.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

色々なオプションがある。

XXに関するテクニック

学習に関するテクニック

学習に関する問題点

ニューラルネットワークの問題点には学習に関する問題点が多い

勾配(降下法)誤差逆伝播法

勾配(降下法)

誤差逆伝播法

勾配降下法アルゴリズムの選択

SGD

  • 呼称
    • SGD:Stochastic Gradient Descent
    • 確率的勾配降下法
  • 概要
    • 勾配が最も急な向きに勾配を下る手法
    • 勾配が急であればあるほど大きくパラメタを変化させる。
    • 変化を学習率というハイパーパラメタによって調整する。
  • 欠点
  • 最短距離でない、無駄に谷間を往復する。
    学習率が大きい場合は無駄な往復が目立つ。
  • オンライン
    θ-=η∇θL(f(xi,θ), yi)
  • バッチ
                m
    θ-=η/m∇θ∑L(f(xi,θ), yi)
                i
  • 解説
  • 説明集合
    {x1, ... , xm}
  • 目的集合
    {y1, ... , ym}
  • 予測関数
    ^yi = f(xi,θ) i∈{1, ... , m}
  • 経験損失
       m
    1/m∑L(^yi, yi)
       i
  • 勾配降下法
    θt = θt-1 - η(∂L/∂θ)
  • 確率的勾配降下法
                          m
    θt = θt-1 - η/m∇θ∑L(f(xi,θ), yi)
                          i

MomentumSGD

  • 概要
    • モーメンタムとは物理で言う慣性の考え方を適用したものの意味。
    • SGDに慣性(加速・減速)の概念を加えた。
    • 慣性として指数移動平均を使用する。
    • 局所的な谷底から抜け出すのに役立つ。
    • 加速しているため、極小値付近で止まり難い。
  • v t = βv t−1 + (1−β)gt
    W t−1 = Wt − η vt

NesterovAG

(Nesterov Accelerated Gradient)

  • 極小値付近でブレーキをかける機能を加えたアルゴリズム
  • 現在と過去の勾配から将来の勾配を予測することでコレを実現。

AdaGrad?

(Adaptive Gradient)

  • 動いた量が増えたら更新を緩やかにする。
  • NesterovAGのブレーキ機能を学習率の減衰によって実現
  • パラメタ更新量のスケーリング
    tは更新回数を表す下付き文字
  • g(t) = 今回の勾配
  • 過去の更新量の二乗和
    ht = (Σg(t)^2)
  • 現在の勾配を反比例するようスケーリング(=割る)
    この際、0除算にならないように分母に極小の値εを加算
     θt = θt-1 - η(g(t)/(√ht+ε))
  • 極小値に差し掛かったところで更新が緩やかになることを狙っている。
    • 損失関数の偏微分が大きいパラメタでは学習率が比較的急に減少
    • 損失関数の偏微分が小さいパラメタでは学習率が比較的緩やかに減少

※ ε = 0.001

RMSprop

(Root Mean Square Propagation)

  • AdaGradの問題点を改良した版
    • 更新回数が増えるほど更新量が減る。
    • 損失関数が大きいと次の更新量が急減する。
    • 急減するあまり更新が止まり易い。
  • パラメタ更新量のスケーリング
    tは更新回数を表す下付き文字
  • g(t) = 今回の勾配
  • 学習率の減衰の抑制を実現
    過去の勾配との指数移動平均の累積を取る。
  • βが過去の勾配成分の累積をどれだけ重視するか指定するハイパーパラメタ(0-1)
  • 更新するたびに過去の勾配はβ乗され指数関数的に減弱して蓄積されていく
    ht = β(ht-1) + (1-β) * g(t)^2
  • 実装に際して、式を変形
    ht = ht-1 + (1-β) (g(t)^2 - ht-1)
  • 現在の勾配を反比例するようスケーリング(=割る)
    この際、0除算にならないように分母に極小の値εを加算
    θt = θt-1 - η(g(t)/(√ht+ε))

※ ε = 0.001、β = 0.9

AdaDelta?

  • AdaGradの改良版のRMSpropに、もうひと工夫加えたようなアルゴリズム
  • パラメタ更新量のスケーリング
    tは更新回数を表す下付き文字
  • g(t) = 今回の勾配
  • 学習率の減衰の抑制を実現
  • 過去の勾配との指数移動平均の累積を取る。
    vt = β(vt-1) + (1-β) * g(t) ^2
  • 更新量のスケーリング(=割る)
    この際、0除算にならないように分母に極小の値εを加算
    ht = -(√(ut-1 + ε)/√(vt + ε)) * g(t)
  • 過去の更新量との指数移動平均の累積を取る。
    ut = β(ut-1) + (1-β) * ht^2
  • パラメタ更新
    θt = θt-1 - η ht

※ β = 0.9

Adam

(ADAptive Moment estimation)

  • パラメタ更新量のスケーリング
    tは更新回数を表す下付き文字
  • g(t) = 今回の勾配
  • 学習率の減衰の抑制を実現
  • Momentum的な累積
    mt = β1(mt-1) + (1-β1) * g(t)
    ^mt = mt / (1-β1^t)
  • RMSprop的な指数移動平均の累積
    vt = β2(vt-1) + (1-β2) * g(t)^2
    ^vt = vt / (1-β2^t)
  • 現在の勾配を反比例するようスケーリング(=割る)
    この際、0除算にならないように分母に極小の値εを加算
    パラメタ更新量 = - (?/√^vt+ε)) * ^mt

※ ε = 0.001、β1 = 0.9、β2 = 0.999

実装例

重みの初期値

重みの初期値戦略

学習結果はこの初期値に大きく影響される。収束する・しないや、収束の質に影響する。

  • すべての重みを同じ値で初期化すると学習が進行しない。
    • 「対称性の破れ」問題と言い、モデルの表現力が低下する。
    • 各層のニューロンが同じような役割を持ち、情報の流れが制限されるため。
    • ランダムな初期値を設定しバイアスを使用することで、各ノードが異なる特徴を学習する。
  • 初期値の大小
  • 初期の重みが大きいほど
    • 「対称性の破れ」は大きくなる(モデルの表現力が向上)。
    • 逆伝播の際に信号がうまく伝達するが、大き過ぎると値が爆発する恐れがある。
  • 初期の重みが小さいほど
    • 「対称性の破れ」は小さくなる(モデルの表現力が低下)。
    • 逆伝播の際に信号が消失する恐れがあるが、正則化の観点からは重みは小さい方が望ましい。
  • 一般的な重みの決め方
  • 重み
    • ガウス分布や一様分布に従うランダムな初期化
    • 慣例で標準偏差0.01のガウス分布((正規分布)を使用。
  • バイアス
    経験則に選択された定数
  • 経験則に基づく重みの決め方
    入出力層の数で標準偏差を決めてサンプリング
    m個の入力に対してn個の出力があるような全結合層の重みを初期化するとき、
  • Xavierの初期値、HEの初期値
  • 一様分布 (−√(1/m),√(1/m))からサンプリング
  • 正規化を施した一様分布 (−√(6/(m+n)),1√(6/(m+n)))からサンプリング
  • その他の重みの決め方
    • スパース初期化
    • スケーリング係数gを用いてランダムに直交行列を初期化
  • 重みの初期化の抱える課題
    • 最適な重みの初期化基準を採択してもモデル性能の最適に繋がらない事が多い。
      • そもそも採択している基準が間違っている可能性
      • 初期化の時に導入された性質が学習の過程で消えてしまう可能性
      • 最適化は速くなっても汎化誤差が意図せずに大きくなってしまう可能性
    • そのため、初期化はモデルの性質をよく見極めた上で戦略的に行うのが有効。

活性化関数の出力分布

勾配消失や表現力の制限問題を回避するよう
活性化関数の出力分布がバラけるように重みを初期値する。

  • Sigmoid関数の例
    • 標準偏差1の正規分布では値が0か1に集中する(勾配消失、表現力の制限問題)。
    • 標準偏差0.01の正規分布では値が0.5に集中する(表現力の制限問題)。
    • Xavier(Glorot)の初期値は線形の活性化関数を対象にしていて(Sigmoidも中央部分では線形とみなせる)
      標準偏差を1/√(前層ノード数)の正規分布にすると、深い層で歪になるものの、広がりを持った分布になる。
    • なお、Xavierの論文では後層ノード数も考慮した設定値が提案されている。
  • ReLu関数の例
    • 標準偏差0.01の正規分布では値が0に寄る(微分時、勾配消失、表現力の制限問題)。
    • Xavier(Glorot)の初期値で非線形なReLu?は深い層でより値が0に寄って行く(微分時、勾配消失)。
    • HE(Kaiming)の初期値で、標準偏差を√(2/前層ノード数)の正規分布にすると各層で均等な広がりを持った分布になる。

Xavier、He

活性化関数の出力が広がりを持った分布になるように重みの初期値を設定する。

バッチ正規化

(Batch Normalization)

概要

  • 活性化関数の出力ではなく、アフィン変換層と活性化関数の間で、
    • ミニバッチの平均0、標準偏差が1となるよう正規化の処理を施し、
    • 更に、固有のスケール(初期値1)とシフト(初期値0)を行うことで、

出力を広がりを持った分布にする方法。

  • 内部共変量シフトを防ぎ、上手く学習できるようにする。
    • 内部共変量シフトとは学習時のパラメタ変化がデータ分布へ影響を与えること。
    • 上位層のパラメタ更新で下位層のデータ分布が変化し学習結果にズレが生じ学習が上手く進まなくなる。
    • これを防ぐことで、初期値の影響を小さくし、過学習が抑制され、学習時間を短縮できる。

計算

(Bはミニバッチの集合的な意味)

  • 平均値を計算
              m
    μB = 1/m Σ xi
              i=1
  • (平均値から)分散を計算
                 m
    σ^2B =  1/m Σ(xi-μB)^2
                 i=1
  • 正規化(εはゼロ除算防止の微小値)
    xi' = (xi-μB) / √(σ^2B + ε)
  • スケーリング(γ)とシフト(β)
    yi = γxi' + β

実装時

BatchNormalization?

  • コンストラクタ
    • 引数なしでもOK
    • 平均と分散の移動平均は別になるので使いまわしNG
  • 実行(call)
    • training:
      • false:推論時は学習した移動統計
      • true:学習時はミニバッチの平均・分散

学習時と推論時

  • 学習時
    • ミニバッチの平均と分散で正規化する。
    • 平均と分散の移動平均を更新する。
  • 推論
    • 平均と分散の移動平均で正規化する。
    • 平均と分散の移動平均を更新しない。

ハイパーパラメタとチューニング

選択

最適化

グリッドサーチ、ランダムサーチ、ベイズ最適化

過学習を抑止する方法

データ拡張

(data augmentation)

<画像の場合>

  • 処理
    • CNNの画像データにノイズ(拡大・縮小、反転、回転、並進)を加えて拡張する。
    • 実際に得られそうな拡張のみ行う(例えば上下固定なら回転はしない等)。
    • 画像のサイズや形は変更しない(と言うか、深層学習の入力ベクトルのサイズは固定なので)。
  • 効果
    • これによりノイズに「頑健」(=統計用語で「決定的でない要因に鈍感」)になる。
    • ロバスト性を高める。と言う(外乱の影響に頑健と言うような意味)。
  • 実装
    • 左右反転(flip)
    • 回転(rotate)
    • 並進(move)
    • 拡大(crop)
    • ガンマ変換(gamma)
    • ガウシアンノイズ(gaussian)
    • 色の三属性の調整
      • コントラスト(色相:hue)
      • ブライトネス(輝度:brightness)
      • カラフルネス(彩度:saturation)
  • 使用時の注意
  • 確率的な適用
    処理量を抑えるためミニバッチ毎に確率的にかける。
  • leakageの防止
    • 拡張元画像が同じ拡張画像をtrainデータとtestデータに混ぜないようにする。
    • データ分割後にデータ拡張を行う順番で処理を行えばleakageしない。
  • 特殊な処理
  • MixUp?
    画像を合成
  • Cutout / Random Erasing
    入力画像をランダムなマスクで欠落させ
    より強い正則化の効果を作り出す(≒ ドロップアウト)。
  • Cutmix
    CutoutをMixUp?で改良した改良版

<言語の場合>

  • MixUp?
  • EDA
    テキストデータの水増しやバリエーションを生成する。
    • 同義語置換(Synonym Replacement)
    • ランダム挿入(Random Insertion)
    • ランダム削除(Random Deletion)
    • ランダム置換(Random Swap)

<音声の場合>

  • ノイズ付与(Gaussian Noise)
  • MixUp?
  • ボリューム変更
  • ピッチ(音程)シフト
  • SpecAugment?
    • 時間方向のマスキング(Time Masking)
    • 周波数方向のマスキング(Frequency Masking)
    • 時間方向のシフト

出力の分布調整

機械学習と同様のアンサンブル手法

バギング、ブースティング、ブートストラップ、スタッキング

機械学習と同様の正則化

機械学習と同様、明示的な正則化の重みの減衰(Weight Decay)

陰的正則化機能

  • 以下のような、明示的な正則化ではない暗黙の陰的正則化機能がある。
  • また、NNは、その構造自体が何かしらの陰的正則化機能を含んでいるとの説もある。
    (非常に高度な数学理論を駆使してようやく一部が解き明かされつつあるような状況)

ハイパーパラメタとチューニング

早期終了(early stopping)

  • 訓練誤差が頭打ちになった段階で学習を打ち切る。
  • 汎化誤差が上昇に転じた段階で学習を打ち切る。

ドロップアウト(Dropout)

  • アンサンブル学習のバギングに相当する効果(汎化性能の向上効果)がある。
    • 学習時にのみ適用され、推論時には適用されない。
    • 特定の割合のノードをランダムに無効化する(出力をランダムで0に落とす)方法
  • 以下は、実装レベルの話
    • 推論時の順伝播には消去した割合(30%なら 1 - 0.3 = 0.7)を乗算する。
      この意味は、アンサンブル学習のバギングの異なるモデルの平均を取るようなもの。
    • 有効化した場合、順伝播は素通しで、逆伝播の勾配は1。
    • 無効化した場合、順伝播はソコで止まり、逆伝播の勾配は0。

ドロップコネクト(Dropconnect)

  • ドロップアウト(Dropout) ではノード(出力値)を消す。
  • ドロップコネクト(Dropconnect)ではエッジ(重み)を消す。
  • 効果の違い
    • 学習時にのみ適用され、推論時には適用されないが、無効化された重みは推論時にも適用される。
    • この結果、パラメタ数が削減され、モデルの複雑さが減少し、過学習を軽減する。

転移学習

  • 学習済みのモデルを異なった分野で利用する手法
  • 学習済みモデルには手を加えず(、重みを固定し)、
    追加の出力層だけを新たに学習させモデルを作成する。

概要

  • 人が過去の経験を活かして新しい物事を習得する流れと似ている。
  • 大量の犬の画像データと少量の猫の画像データがあり、
    犬の種類判別モデルと猫の種類判別モデルを作成する場合、
    犬の種類判別の課題から得られた知識を猫の種類判別モデルに適応させ判別精度の向上を図る。

詳細

  • メリット・デメリット
    • メリット
      • 限られたデータから高精度なモデルを作成できる
      • 少ないデータでの学習のため学習時間を短縮できる
    • デメリット
      • 精度の改善ではなく悪化をもたらす場合がある(負の転移(negative transfer))
      • 負の転移は、転移元と転移先の関連性が低い、転移の方法が適切でないなどが考えられる。
  • 構築方法
  • 学習済みモデルの最終出力層(全結合)だけを付け替えてデータを学習させ
    最終出力層(全結合)のパラメタだけ変更して新しいモデルを作成する。
  • 入力層に近い部分は、タスクに固有の特徴ではなく汎用的な特徴を抽出する。
  • 奥の層に行くに連れて特徴が複雑になると、拾う特徴は段々とタスクに固有になっていく。
  • 少ないデータで、最終出力層(全結合)のパラメタだけ変更することで学習が速く進むようになる。

ファイン・チューニング

学習済みモデルに手を加えて(、重みを初期値し、)、
追加の出力層以外も新たに再度学習させモデルを作成する。

概要

転移学習との違いは、既存部分を再学習するかどうか。

詳細

転移学習との違いに関してのみ言及。

  • メリット・デメリット
    • メリット
    • デメリット

構築方法

  • 学習済みモデルの最終出力層(全結合)を付け替え、
    出力層(全結合)だけでなく入力層に近い部分のパラメタも変更して新しいモデルを作成する。
  • 学習率を通常の 10^-2 倍程度に小さくする。
  • 出力層(全結合)の何層かのみ初期値を乱数にして学習させる。
    奥にある層は複雑で固有な特徴を学習しているので学習済みのパラメタを利用する効果が薄い。
  • 一部の層のパラメタを全く学習させないという工夫もある。
    手持ちのデータが少ないときほど学習させるパラメタを絞る。

転移学習とファイン・チューニングの違い

出力層の再学習は共通しているが、

転移学習

学習済みモデルには手を加えず、学習を行い新たにモデルを作成

  • 出力層だけを学習させる。

ファイン・チューニング

学習済みモデルにも手を加えて、学習を行い新たにモデルを作成

  • 出力層以外も学習させる。
  • 出力層以外の学習率を低く設定する。

転移学習とファイン・チューニングの実装

参考


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2024-04-04 (木) 15:47:23 (16d)