PRML輪読2, 3日目

更新をサボっている間に3日目が終了しました。

進捗

2日目の範囲

  • 1-2-5:曲線フィッティング再訪
  • 1-2-6:ベイズ曲線フィッティング
  • 1-3:モデル選択
  • 1-4:次元の呪い

3日目の範囲

一章を読んで

1章通して、回帰問題やクラス分類問題に確率を導入する方法を学びました。たとえば、多項式のフィッティングなどに確率論を導入しました。

確率を導入する場合は、

  1. サンプルされたデータをもとに、ある値に対する出力の確率分布を求める
  2. 確率分布より値を決定する

という2ステップで値が決まります。

たとえば、多項式フィッティングをした場合近似関数f(x)が求まるので、
f(x=10) = 5
のように関数にxを代入してやれば答えが得られます。
確率を導入した場合は、まず確率分布p(t|x)が得られるので、
.
.
p(4|x=10) = 0.1
p(5|x=10) = 0.8
p(6|x=10) = 0.08
.
.
のように、x=10の点での値の確率分布がまず得られて、この確率をもとに
x=10のときは5
と値を決めます。

確率を導入するメリット

確率を導入する目的として、そもそも過学習などの問題を解決するという目的はあったのですが、他にも

  • 外部要求であまり間違えて欲しくない間違え方がある場合、確率に補正を加えるという簡単な方法で対応できる(リスク最小化)
  • 値決定の妥当性が確率で出ているため、決定が難しい値を決めずに判断を人力に委ねることができる(棄却オプション)
  • 識別したいデータが母集団の中で十分に少ない時、そのまま学習データとして用いると精度が全く出ない可能性があるが、確率で出すなら識別したいデータを抽出し、学習した後確率を補正する方法で精度を得ることができ、また容易に補正できる。

など、いろいろと確率という情報があることによってできることがあることを知りました。

情報理論については、各種エントロピーがどのように取り扱われているのかがわからないので理解は甘いのですが、話としては定性的な情報量の議論からそれを支えるロジックとしてミクロカノニカル分布を導入しての説明があったのでしっかりしているなという印象を受けました。情報量についても確率が小さいほど大きく、また独立な事象は足し合わせることができる、という要求のもとに一番シンプルな関数を定義しているのかな、という筋道がしっかり立っていたのでよくわかった感じがします。
内容に関しては、情報理論におけるエントロピー統計力学と異なり、1要素あたりのエントロピーエントロピーとして扱うのだということを確認しました。あとボルツマン定数も付いてない。

式展開をしっかり追うために、演習を解きたいと思いつつ、ひとまず全体の展望を見るために先に進むことにしました。

ChainerのサンプルのMNIST学習が動かなかった(修正済み)

 
追記(2015/7/3 12:10)

Twitterで@unnonounoさんからレスポンスをいただき、すぐに修正していただきました!以後は普通に

python chainer/examples/mnist/train_mnist.py

を実行すれば実行可能です!

 

また、このtrain_mnist.pyですが、デフォルトでCPUのみで計算をします。--gpu=0等のオプションをつけるとGPUで計算してくれます。

参考

cvl-robot.hateblo.jp

 

 
 
結論から先に行うと、最新のサンプルでは、データダウンロード用のコードを先に実行する必要があります。
python chainer/examples/mnist/download_convert.py
を実行してから
python chainer/examples/mnist/train_mnist.py
を実行してください。
 
 

DIGITSでぶんまわして遊んだので、そろそろ手入れて遊びたいとChainerをインストールしました。

インストールまではよかったよですが、最後、サンプルのMNISTを学習させる
chainer/examples/mnist/train_mnist.py
が動かない。どうやらmnistの画像がないらしい。
あれ?自分で用意するのかなとか思ったけど、ググっても特にそんな記述はない。
探しているうちにtrain_mnist.pyがデータのダウンロードまでしてくれるとのこと。
 
 

hi-king.hatenablog.com

mnist = fetch_mldata('MNIST original')

上のブログによると、どうやらこれがダウンロードに関係しているらしい。

ところが、手元のコードでこの記述を探すとそもそもfetch_mldataという記述がない。

あれっと思いgithub見に行くと

f:id:sora_sakaki:20150703083942j:image
 
これですね。
Remove dependency on scikit-learn's fetch_mldata
このコミットでダウンロードするスクリプトが追加されて、train_mnist.pyからダウンロードしなくなったようです。
README.mdの変更も時間の問題とは思うけど、今始める人は気をつけて。
 

学習でちょっとあそんでみた話

Juiz(先日作った我が家のディープラーニング用マシン)が無事起動して、セットアップを進める傍ら、Labellioというサービスを使って学習して遊んでみました。

Labellioで学習体験

このLabellioってサービスは、任意の画像を学習させて識別させるということを提供するクラウドです。
これがまたすごくて、何がすごいってとても簡単なんですよ。登録はgoogleアカウントでできて、その後の学習用のサンプルはなんとキーワードだけでBingから検索してきてくれる!全く知らなくても5分で遊べるサービスです。

実際昨日は昼休みに「ONEPEACE」「NARUTO」で学習させてマイナーキャラを食わせて識別できるかなどをやっていました。
たとえばこんな感じ。
f:id:sora_sakaki:20150702101222p:plain

あとニッチな話ですが絵師さんのkaroryさんとななろば華さんの絵が似てるという話があるのでそれも識別してみました。





というわけで、5分でやっつけた学習でしたが、わりと識別できました。余談ですがどちらの絵師さんも好きでタペストリとか集めてます。
ディープラーニングしようと環境を整えている自分ですが、実際に自分で画像を識別したのは初めてだったので楽しかったです。是非体験してください!

Juizの進捗

とりあえずCUDA, Caffe, DIGITSのインストールまで終わって無事MNISTの学習などができるようになりました。
それはそうと、DIGITSが落ちると再起動後すでに作成済みのモデルデータが一覧から消えて認識されないんですが、なにが原因なんですかね?