DNNの基礎知識についてのまとめ
深層ニューラルネットの訓練
今回は、深層ニューラルネットワーク(以下DNN)の問題点を挙げ、その解決法を示します。
勾配消失/爆発問題
勾配消失
勾配降下法による更新では下位層の接続の重みがほとんど変わらず、訓練が良い解に収束しなくなること
勾配爆発
逆に勾配がどんどん急になり、多くの層の重みが更新によって膨大になり、アルゴリズムが発散してしまうこと → 層によって学習速度が大幅に変わってしまう
- 理由
Xavierの初期値とHeの初期値
信号を適切に流すために、各層の入出力の分散を等しくする必要があり、層を通過する前後の勾配の分散も等しい必要がある
活性化関数
- ReLU(ランプ)関数
深層ニューラルネットで主に使用される
バッチ正規化
訓練中に前の層のパラメータの変化に伴い、各層の入力分布が変化する問題(内部共変量シフト)に対処するためのテクニック
各層の活性化関数を実行する直前に、入力の0を中心とするセンタリングと正規化を行い、層ごとに二つの新しいパラメータをそれぞれ使ってスケーリングとシフトを行う → 各層の入力の最適なスケールと平均をモデルに学習させる
勾配クリッピング
バックプロパゲーションステップでは勾配をクリッピングし、一定の閾値を超えないようにするテクニック ただ、一般にバッチ正規化の方が主流
プレトレーニング済み層の再利用
転移学習
既存のNNを探し、そのネットワークの下位層を再利用すること → 時間の大幅短縮、訓練データを減らせる
- 事前に訓練したモデルを復元するためのSaver
- 新しいモデルを保存するための別のSaver
model zoo
多くの人が様々なタスクのために機械学習モデルを訓練し、プレトレーニング済みのモデルを一般開放している
オプティマイザの高速化
Momentum最適化
それまでの勾配を重視
- ハイパーパラメータ β 0~1の値をとる(一般に0.9を用いる)
NAG(Nesterov Accelerated Gradient)
Momentum最適化の変種 元の位置の勾配ではなく、慣性の方向に少し進んだところで測定された勾配を使うことで、正確性が増した
AdaGrad
最も急な次元に沿って勾配ベクトルをスケールダウンする → パラメータの要素ごとに適応的に学習係数を調整しながら学習を行う手法 - 適応学習率(adaptive learning rate) 傾斜が急な次元では傾斜が緩やかな次元よりも早く学習率を下げる
ただし、学習率が大きく下がるため、全体の最適値に到達する前にアルゴリズムが止まってしまう
RMSProp
- Adaの問題点を解決 過去の全ての勾配を均一に加算していくのではなく、過去の勾配を徐々に忘れて、新しい勾配の情報が反映されるように加算 → 指数平均移動 : 指数関数的に過去の勾配のスケールを減少させる
Adam(adaptive momentum estimation)
- MomentumとRMSPropのアイデアの融合
- Momentum 過去の勾配の指数関数的減衰平均を管理
- RMSProp 過去の勾配の二乗の指数関数的減衰平均を管理
- ハイパーパラメータ
- 慣性減衰ハイパーパラメータ β1 : 0.9
- スケーリング減衰ハイパーパラメータ β2 : 0.999
学習スケジュール
高い学習率でスタートし、コスト低減のペースが下がったら学習率を下げる
- 部分ごとに一定の学習率をあらかじめ決めておく
- 性能によるスケジューリング
- 指数関数的スケジューリング
- 累乗スケジューリング
正則化による過学習の防止
早期打ち切り
検証セットに対する性能が落ち始めたところで訓練を中止する 通常、他の正則化手法と組み合わせる
l1, l2正則化
重みに制限を加える → コスト関数に正則化項を追加
ドロップアウト
DNNで最もよく使われている正則化テクニック(ただし、収束は大幅に遅くなる)
ニューロンをランダムに消去しながら学習する手法
入出力層と任意の隠れ層にtf.layers.dropout()
関数を適用
データ拡張
既存の訓練インスタンスから新しい訓練インスタンスを生成して人工的に訓練セットを膨らませる
実践的なガイドライン
今回は以下の書籍のDNNについてまとめました。次回はこの実践的なガイドラインに沿って実際にプログラムを動かしてみようと思います。
scikit-learnとTensorFlowによる実践機械学習
- 作者: Aurélien Géron,下田倫大,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/04/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る