「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
色々なオプションがある。
XXに関するテクニック †
学習に関するテクニック †
学習に関する問題点 †
ニューラルネットワークの問題点には学習に関する問題点が多い
SGD †
- 呼称
- SGD:Stochastic Gradient Descent
- 確率的勾配降下法
- 概要
- 勾配が最も急な向きに勾配を下る手法
- 勾配が急であればあるほど大きくパラメタを変化させる。
- 変化を学習率というハイパーパラメタによって調整する。
- 最短距離でない、無駄に谷間を往復する。
学習率が大きい場合は無駄な往復が目立つ。
- オンライン
θ-=η∇θL(f(xi,θ), yi)
- 勾配降下法
θt = θt-1 - η(∂L/∂θ)
MomentumSGD †
- 概要
モーメンタムとは物理で言う慣性の考え方を適用したものの意味。
- SGDに慣性(加速・減速)の概念を加えた最適化手法。
- 加速で、谷間での無駄な往復を減らし、早く収束する。
- ν = αν - 学習率 * 勾配(次回のνを保存)
- θt = θt-1 + ν(νが + なのは前回符号依存)
NesterovAG †
(Nesterov Accelerated Gradient)
- 極小値付近でブレーキをかける機能を加えたアルゴリズム
- 現在と過去の勾配から将来の勾配を予測することでコレを実現。
AdaGrad? †
(Adaptive Gradient)
- 動いた量が増えたら更新を緩やかにする。
- NesterovAGのブレーキ機能を学習率の減衰によって実現
- パラメタ更新量のスケーリング
tは更新回数を表す下付き文字
- 過去の更新量の二乗和
ht = (Σg(t)^2)
- 極小値に差し掛かったところで更新が緩やかになることを狙っている。
- 損失関数の偏微分が大きいパラメタでは学習率が比較的急に減少
- 損失関数の偏微分が小さいパラメタでは学習率が比較的緩やかに減少
※ ε = 0.001
RMSprop †
(Root Mean Square Propagation)
- AdaGradの問題点を改良した版
- 更新回数が増えるほど更新量が減る。
- 損失関数が大きいと次の更新量が急減する。
- 急減するあまり更新が止まり易い。
- パラメタ更新量のスケーリング
tは更新回数を表す下付き文字
- 学習率の減衰の抑制を実現
過去の勾配との指数移動平均の累積を取る。
- βが過去の勾配成分の累積をどれだけ重視するか指定するハイパーパラメタ(0-1)
※ ε = 0.001、β = 0.9
AdaDelta? †
- パラメタ更新量のスケーリング
tは更新回数を表す下付き文字
※ β = 0.9
Adam †
(ADAptive Moment estimation)
- パラメタ更新量のスケーリング
tは更新回数を表す下付き文字
※ ε = 0.001、β1 = 0.9、β2 = 0.999
実装例 †
重みの初期値 †
- 重みが大きくなりすぎると過学習。
- 重みの初期値は小さい方が良い。
- 慣例で標準偏差0.01の正規分布を使用。
0にする。 †
...と言う事で、重みの初期値を0にシた場合、
- 順伝播
- 入力&重のドット積の結果がゼロ
- 出力はバイアスの加算の値になる。
- 逆伝播
- 転置の重みドット積の結果がゼロ
- バイアス加算の逆伝播のみになる。
という事で学習が上手くできなくなるらしい。
活性化関数の出力分布 †
勾配消失や表現力の制限問題を回避するよう
活性化関数の出力分布がバラけるように重みを初期値する。
- Sigmoid関数の例
- 標準偏差1の正規分布では値が0か1に集中する(勾配消失、表現力の制限問題)。
- 標準偏差0.01の正規分布では値が0.5に集中する(表現力の制限問題)。
- Xavierの初期値は線形の活性化関数を対象にしていて(Sigmoidも中央部分では線形とみなせる)
標準偏差を1/√(前層ノード数)の正規分布にすると、深い層で歪になるものの、広がりを持った分布になる。
- なお、Xavierの論文では後層ノード数も考慮した設定値が提案されている。
- ReLu関数の例
- 標準偏差0.01の正規分布では値が0に寄る(微分時、勾配消失、表現力の制限問題)。
- Xavierの初期値で非線形なReLu?は深い層でより値が0に寄って行く(微分時、勾配消失)。
- HEの初期値で、標準偏差を√(2/前層ノード数)の正規分布にすると各層で均等な広がりを持った分布になる。
出力が広がりを持った分布になるように重みの初期値を設定する。
バッチ正規化 †
(Batch Normalization)
概要 †
- 活性化関数の出力ではなく、アフィン変換層と活性化関数の間で、
- ミニバッチの平均0、標準偏差が1となるよう正規化の処理を施し、
- 更に、固有のスケール(初期値1)とシフト(初期値0)を行うことで、
出力を広がりを持った分布にする方法。
- 内部共変量シフトを防ぎ、上手く学習できるようにする。
- 内部共変量シフトとは学習時のパラメタ変化がデータ分布へ影響を与えること。
- 上位層のパラメタ更新で下位層のデータ分布が変化し学習結果にズレが生じ学習が上手く進まなくなる。
- これを防ぐことで、初期値の影響を小さくし、過学習が抑制され、学習時間を短縮できる。
計算 †
(Bはミニバッチの集合的な意味)
- スケーリング(γ)とシフト(β)
yi = γxi' + β
実装時 †
- コンストラクタ
- 引数なしでもOK
- 平均と分散の移動平均は別になるので使いまわしNG
学習時と推論時 †
- 学習時
- ミニバッチの平均と分散で正規化する。
- 平均と分散の移動平均を更新する。
- 推論
- 平均と分散の移動平均で正規化する。
- 平均と分散の移動平均を更新しない。
過学習を抑止する方法 †
過学習の発生を軽減する一因になる。
早期終了(early stopping) †
- 訓練誤差が頭打ちになった段階で学習を打ち切る。
- 汎化誤差が上昇に転じた段階で学習を打ち切る。
ドロップアウト(Dropout) †
- 学習時に特定の割合のノードをランダムに無効化する(出力をランダムで0に落とす)方法
- 以下は、実装レベルの話
- 推論時の順伝播には消去した割合(30%なら 1 - 0.3 = 0.7)を乗算する。
この意味は、アンサンブル学習のバギングの異なるモデルの平均を取るようなもの。
- 有効化した場合、順伝播は素通しで、逆伝播の勾配は1。
- 無効化した場合、順伝播はソコで止まり、逆伝播の勾配は0。
CNNの場合は... †
- データ拡張(data augmentation)
CNNの画像データにノイズ(拡大・縮小、反転、回転、並進)を加えて拡張する。
- 処理と効果
- 実際に得られそうな拡張のみ行う(例えば上下固定なら回転はしない等)。
- これによりノイズに「頑健」(=統計用語で「決定的でない要因に鈍感」)になる。
- ロバスト性を高める。と言う(外乱の影響に頑健と言うような意味)。
- 画像のサイズや形は変更しない(と言うか、深層学習の入力ベクトルのサイズは固定なので)。
- 確率的な適用
処理量を抑えるためミニバッチ毎に確率的にかける。
- leakageの防止
・拡張元画像が同じ拡張画像をtrainデータとtestデータに混ぜないようにする。
・データ分割後にデータ拡張を行う順番で処理を行えばleakageしない。
- Cutout / Random Erasing
入力画像をランダムなマスクで欠落させ
より強い正則化の効果を作り出す(≒ ドロップアウト)。
- Cutmix
CutoutをMixUp?で改良した改良版
転移学習 †
- 学習済みモデルには手を加えず(、重みを固定し)、
追加の出力層だけを新たに学習させモデルを作成する。
概要 †
- 人が過去の経験を活かして新しい物事を習得する流れと似ている。
- 大量の犬の画像データと少量の猫の画像データがあり、
犬の種類判別モデルと猫の種類判別モデルを作成する場合、
犬の種類判別の課題から得られた知識を猫の種類判別モデルに適応させ判別精度の向上を図る。
詳細 †
- メリット・デメリット
- メリット
- 限られたデータから高精度なモデルを作成できる
- 少ないデータでの学習のため学習時間を短縮できる
- デメリット
- 精度の改善ではなく悪化をもたらす場合がある(負の転移(negative transfer))
- 負の転移は、転移元と転移先の関連性が低い、転移の方法が適切でないなどが考えられる。
- 学習済みモデルの最終出力層(全結合)だけを付け替えてデータを学習させ
最終出力層(全結合)のパラメタだけ変更して新しいモデルを作成する。
- 入力層に近い部分は、タスクに固有の特徴ではなく汎用的な特徴を抽出する。
- 奥の層に行くに連れて特徴が複雑になると、拾う特徴は段々とタスクに固有になっていく。
- 少ないデータで、最終出力層(全結合)のパラメタだけ変更することで学習が速く進むようになる。
ファイン・チューニング †
学習済みモデルに手を加えて(、重みを初期値し、)、
追加の出力層以外も新たに再度学習させモデルを作成する。
概要 †
転移学習との違いは、既存部分を再学習するかどうか。
詳細 †
転移学習との違いに関してのみ言及。
構築方法 †
- 学習済みモデルの最終出力層(全結合)を付け替え、
出力層(全結合)だけでなく入力層に近い部分のパラメタも変更して新しいモデルを作成する。
- 出力層(全結合)の何層かのみ初期値を乱数にして学習させる。
奥にある層は複雑で固有な特徴を学習しているので学習済みのパラメタを利用する効果が薄い。
- 一部の層のパラメタを全く学習させないという工夫もある。
手持ちのデータが少ないときほど学習させるパラメタを絞る。
転移学習とファイン・チューニングの違い †
出力層の再学習は共通しているが、
転移学習 †
学習済みモデルには手を加えず、学習を行い新たにモデルを作成
ファイン・チューニング †
学習済みモデルにも手を加えて、学習を行い新たにモデルを作成
- 出力層以外も学習させる。
- 出力層以外の学習率を低く設定する。
参考 †