FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

EMアルゴリズムの勉強(「機械学習理論入門」を読む)

ITエンジニアのための機械学習理論入門

ITエンジニアのための機械学習理論入門

機械学習理論入門も、いよいよ終盤にさしかかってきた。EMアルゴリズムの章を無事に読み終えた。 といっても、もう一週間くらい前には読み終わっており、TensorFlowを使って再現しようとしていたのだが、日々の忙しさのせいでほとんど実装作業をすることができていなかった。 せめて、サンプルプログラムを実行してみようということで、付録のEMアルゴリズムのサンプルコードを動作させてみることにする。

何ぶん機械学習初心者なので、間違ったことを書いているかもしれません。間違っていればご指摘頂ければ幸いです。

EMアルゴリズム

教師なし学習のモデルで、本章では例によってMNISTの手書き文字認識を、教師が存在しない中でどのようにして実装するかについて書かれている。

k平均法を既に学んでいれば、その考え方は非常に分かりやすい。k平均法は、例えば2次元上の点を2種類に分類する場合、

  • 1と2のグループがあった場合、どちらのグループの中心に近いか
  • 近い法のグループに配属し、同じグループの配属された中で再度平均を取ってグループの中心を算出する。
    1. に戻って、どちらのグループに近いかを判定する。

これは非常に分かりやすかった。実際、TensorFlowでも実装することができた。

msyksphinz.hatenablog.com

k平均法の場合は、どちらのグループに属しているかははっきりしている。つまり0か1のどちらかだ。一方で、EMアルゴリズムは、どちらのグループに存在しているのかは確率で表現される。これが違いのように思われた。 つまり、K種類の文字に識別しなければならない場合、ある特定の手書きの文字は、K種類のグループのうちどのグループに存在しているかを確率で表現する。もちろん、K種類の確率の総和は1だ。

{
\sum_{k=0}^K \pi_k = 1
}

ここで、{\pi_k}はk番目の画像生成器を選択する確率だ。k平均法が確率的に中間値がとられる可能性があるとして、発展させたものがEMアルゴリズムというように理解した。あっているかな?

サンプルプログラムを動作させて試してみる

という訳で、さっそく本書のサポートページで配布されているPythonのコードをダウンロードして実行してみた。

run 07-prep-data.py
run 07-em-mix.py

実行結果は以下だ。何故か途中で固まってしまった。Windowsでやったからかなあ?

f:id:msyksphinz:20151211005120p:plain

とりあえず、TensorFlowでの再現は叶わなかったものの、大体のアルゴリズムについては納得できた気がする。この調子で、どんどん終わらせていこう。