Deep Learning 脱初心者めざして

主にDeepLearningや画像処理について扱います

DNNの基礎知識についてのまとめ

深層ニューラルネットの訓練

今回は、深層ニューラルネットワーク(以下DNN)の問題点を挙げ、その解決法を示します。

勾配消失/爆発問題

勾配消失

勾配降下法による更新では下位層の接続の重みがほとんど変わらず、訓練が良い解に収束しなくなること

勾配爆発

逆に勾配がどんどん急になり、多くの層の重みが更新によって膨大になり、アルゴリズムが発散してしまうこと
→ 層によって学習速度が大幅に変わってしまう

  • 理由
    • 活性化関数
      • 従来はロジスティックシグモイド関数(平均 : 0.5)
      • 入力が大きくなると関数は0か1で飽和し、導関数が極端に0に近くなってしまう → 勾配が消失
    • 初期値
      • 各層の出力の分散が、入力の分散よりもずっと大きくなる

Xavierの初期値とHeの初期値

信号を適切に流すために、各層の入出力の分散を等しくする必要があり、層を通過する前後の勾配の分散も等しい必要がある

活性化関数

  • ReLU(ランプ)関数
    深層ニューラルネットで主に使用される
    • dying ReLU 訓練中に一部のニューロンが0以外の値を出力しなくなる現象
    • leaky ReLU ReLU関数の変種 高い性能を発揮(リークが大きい方がより良い)

      • randomized leaky ReLU リークを無作為に選び、テスト中の平均を固定する 正則化器としても機能

      • parametric leaky ReLU 大規模な画像データセットでは良い性能を示す

    • ELU関数 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()関数を適用

データ拡張

既存の訓練インスタンスから新しい訓練インスタンスを生成して人工的に訓練セットを膨らませる

実践的なガイドライン

  • 初期値 : Heの初期値
  • 活性化関数 : ELU
  • 正則化 : バッチ正規化、Dropout
  • オプティマイザ : NAG
  • 学習率のスケジューリング : なし

今回は以下の書籍のDNNについてまとめました。次回はこの実践的なガイドラインに沿って実際にプログラムを動かしてみようと思います。

scikit-learnとTensorFlowによる実践機械学習

scikit-learnとTensorFlowによる実践機械学習