「[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfrastructure.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>深層学習(deep learning)]] --[[パーセプトロン]] --[[ニューラルネットワーク]] ---[[ニューラルネットワーク(推論)]] ---[[ニューラルネットワーク(学習)]]~ ・[[深層学習の誤差逆伝播法]]~ ・深層学習のテクニック *目次 [#xf223dce] #contents *概要 [#tf550353] 色々なオプションがある。 *XXに関するテクニック [#z81a8b64] *学習に関するテクニック [#h518e281] **学習に関する問題点 [#i78c0d96] [[ニューラルネットワークの問題点には学習に関する問題点が多い>ニューラルネットワーク#s191b3fd]] **[[勾配(降下法)>#eaed3a38]]と[[誤差逆伝播法>#q2fc1f35]] [#a1907002] ***[[勾配(降下法)>ニューラルネットワーク(学習)#e083729e]] [#eaed3a38] ***[[誤差逆伝播法>深層学習の誤差逆伝播法]] [#q2fc1f35] **[[勾配降下法>#eaed3a38]]アルゴリズムの選択 [#ma318ba7] -深層学習についてのレポート(E資格・黒本対策)~ https://1drv.ms/p/s!Amfs5caPP9r5kSqPW2ZsZfWm8DKm ***実装例 [#t25731a2] -[[o'reillyのカサゴ深層学習の本>https://github.com/OpenTouryoProject/DxCommon/blob/master/Notebook/Jupyter/path/KasagoDL4.ipynb]] -[[勾配降下法アルゴリズムの選択>データマイニング(DM)- Python - DL#d4ef6dca]] **重みの初期値 [#o35805ae] ***重みの初期値戦略 [#q6054249] 学習結果はこの初期値に大きく影響される。収束する・しないや、収束の質に影響する。 -すべての重みを同じ値で初期化すると学習が進行しない。 --「対称性の破れ」問題と言い、モデルの表現力が低下する。 --各層のニューロンが同じような役割を持ち、情報の流れが制限されるため。 --ランダムな初期値を設定しバイアスを使用することで、各ノードが異なる特徴を学習する。 -初期値の大小 --初期の重みが大きいほど ---「対称性の破れ」は大きくなる(モデルの表現力が向上)。 ---逆伝播の際に信号がうまく伝達するが、大き過ぎると値が爆発する恐れがある。 --初期の重みが小さいほど ---「対称性の破れ」は小さくなる(モデルの表現力が低下)。 ---逆伝播の際に信号が消失する恐れがあるが、正則化の観点からは重みは小さい方が望ましい。 -一般的な重みの決め方 --重み ---ガウス分布や一様分布に従うランダムな初期化 ---慣例で標準偏差0.01のガウス分布((正規分布)を使用。 --バイアス~ 経験則に選択された定数 -経験則に基づく重みの決め方~ 入出力層の数で標準偏差を決めてサンプリング~ m個の入力に対してn個の出力があるような全結合層の重みを初期化するとき、 --[[Xavierの初期値、HEの初期値>深層学習のテクニック#cda1d3c9]] --一様分布 (−√(1/m),√(1/m))からサンプリング --正規化を施した一様分布 (−√(6/(m+n)),1√(6/(m+n)))からサンプリング -その他の重みの決め方 --スパース初期化 --スケーリング係数gを用いてランダムに直交行列を初期化 -重みの初期化の抱える課題 --最適な重みの初期化基準を採択してもモデル性能の最適に繋がらない事が多い。 ---そもそも採択している基準が間違っている可能性 ---初期化の時に導入された性質が学習の過程で消えてしまう可能性 ---最適化は速くなっても汎化誤差が意図せずに大きくなってしまう可能性 --そのため、初期化はモデルの性質をよく見極めた上で戦略的に行うのが有効。 ***活性化関数の出力分布 [#k8090516] 勾配消失や表現力の制限問題を回避するよう~ 活性化関数の出力分布がバラけるように重みを初期値する。 -[[Sigmoid関数>ニューラルネットワーク(推論)#qc025e6f]]の例 --標準偏差1の正規分布では値が0か1に集中する(勾配消失、表現力の制限問題)。 --標準偏差0.01の正規分布では値が0.5に集中する(表現力の制限問題)。 --Xavier(Glorot)の初期値は線形の活性化関数を対象にしていて(Sigmoidも中央部分では線形とみなせる)~ 標準偏差を1/√(前層ノード数)の正規分布にすると、深い層で歪になるものの、広がりを持った分布になる。 --なお、Xavierの論文では後層ノード数も考慮した設定値が提案されている。 -[[ReLu関数>ニューラルネットワーク#x80775f2]]の例 --標準偏差0.01の正規分布では値が0に寄る(微分時、勾配消失、表現力の制限問題)。 --Xavier(Glorot)の初期値で非線形なReLuは深い層でより値が0に寄って行く(微分時、勾配消失)。 --HE(Kaiming)の初期値で、標準偏差を√(2/前層ノード数)の正規分布にすると各層で均等な広がりを持った分布になる。 ***[[Xavier、He>#k8090516]] [#cda1d3c9] 活性化関数の出力が広がりを持った分布になるように重みの初期値を設定する。 ***[[バッチ正規化>#t3c6ab88]] [#cf2128f1] ***[[重みの初期値からの解放>#t3c6ab88]] [#cf2128f1] **バッチ正規化 [#t3c6ab88] (Batch Normalization) ***概要 [#t3af6bd9] -[[活性化関数の出力>#k8090516]]ではなく、アフィン変換層と活性化関数の間で、 --ミニバッチの平均0、標準偏差が1となるよう正規化の処理を施し、 --更に、固有のスケール(初期値1)とシフト(初期値0)を行うことで、 >出力を広がりを持った分布にする方法。 -内部共変量シフトを防ぎ、上手く学習できるようにする。 --内部共変量シフトとは学習時のパラメタ変化がデータ分布へ影響を与えること。 --上位層のパラメタ更新で下位層のデータ分布が変化し学習結果にズレが生じ学習が上手く進まなくなる。 --これを防ぐことで、初期値の影響を小さくし、過学習が抑制され、学習時間を短縮できる。 -[[勾配消失・爆発を解消する方法>ニューラルネットワーク#id252e38]]の一つでもある。 ***計算 [#bfd04b12] (Bはミニバッチの集合的な意味) --平均値を計算 m μB = 1/m Σ xi i=1 --(平均値から)[[分散>統計解析#m656dd23]]を計算 m σ^2B = 1/m Σ(xi-μB)^2 i=1 --正規化(εはゼロ除算防止の微小値) xi' = (xi-μB) / √(σ^2B + ε) --スケーリング(γ)とシフト(β) yi = γxi' + β ***実装時 [#q0aa194c] BatchNormalization -コンストラクタ --引数なしでもOK --平均と分散の移動平均は別になるので使いまわしNG -実行(call) --training: ---false:推論時は学習した移動統計 ---true:学習時はミニバッチの平均・分散 --trainable: ---false:[[転移学習>#ebe9edcc]] ---true:[[ファイン・チューニング>#ea94272b]] ***学習時と推論時 [#w7f17af7] -学習時 --ミニバッチの平均と分散で正規化する。 --平均と分散の移動平均を更新する。 -推論 --平均と分散の移動平均で正規化する。 --平均と分散の移動平均を更新しない。 **ハイパーパラメタとチューニング [#g80ab15e] ***選択 [#y03e8317] -[[学習率>ニューラルネットワーク#za4d873f]] -[[層のサイズ、層の深さ、バッチサイズ>ニューラルネットワーク(学習)#y43c81d1]] ***最適化 [#m865261a] [[グリッドサーチ、ランダムサーチ、ベイズ最適化>機械学習(machine learning)#k6cdefb0]] **過学習を抑止する方法 [#f5d40509] ***データ拡張 [#l8a79d61] (data augmentation) <画像の場合> -処理 --CNNの画像データにノイズ(拡大・縮小、反転、回転、並進)を加えて拡張する。 --実際に得られそうな拡張のみ行う(例えば上下固定なら回転はしない等)。 --画像のサイズや形は変更しない(と言うか、深層学習の入力ベクトルのサイズは固定なので)。 -効果 --これによりノイズに「頑健」(=統計用語で「決定的でない要因に鈍感」)になる。 --ロバスト性を高める。と言う(外乱の影響に頑健と言うような意味)。 -[[実装>データマイニング(DM)- Python - CNN#o122ce57]] --左右反転(flip) --回転(rotate) --並進(move) --拡大(crop) --ガンマ変換(gamma) --ガウシアンノイズ(gaussian) --色の三属性の調整 ---コントラスト(色相:hue) ---ブライトネス(輝度:brightness) ---カラフルネス(彩度:saturation) -使用時の注意 --確率的な適用~ 処理量を抑えるためミニバッチ毎に確率的にかける。~ --leakageの防止 ---拡張元画像が同じ拡張画像をtrainデータとtestデータに混ぜないようにする。~ ---データ分割後にデータ拡張を行う順番で処理を行えばleakageしない。 -特殊な処理 --MixUp~ 画像を合成 --Cutout / Random Erasing~ 入力画像をランダムなマスクで欠落させ~ より強い正則化の効果を作り出す(≒ [[ドロップアウト>#hf3c7a28]])。 --Cutmix~ CutoutをMixUpで改良した改良版 <言語の場合> -MixUp -EDA~ テキストデータの水増しやバリエーションを生成する。 --同義語置換(Synonym Replacement) --ランダム挿入(Random Insertion) --ランダム削除(Random Deletion) --ランダム置換(Random Swap) <音声の場合> -ノイズ付与(Gaussian Noise) -MixUp -ボリューム変更 -ピッチ(音程)シフト -SpecAugment --時間方向のマスキング(Time Masking) --周波数方向のマスキング(Frequency Masking) --時間方向のシフト ***[[出力の分布調整>ニューラルネットワーク#hdea3b9f]] [#rf986b56] -過学習の発生を軽減する一因になる。 -[[データ正規化>データマイニング(DM)- CRISP-DM#v9d19242]]、[[重みの初期値>#o35805ae]]、[[バッチ正規化>#t3c6ab88]]などがある。 -CNNに於いては、畳み込み層とプーリング層の間にバッチ正規化の層を追加。 ***[[機械学習と同様のアンサンブル手法>機械学習(machine learning)#t3b0d157]] [#v44f2bbc] バギング、ブースティング、ブートストラップ、スタッキング ***[[機械学習と同様の正則化>統計解析#i38c7fea]] [#q7425431] 機械学習と同様、明示的な正則化の重みの減衰(Weight Decay) ***陰的正則化機能 [#q1834025] -[[以下>#yc09c881]]のような、明示的な正則化ではない暗黙の陰的正則化機能がある。 -また、NNは、その構造自体が何かしらの陰的正則化機能を含んでいるとの説もある。~ (非常に高度な数学理論を駆使してようやく一部が解き明かされつつあるような状況) ***[[ハイパーパラメタとチューニング>#g80ab15e]] [#yc09c881] ***早期終了(early stopping) [#q2b741ae] -[[訓練誤差>深層学習の誤差逆伝播法#q7efa2ae]]が頭打ちになった段階で学習を打ち切る。 -[[汎化誤差>深層学習の誤差逆伝播法#q7efa2ae]]が上昇に転じた段階で学習を打ち切る。 ***ドロップアウト(Dropout) [#hf3c7a28] -[[アンサンブル学習のバギング>#v44f2bbc]]に相当する効果(汎化性能の向上効果)がある。 --学習時にのみ適用され、推論時には適用されない。 --特定の割合のノードをランダムに無効化する(出力をランダムで0に落とす)方法 -以下は、実装レベルの話 --推論時の順伝播には消去した割合(30%なら 1 - 0.3 = 0.7)を乗算する。~ この意味は、[[アンサンブル学習のバギング>機械学習(machine learning)#t3b0d157]]の異なるモデルの平均を取るようなもの。 --有効化した場合、順伝播は素通しで、逆伝播の勾配は1。 --無効化した場合、順伝播はソコで止まり、逆伝播の勾配は0。 ***ドロップコネクト(Dropconnect) [#ta2e931d] -ドロップアウト(Dropout) ではノード(出力値)を消す。 -ドロップコネクト(Dropconnect)ではエッジ(重み)を消す。 -効果の違い --学習時にのみ適用され、推論時には適用されないが、無効化された重みは推論時にも適用される。 --この結果、パラメタ数が削減され、モデルの複雑さが減少し、過学習を軽減する。 **転移学習 [#ebe9edcc] -学習済みのモデルを異なった分野で利用する手法 -学習済みモデルには手を加えず(、重みを固定し)、~ 追加の出力層だけを新たに学習させモデルを作成する。 ***概要 [#k07a1a43] -人が過去の経験を活かして新しい物事を習得する流れと似ている。 -大量の犬の画像データと少量の猫の画像データがあり、~ 犬の種類判別モデルと猫の種類判別モデルを作成する場合、~ 犬の種類判別の課題から得られた知識を猫の種類判別モデルに適応させ判別精度の向上を図る。 ***詳細 [#i669f1c6] -メリット・デメリット --メリット ---限られたデータから高精度なモデルを作成できる ---少ないデータでの学習のため学習時間を短縮できる --デメリット ---精度の改善ではなく悪化をもたらす場合がある(負の転移(negative transfer)) ---負の転移は、転移元と転移先の関連性が低い、転移の方法が適切でないなどが考えられる。 -構築方法 --学習済みモデルの最終出力層(全結合)だけを付け替えてデータを学習させ~ 最終出力層(全結合)のパラメタだけ変更して新しいモデルを作成する。 ---入力層に近い部分は、タスクに固有の特徴ではなく汎用的な特徴を抽出する。 ---奥の層に行くに連れて特徴が複雑になると、拾う特徴は段々とタスクに固有になっていく。 --少ないデータで、最終出力層(全結合)のパラメタだけ変更することで学習が速く進むようになる。 **ファイン・チューニング [#ea94272b] 学習済みモデルに手を加えて(、重みを初期値し、)、~ 追加の出力層以外も新たに再度学習させモデルを作成する。 ***概要 [#s38ca193] [[転移学習>#ebe9edcc]]との違いは、既存部分を再学習するかどうか。 ***詳細 [#k36d2d62] [[転移学習>#ebe9edcc]]との違いに関してのみ言及。 -メリット・デメリット --メリット --デメリット ***構築方法 [#iad66a2b] -学習済みモデルの最終出力層(全結合)を付け替え、~ 出力層(全結合)だけでなく入力層に近い部分のパラメタも変更して新しいモデルを作成する。 --学習率を通常の 10^-2 倍程度に小さくする。 --出力層(全結合)の何層かのみ初期値を乱数にして学習させる。~ 奥にある層は複雑で固有な特徴を学習しているので学習済みのパラメタを利用する効果が薄い。 --一部の層のパラメタを全く学習させないという工夫もある。~ 手持ちのデータが少ないときほど学習させるパラメタを絞る。 **転移学習とファイン・チューニングの違い [#q86c1484] 出力層の再学習は共通しているが、 ***転移学習 [#v4fb5182] 学習済みモデルには手を加えず、学習を行い新たにモデルを作成 -出力層だけを学習させる。 ***ファイン・チューニング [#ef93997b] 学習済みモデルにも手を加えて、学習を行い新たにモデルを作成 -出力層以外も学習させる。 -出力層以外の学習率を低く設定する。 **[[転移学習とファイン・チューニングの実装>データマイニング(DM)- Python - CNN#se734ba8]] [#cc66ae3a] *参考 [#b62d3054] -転移学習(TL:Transfer Learning)とFine Tuningの違いって? - ts0818のブログ~ https://ts0818.hatenablog.com/entry/2021/02/15/205258