落ちこぼれナースの統計チャレンジ

元落ちこぼれ看護師(保健師)が、私と同じく統計にドキドキしている看護学生や保健師さんに、簡単な言葉で届けるために始めたブログです。

中学生でも分かる!?ディープラーニングの数学〜勾配爆発・勾配消失・バッチ正規化・表現学習・最適化手法〜


今回は、ディープラーニングの「学習が安定する仕組み」を数式と一緒に理解していきましょう。

早速、レッツゴーーーーー!!!


勾配爆発・勾配消失の仕組み

ディープラーニングでは、損失関数を最小化するために「誤差逆伝播法」で勾配を計算します。

層が深くなるほど、この勾配は掛け算の連鎖で伝わります。

\frac{\partial L}{\partial w_1}=\frac{\partial L}{\partial w_L}\prod_{i=2}^{L} f'(z_i) w_i

登場人物:

  • f'(z_i):各層の活性化関数の微分
  • w_i:各層の重み
  • L:層の総数

もし各層の値が、

|f'(z_i) w_i| > 1

であれば、次のように指数的に増加します。仮に各層の値の平均が1.2とすると、

1.2 \times 1.2 \times 1.2 \times 1.2 ... = \infty

これが 勾配爆発(exploding gradient) です。
誤差が膨張し、重みが発散して学習が壊れます。

対策としては、

  • 勾配クリッピング:勾配の上限を設定して切り捨てる
  • 重み初期化:初期の値を安定化
  • バッチ正規化:層ごとのばらつきを整える

逆に、勾配消失(vanishing gradient)という概念もあります。

もし各層の値が、

\left| f'(z_i) w_i \right| < 1

であれば、指数的に減少していきます。仮に各層の値の平均が0.8とすると、

0.8 \times 0.8 \times 0.8 \times 0.8 ... \to 0

対策としては、

  • ReLUなどの使用:勾配が0になりにくい活性化関数を使う
  • 重み初期化:小さすぎる重みを避ける
  • バッチ正規化:入力のスケールを安定させる

バッチ正規化

各層の出力が偏ると、勾配が伝わりにくくなります。
そこで「出力を正規化(平均0・標準偏差1)」するのがバッチ正規化です。

\hat{x_i} = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}},\quad y_i = \gamma \hat{x_i} + \beta

登場人物:

  • \mu_B:バッチ内の平均値
  • \sigma_B^2:バッチ内の分散
  • \epsilon:ゼロ割防止の微小値
  • \gamma:スケール(伸ばす係数)
  • \beta:シフト(ずらす係数)

最初の式で標準化し、次の式でスケール・シフトを調整します。
これにより層間の値のばらつきが減り、勾配が安定します。

表現学習(Feature Learning)

表現学習とは「特徴を自動で学ぶこと」です。
その代表的な例が オートエンコーダ(Autoencoder) です。

h = f(Wx + b),\quad\tilde{x} = g(W'h + b')

登場人物:

  • h:潜在表現(圧縮された特徴)
  • f,g:活性化関数(エンコード/デコード)
  • W,W':重み行列
  • b,b':バイアス

入力 x を一度圧縮し、再構成した出力 \tilde{x}と比較して誤差を最小化します。
これにより「データの本質的な構造」を自動的に学び取ります。

最適化手法(Optimization Methods)

学習の進み方を決めるのが最適化手法(optimizer)です。
勾配降下法の改良版として代表的な3つの手法を見てみましょう。

(1) Momentum(モーメント法)

v_t = \beta v_{t-1} + (1 - \beta)\nabla L_t,\quad w_t = w_{t-1} - \eta v_t

登場人物:

  • v_t:過去の勾配の移動平均(慣性)
  • \beta:慣性係数(0.9前後)
  • \eta:学習率
  • \nabla L_t:現在の勾配

過去の勾配を少し残して進むことで、振動を抑え、より滑らかに収束します。

(2) AdaGrad(アダグラッド)

w_{t+1} = w_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \nabla L_t

登場人物:

  • G_t:過去の勾配の二乗和
  • \eta:学習率
  • \epsilon:安定化のための微小値

よく動いたパラメータほど更新幅を小さくし、動きにくいパラメータは大きく更新することで、学習率を自動調整します。

(3) Adam(アダム)

MomentumとAdaGradを組み合わせた手法です。

m_t = \beta_1 m_{t-1} + (1 - \beta_1)\nabla L_t
v_t = \beta_2 v_{t-1} + (1 - \beta_2)(\nabla L_t)^2
\hat{m_t} = \frac{m_t}{1 - \beta_1^t},\quad\hat{v_t} = \frac{v_t}{1 - \beta_2^t}
w_{t+1} = w_t - \frac{\eta}{\sqrt{\hat{v_t}} + \epsilon} \hat{m_t}

各記号の意味:

  • m_t:1次モーメント(勾配の平均)
  • v_t:2次モーメント(勾配の分散)
  • \beta_1, \beta_2:減衰率(一般的に0.9と0.999)

これにより、初期段階でも学習率が安定し、勾配降下法よりも効率的に最小値へ近づけます。


おわりに

結構重たい内容でしたが、皆さん、着いていけましたか?

書いている私はヘロヘロです。

何回転んでもいいので、まずは概念だけでもゆっくり覚えましょう。


コメントを残す