スタンフォード CS229 機械学習 2026年春 第8講: ニューラルネットワーク 2 (バックプロパゲーション)

バックプロパゲーションと計算グラフ

バックプロパゲーションは、モデルのパラメータに関する損失関数の勾配を計算するために使用される基本的なアルゴリズムです。ディープラーニングでは、このプロセスはしばしば 自動微分 と呼ばれます。核心的な技術的なポイントは、任意の微分可能な回路(算術演算と基本関数のシーケンスから構成されるネットワーク)に対して、その勾配はフォワードパスと同じ漸近的時間計算量で計算できるということです。

複雑性の定理

サイズ $n$ (ここで $n$ は演算の数)の微分可能な回路が実数値スカラー関数 $f$ を計算する場合、その入力に関する $f$ の勾配も $O(n)$ 時間で計算できます。

ニューラルネットワークの文脈では:

  • フォワードパス: 与えられた入力に対する損失関数の評価。
  • バックワードパス: その損失のパラメータに関する勾配の計算。

ニューラルネットワークを評価するために必要な演算の数は通常パラメータの数に比例するため、フォワードパスとバックワードパスの両方は $O(ext{number of parameters})$ 時間で動作します。

効率的な勾配計算の応用

効率的な勾配計算により、いくつかの高度な機械学習手法が可能になります:

  • 二階法: フルヘッシアン行列($n imes n$ 行列)を計算するのは計算上禁止されることがありますが、ヘッシアンベクトル積は $O(n)$ 時間で効率的に計算できます。これは、その関数自身が勾配の積である関数の勾配を計算することで達成されます。
  • メタ学習: バックプロパゲーションはアルゴリズム自身に適用できます。例えば、勾配降下法のステップを通じてバックプロパゲーションを行い、最終的な損失を最小化することで学習率や初期化を最適化できます。

チェーンルールのメカニズム

バックプロパゲーションはチェーンルールの反復適用です。これを理解するために、入力 $z$ が関数 $g$ を通って中間変数 $u$ を生成し、それがさらに関数 $f$ を通ってスカラー出力 $j$ を生成する関数を考えます。

バックワード関数

最終出力 $j$ の入力 $z$ に関する勾配を計算するために、チェーンルールは次の公式を提供します:$z$ に関する勾配は、中間変数 $u$ に関する勾配の線形結合です。

数学的には、これは行列乗算として表されます: $$rac{ext{d}j}{ext{d}z} = (ext{Jacobian of } g)^T imes rac{ext{d}j}{ext{d}u}$$

このメカニズムは「マルコフ的」な性質を持ちます:特定の層での勾配を計算するには、その後の層からの勾配 ($rac{ext{d}j}{ext{d}u}$) と現在の関数 $g$ およびその入力 $z$ の局所情報のみが必要です。その後の勾配を生成した関数 $f$ の内部詳細を知る必要はありません。

ニューラルネットワークの層におけるバックプロパゲーション

マルチレイヤーネットワークでは、このプロセスは2つの交錯したフェーズを含みます:活性化(中間変数)に関する勾配の計算と、パラメータに関する勾配の計算。

1. 活性化に関する勾配

最初の層の勾配を見つけるために、アルゴリズムはまず最終出力からすべての後続層を通じて勾配を逆方向に伝播させる必要があります。これにより、次のような sequential dependency が生じます:$rac{ext{d}j}{ext{d}u_k} ightarrow rac{ext{d}j}{ext{d}u_{k-1}} ightarrow rac{ext{d}j}{ext{d}u_1}$。

2. パラメータに関する勾配

活性化 $u_i$ に関する勾配がわかっている場合、その層に関連するパラメータ $eta_i$ に関する勾配は独立して計算できます。これにより、活性化勾配が伝播された後、パラメータ勾配の更新を潜在的に並列化することができます。

後方関数の具体例

行列乗算(線形層)

線形変換 $u = Wz + b$ に対して:

  • 入力 $z$ に関する勾配: 後方関数は単純に重み行列の転置と入ってくる勾配の積です:$rac{ext{d}j}{ext{d}z} = W^T rac{ext{d}j}{ext{d}u}$。
  • 重み $W$ に関する勾配: 特定の重み $w_{ij}$ に関する勾配は、それが接続する出力の勾配とそれが発生する入力の値の積です。行列形式では、これは外積です:$rac{ext{d}j}{ext{d}W} = rac{ext{d}j}{ext{d}u} z^T$。これにより、単一のトレーニング例に対してランク1の行列が得られます。

活性化関数(要素ごとの層)

要素ごとの活性化関数 $u = ext{sigma}(z)$ に対して:

  • ヤコビアンは対角行列です。なぜなら各出力 $u_i$ は対応する入力 $z_i$ にのみ依存するからです。
  • 後方パスは、入ってくる勾配と活性化関数の導数の要素ごとの(ハダマード)積として計算されます:$rac{ext{d}j}{ext{d}z} = ext{sigma}'(z) ext{⊙} rac{ext{d}j}{ext{d}u}$。

この効率により、$m$ 次元ベクトルに対する活性化関数の後方パスは $O(m)$ のまま保たれ、フォワードパスの計算量と一致します。

Sources