Category: ai
Post
Kinh nghiệm thi AWS Certified Machine Learning – Specialty
Tiếp theo kinh nghiệm thi chứng chỉ Solutions Architect - Associate lần trước thì lần này là chứng chỉ Machine Learning – Specialty. Để đạt được chứng chỉ này bạn cần có những kiến thức cơ bản về Machine Learning (ML), khả năng ứng dụng ML vào các bài toán thực tế cũng như sử dụng thành thạo các dịch vụ liên quan tới ML của AWS.
Các bạn có thể tham khảo câu hỏi mẫu tại đây.
Post
Lối đi nào dành cho các chuyên gia và kỹ sư AI?
Dưới đây là tổng hợp những suy nghĩ cá nhân của tôi về các thách thức và các lối đi cho chuyên gia cũng như kỹ sư phần mềm liên quan tới AI (trí tuệ nhân tạo).
Thách thức Hiện nay khi mà phong trào gọi là “Cách mạng công nghiệp 4.0” đang bùng nổ mạnh mẽ hơn bao giờ hết thì công việc liên quan đến AI cũng trở thành 1 trong những ngành nghề hấp dẫn nhất.
Category: ansible
Category: aws
Post
Dùng AWS Amplify để deploy website tĩnh viết bằng Hugo
Hugo là gì? Hugo là 1 framework viết bằng Go dùng để tạo trang web tĩnh như trang chủ công ty, trang giới thiệu sản phẩm… Cách sử dụng hết sức đơn giản, chỉ cần download 1 theme có sẵn về, sửa nội dung theo hướng dẫn rồi gõ hugo để dịch sang html là bạn đã có 1 trang web tĩnh rất nhanh chóng.
Đây là ví dụ 1 trang web tạo từ Hugo: https://vjai.
Post
Kinh nghiệm thi AWS Certified Machine Learning – Specialty
Tiếp theo kinh nghiệm thi chứng chỉ Solutions Architect - Associate lần trước thì lần này là chứng chỉ Machine Learning – Specialty. Để đạt được chứng chỉ này bạn cần có những kiến thức cơ bản về Machine Learning (ML), khả năng ứng dụng ML vào các bài toán thực tế cũng như sử dụng thành thạo các dịch vụ liên quan tới ML của AWS.
Các bạn có thể tham khảo câu hỏi mẫu tại đây.
Post
Kinh nghiệm thi chứng chỉ AWS Certified Solutions Architect – Associate
Giới thiệu chung AWS Certification là bộ chứng chỉ được câp bởi Amazon đánh giá mức độ hiểu biết về cloud (điện toán đám mây), cụ thể là các dịch vụ của Amazon Web Services (AWS) cũng như việc áp dụng các dịch vụ đó 1 cách hiệu quả vào trong các bài toán thực tế. Bộ chứng chỉ này được chia ra theo các vai trò là Cloud Practitioner, Architect, Developer, và Operations, ngoài ra cộng thêm Specialty.
Post
MeCabをLambdaに動かすメモ
絶対忘れるので覚えるうちにメモをとります。 基本的はhttp://dev.classmethod.jp/cloud/aws-lambda-with-mecab/に沿って進めますが、ダウンロードURLが死んだり、pipのインストールパス変わったりしました。
0. Lambdaと同じ環境のEC2インスタンスを作る https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/current-supported-versions.html サポートAMIが時々変わるようなので作るときは必ずチェックしておきましょう。
これからはEC2上に作業します。 LambdaはPython2.7しか使えないのでPython2.7.12を使いました。
1. プロジェクトの作成 $ mkdir $HOME/preprocessing $ PROJECT_HOME=$HOME/preprocessing 2. MeCab のインストール HPのこちらのリンクからダウンロードできます。 GoogleDriveなのでwgetが使えないからMacに保存して、scpすればいいでしょう。例えば$HOMEに保存します。
$ cd ~ $ tar zvxf mecab-0.996.tar.gz $ cd mecab-0.996 $ ./configure --prefix=$PROJECT_HOME/local --enable-utf8-only $ make && make install 3. MeCab辞書のインストール mecab-ipadic-neologdを使いたかったですが、 Lambdaの容量制限超えてしまうので、IPA辞書を使います。ダウンロードリンクもMeCabと同じページにあります。
$ tar zvxf mecab-ipadic-2.7.0-20070801.tar.gz $ cd mecab-ipadic-2.7.0-20070801 $ export PATH=$PROJECT_HOME/local/bin:$PATH $ ./configure --prefix=$PROJECT_HOME/local --enable-utf8-only $ make && sudo make install 4. MeCab Python バインディングのインストール これは元の記事の方法には動かなかったので、別のpipパッケージをインストールします。
$ cd $PROJECT_HOME $ virtualenv env $ source env/bin/activate $ pip install mecab-python3 インストール終わってもpython consoleから使えないです。
Category: backbone.js
Post
Using Backbone.js on Rails
My simple demo to show how to integrate Backbone.js with Rails! Source code can be found here: https://github.com/vanhuyz/rails-with-backbonejs-example
Category: book
Post
Bàn chút về câu hỏi "Bạn là ai?"
Mới đọc xong quyển Homo Deus: A Brief History of Tomorrow của tác giả Harari thấy có 1 đoạn khá thú vị về cái gọi là “bản thân mình” (self) nên tổng hợp lại 1 chút về chủ đề này.
Mình vốn là người rất kém trong việc giới thiệu bản thân khi gặp 1 người mới, vì chính mình cũng không hiểu rõ mình là người như thế nào. Gần đây mới làm thử trắc nghiệm tính cách trên 16personalities thì ra kết quả là INTP - the logician, tạm dịch là nhà logic học.
Category: deep learning
Post
Lối đi nào dành cho các chuyên gia và kỹ sư AI?
Dưới đây là tổng hợp những suy nghĩ cá nhân của tôi về các thách thức và các lối đi cho chuyên gia cũng như kỹ sư phần mềm liên quan tới AI (trí tuệ nhân tạo).
Thách thức Hiện nay khi mà phong trào gọi là “Cách mạng công nghiệp 4.0” đang bùng nổ mạnh mẽ hơn bao giờ hết thì công việc liên quan đến AI cũng trở thành 1 trong những ngành nghề hấp dẫn nhất.
Post
Thử code CycleGAN biến ảnh cam thành ảnh táo với TensorFlow
Giới thiệu về CycleGAN Trước hết mời các bạn xem video này:
Đây là thuật toán sử dụng Deep Learning để chuyển từ ảnh này sang ảnh kia mà vẫn giữ nguyên bố cục, chỉ thay đổi bề mặt của vật thể. Chẳng hạn chuyển từ ảnh ngựa thường sang ngựa vằn, chuyển ảnh cam thành ảnh táo, chuyển ảnh thành tranh… Không chỉ áp dụng với ảnh mà còn cả với video nữa, và như tác giả có nói là có thể realtime với video 60fps!
Post
A note about Generative Adversarial Networks
Generative Adversarial Networks (GAN) Use a latent code Asymptotically consistent (unlike variational methods - e.g. VAE) No Markov chains needed (unlike Boltzmann Machines) Often regarded as producing the best samples (?) Discriminator The discriminator examines samples to determine whether they are real or fake.
Cost:
$$ J^{(D)}\big(\boldsymbol{\theta}^{(D)},\boldsymbol{\theta}^{(G)}\big)=-\frac{1}{2}\mathbb{E}_ {\boldsymbol{x} \sim p_ {data}} \log D(\boldsymbol{x}) - \frac{1}{2}\mathbb{E}_ \boldsymbol{z}\log(1-D(G(\boldsymbol{z}))) $$
This is just the standard cross-entropy cost that is minimized when training a standard binary classifier with a sigmoid output.
Post
Tôi đã tự học Deep Learning như thế nào
Nhân dịp TensorFlow vừa kỷ niệm 1 năm open source, mình viết bài này để kể lại 1 năm qua mình đã tự học Deep Learning như thế nào, vừa để tự tổng hợp kiến thức, vừa để cho các bạn nào quan tâm đến Machine Learning nói chung cũng như là Deep Learning nói riêng tham khảo.
Mình là 1 kỹ sư bên server-side, công việc chủ yếu dùng Rails, SQL và hoàn toàn không liên quan gì đến Deep Learning.
Category: devops
Category: english
Post
A note about Generative Adversarial Networks
Generative Adversarial Networks (GAN) Use a latent code Asymptotically consistent (unlike variational methods - e.g. VAE) No Markov chains needed (unlike Boltzmann Machines) Often regarded as producing the best samples (?) Discriminator The discriminator examines samples to determine whether they are real or fake.
Cost:
$$ J^{(D)}\big(\boldsymbol{\theta}^{(D)},\boldsymbol{\theta}^{(G)}\big)=-\frac{1}{2}\mathbb{E}_ {\boldsymbol{x} \sim p_ {data}} \log D(\boldsymbol{x}) - \frac{1}{2}\mathbb{E}_ \boldsymbol{z}\log(1-D(G(\boldsymbol{z}))) $$
This is just the standard cross-entropy cost that is minimized when training a standard binary classifier with a sigmoid output.
Post
Using Backbone.js on Rails
My simple demo to show how to integrate Backbone.js with Rails! Source code can be found here: https://github.com/vanhuyz/rails-with-backbonejs-example
Category: hugo
Post
Dùng AWS Amplify để deploy website tĩnh viết bằng Hugo
Hugo là gì? Hugo là 1 framework viết bằng Go dùng để tạo trang web tĩnh như trang chủ công ty, trang giới thiệu sản phẩm… Cách sử dụng hết sức đơn giản, chỉ cần download 1 theme có sẵn về, sửa nội dung theo hướng dẫn rồi gõ hugo để dịch sang html là bạn đã có 1 trang web tĩnh rất nhanh chóng.
Đây là ví dụ 1 trang web tạo từ Hugo: https://vjai.
Category: japanese
Post
自然言語処理の国際学会 ACL2018 @メルボルンに参加してきました!
7月10日~15日 で オーストラリアのメルボルンで開催されました 56th Annual Meeting of the Association for Computational Linguistics (ACL2018) に参加してきました。
Post
AnacondaによるTensorFlowインストール手順
Anacondaによるインストールは大変楽という噂がありますので試してみました。 AnacondaはデフォルトNumPy、 Pandas、 SciPy、 Matplotlib、 Jupyterなどが入っています。 他のパッケージ、例えばTensorFlow、 OpenCVも簡単にインストールでき、pyenv/virtualenvがいらなくなるのでおすすめです。
環境: Ubuntu 16.04 Anacondaインストール スクリプトダウンロード URL変える可能性があるのでまずHP確認してください。 https://www.continuum.io/downloads#linux $ wget https://repo.continuum.io/archive/Anaconda3-4.2.0-Linux-x86_64.sh スクリプト実行 $ bash Anaconda3-4.2.0-Linux-x86_64.sh $ source ~/.bashrc TensorFlowインストール 詳細はこちら https://www.tensorflow.org/get_started/os_setup#anaconda_installation
$ conda create -n tensorflow python=3.5 condaコマンドでインストールできるのは現在CPUバージョンだけです。GPUインストールしたい場合はpipでインストールしてください。
$ source activate tensorflow $ conda install -c conda-forge tensorflow 確認:
$ python Python 3.5.2 |Continuum Analytics, Inc.| (default, Jul 2 2016, 17:53:06) [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux Type "help", "copyright", "credits" or "license" for more information.
Post
最尤推定は何ができるの?
英語: Maximum Likelihood Estimation (MLE)
最近仕事で確率モデルを扱う機会があって、パラメータ推定には最尤推定を使うことがありました。 でもわかるような、わからないような状態なので、式を立てて一度整理したいと思います。
例1 問題 データ $D= { x^{(1)},…, x^{(N)} }$(母集団) が与えられるとします。 このデータが正規分布に従うと仮定したら、最尤推定でパラメータを推定しましょう。
回答 まず正規分布の式です。
$$ p(x) = \frac{1}{\sqrt{2\pi\sigma^2}}\exp \big(-\frac{(x-\mu)^2}{2\sigma^2}\big) $$
最尤推定はとは、尤度がもっとも高くなるようにパラメータを決定する方法です。「できるかぎりデータにフィットさせる」推定方法です1。
最尤推定の1つ目の条件は、データは独立に同一の確率分布(i.i.d)2に従うのです。 そこで、尤度(likelihood)は
$$ p(D) = \prod_ {x^{(i)}\in D} p(x^{(i)}) $$
です。これを最大化したいです。
確率$p$は$[0,1]$の間の値なので、積をとるとコンピュータの計算に誤差が出るので実際、$\log$3をとることが多いです。
$$ \begin{align} \log p(D) &= \sum_ {x^{(i)}\in D} \log p(x^{(i)}) \\ &= \sum_ {x^{(i)}\in D} \log \Big(\frac{1}{\sqrt{2\pi\sigma^2}}\exp \big(-\frac{(x^{(i)}-\mu)^2}{2\sigma^2}\big)\Big) \\ &= -\frac{N}{2}\log(2\pi) - N\log (\sigma) - \sum_ {x^{(i)}\in D} \frac{(x^{(i)}-\mu)^2}{2\sigma^2} \end{align} $$
この場合のパラメータは$(\mu, \sigma)$ですね。
Post
MeCabをLambdaに動かすメモ
絶対忘れるので覚えるうちにメモをとります。 基本的はhttp://dev.classmethod.jp/cloud/aws-lambda-with-mecab/に沿って進めますが、ダウンロードURLが死んだり、pipのインストールパス変わったりしました。
0. Lambdaと同じ環境のEC2インスタンスを作る https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/current-supported-versions.html サポートAMIが時々変わるようなので作るときは必ずチェックしておきましょう。
これからはEC2上に作業します。 LambdaはPython2.7しか使えないのでPython2.7.12を使いました。
1. プロジェクトの作成 $ mkdir $HOME/preprocessing $ PROJECT_HOME=$HOME/preprocessing 2. MeCab のインストール HPのこちらのリンクからダウンロードできます。 GoogleDriveなのでwgetが使えないからMacに保存して、scpすればいいでしょう。例えば$HOMEに保存します。
$ cd ~ $ tar zvxf mecab-0.996.tar.gz $ cd mecab-0.996 $ ./configure --prefix=$PROJECT_HOME/local --enable-utf8-only $ make && make install 3. MeCab辞書のインストール mecab-ipadic-neologdを使いたかったですが、 Lambdaの容量制限超えてしまうので、IPA辞書を使います。ダウンロードリンクもMeCabと同じページにあります。
$ tar zvxf mecab-ipadic-2.7.0-20070801.tar.gz $ cd mecab-ipadic-2.7.0-20070801 $ export PATH=$PROJECT_HOME/local/bin:$PATH $ ./configure --prefix=$PROJECT_HOME/local --enable-utf8-only $ make && sudo make install 4. MeCab Python バインディングのインストール これは元の記事の方法には動かなかったので、別のpipパッケージをインストールします。
$ cd $PROJECT_HOME $ virtualenv env $ source env/bin/activate $ pip install mecab-python3 インストール終わってもpython consoleから使えないです。
Post
MacでMongoDBメモ
機械学習で大量のデータを扱いにはデータベースが欲しくなります。SQLデータベースは設計が面倒なので今回はNoSQLのMongoDBを選択しました。
設定編 インストール $ brew update $ brew install mongodb データベースの保存先のディレクトリを作る $ sudo mkdir -p /data/db $ sudo chown -R 777 /data /data/dbはデフォルトなのでおすすめです。 777は多分危ないかもしれませんので、正しい権限を教えてください :bow:
起動 サーバー $ mongod クライエント $ mongo MongoDB shell version: 3.2.9 connecting to: test Welcome to the MongoDB shell. For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user > use mydb switched to db mydb > a = { content: "ほげほげ" } { "content" : "ほげほげ" } > db.
Post
MeCabに人名辞書を追加
生成された辞書(バイナリ)はどこでも使えますので、辞書生成はMac側で行います。
インストール $ brew install mecab mecab-ipadic 構成 ## /usr/local/Cellar/mecab └── 0.996 ├── AUTHORS ├── COPYING ├── ChangeLog ├── INSTALL_RECEIPT.json ├── NEWS ├── README ├── bin │ ├── mecab │ └── mecab-config ├── include │ └── mecab.h ├── lib │ ├── libmecab.2.dylib │ ├── libmecab.a │ └── libmecab.dylib -> libmecab.2.dylib ├── libexec │ └── mecab │ ├── mecab-cost-train │ ├── mecab-dict-gen │ ├── mecab-dict-index │ ├── mecab-system-eval │ └── mecab-test-gen └── share └── man └── man1 └── mecab.
Post
Elasticsearchのbool queryを利用してAND OR NOTを書いてみる
※ この記事をQiitaにも載せました!
初めてElasticsearchのクエリをビルドしたのでいろいろハマりました。SQLの世界観とちょっと違っていて、なれるまで時間がかかると思います。でも、なれたら複雑な検索条件をSQLより簡単に書けるかも知れません。
では、Elasticsearchの基礎クエリの一つ、Bool Queryを解説してみます。
Bool Queryについて Elasticsearch 2.0からandクエリとorクエリは全部非推奨になり、その代わりにboolクエリの方が推奨されます。Boolクエリは複数のクエリを組み合わせる(つまりAND、OR、NOTで結合)のに使います。
Boolクエリは4種類があります:must、 filter、 should、 must_ notです。
クエリ 説明 must ANDとして使います。小クエリは総合スコアに影響を与えます filter mustと同じくANDです。ただし、スコアは無視されます(総合スコアに影響を与えません should ORとして使えます。 minimum_should_match パラメータで最低マッチする条項の数が指定できます[^n]。 must_ not NOTです。 使用例 AND条件 例えば、SQLはこういうSELECT文があります。
SELECT * FROM users WHERE age >= 25 AND salary >= 500000; Elasticsearchのクエリに書き直すと、
{ "query": { "bool" : { "must" : [ { "range" : { "age" : { "gte": 25 } } }, { "range" : { "salary" : { "gte": 500000 } } } ] } } } になります。今回はmustを使いますが、スコア無視したい場合はfilterを使えばいいのです。
Post
Coursera 機械学習 - プログラミング課題8解答例
ソースコード: https://github.com/vanhuyz/coursera-ml/tree/master/machine-learning-ex8/ex8
概要 今回の課題は2パートに分かれています。前半は異常検出アルゴリズム(anomaly detection)を用いて障害が発生したサーバーを検出、後半は映画おすすめシステムを作ります。
1. 異常検出 サーバーは2つのフィーチャーがあります:レスポンスのスループット(mb/s)とレイテンシ(ms)です。m = 307 examplesのデータがあって、その中少し異常点があります。
1.1 正規分布 データ$x$は正規分布に従うのを仮定します。
正規分布:
$$ p(x;\mu,\sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}}e^{-\frac{(x-\mu)^2}{2\sigma^2}} $$
ここで、$\mu$は平均値、$\sigma^2$は分散です。
1.2 正規分布のパラメータ推定 $i$番目のフィーチャーに対して:
平均値: $$ \mu_ i = \frac{1}{m} \sum_ {j=1}^{m} x_ i^{(j)} $$
分散: $$ \sigma_ i^2 = \frac{1}{m}\sum_ {j=1}^{m}(x_ i^{(j)}-\mu_ i)^2 $$
Octaveで書き直すと、
mu = mean(X); sigma2 = var(X) * (m - 1) / m; 注意するのはOctaveの分散計算関数(var)はデフォルトでmではなくm-1を割るので工夫が必要です。
正規分布のグラフ(2Dで輪郭表現)は以下になります。 1.3 しきい値の選択 しきい値$\epsilon$の選択にはクロスバリデーションセットで$F_ 1$スコアの計算が必要です。
$F_ 1$はprecision ($prec$) とrecall ($rec$) から計算します。
Post
Coursera 機械学習 - プログラミング課題6解答例
ソースコード:https://github.com/vanhuyz/coursera-ml/tree/master/machine-learning-ex6/ex6
0. 概要 今回の課題はSupport Vector Machines(SVM)を使って迷惑メールを識別することです (spam classifier)。パート1はSVMをいろいろ試すのと、パート2は迷惑メールの課題になります。
1. Support Vector Machines (SVM) SVM with Gaussian Kernels Gaussian Kernel:
$$ K_ {gaussian}(x^{(i)},x^{(j)}) = \exp\Big(-\frac{|x^{(i)}-x^{(j)}|^2}{2\sigma^2}\Big) = \exp\Bigg(-\frac{\sum_ {k=1}^n(x_ k^{(i)}-x_ k^{(j)})^2}{2\sigma^2}\Bigg) $$
Octaveで書き直すと、
function sim = gaussianKernel(x1, x2, sigma) x1 = x1(:); x2 = x2(:); sim = exp(-norm(x1 - x2)^2 / (2*sigma^2)); end 途中で実行するエラーがありました
error: get: unknown hggroup property Color visualizeBoundary.m ファイルの21行
contour(X1, X2, vals, [1,1], 'b') に変更するとなおりました。
参考:https://www.coursera.org/learn/machine-learning/discussions/1RmNir4KEeWSBRJpSArseQ
データセット2の実行結果: Cross Validation Setでパラメータ選択 SVMのライブラリを使う前提なのでSVMの中身は気にしなくていいです。SVM with a Gaussian kernelを使う場合、調整必要なパラメータは$C$と$\sigma$だけです。$C$は正規化を調整するパラメータで、$\sigma$は2つ点の類似度(similarity)を調整するパラメータです。 一般的に,
Post
Coursera 機械学習 - プログラミング課題4解答例
解答例:https://github.com/vanhuyz/coursera-ml/tree/master/machine-learning-ex4/ex4
概要 今回の課題は前回と続き手書き数字の判定問題です。前回はニューラルネットワークで、与えられたパラメータからフィードフォワード・プロパゲイションを行うところまででした。今回はbackpropagationアルゴリズムを使って、パラメータを抽出することです(学習過程)。
1. ニューラルネットワーク 1.1 データを可視化 5000学習データがあり、各データは20x20ピックセルグレースケールの数字画像です。
1.2 モデル表現 ニューラルネットワークは3つのレイヤーがあります:input layer, hidden layerとoutput layerです。
1.3 フィードフォワードとコスト関数 ニューラルネットワークのコスト関数(未正規化)はこのように計算できます。
$$ J(\Theta) = \frac{1}{m}\sum_ {i=1}^{m}\sum_ {k=1}^{K}\Big[-y_ k^{(i)}\log((h_ \Theta(x^{(i)}))_ k)-(1-y_ k^{(i)})\log(1-(h_ \Theta(x^{(i)}))_ k)\Big] $$
ここで$K=10$(10数字)、$m=5000$(学習データ)、$h_ \theta$はFigure 2から計算できます。$y$は0から9の数字ですが、計算都合のため以下の図のようにベクトルにマッピングします。
課題はコスト関数をOctaveで計算することです。
function [J grad] = nnCostFunction(nn_ params, ... input_ layer_ size, ... hidden_ layer_ size, ... num_ labels, ... X, y, lambda) % Reshape nn_ params back into the parameters Theta1 and Theta2 Theta1 = reshape(nn_ params(1:hidden_ layer_ size * (input_ layer_ size + 1)), .
Post
Coursera 機械学習 - プログラミング課題2解答例
課題について 今回の課題はLogistic Regression(分類)に関するものです。
https://www.coursera.org/learn/machine-learning/programming/ixFof/logistic-regression
ソースコードはgithubに上げました。
https://github.com/vanhuyz/coursera-ml/tree/master/machine-learning-ex2/ex2
問題1 Logistic regressionモデルで学生の過去の2つテスト結果から大学入試に合格・不合格を予測します。
学習データは以下の図の通りです。+は合格、◯は不合格です。
1. Sigmoid関数 Sigmoid関数は以下のように定義されています。
$$ g(z)=\frac{1}{1+e^{-z}} $$
注意したいのはzはスカラー、ベクトル、行列でもいいです。ベクトル・行列の場合は各要素を適応することになるます。
実装:
function g = sigmoid(z) g = zeros(size(z)); g = 1 ./ (1 + exp(-z)); end Octaveの**+**、exp演算子はもし行列と実数を計算するとき、自動に各要素に適応するようです。 / はそうになっていないのでちゃんと . をつけましょう。
2. Cost function and gradient Cost function: $$ J(\theta) = \frac{1}{m}\sum_ {i=1}^{m}[-y^{(i)}\log(h_ \theta(x^{(i)}))-(1-y^{(i)})\log(1-h_ \theta(x^{(i)}))] $$
Gradient: $$ \frac{\partial J(\theta)}{\partial \theta_ j} = \frac{1}{m}\sum_ {i=1}^m (h_ \theta(x^{(i)})-y^{(i)})x_ j^{(i)} $$
実装: 理解しやすいためcost functionの計算とgradientの計算を分けています。
function [J, grad] = costFunction(theta, X, y) m = length(y); % number of training examples J = 0; grad = zeros(size(theta)); % cost function for i = 1:m h = sigmoid(X(i,:) * theta); J += -y(i)*log(h) - (1 - y(i))*log(1-h); end J = J / m; % gradient for j = 1:size(theta) for i = 1:m h = sigmoid(X(i,:) * theta); grad(j) += (h - y(i)) * X(i,j); end end grad = grad / m; end 番外編:Gradientのベクトル化: gradientベクトルを$\nabla$で記号すると、以下のようになります(予想です。僕がまだ証明しません。でも結果は正しいので合っているでしょう)
Post
Coursera 機械学習 - プログラミング課題1解答例
課題のページ https://www.coursera.org/learn/machine-learning/programming/8f3qT/linear-regression
プログラミング課題はちょっと重いので今回の解答例を上げます。 わからないことや別の解答がありましたらコメントをお願いします。
必須課題 1. Computing Cost (for One Variable) Gradient DescentのCost function $J(\theta)$ は以下の通り
$$ J(\theta) = \frac{1}{2m}\sum_ {i=1}^m (h_ \theta(x^{(i)}) - y^{(i)} )^2 $$
ここで、仮定関数 $ h_ \theta(x) $は
$$ h_ \theta(x) = \theta^T x = \theta_ 0 + \theta_ 1x_ 1 $$
それで、
$$ J(\theta) = \frac{1}{2m}\sum_ {i=1}^m (\theta^T x^{(i)} - y^{(i)} )^2 $$
注意したいのは $\theta$ と $x^{(i)}$ はベクトルで、$ y^{(i)} $は実数です。 課題はこの関数をOctaveで書くことです。以下は解答例です。
function J = computeCost(X, y, theta) m = length(y); % number of training examples % 97 examplesがあるのでここで m == 97 % size(X) == [97 2] % size(y) == [97 1] % size(theta) == [2 1] % Xは97x2行列。1行は1つのtraining example [x0 x1] (x0はいつも1) % yは97次元ベクトル % thetaは2次元ベクトル J = 0; % まずは和の部分を計算します for i = 1:m J += (theta' * X(i,:)' - y(i))^2; end % X(i,:)は1つの行、つまりtraining exampleです。ベクトルに変換するので転置を取りました。 % 最後に2mを割るだけです J = J / (2*m); end 実行した結果、cost functionの値は32.
Post
メンテナンス本格入門のまとめ
メンテナンスは必要? メンテナンスなんてない方がよい それでも行う必要があるとき 歴史的かつ技術的な負債 作業難度のトレードオフ メンテナンスの種類 計画メンテナンス 事前に計画し、ユーザー告知を行って作業を行う。これに当たる主だった作業としては
ハードウェアの保留/入れ替え データベースの設定変更 ネットワークの保留 手順:
作業手順作成 事前準備:Sorryサーバーの準備 テスト環境での予行演習 作業実施:作業チェック、問題発生時の対処 確認作業:モニタリング、作業の振り返り 緊急メンテナンス 障害が発生した場合などに原因を解決/追求品ケラバサービス継続が難しい場合などに行う。内容は
障害復旧 障害の現状保存 障害の詳細調査 手順
障害検知 原因調査 メンテナンス判断 作業実施 確認作業 振り返り・ノウハウ化 その他:ユーザーへ告知、補償 メンテナンスの手法 全停止メンテナンス 一部停止メンテナンス 無停止メンテナンス メンテフリーへのアプローチ メンテフリーとはサビースを停止せずメンテナンスを行う。そのためには、設計、構築、運用のすべての段階で「いかにSPOFをなくし、システム停止せずに作業できるか」を考え続ける必要がある。アプローチは様々あるが、弊社に適したものは以下にあげられる。
Webサーバー、アプリケーションサーバー ロードバランサによって複数のサーバーにアクセスを振り分け、2台以上用意する。Apache/Nginx・アプリケーションサーバーの設定変更や再起動といった作業でユーザーに影響があるシステム構成いなっているものは好ましくない
データベース設計: スキーマ変更の頻度高いサービスはMongoDBへ RDBの場合はマスタスレーブ構成やマスタ分割、スキーマ変更のコストを下げる。MySQLの場合はオンラインスキーマ変更がある リリース: ロードバランサ切り離しによるリリース:ロードバランサからアプリケーションサーバーを分離し、1台ずつアプリケーションを入れ替えていく。Jenkinsなどでサーバーに順次デプロイしていくと良い 系切り替えによるリリース:稼働系と待機系の2系統を準備し、ロードバランサでクライアントの向き先を切り替えてリリースする ホットデプロイによる動的リリース:アプリケーションを再起動せずにモジュールを更新する機能。UnicornやPumaなどはこの機能がある(と書いてある) カナリアリリース:一部のユーザーから徐々に新バージョンのアプリケーションを適用していく手法。FacebookやGoogleの大規模サービスはこの方法でデプロイされている 結論 サービスの種類・規模や原因によって様々なパータンがある。いつ起こるのもわからない。そのため、監視ツールを導入や毎日心構えが必要である(エンジニアの辛い道)
Post
Fluentd導入してからエラーログを全部Slackに通知する
やりたいこと サーバーが落ちるときすぐ管理者に通知する
設計イメージ Fluentdで全部のエラーログをまとめてSlackに送信する。
Fluentd導入 Fluentdとは ログ収集ミドルウェアである。Fluentdにインプットされた、すべてのログをJSONに変換し、アウトプットする。
Fluentdのインストール (Ubuntu 14.04) 事前準備 ntpをインストールする $ sudo apt-get install ntp ファイルディスクリプタの上限を増やす 現在のファイルディスクリプタ数を確認
$ ulimit -n 1024 もし1024なら不十分なので上限を増やす。/etc/security/limits.conf に以下の行を追加する
root soft nofile 65536 root hard nofile 65536 * soft nofile 65536 * hard nofile 65536 編集終わったらマシン再起動
$ sudo reboot もう一度確認
$ ulimit -n 65536 Fluentdのインストール $ curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh 起動するときFluentd(td-agent)を自動に起動
$ sudo update-rc.d td-agent defaults Slackへ連帯 FluentdのSlackプラグインをインストールする $ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-slack SlackのWebhookを登録 https://yourteam.
Post
Railsで論理削除を考慮するunique制約のかけ方
使用バージョン Rails 4.2.0 Ruby 2.2.0 MySQL 5.6 論理削除のgem: paranoia 2.1.0 目的 例えばこういうuserモデルがあります
# 20150119070756_create_users.rb class CreateUsers < ActiveRecord::Migration def change create_table :users do |t| t.string :name, :limit => 20 t.datetime :deleted_at # <- 論理削除 t.timestamps null: false end end end 注意したいのはdeleted_atコラムは削除した日付です。デフォルトだと、
非削除レコードはdeleted_at IS NULL 削除済みレコードはdeleted_at IS NOT NULL 問題: もしnameをunique制約をかけると、削除済みレコードはそのままデータベースに残るので同じnameのレコードを追加することができません。
目的: 非削除レコードの中でnameをunique制約したい。
ネットで調べるとハマる人が少なくないようです。 今回はデータベースレベルとアプリケーションレベルの両方設定します。
作業内容 まずdeleted_atはNULLだとunique複合キーを設定するのも意味ないのでNULLを避けます。
設定ファイルparanoia.rbを作る # config/initializers/paranoia.rb Paranoia.default_sentinel_value = DateTime.new(0) 以上の1行だけで、
非削除レコードはdeleted_at = '0000-01-01 00:00:00' 削除済みレコードはdeleted_at != '0000-01-01 00:00:00' になります。これで、unique複合キーを設定することができます。
Post
MySQLで大量のデータを挿入して、SELECTパーフォマンスを比較する
大量のデータを扱う機会があるため、データが非常に多いときMySQLのパフォーマンスはどうなるかを検討した。
検討するテーブル: 検討したいquery: SELECT * FROM activity_records WHERE date BETWEEN '2014-01-01' AND '2014-04-10'; なのでdateコラムにindexをつけた。このテーブルに5億ぐらいのレコードがあるとき、レスポンス時間はどのぐらいなのか検討したい。
環境: SSD: 256GB
テーブルに5億レコードを挿入する この記事は大変参考になりました:Mass inserting data in Rails without killing your performance
単純の(5*10**8).times { Model.create(options) }なら20日間がかかるのに対し、1つのINSERTを大量のデータをまとめ(bulk insertと呼ばれる)すると10時間しかかからない。
最終のrakeタスクのコードは以下となる
# insert_data.rake namespace :insert_data do desc "Insert dummy activity records" task run: :environment do TOTAL_RECORDS = 500000000 RECORDS_PER_TIME = 50000 CONN = ActiveRecord::Base.connection start_time = Time.now (TOTAL_RECORDS/RECORDS_PER_TIME).times do |i| inserts = Array.new RECORDS_PER_TIME.times do |j| date = (Time.
Post
API開発用必要なGemのまとめ(2015/08更新)
初めてRailsプロジェクトに入ったとき、Gemfileを見ても全くわからなかった。Rails初心者のため必要なGemをまとめました。良いGemを発見したらどんどん更新していこうと思います。
2015/08/13時点
データベース関連 mysql2 MySQLアダプタ MySQLを使うなら必須 redis Ruby client library for Redis cache, session保存用 ar-octopus レプリケーション (master+slave管理) switch_point (※ 2015/08/13追加) ar-octopusの代替。機能はar-octopusまで高くないが、master+slave切り替えぐらいなら十分 paranoia 論理削除 API grape REST API生成 grape-entity grapeのサーポート レスポンス(json)を簡単に記述できる grape-swagger grapeのサーポート Swaggerドキュメントを生成する kramdown grape-swaggerのサーポート markdownパーサー rack-cors Cross-Origin Resource Sharing (CORS)をハンドリング Swaggerを別のサーバーに置く場合はこれが必須 kaminariまたはgrape-kaminari APIのページネーション テスト rspec-rails テストフレームワーク capybara (※ 2015/08/13追加) Websiteのテストフレームワーク shoulda-matchers (※ 2015/08/13追加) モデルテストに便利 spork-rails テストの実行時間を短縮してくれる factory_girl_rails テストデータを用意する database_cleaner FactoryGirlにて作成するテストデータを、テストを実行する度に消去する turnip (※ 2015/08/13追加) Rspecの中にCucumber風コードを書ける capybara-screenshot (※ 2015/08/13追加) Capybaraのテストが失敗したら自動的にスクリーンショートを撮る ユーザ認証 devise ユーザ登録・ログインまで全てやってくれる 管理画面 activeadmin 10分で作れる管理画面 Push通知 houston iOSデバイスにpush通知を送る定番のgem invalid tokenが混じると通知が届かないバグがある(2014/12) parse-ruby-client (※ 2015/08/13追加) Parseと連携 バックグラウンド処理 sidekiq バックグラウンドworkerの定番 sucker_punch (※ 2015/08/13追加) Sidekiqはredisが必須なのでインフラコストが上がる。メールをバックグラウンドで送るぐらいならsucker_punchの方が軽い whenever Cron jobs管理 画像関連 carrierwave 画像アップロードの定番 paperclip (※ 2015/08/13追加) これも画像アップロードの定番 fog carrierwaveのサーポート S3にアップロード rmagick 画像処理(サイズ調整、角丸など)に便利 デプロイ用 unicorn 本番用のWebサーバー 設定は面倒 capistrano 有名なデプロイツール capistrano-rails db migrateとassets compileタスクを用意する capistrano-rbenv デプロイ先にrbenv使ったらこれが必要 capistrano3-unicorn デプロイした後unicornを再起動してくれる Ubuntu14.
Post
Docker経由Swagger UIを入れてみた
はじめに 目的:SwaggerUIを開発環境に入れて、Railsと組み合わせたい Railsのswagger-ui gemもありますが、あれはSwaggerUIが古い。最新版のSwaggerUIを使いたい。 手動で構築するのがちょっと面倒だから、Dockerを使って入れてみた
作業 Docker HubにSwagger UIを探してこういうイメージを見つけた
https://registry.hub.docker.com/u/capoferro/swagger-ui/
capoferro / swagger-ui Simple docker container to serve the Swagger UI
インストールする方法は以下となります
イーメジをpullする $ docker pull capoferro/swagger-ui コンテナを起動する $ docker run -d -p 4567:80 capoferro/swagger-ui このコマンドはSwaggerUIコンテナの80ポートをホストマシンの4567ポートに紐付ける
ブラウザにboot2dockerマシンのIP(普通192.168.59.103)のポート4567をアクセスするとSwaggerの画面が出てくる これでSwaggerUIのインストールが成功した。
最後にRailsのアプリを紐付けること:
動いているSwaggerコンテナのIDを確認する ( $ docker ps) 今回コンテナIDは859502ad6704がわかりました。
SwaggerUIコンテナに入る $ docker exec -i -t 8595 /bin/bash (8595はコンテナIDの先頭4文字です。コンテナIDを指定するとき先頭3,4文字でも動くはず)
index.htmlの中にurlのところにデフォルトURLをRailsのswagger_docパスに変更する: viでもいいですが、キーボードがおかしかったのでsedを使いました $ sed -i "s@http://petstore.swagger.wordnik.com/api/api-docs@http://192.168.59.103:3000/api/swagger_doc@g" index.html 終わり!
まわりの話 SwaggerUIイメージのソースコード: https://github.com/capoferro/swagger-ui-docker
Dockerfileをみてわかるように、このイメージはUbuntuベース、nginx上にSwaggerUI動くという形です。SwaggerUIは公式のgithubをプルするので最新版になっているだろう。
Post
Docker + Figを使ってRailsの開発環境を構築する
前回はDockerで構築したアプリを使うのを述べました。今回は実際どうやってそのRailsアプリを構築するのかを紹介します。
構築したい環境 Ruby 2.2 Rails 4.2.0 MySQL Redis シナリオ 以上の条件でコンテナを3つ準備します。
web : Railsアプリ。もちろんRubyが入ってるので今回はofficial ruby imageをベースにコンテナを作ります db : official MySQL imageを採用します redis: official Redis imageを採用します 気づいたのは使った3つのofficial imagesは全部Debian (Ubuntuと似ているLinux OS)です。違うOSでも問題ないでしょう。
webコンテナのDockerfile
# Docker hubのruby imageをpullする。2.2.0を指定 FROM ruby:2.2.0 MAINTAINER vanhuyz # 必要なパッケージをインストール RUN apt-get update -qq && apt-get install -y build-essential libpq-dev # myappディレクトリーをwebコンテナに作成 RUN mkdir /myapp # RUN, CMDのworking directoryを指定 WORKDIR /myapp # hostマシンのGemfileをwebコンテナにコピーする ADD Gemfile /myapp/Gemfile # webコンテナにbundle installを実行 RUN bundle install # 生成されたファイルをwebコンテナにコピーする ADD .
Post
魔法のDockerを使ってみよう
前回はDockerをインストールするまで記述しました。今回は実際Dockerで構築したRailsアプリを動かしましょう。
前提 Mac OS Xにboot2dockerが起動された状態、またはLinuxにDockerインストール済み
作業 まずFigというコンテナ管理ツールをインストールします $ curl -L https://github.com/docker/fig/releases/download/1.0.1/fig-`uname -s`-`uname -m` > /usr/local/bin/fig; chmod +x /usr/local/bin/fig 次に構築したRailsアプリをcloneします $ git clone git@github.com:vanhuyz/rails-docker-test.git $ cd rails-docker-test 最後にfig up するだけで $ fig up 完了!
構築したRailsアプリの確認 (Yosemite編) 僕のRails環境は以下のように構成されています
Ruby 2.2 Rails 4.2.0 MySQL Redis では構築できた環境を確認しましょう!
まずboot2docker仮想マシンのIPを確認します。
Vans-MacBook-Air:~ vanhuy$ boot2docker ip 192.168.59.103 webコンテナは3000ポートに紐付いているのでブラウザから192.168.59.103:3000にアクスセスしてみると
やった!ちゃんとRailsの初期画面が出ています。
次にmysqlの確認:
Vans-MacBook-Air:~ vanhuy$ mysql -h 192.168.59.103 -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g.
Post
Dockerをインストールする(Yosemite編)
Docker導入する理由 開発環境を一気構築できる コンテナ型仮想化なので軽い Vagrant/Chefより学習コストが低い 小さいコンテナから構成されるので安定性が高まる Amazon EC2 Container Serviceが発表されたから本番構築でも可能に! Yosemiteにインストールしてみよう インストール方法は非常に簡単です。
Boot2dockerパッケージをダウンロードする ダウンロードしたパッケージをダブルクリックしてインストールする Boot2Dockerアプリを起動する どのターミナルにも使いたい場合は以下のコマンドを~/.bash_profileに追加する $(boot2docker shellinit) 終わり! 参考:公式サイト
Boot2dockerを分解してみよう ではBoot2dockerは何が入っているのかを調べてみた。
VirtualBox:仮装化ソフトウェア Boot2Docker:小さいLinuxベースOS。DockerはLinuxベースで動作するから、Macに動作する場合は仮装マシンが必要。インストールできたらboot2docker-vmがVirtualBoxに入っているはず Boot2Docker Management Tool: Boot2Dockerの管理ツール。コマンドが充実。 $ boot2docker Usage: boot2docker [<options>] {help|init|up|ssh|save|down|poweroff|reset|restart|config|status|info|ip|shellinit|delete|download|upgrade|version} [<args>] $ boot2docker ssh # boot2docker仮装マシンにSSHする $ cat /proc/version Linux version 3.16.7-tinycore64 (root@064f0e1ce709) (gcc version 4.7.2 (Debian 4.7.2-5) ) #1 SMP Tue Dec 16 23:03:39 UTC 2014 Docker Client:dockerコマンドが使えるようになります。Dockerの使い方は本当に長くなりそうですから、以下は重要なコマンドをリストアップします $ docker # 全部コマンドが見られる $ docker version # dockerバージョンを見る $ docker search <string> # DockerHubにイメージを検索 $ docker pull <username>/<repository> # イメージをダウンロード $ docker run <username>/<repository> <command> ## コンテナの中にコマンドを実行する。例えば: $docker run learn/tutorial echo “hello” $ docker ps -l # 作ったコンテナのIDを調べる $ docker commit <ID> <username>/<new_repository> ## コンテナをイメージ化する $ docker inspect <ID> # コンテナの全部情報が見られる $ docker images # 現在のホストになんのイメージが入っているのか $ docker push <username>/<repository> # DockerHubにpushする 参考:Try Docker
Category: life
Post
Tổng hợp hội thảo thường niên của các công ty công nghệ tại Tokyo
Thời điểm cuối năm cũ và đầu năm mới thường là lúc mà các công ty tổ chức hội thảo công nghệ (tech conference) vừa để giới thiệu dịch vụ hay “khoe” những thành quả trong 1 năm vừa qua vừa để thu hút nhân tài đến với công ty. Trước đây các công ty thường sắp xếp tổ chức cuối tuần để nhiều người tiện tham gia hơn nhưng gần đây thì lại có xu hướng chuyển qua tổ chức ngày thường.
Post
Lối đi nào dành cho các chuyên gia và kỹ sư AI?
Dưới đây là tổng hợp những suy nghĩ cá nhân của tôi về các thách thức và các lối đi cho chuyên gia cũng như kỹ sư phần mềm liên quan tới AI (trí tuệ nhân tạo).
Thách thức Hiện nay khi mà phong trào gọi là “Cách mạng công nghiệp 4.0” đang bùng nổ mạnh mẽ hơn bao giờ hết thì công việc liên quan đến AI cũng trở thành 1 trong những ngành nghề hấp dẫn nhất.
Post
Kinh nghiệm đổi bằng lái xe ô tô cấp tại Nhật sang bằng Việt Nam
Gần đây số lượng người Việt ở Nhật cũng nhiều và trong đó cũng có nhiều người học lái xe ô tô ở Nhật luôn. Tất nhiên mục đích chính vẫn là lái xe ở Nhật nhưng chắc nhiều bạn cũng băn khoăn không biết bằng Nhật có lái xe được ở Việt Nam hay không. Mình cũng đã tìm hiểu về cái này và được câu trả lời là:
Post
Đánh giá một số trung tâm học tiếng Anh giao tiếp ở Nhật
Mở đầu Người Nhật vốn nổi tiếng không nói được tiếng Anh nhưng gần đây khi mà các công ty Nhật bắt đầu coi trọng vấn đề “toàn cầu hoá” thì tiếng Anh lại trở thành 1 trong kỹ năng rất được săn đón. Chính vì thế mà các trung tâm tiếng Anh giao tiếp (英会話) cho người đi làm mở ra khá rầm rộ với nhiều hình thức khác nhau.
Category: machine learning
Post
Kinh nghiệm thi AWS Certified Machine Learning – Specialty
Tiếp theo kinh nghiệm thi chứng chỉ Solutions Architect - Associate lần trước thì lần này là chứng chỉ Machine Learning – Specialty. Để đạt được chứng chỉ này bạn cần có những kiến thức cơ bản về Machine Learning (ML), khả năng ứng dụng ML vào các bài toán thực tế cũng như sử dụng thành thạo các dịch vụ liên quan tới ML của AWS.
Các bạn có thể tham khảo câu hỏi mẫu tại đây.
Post
自然言語処理の国際学会 ACL2018 @メルボルンに参加してきました!
7月10日~15日 で オーストラリアのメルボルンで開催されました 56th Annual Meeting of the Association for Computational Linguistics (ACL2018) に参加してきました。
Post
Lối đi nào dành cho các chuyên gia và kỹ sư AI?
Dưới đây là tổng hợp những suy nghĩ cá nhân của tôi về các thách thức và các lối đi cho chuyên gia cũng như kỹ sư phần mềm liên quan tới AI (trí tuệ nhân tạo).
Thách thức Hiện nay khi mà phong trào gọi là “Cách mạng công nghiệp 4.0” đang bùng nổ mạnh mẽ hơn bao giờ hết thì công việc liên quan đến AI cũng trở thành 1 trong những ngành nghề hấp dẫn nhất.
Post
最尤推定は何ができるの?
英語: Maximum Likelihood Estimation (MLE)
最近仕事で確率モデルを扱う機会があって、パラメータ推定には最尤推定を使うことがありました。 でもわかるような、わからないような状態なので、式を立てて一度整理したいと思います。
例1 問題 データ $D= { x^{(1)},…, x^{(N)} }$(母集団) が与えられるとします。 このデータが正規分布に従うと仮定したら、最尤推定でパラメータを推定しましょう。
回答 まず正規分布の式です。
$$ p(x) = \frac{1}{\sqrt{2\pi\sigma^2}}\exp \big(-\frac{(x-\mu)^2}{2\sigma^2}\big) $$
最尤推定はとは、尤度がもっとも高くなるようにパラメータを決定する方法です。「できるかぎりデータにフィットさせる」推定方法です1。
最尤推定の1つ目の条件は、データは独立に同一の確率分布(i.i.d)2に従うのです。 そこで、尤度(likelihood)は
$$ p(D) = \prod_ {x^{(i)}\in D} p(x^{(i)}) $$
です。これを最大化したいです。
確率$p$は$[0,1]$の間の値なので、積をとるとコンピュータの計算に誤差が出るので実際、$\log$3をとることが多いです。
$$ \begin{align} \log p(D) &= \sum_ {x^{(i)}\in D} \log p(x^{(i)}) \\ &= \sum_ {x^{(i)}\in D} \log \Big(\frac{1}{\sqrt{2\pi\sigma^2}}\exp \big(-\frac{(x^{(i)}-\mu)^2}{2\sigma^2}\big)\Big) \\ &= -\frac{N}{2}\log(2\pi) - N\log (\sigma) - \sum_ {x^{(i)}\in D} \frac{(x^{(i)}-\mu)^2}{2\sigma^2} \end{align} $$
この場合のパラメータは$(\mu, \sigma)$ですね。
Post
Coursera 機械学習 - プログラミング課題8解答例
ソースコード: https://github.com/vanhuyz/coursera-ml/tree/master/machine-learning-ex8/ex8
概要 今回の課題は2パートに分かれています。前半は異常検出アルゴリズム(anomaly detection)を用いて障害が発生したサーバーを検出、後半は映画おすすめシステムを作ります。
1. 異常検出 サーバーは2つのフィーチャーがあります:レスポンスのスループット(mb/s)とレイテンシ(ms)です。m = 307 examplesのデータがあって、その中少し異常点があります。
1.1 正規分布 データ$x$は正規分布に従うのを仮定します。
正規分布:
$$ p(x;\mu,\sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}}e^{-\frac{(x-\mu)^2}{2\sigma^2}} $$
ここで、$\mu$は平均値、$\sigma^2$は分散です。
1.2 正規分布のパラメータ推定 $i$番目のフィーチャーに対して:
平均値: $$ \mu_ i = \frac{1}{m} \sum_ {j=1}^{m} x_ i^{(j)} $$
分散: $$ \sigma_ i^2 = \frac{1}{m}\sum_ {j=1}^{m}(x_ i^{(j)}-\mu_ i)^2 $$
Octaveで書き直すと、
mu = mean(X); sigma2 = var(X) * (m - 1) / m; 注意するのはOctaveの分散計算関数(var)はデフォルトでmではなくm-1を割るので工夫が必要です。
正規分布のグラフ(2Dで輪郭表現)は以下になります。 1.3 しきい値の選択 しきい値$\epsilon$の選択にはクロスバリデーションセットで$F_ 1$スコアの計算が必要です。
$F_ 1$はprecision ($prec$) とrecall ($rec$) から計算します。
Post
Coursera 機械学習 - プログラミング課題6解答例
ソースコード:https://github.com/vanhuyz/coursera-ml/tree/master/machine-learning-ex6/ex6
0. 概要 今回の課題はSupport Vector Machines(SVM)を使って迷惑メールを識別することです (spam classifier)。パート1はSVMをいろいろ試すのと、パート2は迷惑メールの課題になります。
1. Support Vector Machines (SVM) SVM with Gaussian Kernels Gaussian Kernel:
$$ K_ {gaussian}(x^{(i)},x^{(j)}) = \exp\Big(-\frac{|x^{(i)}-x^{(j)}|^2}{2\sigma^2}\Big) = \exp\Bigg(-\frac{\sum_ {k=1}^n(x_ k^{(i)}-x_ k^{(j)})^2}{2\sigma^2}\Bigg) $$
Octaveで書き直すと、
function sim = gaussianKernel(x1, x2, sigma) x1 = x1(:); x2 = x2(:); sim = exp(-norm(x1 - x2)^2 / (2*sigma^2)); end 途中で実行するエラーがありました
error: get: unknown hggroup property Color visualizeBoundary.m ファイルの21行
contour(X1, X2, vals, [1,1], 'b') に変更するとなおりました。
参考:https://www.coursera.org/learn/machine-learning/discussions/1RmNir4KEeWSBRJpSArseQ
データセット2の実行結果: Cross Validation Setでパラメータ選択 SVMのライブラリを使う前提なのでSVMの中身は気にしなくていいです。SVM with a Gaussian kernelを使う場合、調整必要なパラメータは$C$と$\sigma$だけです。$C$は正規化を調整するパラメータで、$\sigma$は2つ点の類似度(similarity)を調整するパラメータです。 一般的に,
Post
Coursera 機械学習 - プログラミング課題4解答例
解答例:https://github.com/vanhuyz/coursera-ml/tree/master/machine-learning-ex4/ex4
概要 今回の課題は前回と続き手書き数字の判定問題です。前回はニューラルネットワークで、与えられたパラメータからフィードフォワード・プロパゲイションを行うところまででした。今回はbackpropagationアルゴリズムを使って、パラメータを抽出することです(学習過程)。
1. ニューラルネットワーク 1.1 データを可視化 5000学習データがあり、各データは20x20ピックセルグレースケールの数字画像です。
1.2 モデル表現 ニューラルネットワークは3つのレイヤーがあります:input layer, hidden layerとoutput layerです。
1.3 フィードフォワードとコスト関数 ニューラルネットワークのコスト関数(未正規化)はこのように計算できます。
$$ J(\Theta) = \frac{1}{m}\sum_ {i=1}^{m}\sum_ {k=1}^{K}\Big[-y_ k^{(i)}\log((h_ \Theta(x^{(i)}))_ k)-(1-y_ k^{(i)})\log(1-(h_ \Theta(x^{(i)}))_ k)\Big] $$
ここで$K=10$(10数字)、$m=5000$(学習データ)、$h_ \theta$はFigure 2から計算できます。$y$は0から9の数字ですが、計算都合のため以下の図のようにベクトルにマッピングします。
課題はコスト関数をOctaveで計算することです。
function [J grad] = nnCostFunction(nn_ params, ... input_ layer_ size, ... hidden_ layer_ size, ... num_ labels, ... X, y, lambda) % Reshape nn_ params back into the parameters Theta1 and Theta2 Theta1 = reshape(nn_ params(1:hidden_ layer_ size * (input_ layer_ size + 1)), .
Post
Coursera 機械学習 - プログラミング課題2解答例
課題について 今回の課題はLogistic Regression(分類)に関するものです。
https://www.coursera.org/learn/machine-learning/programming/ixFof/logistic-regression
ソースコードはgithubに上げました。
https://github.com/vanhuyz/coursera-ml/tree/master/machine-learning-ex2/ex2
問題1 Logistic regressionモデルで学生の過去の2つテスト結果から大学入試に合格・不合格を予測します。
学習データは以下の図の通りです。+は合格、◯は不合格です。
1. Sigmoid関数 Sigmoid関数は以下のように定義されています。
$$ g(z)=\frac{1}{1+e^{-z}} $$
注意したいのはzはスカラー、ベクトル、行列でもいいです。ベクトル・行列の場合は各要素を適応することになるます。
実装:
function g = sigmoid(z) g = zeros(size(z)); g = 1 ./ (1 + exp(-z)); end Octaveの**+**、exp演算子はもし行列と実数を計算するとき、自動に各要素に適応するようです。 / はそうになっていないのでちゃんと . をつけましょう。
2. Cost function and gradient Cost function: $$ J(\theta) = \frac{1}{m}\sum_ {i=1}^{m}[-y^{(i)}\log(h_ \theta(x^{(i)}))-(1-y^{(i)})\log(1-h_ \theta(x^{(i)}))] $$
Gradient: $$ \frac{\partial J(\theta)}{\partial \theta_ j} = \frac{1}{m}\sum_ {i=1}^m (h_ \theta(x^{(i)})-y^{(i)})x_ j^{(i)} $$
実装: 理解しやすいためcost functionの計算とgradientの計算を分けています。
function [J, grad] = costFunction(theta, X, y) m = length(y); % number of training examples J = 0; grad = zeros(size(theta)); % cost function for i = 1:m h = sigmoid(X(i,:) * theta); J += -y(i)*log(h) - (1 - y(i))*log(1-h); end J = J / m; % gradient for j = 1:size(theta) for i = 1:m h = sigmoid(X(i,:) * theta); grad(j) += (h - y(i)) * X(i,j); end end grad = grad / m; end 番外編:Gradientのベクトル化: gradientベクトルを$\nabla$で記号すると、以下のようになります(予想です。僕がまだ証明しません。でも結果は正しいので合っているでしょう)
Post
Coursera 機械学習 - プログラミング課題1解答例
課題のページ https://www.coursera.org/learn/machine-learning/programming/8f3qT/linear-regression
プログラミング課題はちょっと重いので今回の解答例を上げます。 わからないことや別の解答がありましたらコメントをお願いします。
必須課題 1. Computing Cost (for One Variable) Gradient DescentのCost function $J(\theta)$ は以下の通り
$$ J(\theta) = \frac{1}{2m}\sum_ {i=1}^m (h_ \theta(x^{(i)}) - y^{(i)} )^2 $$
ここで、仮定関数 $ h_ \theta(x) $は
$$ h_ \theta(x) = \theta^T x = \theta_ 0 + \theta_ 1x_ 1 $$
それで、
$$ J(\theta) = \frac{1}{2m}\sum_ {i=1}^m (\theta^T x^{(i)} - y^{(i)} )^2 $$
注意したいのは $\theta$ と $x^{(i)}$ はベクトルで、$ y^{(i)} $は実数です。 課題はこの関数をOctaveで書くことです。以下は解答例です。
function J = computeCost(X, y, theta) m = length(y); % number of training examples % 97 examplesがあるのでここで m == 97 % size(X) == [97 2] % size(y) == [97 1] % size(theta) == [2 1] % Xは97x2行列。1行は1つのtraining example [x0 x1] (x0はいつも1) % yは97次元ベクトル % thetaは2次元ベクトル J = 0; % まずは和の部分を計算します for i = 1:m J += (theta' * X(i,:)' - y(i))^2; end % X(i,:)は1つの行、つまりtraining exampleです。ベクトルに変換するので転置を取りました。 % 最後に2mを割るだけです J = J / (2*m); end 実行した結果、cost functionの値は32.
Category: mongodb
Post
MacでMongoDBメモ
機械学習で大量のデータを扱いにはデータベースが欲しくなります。SQLデータベースは設計が面倒なので今回はNoSQLのMongoDBを選択しました。
設定編 インストール $ brew update $ brew install mongodb データベースの保存先のディレクトリを作る $ sudo mkdir -p /data/db $ sudo chown -R 777 /data /data/dbはデフォルトなのでおすすめです。 777は多分危ないかもしれませんので、正しい権限を教えてください :bow:
起動 サーバー $ mongod クライエント $ mongo MongoDB shell version: 3.2.9 connecting to: test Welcome to the MongoDB shell. For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user > use mydb switched to db mydb > a = { content: "ほげほげ" } { "content" : "ほげほげ" } > db.
Category: nginx
Category: presentation
Post
Using Backbone.js on Rails
My simple demo to show how to integrate Backbone.js with Rails! Source code can be found here: https://github.com/vanhuyz/rails-with-backbonejs-example
Category: prml
Post
PRML - Chap 12: Continuous Latent Variables - 12.2.3 ~ end
12.2.3 Bayesian PCA Graphical model cho Bayesian PCA được biểu diễn như sau: Ở đây ta đã đưa thêm Gaussian prior độc lập cho $\mathbf{W}$ với các precision $\alpha_i$:
Giá trị của $\alpha_i$ được tìm bằng cách maximizing the maginal likelihood:
Chú ý là để đơn giản ở đây ta coi $\mathbf{\mu}$ và $\sigma^2$ là các parameters chứ không đưa thêm priors cho chúng.
Sử dụng Laplace approximation, các $\alpha_i$ sẽ tìm được như sau:
Post
PRML - Chap 10: Approximate Inference - 10.1
Trong thực tế, tính toán trong không gian nhiều chiều của các hàm phức tạp (chẳng hạn trong EM là tính posterior và kỳ vọng của nó) là rất khó khăn nên người ta dùng phương pháp xấp xỉ.
10.1 Variational Inference Kí hiệu set của N i.i.d data là $\mathbf{X}=\{x_ 1, \ldots, x_ n\}$, tất cả latent variables là $\mathbf{Z}=\{z_ 1, \ldots, z_ n\}$. Mô hình của chúng ta sẽ là joint distribution $p(\mathbf{X},\mathbf{Z})$, và mục tiêu là đi tìm giá trị xấp xỉ cho posterior distribution $p(\mathbf{Z}|\mathbf{X})$ và model evidence $p(\mathbf{X})$.
Post
PRML - Chap 9: Mixture Models and EM - 9.3
9.3 An Alternative View of EM Mục đích của thuật toán EM là tìm maximum likelihood cho model có biến ẩn (latent variables). $\mathbf{X}$: dữ liệu quan sát được, $Z$: tất cả biến ẩn, $\mathbf{\theta}$: model parameters thì hàm log likelihood là:
$$ \ln p(\mathbf{X}|\mathbf{\theta}) = \ln \Big\{ \sum_ {\mathbf{Z}} p(\mathbf{X},\mathbf{Z}|\mathbf{\theta}) \Big\} $$
Vấn đề ở đây là vế phải là log của tổng nên cho dù giả sử $p(\mathbf{X},\mathbf{Z}|\mathbf{\theta})$ là hàm mũ thì cũng không thể tìm được nghiệm maximum likelihood (có thể tính thử đạo hàm để kiểm nghiệm :D).
Post
PRML - Chap 8: Graphical Models - 8.3
$ \def\ci{\perp\!\!\!\perp} \def\given{\ | \ } \def\nci{\perp\!\!\!\perp\!\!\!\!\!\!/ \ } \def\zeroslash{0\!\!\!/} $
8.3 Markov Random Fields Markov random field, còn gọi là Markov network hay undirected graphical model được biểu diễn bằng graph vô hướng.
8.3.1 Conditional independence properties Sử dụng graph vô hướng sẽ dễ kiểm tra tính chất độc lập có điều kiện của 2 biến hơn (conditional independence property). Chú ý là chỉ giống với phép thử d-separation trong trường hợp không có hiện tượng ’explaining away'.
Post
PRML - Chap 7: Sparse Kernel Machines 7.1.1 ~ 7.1.3
7.1.1 Overlapping class distributions Trong phần trước chúng ta đã giả sử là dữ liệu rất đẹp và tồn tại đường biên giới có thể chia được các class ra tách biệt với nhau. Tuy nhiên trong thực tế thì vì dữ liệu có noise nên nếu cố tìm đường biên giới để tách các class thì dễ dẫn đến overfit. Trong phần này, chúng ta sẽ xây dựng model mà cho phép 1 vài điểm có thể bị phân loại sai, vì mục đích chính là model chạy tốt trên tập test.
Post
PRML - Chap 6: Kernel methods - 6.4 Gaussian Processes
6.4.1 Linear regression revisited Thử xem xét lại model:
$$ y(\mathbf{x}) = \mathbf{w}^T\phi(\mathbf{x}) $$
với $\mathbf{x}$ là input, $y(\mathbf{x})$ là output, $\mathbf{w}$ là parameters, $\phi(\mathbf{x})$ là basis function.
Giả sử prior đối với $\mathbf{w}$ là 1 Gaussian đơn vị:
$$ p(\mathbf{w}) = \mathcal{N}(\mathbf{w}|\mathbf{0},\alpha^{-1}\mathbf{I}) $$
Trong thực tế, với training set $x_ 1,\ldots,x_ N$, ta quan tâm tới
$$ \mathbf{y} = \big(y(x_ 1),\ldots,y(x_ N)\big)^T = \mathbf{\Phi}\mathbf{w} $$
với $\mathbf{\Phi}$ là ma trận với mỗi phần tử là $\Phi_ {nk} = \phi_ k(x_ n)$ ($\phi_ k$ là gì thì chưa rõ, có thể sách in sai?
Post
PRML - Chap 5: Neural networks
5.5.3 Invariances Trong bài toán thực tế, nhiều lúc kết quả dự đoán không đổi cho dù đầu vào có nhứng biến đổi nhất định. Chẳng hạn trong bài toán phân biệt ảnh chó với ảnh mèo thì
còn mèo có nằm ở góc nào của ảnh thì vẫn là con mèo (translation invariance) kích cỡ ảnh hay con mèo có to nhỏ cỡ nào thì vẫn là con mèo (scale invariance) Dữ liệu mà có cực nhiều với đầy đủ các patterns thì máy có thể tự học được các thay đổi đó nhưng thực tế thì không như vậy.
Post
PRML - Chap 4: Linear Models for Classification
4.3.1 Fixed basis functions Bài toán là phân loại các input vector x Áp 1 hàm phi tuyến cố định $\phi(x)$ vào thì bài toán trở thành phân loại các $\phi(x)$ → đường decision boundary sẽ trờ thành tuyến tính → bài toán trở nên đơn giản đi rất nhiều 4.3.2 Logistic regression Thuật toán này rất quan trọng nên anh em cần chú ý hiểu kỹ Tên là regression nhưng lại là thuật toán classification Trở lại bài toán phân biệt 2 lớp: data set $\{\phi_ n, t_ n\}$ với $t_ n \in \{0,1\}$ và $n=1,\ldots,N$ Hàm likelihood trở thành $$ p(\mathbf{t}|w) = \prod_ {n=1}^N y_ n^{t_ n}{1-y_ n}^{1-t_ n} $$ với $\mathbf{t} = (t_ 1,\ldots,t_ N)^T$ và $y_ n = p(C_ 1 | \phi_ n)=y(\phi) = \sigma(w^T\phi)$ là xác suất để $\phi_ n$ rơi vào lớp $C_ 1$.
Post
PRML - Chap 3: Linear Models for Regression
The Evidence Approximation Trong Bayesian đối với linear model, ta đã thấy sự xuất hiện của $\alpha$ và $\beta$ là các hyperparameters của prior và noise.
Trong chương này, ta sẽ cố gắng tìm các giá trị này dựa trên maximizing the magrinal likelihood function.
Framework này được gọi là evidence approximation.
Theo công thức Bayes:
$$ p(\alpha, \beta|\mathbf{t}) \propto p(\mathbf{t}|\alpha,\beta)p(\alpha,\beta) $$
$p(\mathbf{t}|\alpha,\beta)$ là marginal likelihood function
Evaluation of the evidence function Marginal likelihood function có thể triển khai theo $\mathbf{w}$ như sau:
Post
PRML - Chap 2: Probability Distributions
2.3.3 Bayes’ theorem for Gaussian variables Tóm lại Nếu $p(x)$ và $p(y|x)$ đều là các phân phối chuẩn thì $p(y)$ và $p(x|y)$ cũng là các phân phối chuẩn.
Công thức: Giả sử
$$ \begin{align} p(x) & = \mathcal{N}(x|\mathbf{\mu}, \mathbf{\Lambda} ^{-1}\big) \\ p(y|x)& = \mathcal{N}\big(y|\mathbf{A}x+\mathbf{b}, \mathbf{L} ^{-1}\big) \\ \end{align} $$
thì
$$ \begin{align} p(y) & = &\mathcal{N}\big(y|\mathbf{A}\mu+b,\mathbf{L}^{-1}+\mathbf{A}\mathbf{\Lambda}^{-1}\mathbf{A}^{\mathrm{T}}\big)\\ p(x|y) & = &\mathcal{N}\big(x|\Sigma{ \mathbf{A}^{\mathrm{T}}\mathbf{L}(y-b)+\mathbf{\Lambda}\mu},\Sigma\big) \end{align} $$
với
$$ \Sigma = (\mathbf{\Lambda}+\mathbf{A}^{T}\mathbf{L}\mathbf{A})^{-1} $$
2.3.4 Maximum likelihood for the Gaussian Data set
Post
PRML - Chap 1: Probability Theory
Ví dụ Có 2 hộp: Đỏ, Lam Có 2 loại quả: Táo(màu lá), Cam(màu cam)
Chọn 1 hộp bất kỳ rồi bốc 1 quả bất kỳ trong hộp đó
Biến ngẫu nhiên (Random variable) B: hộp, có thể nhận 1 trong 2 giá trị r(đỏ), b (lam) F: quả, có thể nhận 1 trong 2 giá trị a(táo), o (cam)
Ký hiệu xác suất Giả sử xác xuất chọn hộp đỏ trong 2 hộp là 4/10
Category: ruby on rails
Category: soft skills
Category: study
Post
Đánh giá một số trung tâm học tiếng Anh giao tiếp ở Nhật
Mở đầu Người Nhật vốn nổi tiếng không nói được tiếng Anh nhưng gần đây khi mà các công ty Nhật bắt đầu coi trọng vấn đề “toàn cầu hoá” thì tiếng Anh lại trở thành 1 trong kỹ năng rất được săn đón. Chính vì thế mà các trung tâm tiếng Anh giao tiếp (英会話) cho người đi làm mở ra khá rầm rộ với nhiều hình thức khác nhau.
Category: tensorflow
Post
AnacondaによるTensorFlowインストール手順
Anacondaによるインストールは大変楽という噂がありますので試してみました。 AnacondaはデフォルトNumPy、 Pandas、 SciPy、 Matplotlib、 Jupyterなどが入っています。 他のパッケージ、例えばTensorFlow、 OpenCVも簡単にインストールでき、pyenv/virtualenvがいらなくなるのでおすすめです。
環境: Ubuntu 16.04 Anacondaインストール スクリプトダウンロード URL変える可能性があるのでまずHP確認してください。 https://www.continuum.io/downloads#linux $ wget https://repo.continuum.io/archive/Anaconda3-4.2.0-Linux-x86_64.sh スクリプト実行 $ bash Anaconda3-4.2.0-Linux-x86_64.sh $ source ~/.bashrc TensorFlowインストール 詳細はこちら https://www.tensorflow.org/get_started/os_setup#anaconda_installation
$ conda create -n tensorflow python=3.5 condaコマンドでインストールできるのは現在CPUバージョンだけです。GPUインストールしたい場合はpipでインストールしてください。
$ source activate tensorflow $ conda install -c conda-forge tensorflow 確認:
$ python Python 3.5.2 |Continuum Analytics, Inc.| (default, Jul 2 2016, 17:53:06) [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux Type "help", "copyright", "credits" or "license" for more information.
Category: til
Post
MeCabに人名辞書を追加
生成された辞書(バイナリ)はどこでも使えますので、辞書生成はMac側で行います。
インストール $ brew install mecab mecab-ipadic 構成 ## /usr/local/Cellar/mecab └── 0.996 ├── AUTHORS ├── COPYING ├── ChangeLog ├── INSTALL_RECEIPT.json ├── NEWS ├── README ├── bin │ ├── mecab │ └── mecab-config ├── include │ └── mecab.h ├── lib │ ├── libmecab.2.dylib │ ├── libmecab.a │ └── libmecab.dylib -> libmecab.2.dylib ├── libexec │ └── mecab │ ├── mecab-cost-train │ ├── mecab-dict-gen │ ├── mecab-dict-index │ ├── mecab-system-eval │ └── mecab-test-gen └── share └── man └── man1 └── mecab.
Post
Elasticsearchのbool queryを利用してAND OR NOTを書いてみる
※ この記事をQiitaにも載せました!
初めてElasticsearchのクエリをビルドしたのでいろいろハマりました。SQLの世界観とちょっと違っていて、なれるまで時間がかかると思います。でも、なれたら複雑な検索条件をSQLより簡単に書けるかも知れません。
では、Elasticsearchの基礎クエリの一つ、Bool Queryを解説してみます。
Bool Queryについて Elasticsearch 2.0からandクエリとorクエリは全部非推奨になり、その代わりにboolクエリの方が推奨されます。Boolクエリは複数のクエリを組み合わせる(つまりAND、OR、NOTで結合)のに使います。
Boolクエリは4種類があります:must、 filter、 should、 must_ notです。
クエリ 説明 must ANDとして使います。小クエリは総合スコアに影響を与えます filter mustと同じくANDです。ただし、スコアは無視されます(総合スコアに影響を与えません should ORとして使えます。 minimum_should_match パラメータで最低マッチする条項の数が指定できます[^n]。 must_ not NOTです。 使用例 AND条件 例えば、SQLはこういうSELECT文があります。
SELECT * FROM users WHERE age >= 25 AND salary >= 500000; Elasticsearchのクエリに書き直すと、
{ "query": { "bool" : { "must" : [ { "range" : { "age" : { "gte": 25 } } }, { "range" : { "salary" : { "gte": 500000 } } } ] } } } になります。今回はmustを使いますが、スコア無視したい場合はfilterを使えばいいのです。
Post
メンテナンス本格入門のまとめ
メンテナンスは必要? メンテナンスなんてない方がよい それでも行う必要があるとき 歴史的かつ技術的な負債 作業難度のトレードオフ メンテナンスの種類 計画メンテナンス 事前に計画し、ユーザー告知を行って作業を行う。これに当たる主だった作業としては
ハードウェアの保留/入れ替え データベースの設定変更 ネットワークの保留 手順:
作業手順作成 事前準備:Sorryサーバーの準備 テスト環境での予行演習 作業実施:作業チェック、問題発生時の対処 確認作業:モニタリング、作業の振り返り 緊急メンテナンス 障害が発生した場合などに原因を解決/追求品ケラバサービス継続が難しい場合などに行う。内容は
障害復旧 障害の現状保存 障害の詳細調査 手順
障害検知 原因調査 メンテナンス判断 作業実施 確認作業 振り返り・ノウハウ化 その他:ユーザーへ告知、補償 メンテナンスの手法 全停止メンテナンス 一部停止メンテナンス 無停止メンテナンス メンテフリーへのアプローチ メンテフリーとはサビースを停止せずメンテナンスを行う。そのためには、設計、構築、運用のすべての段階で「いかにSPOFをなくし、システム停止せずに作業できるか」を考え続ける必要がある。アプローチは様々あるが、弊社に適したものは以下にあげられる。
Webサーバー、アプリケーションサーバー ロードバランサによって複数のサーバーにアクセスを振り分け、2台以上用意する。Apache/Nginx・アプリケーションサーバーの設定変更や再起動といった作業でユーザーに影響があるシステム構成いなっているものは好ましくない
データベース設計: スキーマ変更の頻度高いサービスはMongoDBへ RDBの場合はマスタスレーブ構成やマスタ分割、スキーマ変更のコストを下げる。MySQLの場合はオンラインスキーマ変更がある リリース: ロードバランサ切り離しによるリリース:ロードバランサからアプリケーションサーバーを分離し、1台ずつアプリケーションを入れ替えていく。Jenkinsなどでサーバーに順次デプロイしていくと良い 系切り替えによるリリース:稼働系と待機系の2系統を準備し、ロードバランサでクライアントの向き先を切り替えてリリースする ホットデプロイによる動的リリース:アプリケーションを再起動せずにモジュールを更新する機能。UnicornやPumaなどはこの機能がある(と書いてある) カナリアリリース:一部のユーザーから徐々に新バージョンのアプリケーションを適用していく手法。FacebookやGoogleの大規模サービスはこの方法でデプロイされている 結論 サービスの種類・規模や原因によって様々なパータンがある。いつ起こるのもわからない。そのため、監視ツールを導入や毎日心構えが必要である(エンジニアの辛い道)
Post
Fluentd導入してからエラーログを全部Slackに通知する
やりたいこと サーバーが落ちるときすぐ管理者に通知する
設計イメージ Fluentdで全部のエラーログをまとめてSlackに送信する。
Fluentd導入 Fluentdとは ログ収集ミドルウェアである。Fluentdにインプットされた、すべてのログをJSONに変換し、アウトプットする。
Fluentdのインストール (Ubuntu 14.04) 事前準備 ntpをインストールする $ sudo apt-get install ntp ファイルディスクリプタの上限を増やす 現在のファイルディスクリプタ数を確認
$ ulimit -n 1024 もし1024なら不十分なので上限を増やす。/etc/security/limits.conf に以下の行を追加する
root soft nofile 65536 root hard nofile 65536 * soft nofile 65536 * hard nofile 65536 編集終わったらマシン再起動
$ sudo reboot もう一度確認
$ ulimit -n 65536 Fluentdのインストール $ curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh 起動するときFluentd(td-agent)を自動に起動
$ sudo update-rc.d td-agent defaults Slackへ連帯 FluentdのSlackプラグインをインストールする $ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-slack SlackのWebhookを登録 https://yourteam.
Post
Railsで論理削除を考慮するunique制約のかけ方
使用バージョン Rails 4.2.0 Ruby 2.2.0 MySQL 5.6 論理削除のgem: paranoia 2.1.0 目的 例えばこういうuserモデルがあります
# 20150119070756_create_users.rb class CreateUsers < ActiveRecord::Migration def change create_table :users do |t| t.string :name, :limit => 20 t.datetime :deleted_at # <- 論理削除 t.timestamps null: false end end end 注意したいのはdeleted_atコラムは削除した日付です。デフォルトだと、
非削除レコードはdeleted_at IS NULL 削除済みレコードはdeleted_at IS NOT NULL 問題: もしnameをunique制約をかけると、削除済みレコードはそのままデータベースに残るので同じnameのレコードを追加することができません。
目的: 非削除レコードの中でnameをunique制約したい。
ネットで調べるとハマる人が少なくないようです。 今回はデータベースレベルとアプリケーションレベルの両方設定します。
作業内容 まずdeleted_atはNULLだとunique複合キーを設定するのも意味ないのでNULLを避けます。
設定ファイルparanoia.rbを作る # config/initializers/paranoia.rb Paranoia.default_sentinel_value = DateTime.new(0) 以上の1行だけで、
非削除レコードはdeleted_at = '0000-01-01 00:00:00' 削除済みレコードはdeleted_at != '0000-01-01 00:00:00' になります。これで、unique複合キーを設定することができます。
Post
MySQLで大量のデータを挿入して、SELECTパーフォマンスを比較する
大量のデータを扱う機会があるため、データが非常に多いときMySQLのパフォーマンスはどうなるかを検討した。
検討するテーブル: 検討したいquery: SELECT * FROM activity_records WHERE date BETWEEN '2014-01-01' AND '2014-04-10'; なのでdateコラムにindexをつけた。このテーブルに5億ぐらいのレコードがあるとき、レスポンス時間はどのぐらいなのか検討したい。
環境: SSD: 256GB
テーブルに5億レコードを挿入する この記事は大変参考になりました:Mass inserting data in Rails without killing your performance
単純の(5*10**8).times { Model.create(options) }なら20日間がかかるのに対し、1つのINSERTを大量のデータをまとめ(bulk insertと呼ばれる)すると10時間しかかからない。
最終のrakeタスクのコードは以下となる
# insert_data.rake namespace :insert_data do desc "Insert dummy activity records" task run: :environment do TOTAL_RECORDS = 500000000 RECORDS_PER_TIME = 50000 CONN = ActiveRecord::Base.connection start_time = Time.now (TOTAL_RECORDS/RECORDS_PER_TIME).times do |i| inserts = Array.new RECORDS_PER_TIME.times do |j| date = (Time.
Post
API開発用必要なGemのまとめ(2015/08更新)
初めてRailsプロジェクトに入ったとき、Gemfileを見ても全くわからなかった。Rails初心者のため必要なGemをまとめました。良いGemを発見したらどんどん更新していこうと思います。
2015/08/13時点
データベース関連 mysql2 MySQLアダプタ MySQLを使うなら必須 redis Ruby client library for Redis cache, session保存用 ar-octopus レプリケーション (master+slave管理) switch_point (※ 2015/08/13追加) ar-octopusの代替。機能はar-octopusまで高くないが、master+slave切り替えぐらいなら十分 paranoia 論理削除 API grape REST API生成 grape-entity grapeのサーポート レスポンス(json)を簡単に記述できる grape-swagger grapeのサーポート Swaggerドキュメントを生成する kramdown grape-swaggerのサーポート markdownパーサー rack-cors Cross-Origin Resource Sharing (CORS)をハンドリング Swaggerを別のサーバーに置く場合はこれが必須 kaminariまたはgrape-kaminari APIのページネーション テスト rspec-rails テストフレームワーク capybara (※ 2015/08/13追加) Websiteのテストフレームワーク shoulda-matchers (※ 2015/08/13追加) モデルテストに便利 spork-rails テストの実行時間を短縮してくれる factory_girl_rails テストデータを用意する database_cleaner FactoryGirlにて作成するテストデータを、テストを実行する度に消去する turnip (※ 2015/08/13追加) Rspecの中にCucumber風コードを書ける capybara-screenshot (※ 2015/08/13追加) Capybaraのテストが失敗したら自動的にスクリーンショートを撮る ユーザ認証 devise ユーザ登録・ログインまで全てやってくれる 管理画面 activeadmin 10分で作れる管理画面 Push通知 houston iOSデバイスにpush通知を送る定番のgem invalid tokenが混じると通知が届かないバグがある(2014/12) parse-ruby-client (※ 2015/08/13追加) Parseと連携 バックグラウンド処理 sidekiq バックグラウンドworkerの定番 sucker_punch (※ 2015/08/13追加) Sidekiqはredisが必須なのでインフラコストが上がる。メールをバックグラウンドで送るぐらいならsucker_punchの方が軽い whenever Cron jobs管理 画像関連 carrierwave 画像アップロードの定番 paperclip (※ 2015/08/13追加) これも画像アップロードの定番 fog carrierwaveのサーポート S3にアップロード rmagick 画像処理(サイズ調整、角丸など)に便利 デプロイ用 unicorn 本番用のWebサーバー 設定は面倒 capistrano 有名なデプロイツール capistrano-rails db migrateとassets compileタスクを用意する capistrano-rbenv デプロイ先にrbenv使ったらこれが必要 capistrano3-unicorn デプロイした後unicornを再起動してくれる Ubuntu14.
Post
Docker経由Swagger UIを入れてみた
はじめに 目的:SwaggerUIを開発環境に入れて、Railsと組み合わせたい Railsのswagger-ui gemもありますが、あれはSwaggerUIが古い。最新版のSwaggerUIを使いたい。 手動で構築するのがちょっと面倒だから、Dockerを使って入れてみた
作業 Docker HubにSwagger UIを探してこういうイメージを見つけた
https://registry.hub.docker.com/u/capoferro/swagger-ui/
capoferro / swagger-ui Simple docker container to serve the Swagger UI
インストールする方法は以下となります
イーメジをpullする $ docker pull capoferro/swagger-ui コンテナを起動する $ docker run -d -p 4567:80 capoferro/swagger-ui このコマンドはSwaggerUIコンテナの80ポートをホストマシンの4567ポートに紐付ける
ブラウザにboot2dockerマシンのIP(普通192.168.59.103)のポート4567をアクセスするとSwaggerの画面が出てくる これでSwaggerUIのインストールが成功した。
最後にRailsのアプリを紐付けること:
動いているSwaggerコンテナのIDを確認する ( $ docker ps) 今回コンテナIDは859502ad6704がわかりました。
SwaggerUIコンテナに入る $ docker exec -i -t 8595 /bin/bash (8595はコンテナIDの先頭4文字です。コンテナIDを指定するとき先頭3,4文字でも動くはず)
index.htmlの中にurlのところにデフォルトURLをRailsのswagger_docパスに変更する: viでもいいですが、キーボードがおかしかったのでsedを使いました $ sed -i "s@http://petstore.swagger.wordnik.com/api/api-docs@http://192.168.59.103:3000/api/swagger_doc@g" index.html 終わり!
まわりの話 SwaggerUIイメージのソースコード: https://github.com/capoferro/swagger-ui-docker
Dockerfileをみてわかるように、このイメージはUbuntuベース、nginx上にSwaggerUI動くという形です。SwaggerUIは公式のgithubをプルするので最新版になっているだろう。
Post
Docker + Figを使ってRailsの開発環境を構築する
前回はDockerで構築したアプリを使うのを述べました。今回は実際どうやってそのRailsアプリを構築するのかを紹介します。
構築したい環境 Ruby 2.2 Rails 4.2.0 MySQL Redis シナリオ 以上の条件でコンテナを3つ準備します。
web : Railsアプリ。もちろんRubyが入ってるので今回はofficial ruby imageをベースにコンテナを作ります db : official MySQL imageを採用します redis: official Redis imageを採用します 気づいたのは使った3つのofficial imagesは全部Debian (Ubuntuと似ているLinux OS)です。違うOSでも問題ないでしょう。
webコンテナのDockerfile
# Docker hubのruby imageをpullする。2.2.0を指定 FROM ruby:2.2.0 MAINTAINER vanhuyz # 必要なパッケージをインストール RUN apt-get update -qq && apt-get install -y build-essential libpq-dev # myappディレクトリーをwebコンテナに作成 RUN mkdir /myapp # RUN, CMDのworking directoryを指定 WORKDIR /myapp # hostマシンのGemfileをwebコンテナにコピーする ADD Gemfile /myapp/Gemfile # webコンテナにbundle installを実行 RUN bundle install # 生成されたファイルをwebコンテナにコピーする ADD .
Post
魔法のDockerを使ってみよう
前回はDockerをインストールするまで記述しました。今回は実際Dockerで構築したRailsアプリを動かしましょう。
前提 Mac OS Xにboot2dockerが起動された状態、またはLinuxにDockerインストール済み
作業 まずFigというコンテナ管理ツールをインストールします $ curl -L https://github.com/docker/fig/releases/download/1.0.1/fig-`uname -s`-`uname -m` > /usr/local/bin/fig; chmod +x /usr/local/bin/fig 次に構築したRailsアプリをcloneします $ git clone git@github.com:vanhuyz/rails-docker-test.git $ cd rails-docker-test 最後にfig up するだけで $ fig up 完了!
構築したRailsアプリの確認 (Yosemite編) 僕のRails環境は以下のように構成されています
Ruby 2.2 Rails 4.2.0 MySQL Redis では構築できた環境を確認しましょう!
まずboot2docker仮想マシンのIPを確認します。
Vans-MacBook-Air:~ vanhuy$ boot2docker ip 192.168.59.103 webコンテナは3000ポートに紐付いているのでブラウザから192.168.59.103:3000にアクスセスしてみると
やった!ちゃんとRailsの初期画面が出ています。
次にmysqlの確認:
Vans-MacBook-Air:~ vanhuy$ mysql -h 192.168.59.103 -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g.
Post
Dockerをインストールする(Yosemite編)
Docker導入する理由 開発環境を一気構築できる コンテナ型仮想化なので軽い Vagrant/Chefより学習コストが低い 小さいコンテナから構成されるので安定性が高まる Amazon EC2 Container Serviceが発表されたから本番構築でも可能に! Yosemiteにインストールしてみよう インストール方法は非常に簡単です。
Boot2dockerパッケージをダウンロードする ダウンロードしたパッケージをダブルクリックしてインストールする Boot2Dockerアプリを起動する どのターミナルにも使いたい場合は以下のコマンドを~/.bash_profileに追加する $(boot2docker shellinit) 終わり! 参考:公式サイト
Boot2dockerを分解してみよう ではBoot2dockerは何が入っているのかを調べてみた。
VirtualBox:仮装化ソフトウェア Boot2Docker:小さいLinuxベースOS。DockerはLinuxベースで動作するから、Macに動作する場合は仮装マシンが必要。インストールできたらboot2docker-vmがVirtualBoxに入っているはず Boot2Docker Management Tool: Boot2Dockerの管理ツール。コマンドが充実。 $ boot2docker Usage: boot2docker [<options>] {help|init|up|ssh|save|down|poweroff|reset|restart|config|status|info|ip|shellinit|delete|download|upgrade|version} [<args>] $ boot2docker ssh # boot2docker仮装マシンにSSHする $ cat /proc/version Linux version 3.16.7-tinycore64 (root@064f0e1ce709) (gcc version 4.7.2 (Debian 4.7.2-5) ) #1 SMP Tue Dec 16 23:03:39 UTC 2014 Docker Client:dockerコマンドが使えるようになります。Dockerの使い方は本当に長くなりそうですから、以下は重要なコマンドをリストアップします $ docker # 全部コマンドが見られる $ docker version # dockerバージョンを見る $ docker search <string> # DockerHubにイメージを検索 $ docker pull <username>/<repository> # イメージをダウンロード $ docker run <username>/<repository> <command> ## コンテナの中にコマンドを実行する。例えば: $docker run learn/tutorial echo “hello” $ docker ps -l # 作ったコンテナのIDを調べる $ docker commit <ID> <username>/<new_repository> ## コンテナをイメージ化する $ docker inspect <ID> # コンテナの全部情報が見られる $ docker images # 現在のホストになんのイメージが入っているのか $ docker push <username>/<repository> # DockerHubにpushする 参考:Try Docker
Category: vietnamese
Post
Kinh nghiệm thi AWS Certified Machine Learning – Specialty
Tiếp theo kinh nghiệm thi chứng chỉ Solutions Architect - Associate lần trước thì lần này là chứng chỉ Machine Learning – Specialty. Để đạt được chứng chỉ này bạn cần có những kiến thức cơ bản về Machine Learning (ML), khả năng ứng dụng ML vào các bài toán thực tế cũng như sử dụng thành thạo các dịch vụ liên quan tới ML của AWS.
Các bạn có thể tham khảo câu hỏi mẫu tại đây.
Post
Kinh nghiệm thi chứng chỉ AWS Certified Solutions Architect – Associate
Giới thiệu chung AWS Certification là bộ chứng chỉ được câp bởi Amazon đánh giá mức độ hiểu biết về cloud (điện toán đám mây), cụ thể là các dịch vụ của Amazon Web Services (AWS) cũng như việc áp dụng các dịch vụ đó 1 cách hiệu quả vào trong các bài toán thực tế. Bộ chứng chỉ này được chia ra theo các vai trò là Cloud Practitioner, Architect, Developer, và Operations, ngoài ra cộng thêm Specialty.
Post
Tổng hợp hội thảo thường niên của các công ty công nghệ tại Tokyo
Thời điểm cuối năm cũ và đầu năm mới thường là lúc mà các công ty tổ chức hội thảo công nghệ (tech conference) vừa để giới thiệu dịch vụ hay “khoe” những thành quả trong 1 năm vừa qua vừa để thu hút nhân tài đến với công ty. Trước đây các công ty thường sắp xếp tổ chức cuối tuần để nhiều người tiện tham gia hơn nhưng gần đây thì lại có xu hướng chuyển qua tổ chức ngày thường.
Post
Lối đi nào dành cho các chuyên gia và kỹ sư AI?
Dưới đây là tổng hợp những suy nghĩ cá nhân của tôi về các thách thức và các lối đi cho chuyên gia cũng như kỹ sư phần mềm liên quan tới AI (trí tuệ nhân tạo).
Thách thức Hiện nay khi mà phong trào gọi là “Cách mạng công nghiệp 4.0” đang bùng nổ mạnh mẽ hơn bao giờ hết thì công việc liên quan đến AI cũng trở thành 1 trong những ngành nghề hấp dẫn nhất.
Post
Kinh nghiệm đổi bằng lái xe ô tô cấp tại Nhật sang bằng Việt Nam
Gần đây số lượng người Việt ở Nhật cũng nhiều và trong đó cũng có nhiều người học lái xe ô tô ở Nhật luôn. Tất nhiên mục đích chính vẫn là lái xe ở Nhật nhưng chắc nhiều bạn cũng băn khoăn không biết bằng Nhật có lái xe được ở Việt Nam hay không. Mình cũng đã tìm hiểu về cái này và được câu trả lời là:
Post
Đánh giá một số trung tâm học tiếng Anh giao tiếp ở Nhật
Mở đầu Người Nhật vốn nổi tiếng không nói được tiếng Anh nhưng gần đây khi mà các công ty Nhật bắt đầu coi trọng vấn đề “toàn cầu hoá” thì tiếng Anh lại trở thành 1 trong kỹ năng rất được săn đón. Chính vì thế mà các trung tâm tiếng Anh giao tiếp (英会話) cho người đi làm mở ra khá rầm rộ với nhiều hình thức khác nhau.
Post
Bàn chút về câu hỏi "Bạn là ai?"
Mới đọc xong quyển Homo Deus: A Brief History of Tomorrow của tác giả Harari thấy có 1 đoạn khá thú vị về cái gọi là “bản thân mình” (self) nên tổng hợp lại 1 chút về chủ đề này.
Mình vốn là người rất kém trong việc giới thiệu bản thân khi gặp 1 người mới, vì chính mình cũng không hiểu rõ mình là người như thế nào. Gần đây mới làm thử trắc nghiệm tính cách trên 16personalities thì ra kết quả là INTP - the logician, tạm dịch là nhà logic học.
Post
PRML - Chap 12: Continuous Latent Variables - 12.2.3 ~ end
12.2.3 Bayesian PCA Graphical model cho Bayesian PCA được biểu diễn như sau: Ở đây ta đã đưa thêm Gaussian prior độc lập cho $\mathbf{W}$ với các precision $\alpha_i$:
Giá trị của $\alpha_i$ được tìm bằng cách maximizing the maginal likelihood:
Chú ý là để đơn giản ở đây ta coi $\mathbf{\mu}$ và $\sigma^2$ là các parameters chứ không đưa thêm priors cho chúng.
Sử dụng Laplace approximation, các $\alpha_i$ sẽ tìm được như sau:
Post
PRML - Chap 10: Approximate Inference - 10.1
Trong thực tế, tính toán trong không gian nhiều chiều của các hàm phức tạp (chẳng hạn trong EM là tính posterior và kỳ vọng của nó) là rất khó khăn nên người ta dùng phương pháp xấp xỉ.
10.1 Variational Inference Kí hiệu set của N i.i.d data là $\mathbf{X}=\{x_ 1, \ldots, x_ n\}$, tất cả latent variables là $\mathbf{Z}=\{z_ 1, \ldots, z_ n\}$. Mô hình của chúng ta sẽ là joint distribution $p(\mathbf{X},\mathbf{Z})$, và mục tiêu là đi tìm giá trị xấp xỉ cho posterior distribution $p(\mathbf{Z}|\mathbf{X})$ và model evidence $p(\mathbf{X})$.
Post
PRML - Chap 9: Mixture Models and EM - 9.3
9.3 An Alternative View of EM Mục đích của thuật toán EM là tìm maximum likelihood cho model có biến ẩn (latent variables). $\mathbf{X}$: dữ liệu quan sát được, $Z$: tất cả biến ẩn, $\mathbf{\theta}$: model parameters thì hàm log likelihood là:
$$ \ln p(\mathbf{X}|\mathbf{\theta}) = \ln \Big\{ \sum_ {\mathbf{Z}} p(\mathbf{X},\mathbf{Z}|\mathbf{\theta}) \Big\} $$
Vấn đề ở đây là vế phải là log của tổng nên cho dù giả sử $p(\mathbf{X},\mathbf{Z}|\mathbf{\theta})$ là hàm mũ thì cũng không thể tìm được nghiệm maximum likelihood (có thể tính thử đạo hàm để kiểm nghiệm :D).
Post
PRML - Chap 8: Graphical Models - 8.3
$ \def\ci{\perp\!\!\!\perp} \def\given{\ | \ } \def\nci{\perp\!\!\!\perp\!\!\!\!\!\!/ \ } \def\zeroslash{0\!\!\!/} $
8.3 Markov Random Fields Markov random field, còn gọi là Markov network hay undirected graphical model được biểu diễn bằng graph vô hướng.
8.3.1 Conditional independence properties Sử dụng graph vô hướng sẽ dễ kiểm tra tính chất độc lập có điều kiện của 2 biến hơn (conditional independence property). Chú ý là chỉ giống với phép thử d-separation trong trường hợp không có hiện tượng ’explaining away'.
Post
PRML - Chap 7: Sparse Kernel Machines 7.1.1 ~ 7.1.3
7.1.1 Overlapping class distributions Trong phần trước chúng ta đã giả sử là dữ liệu rất đẹp và tồn tại đường biên giới có thể chia được các class ra tách biệt với nhau. Tuy nhiên trong thực tế thì vì dữ liệu có noise nên nếu cố tìm đường biên giới để tách các class thì dễ dẫn đến overfit. Trong phần này, chúng ta sẽ xây dựng model mà cho phép 1 vài điểm có thể bị phân loại sai, vì mục đích chính là model chạy tốt trên tập test.
Post
PRML - Chap 6: Kernel methods - 6.4 Gaussian Processes
6.4.1 Linear regression revisited Thử xem xét lại model:
$$ y(\mathbf{x}) = \mathbf{w}^T\phi(\mathbf{x}) $$
với $\mathbf{x}$ là input, $y(\mathbf{x})$ là output, $\mathbf{w}$ là parameters, $\phi(\mathbf{x})$ là basis function.
Giả sử prior đối với $\mathbf{w}$ là 1 Gaussian đơn vị:
$$ p(\mathbf{w}) = \mathcal{N}(\mathbf{w}|\mathbf{0},\alpha^{-1}\mathbf{I}) $$
Trong thực tế, với training set $x_ 1,\ldots,x_ N$, ta quan tâm tới
$$ \mathbf{y} = \big(y(x_ 1),\ldots,y(x_ N)\big)^T = \mathbf{\Phi}\mathbf{w} $$
với $\mathbf{\Phi}$ là ma trận với mỗi phần tử là $\Phi_ {nk} = \phi_ k(x_ n)$ ($\phi_ k$ là gì thì chưa rõ, có thể sách in sai?
Post
Thử code CycleGAN biến ảnh cam thành ảnh táo với TensorFlow
Giới thiệu về CycleGAN Trước hết mời các bạn xem video này:
Đây là thuật toán sử dụng Deep Learning để chuyển từ ảnh này sang ảnh kia mà vẫn giữ nguyên bố cục, chỉ thay đổi bề mặt của vật thể. Chẳng hạn chuyển từ ảnh ngựa thường sang ngựa vằn, chuyển ảnh cam thành ảnh táo, chuyển ảnh thành tranh… Không chỉ áp dụng với ảnh mà còn cả với video nữa, và như tác giả có nói là có thể realtime với video 60fps!
Post
PRML - Chap 5: Neural networks
5.5.3 Invariances Trong bài toán thực tế, nhiều lúc kết quả dự đoán không đổi cho dù đầu vào có nhứng biến đổi nhất định. Chẳng hạn trong bài toán phân biệt ảnh chó với ảnh mèo thì
còn mèo có nằm ở góc nào của ảnh thì vẫn là con mèo (translation invariance) kích cỡ ảnh hay con mèo có to nhỏ cỡ nào thì vẫn là con mèo (scale invariance) Dữ liệu mà có cực nhiều với đầy đủ các patterns thì máy có thể tự học được các thay đổi đó nhưng thực tế thì không như vậy.
Post
PRML - Chap 4: Linear Models for Classification
4.3.1 Fixed basis functions Bài toán là phân loại các input vector x Áp 1 hàm phi tuyến cố định $\phi(x)$ vào thì bài toán trở thành phân loại các $\phi(x)$ → đường decision boundary sẽ trờ thành tuyến tính → bài toán trở nên đơn giản đi rất nhiều 4.3.2 Logistic regression Thuật toán này rất quan trọng nên anh em cần chú ý hiểu kỹ Tên là regression nhưng lại là thuật toán classification Trở lại bài toán phân biệt 2 lớp: data set $\{\phi_ n, t_ n\}$ với $t_ n \in \{0,1\}$ và $n=1,\ldots,N$ Hàm likelihood trở thành $$ p(\mathbf{t}|w) = \prod_ {n=1}^N y_ n^{t_ n}{1-y_ n}^{1-t_ n} $$ với $\mathbf{t} = (t_ 1,\ldots,t_ N)^T$ và $y_ n = p(C_ 1 | \phi_ n)=y(\phi) = \sigma(w^T\phi)$ là xác suất để $\phi_ n$ rơi vào lớp $C_ 1$.
Post
PRML - Chap 3: Linear Models for Regression
The Evidence Approximation Trong Bayesian đối với linear model, ta đã thấy sự xuất hiện của $\alpha$ và $\beta$ là các hyperparameters của prior và noise.
Trong chương này, ta sẽ cố gắng tìm các giá trị này dựa trên maximizing the magrinal likelihood function.
Framework này được gọi là evidence approximation.
Theo công thức Bayes:
$$ p(\alpha, \beta|\mathbf{t}) \propto p(\mathbf{t}|\alpha,\beta)p(\alpha,\beta) $$
$p(\mathbf{t}|\alpha,\beta)$ là marginal likelihood function
Evaluation of the evidence function Marginal likelihood function có thể triển khai theo $\mathbf{w}$ như sau:
Post
PRML - Chap 2: Probability Distributions
2.3.3 Bayes’ theorem for Gaussian variables Tóm lại Nếu $p(x)$ và $p(y|x)$ đều là các phân phối chuẩn thì $p(y)$ và $p(x|y)$ cũng là các phân phối chuẩn.
Công thức: Giả sử
$$ \begin{align} p(x) & = \mathcal{N}(x|\mathbf{\mu}, \mathbf{\Lambda} ^{-1}\big) \\ p(y|x)& = \mathcal{N}\big(y|\mathbf{A}x+\mathbf{b}, \mathbf{L} ^{-1}\big) \\ \end{align} $$
thì
$$ \begin{align} p(y) & = &\mathcal{N}\big(y|\mathbf{A}\mu+b,\mathbf{L}^{-1}+\mathbf{A}\mathbf{\Lambda}^{-1}\mathbf{A}^{\mathrm{T}}\big)\\ p(x|y) & = &\mathcal{N}\big(x|\Sigma{ \mathbf{A}^{\mathrm{T}}\mathbf{L}(y-b)+\mathbf{\Lambda}\mu},\Sigma\big) \end{align} $$
với
$$ \Sigma = (\mathbf{\Lambda}+\mathbf{A}^{T}\mathbf{L}\mathbf{A})^{-1} $$
2.3.4 Maximum likelihood for the Gaussian Data set
Post
PRML - Chap 1: Probability Theory
Ví dụ Có 2 hộp: Đỏ, Lam Có 2 loại quả: Táo(màu lá), Cam(màu cam)
Chọn 1 hộp bất kỳ rồi bốc 1 quả bất kỳ trong hộp đó
Biến ngẫu nhiên (Random variable) B: hộp, có thể nhận 1 trong 2 giá trị r(đỏ), b (lam) F: quả, có thể nhận 1 trong 2 giá trị a(táo), o (cam)
Ký hiệu xác suất Giả sử xác xuất chọn hộp đỏ trong 2 hộp là 4/10
Post
Tôi đã tự học Deep Learning như thế nào
Nhân dịp TensorFlow vừa kỷ niệm 1 năm open source, mình viết bài này để kể lại 1 năm qua mình đã tự học Deep Learning như thế nào, vừa để tự tổng hợp kiến thức, vừa để cho các bạn nào quan tâm đến Machine Learning nói chung cũng như là Deep Learning nói riêng tham khảo.
Mình là 1 kỹ sư bên server-side, công việc chủ yếu dùng Rails, SQL và hoàn toàn không liên quan gì đến Deep Learning.