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