0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【自然言語処理入門】勾配崩壊と初期化の実務(Xavier/He/勾配クリッピング編)

Posted at

はじめに

私たちはこれまでに、RNNLMが「次に来る単語」を予測する仕組みと、その予測の「間違い」を交差エントロピー損失によって計測し、モデルを学習させる方法を学んできました。

理論上、モデルは損失を小さくするように、内部のパラメータ(重み)を少しずつ更新していくはずです。この「更新の指針」となるのが勾配(Gradient)、つまり損失という山を最も急に下るための「方角」です。

しかし、RNNのように何層にも深く、あるいは何ステップも長く連なったネットワークを学習させようとすると、この「勾配」という名の指針が、とんでもないトラブルに見舞われることがあります。指針が弱すぎて迷子になったり、逆に強すぎて崖から飛び降りてしまったりするのです。

これが、深層学習の世界で誰もが一度は直面する勾配消失問題勾配爆発問題です。

この記事では、

  • 【初心者編】 で、なぜこの恐ろしい問題が起きるのかを、「伝言ゲーム」の例えで直感的に理解します。
  • 【応用編】 で、この問題を解決するために現代のエンジニアが当たり前のように使っている「賢いスタートの切り方(Xavier/He初期化)」と「暴走を防ぐ安全装置(勾配クリッピング)」という、極めて実務的なテクニックを数式と共に解説します。

モデル学習の成否を分ける、縁の下の力持ちたちの活躍を見ていきましょう。


【初心者編】学習を阻む、勾配という名の「伝言ゲーム」

1. 勾配とは「間違いを伝える伝言」

まず、「勾配」を難しく考えず、「学習のためのフィードバック」だと捉えましょう。
RNNが長い文章を読み終えて、最後の単語の予測を間違えたとします。損失関数(先生)が「最後の予測、全然ダメだったぞ!」と叱ります。この「ダメだった」という情報が、勾配という名の伝言
です。

この伝言は、ネットワークを遡って、最後の単語を予測した部分から、その前の単語を処理した部分へ、さらにその前へ…と、文章の一番最初の単語を処理した部分まで、逆向きに伝えられていきます。
この伝言を受け取った各部分が「なるほど、次はこう修正すればいいのか」と自分のパラメータ(重み)を微調整することで、学習が進みます。

2. 勾配消失:ささやき声の伝言ゲーム

RNNが長い文章を扱う時、この伝言ゲームは非常に長い列になります。ここで問題が起きます。

もし、伝言が人から人へ伝わるたびに、少しずつ弱々しい「ささやき声」になっていったらどうなるでしょう?

  1. 最後尾の人(文章の最後の部分): 先生から「間違いだ!」とはっきりした声で伝えられる。
  2. 一つ前の人: 最後尾の人から、少しだけ弱くなった声で伝言を聞く。
  3. ...中間の人たち...: 伝言はどんどん弱まり、聞き取れるかどうかのレベルに。
  4. 先頭の人(文章の最初の部分): 後ろから伝わってきた声は、もはや無音。何も聞こえません。

これが勾配消失 (Gradient Vanishing) です。
文章の最後の方で起きた間違いの「伝言」が、文章の最初の方には全く届かないのです。

その結果、モデルは文章の後半部分については学習できますが、前半部分については全く学習が進みません。 これが、初期のRNNが「忘れっぽい」「長期的な依存関係を学習できない」と言われた最大の原因です。文章の冒頭に出てきた重要な情報を、どう扱えばよかったのかを学ぶためのフィードバックが届かないのですから。

3. 勾配爆発:メガホンでの伝言ゲーム

では、逆のケースを考えてみましょう。

もし、伝言が人から人へ伝わるたびに、メガホンで増幅されて、どんどん大きな声になっていったらどうでしょう?

  1. 最後尾の人: 先生から「間違いだ!」と伝えられる。
  2. 一つ前の人: 最後尾の人から、メガホンで増幅された大声で伝言を聞く。
  3. ...中間の人たち...: 伝言はすさまじい轟音になり、もはや内容は聞き取れず、ただのノイズの塊に。
  4. 先頭の人: 後ろから伝わってきたのは、鼓膜が破れるほどの衝撃波。あまりの衝撃に、その人の記憶(パラメータ)は吹き飛んでしまいます。

これが勾配爆発 (Gradient Exploding) です。
フィードバックが異常に大きくなりすぎて、学習プロセスが完全に崩壊してしまうのです。モデルのパラメータは意味のない巨大な数値(Infinity)や、非数(NaN)になってしまい、学習は即座に停止します。

4. 解決策への道筋

この伝言ゲームを成功させるには、どうすればいいでしょうか?

  1. スタートを工夫する: そもそも伝言ゲームに参加する人たちを、「聞いた通りの声量で、過不足なく次の人に伝えられる人」 を厳選して並ばせる。→ これが 「賢い重みの初期化」 のアイデアです。
  2. ルールを設ける: どんなに大きな声で伝言を聞いたとしても、 「次の人には、あらかじめ決めた上限の声量までで伝えなければならない」 というルールを課す。→ これが 「勾配クリッピング」 のアイデアです。

【応用編】初期化とクリッピングの技術的詳細

伝言ゲームのイメージを元に、これらの問題を解決する具体的な数学的・技術的アプローチを見ていきましょう。

5. なぜ勾配は消えたり、爆発したりするのか?

RNNの隠れ状態を更新する式を思い出してみましょう。
$$
h_t = \tanh(W_{hh} h_{t-1} + W_{xh} x_t)
$$
この式を $h_{t-1}$ で微分(連鎖律)すると、勾配は再帰的に $W_{hh}$ という同じ重み行列を何度も何度も掛け合わせる形で計算されることになります。
$$
\frac{\partial L}{\partial h_t} = \frac{\partial L}{\partial h_T} \frac{\partial h_T}{\partial h_{T-1}} \cdots \frac{\partial h_{t+1}}{\partial h_t} \propto (W_{hh}^T)^{T-t}
$$
もし、この $W_{hh}$ の値が(厳密には特異値が)全体的に1より小さいと、何度も掛け合わせるうちに0に収束します(消失)。逆に1より大きいと、無限大に発散します(爆発)。これが数学的な原因です。

6. 解決策①:賢いスタート地点 - Xavier と He の初期化

勾配が安定して伝わるためには、ネットワークの各層を通過する信号の分散が、大きくなったり小さくなったりしないことが理想です。つまり、入力信号の分散と出力信号の分散が同じであってほしいのです。
この思想に基づいて、重みを「ちょうどいい感じ」のばらつきで初期化するのが、Xavier初期化とHe初期化です。

Xavierの初期化 (Glorot Initialization)

主に tanhsigmoid といった、出力が0を中心に対称な活性化関数で効果を発揮します。
入力ノード数を $n_{in}$、出力ノード数を $n_{out}$ としたとき、重み$W$を以下の分散を持つ正規分布、または範囲を持つ一様分布で初期化します。
$$
\text{正規分布の場合: } W \sim N\left(0, \sqrt{\frac{2}{n_{in} + n_{out}}}\right)
$$

これにより、順伝播(信号)と逆伝播(勾配)の両方で、分散が保たれやすくなり、学習が安定します。

Heの初期化

主に ReLU とその派生関数で使われます。ReLUは入力が負の時に出力を0にするため、Xavierの初期化では分散が半分になってしまい、信号が徐々に弱まる(消失する)傾向にあります。
Heの初期化は、その点を考慮して分散を調整します。
$$
\text{正規分布の場合: } W \sim N\left(0, \sqrt{\frac{2}{n_{in}}}\right)
$$
ReLUを使う場合、Heの初期化を用いるのが現在のデファクトスタンダードとなっています。

7. 解決策②:暴走を防ぐ安全装置 - 勾配クリッピング

重みの初期化は勾配消失と爆発の両方に有効ですが、特にRNNでは学習中に勾配爆発が突発的に起こることがあります。それを防ぐための、いわば「安全装置」「ヒューズ」が勾配クリッピング (Gradient Clipping) です。

これは非常にシンプルなアルゴリズムです。

  1. 逆伝播で、ネットワーク全体の全てのパラメータに対する勾配を計算します。
  2. 全ての勾配を一つの巨大なベクトル $g$ とみなし、そのベクトルの大きさ(L2ノルム $|g|$)を計算します。
  3. もし、その大きさ $|g|$ が、あらかじめ決めておいたしきい値 (threshold) を超えていたら、勾配ベクトル全体を縮小して、大きさがちょうどしきい値になるように正規化します。

数式で書くと以下のようになります。
$$
\text{if } |g| > \text{threshold}: \
\quad g \leftarrow \frac{\text{threshold}}{|g|} g
$$
これにより、勾配の「方角」は変えずに、「勢い」だけを強制的に抑え込むことができます。
どんなに大きな勾配が計算されても、この安全装置のおかげでパラメータの更新が破壊的なものになるのを防ぎ、学習の安定性を劇的に向上させます。

まとめ

モデルの学習を安定化させるための、地味だが極めて重要なテクニックを学びました。

  • 勾配消失/爆発: RNNのような深い(長い)ネットワークでは、勾配という名のフィードバックが伝わる過程で、弱すぎたり強すぎたりして学習が失敗する。
  • 重みの初期化 (Xavier/He): ネットワークを流れる信号の分散を一定に保つように、賢く重みの初期値を設定する。これにより、勾配が適切な大きさで伝わりやすくなる。学習のスタートを成功させるための鍵。
  • 勾配クリッピング: 勾配の大きさに上限を設け、それを超えたら強制的に縮小する。これにより、学習中の突発的な勾配爆発を防ぐ。学習プロセスを守るための安全装置。

現代の深層学習フレームワークでは、これらのテクニックは簡単に実装できるようになっています。しかし、その裏側にある「なぜこれが必要なのか?」という理由を理解しているかどうかは、モデルがうまく学習しないといった問題に直面した際の、トラブルシューティング能力に大きな差を生むでしょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?