>100 Views
June 16, 25
スライド概要
AI・機械学習を勉強したい学生たちが集まる、京都大学の自主ゼミサークルです。私たちのサークルに興味のある方はX(Twitter)をご覧ください!
KaiRA ゼロつく輪読会 #8(2025/6/16) ゼロから作るDeep Learning 6.2-6.3:重みの初期値・BatchNorm 京都大学工学部理工化学科B2 岡本 和優 0
アジェンダ ◼ 6.2 重みの初期値 ◼ 6.3 Batch Normalization 1
アジェンダ ◼ 6.2 重みの初期値 ◼ 6.3 Batch Normalization 2
重みの初期値を0にする? 重みが均一な値では意味がない。ランダムな初期化が必要 • 過学習を防ぐために、重みの値が小さくなるよう調整する手法(Weight decay)が存在する • 重みの値を小さくしたいなら、初期値も小さくした方がいいはず →重みの初期値をすべて0にしてしまえばいいのでは? • しかし、重みの値を均一に設定すると、重みの更新も均一に行われてしまう (すべてのニューロンが同じ値を受け取るから、誤差逆伝播法だとそうなってしまう) • 重みが均一になってしまうと、たくさんの重みを持つ意味がなくなる • そうならないためには、ランダムな値で重みを初期化することが必要 3
正規分布を用いて重みを初期化する 重みの標準偏差をどのように設定すべきか? 標準偏差1の正規分布で初期化 • アクティベーションが0と1に偏っている • 活性化関数にシグモイドを使う場合、 勾配消失の問題が発生 標準偏差0.01の正規分布で初期化 • アクティベーションが0.5付近に集中 • 表現力の観点で大きな問題 (すべてのニューロンがほぼ同じ値を出力) 4
Xavierの初期値 標準偏差が1/ 𝑛の分布を初期化に用いる(𝑛:入力ノード数) 目的:各層のアクティベーションを同じ広がりのある分布にしたい! そのためには標準偏差が1/ 𝑛 の分布を使って重みを初期化するとよい(理由は後述) Xavierの初期値で初期化 • 各層のアクティベーションが 広がりのある分布になっている • 表現力が制限されることなく、 効率的に学習を行える 5
Heの初期値 ReLU関数を用いるときは、標準偏差が 2/𝑛の分布を初期化に用いる 目的はXavierの初期値と同じで、各層のアクティベーションに広がりを持たせること ReLUの場合は負の領域が0になるため、その分2倍の係数が必要となる Xavierの初期値(ReLU) Heの初期値(ReLU) 6
補足:Xavierの初期値の導出 層を経ても分散がキープされるようにしたい 入力と重みは独立同分布で、しかもこの2つの分布は独立しているとすると、 𝑛 𝑛 𝑉𝑎𝑟 𝑦 = 𝑉𝑎𝑟 𝑤𝑖 𝑥𝑖 = 𝑉𝑎𝑟(𝑤𝑖 𝑥𝑖 ) = 𝑛 𝑉𝑎𝑟 𝑤 𝑉𝑎𝑟 𝑥 𝑖=1 𝑖=1 𝑉𝑎𝑟(𝑦) = 𝑉𝑎𝑟(𝑥)とするには、𝑉𝑎𝑟(𝑤) = 1/𝑛とすればよい ここまではLeCunの初期化で、正確にはXavierの初期化では逆伝播の際も考慮して、 入力ノード数だけでなく、出力ノード数によっても重みを正規化している (入力ノード数と出力ノード数の平均𝑛を用いて、𝑉𝑎𝑟 ො 𝑤 = 1/𝑛の分布により初期化) ො とは言え、多くのライブラリの実装では入力ノード数だけを用いている 詳細は以下を参照 https://cvml-expertguide.net/terms/dl/optimization/weight-initialization/ • https://cvml-expertguide.net/terms/dl/optimization/weight-initialization/ 7
補足:Pytorchではどうなっているの? 各レイヤーごとに重みの初期化がデフォルトで決まっている • nn.Linear():Heの初期化の一様分布版 • nn.Conv2d():Heの初期化の一様分布版 • nn.Embedding():標準正規分布 torch.nn.initモジュールに用意されている初期化関数で、個別に初期化をすることも可能 • nn.init.xavier_uniform_()(Xavierの初期化の一様分布版) • nn.init.xavier_normal_()(Xavierの初期化の正規分布版) • nn.init.kaiming_uniform_()(Heの初期化の一様分布版) 8
アジェンダ ◼ 6.2 重みの初期値 ◼ 6.3 Batch Normalization 9
Batch Normalization 強制的にアクティベーションの分布を調整すればいいじゃない! Xavierの初期化・Heの初期化:重みを適切に初期化してアクティベーションの分布を調整する →Batch Normalization:アクティベーションの分布をバッチ単位で直接調整する Batch Normalizationの利点 • 学習を速く進行させることができる • 初期値にそれほど依存しない • 過学習を抑制する 10
Batch Normalizationのアルゴリズム バッチ内のデータの分布が平均0、分散1になるよう正規化 次のようにして入力データを正規化する 𝑚 1 𝜇𝐵 ← 𝑥𝑖 𝑚 𝑚 𝑖=1 1 (𝑥𝑖 − 𝜇𝐵 )2 𝑚 𝑖=1 𝑥𝑖 − 𝜇𝐵 𝑥ෝ𝑖 ← 𝜎2 + 𝜀 その後、正規化されたデータに対して、固有のスケールとシフトで変換を行う 𝜎2 ← 𝑦𝑖 ← 𝛾𝑥ෝ𝑖 + 𝛽 𝛾と𝛽はパラメータで、𝛾 = 1、𝛽 = 0からスタートして学習させる https://cvml-expertguide.net/terms/dl/layers/batch-normalization-layer/ 詳細はhttps://cvml-expertguide.net/terms/dl/layers/batch-normalization-layer/を参照 11
まとめ アクティベーションの値を適切に制御しよう! 重みの初期化 • Xavierの初期値:標準偏差が1/ 𝑛の分布で初期化(活性化関数がシグモイドのとき) • Heの初期値:標準偏差が 2/𝑛の分布で初期化(活性化関数がReLUのとき) • 入力と出力で分散がキープされるように重みが初期化されている Batch Normalization • 入力データが平均0、分散1となるようバッチ単位で正規化 • 原則として活性化関数の前に入れる(BatchNorm→活性化関数→(Dropout)の順) Google Colabのリンク https://colab.research.google.com/drive/1JxM82CdD08E1VDw-Gp_wu4tE0RU8f1eq • https://colab.research.google.com/drive/1JxM82CdD08E1VDw-Gp_wu4tE0RU8f1eq 12