PRML輪読4, 5日目

ディープラーニングとのギャップを感じて深層学習に浮気しつつも予定通り輪読も進めています。
また更新忘れていたので二日分のまとめ

進捗

4日目の範囲

  • 2 : 確率分布
  • 2-1 : 二値変数
  • 2-2 : 多値変数

5日目の範囲


さすがに1回1時間の輪読では全然計算をカバーできなくなってきて、大事だとおもったところの式展開を追いかけつつ流れを追うような感じで進めています。2章が終わったくらいで一通り計算して答え合わせ回みたいな回を作るかも....

ベイズのための確率分布

この章は1章で導入したベイズ理論のためにいろいろな確率分布を紹介しています。

重要な概念として、共役事前分布があり、このような性質を持つ分布は事前分布に使った時に事後分布も同じ形をとります。つまり、この分布を使えば簡単に次々と増えた情報を確率の補正に適用でき、また逆にこのような性質を持たない分布を使ってベイズ的な確率の取り扱いは困難でしょう。

ここまでの感触

まず導入として二項分布の拡張であるベータ分布などを押さえて、ガウス分布を取り扱いました。ガウス分布については、だいぶ線形代数の知識が求められて計算が重たくなってきました。
また、それぞれの分布が具体的にどの局面で使われるのかという対比がまだうまくできていないのでそこを考察する必要を感じています。なので2章が終わった後で考察してまとめます。

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の変更も時間の問題とは思うけど、今始める人は気をつけて。