vanhuyz's notes

Posts

November 13, 2016

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.
November 3, 2016

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から使えないです。
August 31, 2016

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.
August 25, 2016

Effective DevOpsについて

Effective DevOpsという書籍を読んだのでまとめてみました!
June 8, 2016

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.
April 25, 2016

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を使えばいいのです。
April 18, 2016

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$) から計算します。
March 14, 2016

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)を調整するパラメータです。 一般的に,
February 21, 2016

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)), .
January 31, 2016

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$で記号すると、以下のようになります(予想です。僕がまだ証明しません。でも結果は正しいので合っているでしょう)
  • ««
  • «
  • 2
  • 3
  • 4
  • 5
  • 6
  • »
  • »»
© vanhuyz's notes 2025