[読書メモ] ゼロから作るDeep Learning: 第8章

O'Reilly Japan - ゼロから作るDeep Learning

ディープラーニング

  • 層を深くしたニューラルネットワーク
    • 3x3のフィルター
    • ReLU
    • 全結合の後にDropout
    • Adam
    • Heの初期値
    • 99%を超える認識精度
    • 間違っているのは人間も間違うようなもの
  • What is then class of this image?
    • MNISTに対する各手法のランキングがある
    • 1位はあまり層が深くない手法
    • 手書き数字認識という比較的単純な問題はディープになることの表現力を生かせない
  • Data Augmentation
    • 画像を変形して訓練データを増やす

層を深くする

  • 理論的にはあまり詳しいことはわかっていない
  • 画像認識のILSVRCなどディープラーニングが良い成績
    • 層を深くすると認識精度が上がる傾向
  • パラメータ数が少なくて済む
  • 表現力が増す
    • 活性化関数により非線形の力が加わる回数が増える
  • データが少なくて済む
  • 各層はそれぞれシンプルな問題に分解できる

高速化

  • ビット削減
    • 浮動小数点は16ビットで問題ない

歴史や最近のトレンドなどはメモするのを控える。

[読書メモ] ゼロから作るDeep Learning: 第6章

O'Reilly Japan - ゼロから作るDeep Learning

パラメータ更新手法

  • SGD
    • 確率的勾配降下法
    • 単純
    • やみくもにパラメータを探すよりは賢い
  • optimizer
    • SGDというクラスを作り、パラメータの更新はそこでやる
    • 入れ替え可能に
  • SGDの欠点
    • 関数によっては勾配方向に進むのがかなり非効率な場合がある
    • 等方的でない関数
  • Momentum
    • 運動量
    • 速度という概念を使い、物理法則に準じる動き
    • 等方的でない関数も効率的に
  • AdaGrad
    • パラメータの減衰
    • Adaptive、適応的
    • 学習係数をパラメータごとに調整
    • よく変化した要素は学習係数が小さくなっていく
  • Adam
    • Momentum x AdaGrad
  • どの更新手法がいい?
    • 得意な問題が違う
    • SGDはよく使われる
    • 最近はAdamが人気
    • MNISTの学習はAdaGradが得意

重みの初期値

  • 重みの初期値で学習の成否が分かれる
  • 小さい方がいい
    • 0にすればいい?
    • 重みが均一だと意味がない
  • 標準偏差1のガウス分布
    • 勾配消失
  • 標準偏差 0.01のガウス分布
    • 勾配消失は起きないが、偏りがある
    • シグモイド関数の表現力に制限
    • 複数のニューロンが存在する意味が薄れる
  • Xavierの初期値
    • 適度な広がり
    • 線形関数向け
  • Heの初期値
    • 非線形なReLU向け

Batch Norm

  • Batch Normalization
  • 各層のアクティベーションの分布を強制的に広がりを持つように焼成する
  • メリット
    • 学習が速い(学習係数を大きくできる)
    • 初期値にあまり依存しない
    • 過学習を抑制できる

正則化

  • 過学習の原因
    • パラメータが大量で、表現力の高いモデル
    • 訓練データが少ない
  • Weight decay
    • 荷重減衰
    • 大きな重みにペナルティを課すことで過学習を抑制
  • Dropout
    • Weight decayは実装簡単だが、複雑なモデルへの対応は困難
    • 訓練時にランダムにニューロンを消去
    • テスト次じ消去した割合を乗算

ハイパーパラメータの検証

  • テストデータで調整してはダメ
    • テストデータで過学習してしまう
  • 検証データ
    • ハイパーパラメータの良さを評価するためのデータ
    • MNISTの場合は訓練データから20%ぐらい先に分離しておく
    • データに偏りが出ないようにシャッフルしておく

TODO

  • SGDを別クラス化 → 済
  • ハイパーパラメータの検証

[MySQL] rootなのにGRANTできない

MySQLの5.1を間違えて入れたあと、すぐ5.5にして、mysql_upgradeを叩いていなかったという凡ミス…。

参考:mysqlで適切な権限があるにも関わらずgrant文でエラーが出た場合の対処法 | Skyarch Broadcasting

PyCallで手書き数字認識のWebアプリ

一応動くところまで。
https://pycall-mnist.herokuapp.com

GIFではうまく言ってるようにみえるけど思ったより認識精度よくない。
参考アプリでは結構入力の画像をいじってたのでその辺りの工夫が必要かも。

参考

PyCallでMNISTの実データを使った学習・推論

今までは100個のサンプルデータとかでやってたんだけど、概ね動いてきたので実データで。

学習

https://github.com/oreilly-japan/deep-learning-from-scratch/blob/master/ch04/train_neuralnet.py とほぼ同じ処理をしているはず。

$ ruby train.rb 0 10000 100 data/params.json
10000 / 10000
      user     system      total        real
351.320000  38.590000 389.910000 (183.712062)

3分ぐらいかかった。

結果はいい感じ。

推論

$ ruby predict.rb 
7 == 7: o
2 == 2: o
1 == 1: o
0 == 0: o
4 == 4: o
1 == 1: o
4 == 4: o
9 == 9: o
6 == 5: x
9 == 9: o
      user     system      total        real
  0.040000   0.000000   0.040000 (  0.020253)

こちらは全然時間かからず。精度も大丈夫そう。