深層学習の超基礎知識を勉強した(学習に関するテクニック)
本当に久しぶりですが、ゼロから作るDeepLearningの6章、学習に関するテクニックを読んだときのメモを残します。 今年は継続的な勉強を頑張りたいです。継続は力なり。
- SGDとは、確率的勾配降下法のこと
- 勾配方向に向かう一番単純な方法
- stochastic gradient descent
- SGDは解く関数の形状が等方的でないと収束がうまくいかない
- x方向の勾配は急だけど、y方向の勾配が非常に緩い場合など
- このとき、勾配の方向が本来の最小値の方向を指しているとは限らない
- この辺が、ガウス・ニュートンだと解決されているのか?
- 自分の理解が正しければ、方向というよりは、収束点がわかっているイメージ
- 勾配降下法は学習率のパラメータが必要だけど、いらないということ
- 自分の理解が正しければ、方向というよりは、収束点がわかっているイメージ
- この辺が、ガウス・ニュートンだと解決されているのか?
- Momentum
- 収束に慣性を持たせる
- AdaGrad
- パラメータ毎に適応的に学習係数を調整する
- 各パラメータの勾配の二乗和(スカラー)を逐次的に足し合わせてその分だけ学習係数を小さくする
- 一回でも間違って大きく更新されてしまうとその後戻るステップが遅くなるみたいな性質を想像すると、結構イマイチな気がする
- RMSPropという方法の方が良さそう
- Adam
- MomentumとAdaGradの融合
- Qiitaなどをみていても、未だにAdamが鉄板だと思う。ライブラリでAdamを使えば良い
- 初期値はとりあえずランダムで良い?←あとから、ダメという話がある
- 何か学習済みのパラメータがあればそれを流用するのが良い
- 勾配消失問題
- 微分値が0になってしまうと、重みパラメータが更新できないという話
- シグモイドならば0付近と1付近
- 「表現力の制限」の問題は、逆にニューラルネットをコンパクトにしたい際に使用されている気がする
- 初期値について
- Xavierの初期値という考え方がある
- できるだけ偏りなく勾配消失しない形でアクティベーションされることを目指したのかな
- ところで、活性化関数に用いる関数は、原点対象であることが望ましい性質として知られているらしい
- 活性化関数にReLUを使う場合は、「Heの初期値」を用いると良い
- 考え方はほとんどXavierと変わらない
- Xavierの初期値という考え方がある
- Batch Nomalization
- 恥ずかしいことに、バッチノーマライゼーションとミニバッチ学習を混同していたが、全然違う
- ミニバッチ学習
- (ちょっとまだ自信がないが)ミニバッチ学習をせずに一つのデータだけで勾配を計算してしまうと、勾配方法が信用できなくなってしまうという話だと思う
- 100個とか適当にサンプリングしたデータの塊を全データの近似とみなすということは、勾配方向がそこそこだ正しいとみなすことかな?
- なので、ミニバッチ学習のサンプリング数は小さぎてはいけないと思う
- Batch Normalizationは、ニューラルネットにBatch Nomaizationレイヤを挿入する
- 角層でのアクティベーションの分布を適度な広がりになるように調整する専用の層を設計するということ
- ミニバッチごとに正規化を行う
- データの分布が平均が0で分散が1になるように正規化
- 逆伝播の解説は省略されていたが、定性的な理解をしたうえで、基本的にライブラリを信じれば良いだろう
- 過学習を抑制する手段として下の手法が有名
- Weidht decay
- 重みパラメータにペナルティをつける
- 割と昔からある考え方
- Dropout
- 訓練時に、わざとランダムに使用しないニューロンを設定する
- 擬似的に、アンサンブル学習を行っているという解釈になる
- Weidht decay
- 最近はBatch Normalizationの方が有力ということなんだろうか
- ハイパーパラメータの最適化
- 今後重要な領域だろうが、今は興味外なので省略
- ハイパーパラメータを遺伝的アルゴリズムで最適化とかあった気がする