第4章

学習の仕組み — 重みはどうやって決まるのか

ニューラルネットには 数百万〜数千億のパラメータ(重み) があります。 人間が手で決めるのは絶対無理。これらは 「学習」というアルゴリズム でデータから自動的に決まります。 この章では「学習」とは何かを、数式とインタラクティブなアニメーションで完全に理解します。

この章の全体像

「学習」とは、たった1つの考え方で動いています:

1

誤差を測る

予測 $y$ と正解 $t$ のズレを 損失関数 $L$ として数値化。これが小さいほど良い予測。

2

誤差が減る方向を探す

損失 $L$ をパラメータで微分(勾配)。「どっちにパラメータを動かせば $L$ が小さくなるか」が分かる。

3

少しずつ動かす

勾配の逆方向にパラメータを少しずらす(勾配降下法)。これを何百万回も繰り返すと、$L$ が最小になるパラメータに到達。

💡 核心: ニューラルネットの学習は、「巨大な凸凹地形のなかで、最も低い谷を探す」最適化問題です。 その地形を歩く道具が勾配(傾き情報)、効率的に勾配を計算する技が 誤差逆伝播法

1. 学習とは何か — 出発点

1.1 ニューラルネットの問題設定

第3章 で見たように、ニューラルネットは パラメータ化された関数です:

$$y = f(x; \theta)$$

そもそも $\theta$ って何? — イメージで理解する

$\theta$(シータ)と書くと数学的で難しく見えますが、要は 「ネット内の全部の調整つまみを1つの大きな袋に入れたもの」 です。

イメージ:巨大な調整つまみの集まり

θ = (
    w₁₁, w₁₂, w₁₃, ...,    ← 第1層の重み(数千〜数百万個)
    b₁,  b₂,  b₃,  ...,    ← 第1層のバイアス
    w₂₁, w₂₂, w₂₃, ...,    ← 第2層の重み
    b₂,  b₂,  b₃,  ...,    ← 第2層のバイアス
    ...                     ← 全層の重みとバイアス
)

  ↑ これが全部「1つのベクトル」 = θ

例えば NNUE は約 1050万個ChatGPT 級は数千億個 のつまみが束ねられている。

🎚️ たとえ話:ステレオの音響イコライザでイメージする(クリックで展開)

音楽プレイヤーのイコライザを思い出してください:低音、中音、高音…と つまみがたくさん ある。 それぞれを動かすと音が変わります。

🎵 音楽イコライザ つまみ5個 — 人間が手で調整 中低 中高 5個のつまみ で音色を調整 🧠 ニューラルネット (θ) つまみ約1050万個 — 学習で自動調整 ≒1050万個 これが「θ」

ニューラルネットの $\theta$ は、このイコライザのつまみを途方もなく多くしたものと思ってください。 「θ を動かす」 = 「ネットの全つまみを少しずつ動かす」という意味になります。

📐 なぜ「ベクトル」と呼ぶのか — 数学的な背景(クリックで展開)

数学的には、複数の数値を順序付きで並べたものを ベクトル と呼びます:

  • 2次元ベクトル:$(x, y)$ — 例:地図上の座標
  • 3次元ベクトル:$(x, y, z)$ — 例:3D空間の位置
  • 1050万次元ベクトル:$(\theta_1, \theta_2, \ldots, \theta_{10{,}500{,}000})$ — それが NNUE のθ

人間は3次元までしか直感的に見えませんが、数学的にはどんな高次元でも扱えます。θ は「1050万次元空間の中の1点」と見なせるわけです。

問題は、$\theta$ の値(つまみの組み合わせ)をどう決めるか

1.2 手で決めるのは不可能

NNUEは約1050万個のパラメータを持ちます。1日1個決めても 2万8千年 かかる計算。 ChatGPT級なら 数千億〜兆 個。手作業は完全に論外です。

しかも各パラメータを単独で評価することもできない。「W[1][1] = 0.5237 が良いか?」は、 残りの数千万のパラメータが全部決まって初めて評価できる。

⚠️ パラメータは全員同時に決める必要がある。だから、データから自動で最適な組み合わせを見つける仕組み = 学習が必須。

1.3 「学習」を最適化問題として定式化

学習を数学的に書くとこうなります:

問題:データセット $D = \{(x_1, t_1), (x_2, t_2), \ldots, (x_N, t_N)\}$ が与えられたとき、 パラメータ $\theta$ を変数として、損失関数 $L(\theta)$ を最小化する $\theta^*$ を求めよ。

$$\theta^* = \arg\min\limits_{\theta} L(\theta)$$

この数式の意味を分解する

機械学習の論文や教科書で 必ず登場する 1行。記号ごとに意味を分解しましょう。

記号 意味 ひと言で
$\theta$ パラメータ全体(重みとバイアスの束) 「ネットのつまみの集まり」
$L(\theta)$ θ を入れると「予測のズレ」がスカラー値で返る関数 「θ がどれくらい悪いか」
$\min\limits_{\theta} L(\theta)$ θ を動かしたときの L の 最小値そのもの(数値) 「最も小さくなった L の値」
$\arg\min\limits_{\theta} L(\theta)$ L が最小になるときの θ の値 「最小を取るときのつまみ位置」
$\theta^*$ 「最適な θ」を表す慣例的な記号(上付きの *)
読み方:「シータスター」
「これが探し求めるθ」

📢 読み方と記号の慣例

関連表記:$\hat{\theta}$(推定値、シータハット)、$\bar{\theta}$(平均、シータバー)、$\tilde{\theta}$(変形値、シータチルダ)、$\theta'$(プライム、別の値や微分)

📐 補足:$\min$ と $\arg\min$ の違い — 高校数学の復習(クリックで展開)

似ているけど結果が違います。1次元の例で確認:

$L(\theta) = (\theta - 3)^2 + 1$ という放物線を考えると…

min L = 1 ↑ 最小値(数値) θ* = 3 ← arg min(最小を取るθ) θ L(θ) 1 2 4 5 5 L(θ) = (θ − 3)² + 1
  • $\min\limits_{\theta} L(\theta) = 1$(最小値そのもの = 1。縦軸の値)
  • $\arg\min\limits_{\theta} L(\theta) = 3$(最小を取るときの θ = 3。横軸の値)

学習で知りたいのは 「最小値が何点か」ではなく「どのθで最小になるか」。 だから $\arg\min$ を使い、その答えを $\theta^*$(最適解)と呼びます。

🏔️ 補足:「凸凹地形のなかで最も低い谷を探す」イメージ(クリックで展開)

この数式を絵で見ると、「巨大な凸凹地形のなかで、最も低い谷の位置を探す」 問題になります:

⛰️ ⛰️ ⛰️ 局所最小 局所最小 θ* ← 最も低い谷 (学習の目的地) θ (パラメータ、高次元) L(θ) (損失) 損失関数の凸凹地形と最適解 θ*
θ*(赤):最も低い谷 = 学習の目的地
局所最小(灰):浅い谷に捕まると、ここで止まる罠
カーブ:θ を動かしたときの L(θ) の値(凸凹だらけ)

ただし注意:実際は θ が 1050万次元なので、地形は人間には可視化できないほど複雑。 それでも数学的な「最も低い谷を探す」問題として定式化できる、というのがこの1行の意味です。

💡 ひと言で覚えるなら: $\theta^* = \arg\min\limits_{\theta} L(\theta)$ = 「Lを最小にするθを θ* と呼ぶ」 = 「学習の目標は、損失を最小にするパラメータの組み合わせを見つけること」

ここからは、$L(\theta)$ をどう定義するか(損失関数)と、それをどう最小化するか(勾配降下法)の話になります。

2. 損失関数 — 「正解とのズレ」を数値化する

学習の第1歩は、「予測 $y$ と正解 $t$ がどれくらい違うか」を 1つのスカラー値 で表すこと。これを 損失関数(loss function) と呼びます。

📢 記号 $y$ と $t$ の意味

記号 意味 由来
$y$ モデル(ニューラルネット)の 予測出力 output(出力)の慣例的記号
$t$ データに付いている 正解ラベル(教師データ) target(目標)/ true(真値)/ teacher(教師信号)の頭文字

📚 表記の流派:機械学習の文献では2つの書き方があります。

どの流派でも意味は同じ:「モデルの予測」 vs 「データの正解」のズレを測る

2.1 二乗誤差(MSE) — 回帰の定番

📢 MSE = Mean Squared Error(平均二乗誤差)

文字 元の単語 意味
M Mean 平均(ラテン語 medianus「真ん中の」が語源)
S Squared 二乗された(square「正方形」の過去分詞、$a \times a = a^2$ が正方形の面積になることから)
E Error 誤差(ラテン語 errare「さまよう、間違う」が語源)

順番に分解すると:Error(差) → Squared Error(差の2乗) → Mean Squared Error(全データの平均)

出力が連続値(数値予測)のとき、最も使われる損失関数:

$$L_{\text{MSE}}(y, t) = (y - t)^2$$

※ 上の式は1点ぶんの二乗誤差(Squared Error)。データセット全体で平均すると本来の MSE になります(§2.3 で扱います):

$$\text{MSE} = \frac{1}{N} \sum_{i=1}^{N} (y_i - t_i)^2$$

具体例:

2乗する理由

  1. 符号を消す($y > t$ と $y < t$ を同等に扱う)
  2. 大きなズレほど強くペナルティ(差が10倍になると損失は100倍)
  3. 微分しやすい(後の勾配計算で効く)
📚 関連略語(誤差系の指標:RMSE / MAE / SSE / L2)(クリックで展開)
略語 正式名 MSEとの違い
MSE Mean Squared Error 標準形(このセクションの主役)
RMSE Root Mean Squared Error $\sqrt{\text{MSE}}$。平方根を取って元の単位(m, kgなど)に戻す
MAE Mean Absolute Error 2乗の代わりに絶対値 $|y-t|$。外れ値に強い
SSE Sum of Squared Errors 合計(平均しない、Σのみ)
L2 loss L2ノルム損失 MSEと数学的に等価。ベクトルの長さの2乗

2.2 交差エントロピー — 分類の定番

📚 コラム:対数(log)とは何か(クリックで展開)

交差エントロピーで使う $\log(y)$ という関数。本筋から少し脱線しますが、ここでじっくり「対数」を確認しておきましょう。

1. 対数の定義 — 「指数の逆」

対数は 「ある数 $x$ を作るために、底 $a$ を何回掛けるか」 を返す関数:

$$\log_a(x) = b \iff a^b = x$$

底 10 の例(常用対数):

$x$計算$\log_{10}(x)$
1$10^0 = 1$0
10$10^1 = 10$1
100$10^2 = 100$2
1000$10^3 = 1000$3
1,000,000$10^6$6

桁数を表す関数、と思うと直感的。

2. 底の種類

記法 名称 主な用途
$\log_{10}$(一般工学) 10 常用対数 工学、科学(地震・pH等)
$\ln$ または $\log$(ML文脈) $e \approx 2.718$ 自然対数 機械学習・微分積分の標準
$\log_2$ 2 二進対数 情報理論、ビット数

機械学習で $\log$ と書いてあるとき、ほぼ自然対数(底 $e$) です。微分が綺麗($\frac{d}{dx}\ln(x) = \frac{1}{x}$)だから。

📐 コラム・イン・コラム:自然対数の e(ネイピア数)の正体

$e \approx 2.71828\ldots$ という、円周率 $\pi$ と並ぶ数学の超有名定数。なぜこれが「自然」と呼ばれ、機械学習で標準なのか。

1. e の正体は「複利計算の極限」

最も直感的な定義は、銀行の利息計算。
100万円を年利 100% で1年運用する とき:

複利の頻度計算式結果
年1回(複利なし)$100 \times (1+1)$200万
半年に1回$100 \times (1+0.5)^2$225万
月1回$100 \times (1+1/12)^{12}$261万
日1回$100 \times (1+1/365)^{365}$271.4万
瞬間ごと(連続複利)$100 \times e$271.8万

「連続的に複利で増える」上限が $e$。数式で書くと:

$$e = \lim_{n \to \infty} \left(1 + \frac{1}{n}\right)^n$$

2. 複利の極限が e に収束する様子(グラフ)

n (1+1/n)ⁿ 3.0 e ≈ 2.718 2.5 2.0 1 10 100 1k 10k e の上限値 n=1: 2.00 n=10: 2.59 n=100: 2.70 n=1000: 2.717 分割回数 n を増やすと e に収束する

n を大きくしていくと、$e \approx 2.718$ の上限値に漸近。これが「自然界の連続成長率の限界」と呼ばれる所以。

3. もう一つの定義:級数(無限和)

$$e = \frac{1}{0!} + \frac{1}{1!} + \frac{1}{2!} + \frac{1}{3!} + \cdots = \sum_{n=0}^{\infty} \frac{1}{n!}$$

$1 + 1 + 0.5 + 0.1667 + 0.0417 + 0.0083 + \cdots \approx 2.71828$

4. なぜ「自然」と呼ばれるか — 微分の魔法

$e^x$ は「自分を微分しても自分のまま」唯一の関数

d/dx (eˣ) = eˣ              ← e のときだけシンプル!
d/dx (2ˣ) = ln(2) × 2ˣ      ← 余分な係数 ln(2) ≈ 0.693
d/dx (10ˣ) = ln(10) × 10ˣ   ← 同じく ln(10) ≈ 2.303

$a^x$ を微分すると $\ln(a) \times a^x$。$a = e$ のときだけ $\ln(e) = 1$ で係数が消える

自然対数 $\ln(x)$ も微分が綺麗:

d/dx ln(x) = 1/x                    ← 自然対数だけシンプル
d/dx log₁₀(x) = 1/(x × ln(10))      ← 余分な係数

機械学習では誤差逆伝播で大量の微分計算 をするので、係数が出ない $e$ ベースが断然便利。これが「機械学習で `log` と書いたら自然対数 `ln`」の理由。

5. オイラーの公式 — e の偉大さ

数学で最も美しいとされる式:

$$e^{i\pi} + 1 = 0$$

5つの基本定数($e$, $i$(虚数), $\pi$, $1$, $0$)を1つに繋ぐ。これが $e$ の特別さの究極の証拠。

6. 機械学習で e が出る場面

場面数式
Sigmoid関数$\sigma(z) = \dfrac{1}{1 + e^{-z}}$
Softmax$\text{softmax}(z_i) = \dfrac{e^{z_i}}{\sum_j e^{z_j}}$
交差エントロピー$-\log(y)$(自然対数)
ガウス分布$\dfrac{1}{\sqrt{2\pi}\sigma} e^{-(x-\mu)^2/2\sigma^2}$

すべて 「微分すると綺麗になる」 から $e$ が選ばれている。

7. 歴史

出来事
1683年ヤコブ・ベルヌーイが複利計算で初めて発見
1731年レオンハルト・オイラーが文字 `e` を採用("exponential" の頭文字)
1748年オイラーが $e^{i\pi} + 1 = 0$ を発見
以降微積分・確率論・物理学で標準定数

「e」は オイラー(Euler)の頭文字でもあるが、本人は exponential(指数)の頭文字として導入した。「ネイピア数」はジョン・ネイピア(対数の発見者)にちなむ別名。

💡 ひと言で: $e$ は「連続的な成長の限界」「微分しても変わらない唯一の数」。 機械学習で log や exp が出てきたら、ほぼすべて底は e と思って間違いない。

3. 自然対数 $\ln(x)$ のグラフ

x y = ln(x) 1 3 5 7 9 1 2 −1 −2 x=1, y=0 x=0.5 ln(0.5)≈-0.69 x=0.1 ln(0.1)≈-2.3 ↓ x→0 で y→−∞ x=3, y=ln(3)≈1.1 x→∞ でゆっくり増加 → 自然対数 y = ln(x) のグラフ

重要な特徴:

  • $x = 1$ で $y = 0$(緑点)— 「1を作るには $e$ を 0回掛ける」
  • $x \to 0$ で $y \to -\infty$ — 急激に負の無限大へ落ちる
  • $x \to \infty$ で $y \to \infty$、ただしゆっくり増える
  • $x \le 0$ では定義されない

4. log の3つの魔法の性質

  1. 掛け算 → 足し算:$\log(a \times b) = \log(a) + \log(b)$
  2. べき乗 → 掛け算:$\log(a^n) = n \times \log(a)$
  3. 割り算 → 引き算:$\log(a/b) = \log(a) - \log(b)$

これらにより、確率の 掛け算(アンダーフローしやすい)足し算(安定) に変換できる。機械学習・統計で log が頻出するのはこのため。

5. なぜ機械学習で $-\log(y)$ を使うのか

確率 $y$ は 0〜1 の範囲。log を取ると:

  • $y = 1$ → $\log(1) = 0$
  • $y = 0.5$ → $\log(0.5) \approx -0.69$
  • $y = 0.01$ → $\log(0.01) \approx -4.6$
  • $y \to 0$ → $\log(y) \to -\infty$

確率が小さいほど log は 大きな負の数マイナス記号を付ければ正の損失 として扱える:

  • $y = 1$ → $-\log(1) = 0$(罰なし)
  • $y = 0.01$ → $-\log(0.01) = 4.6$(大きな罰)
  • $y \to 0$ → $-\log(y) \to +\infty$(無限の罰)

これが「予測が外れるほど罰が指数的に増える」仕組み。

6. 身近な「対数スケール」の例

現象スケール意味
地震マグニチュード$\log_{10}$M7 は M6 の 10倍のエネルギー
デシベル(音圧)$\log_{10}$10dB 増 = 10倍の音圧
pH(酸性度)$-\log_{10}$pH3 は pH4 の 10倍酸性
音楽の音程$\log_2$1オクターブ上 = 周波数2倍
計算量(バイナリサーチ)$\log_2$$n=1024 \to \log_2(1024)=10$ 回

人間の感覚(音、光、酸性度)は 対数的 に世界を捉えている。だから「log で測る」のが自然な場面が多い。

7. プログラマ的に:log は exp の逆関数

import math

# 指数関数
exp_5 = math.exp(5)        # e^5 ≈ 148.4

# その逆(自然対数)
math.log(exp_5)            # 5(元に戻る)

# 性質1の確認
math.log(2 * 3)            # ≈ 1.79
math.log(2) + math.log(3)  # ≈ 1.79(同じ)

$\exp$ と $\log$ は 互いに逆関数

  • $\exp(\log(x)) = x$
  • $\log(\exp(x)) = x$

出力が確率(0〜1)のとき。NNUEや画像分類でも使われる:

$$L_{\text{CE}}(y, t) = -[t \log y + (1-t) \log(1-y)]$$

この式全体をグラフで見る

まずは $t = 0$ と $t = 1$ のそれぞれで、$y$ を動かしたときに損失 $L$ がどう変化するか を1つのグラフに重ねて見てみましょう。

L = −[t·log(y) + (1−t)·log(1−y)] の全体像 y 予測確率 L 損失 0 0.25 0.5 0.75 1.0 1 2 3 4 5 t = 1 のとき: L = −log(y) t = 0 のとき: L = −log(1−y) ケース1: t=1, y=0.99 → L≈0 ケース2: t=1, y=0.01 → L≈4.6 ケース3: t=0, y=0.01 → L≈0 ケース4: t=0, y=0.99 → L≈4.6 y=0.5 では両方とも L=ln2≈0.69 ↑∞ ∞↑

💡 このグラフが伝えること🔴 t=1 のカーブy → 0 で無限大(正解が「猫」なのに「猫じゃない」と高確率で予測した誤り)。
🔵 t=0 のカーブy → 1 で無限大(正解が「猫じゃない」なのに「猫」と高確率で予測した誤り)。
正解側に近い予測(緑の点)はほぼ罰ゼロ正解と真逆の高確率予測(赤の点)は無限大の罰になります。

この数式を1つずつ分解する

一見複雑ですが、これは 2値分類(正解が 0 または 1)の条件分岐を1行にまとめた ものです。

記号の確認
記号意味値の範囲
$t$正解ラベル(target)0 または 1
$y$モデルの予測確率$0 \leq y \leq 1$
$\log$自然対数(底 $e$)
2つの項に分解
L(y, t) = -[ t · log(y)  +  (1-t) · log(1-y) ]
            └────┬───┘     └──────┬──────┘
              項A:               項B:
            「t=1のとき」用    「t=0のとき」用
ケース1:正解 $t = 1$ のとき

$$L = -[1 \cdot \log(y) + (1-1) \cdot \log(1-y)] = -\log(y)$$

項B が消えて $-\log(y)$ だけ残る:

ケース2:正解 $t = 0$ のとき

$$L = -[0 \cdot \log(y) + (1-0) \cdot \log(1-y)] = -\log(1-y)$$

項A が消えて $-\log(1-y)$ だけ残る:

つまり:t は「スイッチ」
       ┌─ t=1 のとき → -log(y) を使う
L(y,t) ┤
       └─ t=0 のとき → -log(1-y) を使う
なぜ1つの式にまとめるのか
  1. コードがシンプル:`if t == 1: ... else: ...` という分岐がいらない
  2. 微分しやすい:1つの数式として自動微分(PyTorch等)できる
  3. 数学的に美しい:場合分けより本質を表現できる
# Pythonでの実装:分岐なしで1行
def binary_cross_entropy(y, t):
    return -(t * math.log(y) + (1 - t) * math.log(1 - y))
📝 具体例で確認 — 「猫かどうか」判定タスク(4ケース)(クリックで展開)

ピンと来ない場合は、具体例で考えるのが一番。「画像が猫かどうかを判定する」タスクで見ていきましょう。

記号の意味を再確認

  • $t$(正解ラベル):データの真実
    • $t = 1$ → 「実際に猫
    • $t = 0$ → 「実際は猫じゃない
  • $y$(予測確率):モデルが 「猫である」と思う確率(0〜1)
    • $y = 0.99$ → 「確率99%で『猫』」と予測(モデルは「ほぼ猫だ」と判断)
    • $y = 0.01$ → 「確率1%で『猫』」=「確率99%で『猫じゃない』」と予測

4つのケースで見ていくと:

ケース1:$t=1$(実は猫)かつ $y=0.99$(モデルも「ほぼ猫」と予測)

正解側に高確率で予測できた → $L \approx 0.01$(ほぼ罰なし)

ケース2:$t=1$(実は猫)かつ $y=0.01$(モデルは「ほぼ猫じゃない」と予測)

正解と真逆を高確率で予測した → $L \approx 4.6$(大ハズレ)

ケース3:$t=0$(実は猫じゃない)かつ $y=0.01$(モデルも「ほぼ猫じゃない」と予測)

正解側に高確率で予測できた → $L \approx 0.01$(ほぼ罰なし)

ケース4:$t=0$(実は猫じゃない)かつ $y=0.99$(モデルは「ほぼ猫」と予測)

正解と真逆を高確率で予測した → $L \approx 4.6$(大ハズレ)

表でまとめる
実際 ($t$) 予測 ($y$) モデルの判断 結果 損失 $L$
1(猫) 0.99 「確率99%で猫」 正解 🎯 0.01
1(猫) 0.01 「確率99%で猫じゃない」 誤り 4.6
0(非猫) 0.01 「確率99%で猫じゃない」 正解 🎯 0.01
0(非猫) 0.99 「確率99%で猫」 誤り 4.6

💡 ポイント: $y$ は 常に「クラス1(猫)である確率」。 $t$ がどちらでも、$y$ が 正解側に近い ($t=1$ なら $y \to 1$、$t=0$ なら $y \to 0$)と損失は小さい。
逆に 正解から離れた強い予測($t=1$ なのに $y \to 0$、$t=0$ なのに $y \to 1$)は大ハズレで $L \to \infty$。

この関数は、確率分布の「距離」を測る情報理論的な根拠を持ちます。次のコラムで、なぜ「交差エントロピー」という名前なのか、その由来を解説します。

📚 コラム:なぜ「交差エントロピー」という名前なのか(クリックで展開)

Cross-Entropy = 交差 + エントロピー

単語意味
Cross交差、交わる、組み合わせる
Entropyエントロピー(不確実さ、無秩序の度合い)

1. まず「エントロピー」とは

19世紀に 物理学 で登場した概念で、元々は「無秩序さ・混沌の度合い」を表す量。

これを 情報理論 に持ち込んだのが、1948年の クロード・シャノン。 確率分布の「不確実さ」を測る量として定式化しました:

$$H(p) = -\sum_{i} p_i \log p_i$$

例で見ると:

  • 公平なコイン投げ:表50% / 裏50% → エントロピー高い(予測しにくい、混沌)
  • イカサマコイン:表99% / 裏1% → エントロピー低い(ほぼ表と分かっている)

分布がどれくらい予測不可能か」の指標です。

📐 コラム・イン・コラム:「予測不可能か」をもう少し詳しく — 驚き量と平均

「予測不可能」と言われてもピンと来ない人へ。 エントロピーは 「次に何が起こるかの平均的な意外性(驚き量) と読み替えると一気に分かります。

① まず「驚き量」を定義する

ある事象(例:「表が出た」)の 確率が $p$ のとき、それが実際に起きたときの 驚き を次の値で測ります:

$$\text{驚き量}(p) = -\log p \quad \text{(情報量とも呼ぶ)}$$
  • $p = 1$(必ず起きる)→ $-\log 1 = 0$(0驚き。「だろうね」)
  • $p = 0.5$(半々)→ $-\log 0.5 \approx 0.69$(中ぐらい)
  • $p = 0.01$(めったに起きない)→ $-\log 0.01 \approx 4.6$(大きな驚き。「マジか!」)

ポイント:めったに起きないことが起きた時ほど、驚き量は大きい。「$\log$」を使うのは、「2倍珍しい」が「1段階驚き」に対応するように調整されているから。

② エントロピー = 驚き量の「平均値」

シャノンのエントロピー $H(p) = -\sum p_i \log p_i$ は、各事象の 驚き量 $-\log p_i$ を、その事象の発生確率 $p_i$ で重み付けして平均 しているだけです。

$$H(p) = \underbrace{p_1 \cdot (-\log p_1)}_{\text{表が出る確率 × 表が出たときの驚き}} + \underbrace{p_2 \cdot (-\log p_2)}_{\text{裏が出る確率 × 裏が出たときの驚き}} + \cdots$$

つまり 「次のコイン投げで平均してどれくらい驚かされるか」 がエントロピー。

③ コインの例で数値計算
コイン表($p_1$)裏($p_2$)計算$H$(平均驚き)
公平 0.5 0.5 $0.5 \times 0.69 + 0.5 \times 0.69$ 0.69(高い)
少し偏り 0.8 0.2 $0.8 \times 0.22 + 0.2 \times 1.6$ 0.50(中)
イカサマ 0.99 0.01 $0.99 \times 0.01 + 0.01 \times 4.6$ 0.056(低い)
確定(イカサマ振り切り) 1.0 0 $1 \times 0 + 0 \times \infty$ 0(驚きゼロ)
④ なぜ公平コインが最大?
  • 公平コイン(50/50):表でも裏でも「半々だったし、まあそうかな」と 毎回そこそこ驚く → 平均が高い
  • イカサマ(99/1):99%は「予想通り(驚きゼロに近い)」、1%は「マジか!」だが滅多にない → 平均すると ほとんど0
  • 確定(100/0):いつも予想通り → 驚きゼロ。完全な無秩序ゼロ=混沌の対極
⑤ グラフで見る:2値分布のエントロピー
H(p) = −p·log(p) − (1−p)·log(1−p) p 表が出る確率 H エントロピー 0 0.25 0.5 0.75 1.0 0.2 0.4 0.693 公平 (p=0.5) 最大エントロピー イカサマ (p=0.99) H≈0.056

💡 p = 0.5(公平)で山の頂上。両端(p=0 or 1)で H=0。 偏れば偏るほど「次は何が出るか予測できる」 = エントロピーが下がる = 平均驚き量が小さい。

💡 1行まとめ: エントロピー = 「次に何が起こるか分かりにくいほど大きい」。 数学的には 「驚き量 $-\log p_i$ の期待値」

2. 「交差」エントロピー:2つの分布の組み合わせ

通常のエントロピー $H(p)$ は 1つの分布 $p$ の不確実さ。 交差エントロピー $H(p, q)$ は 2つの分布 $p$ と $q$ を掛け合わせた 量:

$$H(p, q) = -\sum_{i} p_i \log q_i$$

ここで:

  • $p$:真の分布(データの正解)
  • $q$:予測の分布(モデルの出力)
  • $p_i \log q_i$ で 2つの分布が掛け合わされている → これが「交差」の由来
📐 コラム・イン・コラム:$H(p, q) = -\sum p_i \log q_i$ のイメージを掴む

一見ややこしい式ですが、「$p$ の世界に住んでいる人が、$q$ を信じたときの平均驚き量」と読めばストンと入ります。

① 部品を1つずつ意味付け
H(p, q) = − Σᵢ   pᵢ     ·    log qᵢ
                  ↑           ↑
            真の発生確率   その事象を「qで信じた」ときの予測確率
            (現実の世界)   (モデルが思っている確率)

$-\log q_i$ は、「モデルが事象 $i$ に確率 $q_i$ を割り当てていたとき、実際に $i$ が起きたら『どれくらい驚くか』」。 それを、現実での発生確率 $p_i$ で重み付けして平均しています。

② 1ステップで意味を組み立てる
  1. モデルは「クラス $i$ の確率は $q_i$ だろう」と予測している
  2. もし本当にクラス $i$ が起きたら、モデルは $-\log q_i$ ぶん驚く($q_i$ が小さいほど大ハズレ)
  3. 現実でクラス $i$ が起きる確率は $p_i$
  4. これらを全クラスについて足し合わせ=$p$ の世界でモデルが感じる平均の驚き=損失
③ 具体例で計算してみる(2クラス分類)

正解の分布 $p = (1, 0)$(クラス1が確定)として、3つのモデル $q$ で比べる:

モデル $q = (q_1, q_2)$ 計算 $H(p, q)$
A:自信あり正解 (0.99, 0.01) $-1 \times \log 0.99 - 0 \times \log 0.01$ ≈0.01(ほぼ罰なし)
B:迷っている (0.5, 0.5) $-1 \times \log 0.5 - 0 \times \log 0.5$ ≈0.69(中ぐらい)
C:真逆を確信 (0.01, 0.99) $-1 \times \log 0.01 - 0 \times \log 0.99$ ≈4.6(大ハズレ)

$p_2 = 0$ なので 2項目は全て消える。 残る $-p_1 \log q_1 = -\log q_1$ が「正解クラスにどれだけ確率を割り当てたか」を測る損失になります。

④ なぜ「平均」が損失になるのか

機械学習では正解 $p$ がワンホット(例:$(1,0)$)なので、$H(p,q)$ は実質「正解クラスに割り当てた確率 $q_{\text{正解}}$ の対数の符号反転」になります。

  • 正解に高い確率を割り当てた → $-\log q_{\text{正解}}$ は小さい → 損失小
  • 正解に低い確率しか割り当てない → $-\log q_{\text{正解}}$ は大きい → 損失大

💡 1行まとめ: $H(p, q)$ は 「現実は $p$ なのに $q$ で予想したら、どれだけ驚かされるかの平均」。 予想が良ければ驚きが少なく=損失が小さい。

3. 直感的な意味

「真の答えが $p$ の世界で、もし $q$ を使って情報を符号化したら、どれくらいムダ(=損失)が出るか」

  • $p$ と $q$ が 完全に一致 → 損失最小
  • $p$ と $q$ が 大きくズレる → 損失大きい

つまり、2つの確率分布の "ズレ" を測る指標

📐 コラム・イン・コラム:なぜ「$p$ と $q$ が一致 → 損失最小」なのか

数学的には ギブスの不等式 という事実があり、

$$H(p, q) \geq H(p) \quad (\text{等号は } p = q \text{ のときのみ})$$

つまり $H(p, q)$ は $q = p$ のときに最小化され、その最小値は $H(p)$ です。 ここでは「なぜそうなるか」を機械学習の文脈で具体的に見ていきます。

① 分類タスクでは $p$ がワンホット(確定)

「実際は猫」というラベルは、$p = (1, 0)$(猫の確率100%、猫じゃない確率0%)のように 正解クラスだけ1で他は0 のベクトルになります(これを ワンホット と呼ぶ)。

このとき $H(p) = 0$(驚きゼロ。正解は確定しているから)。だから 損失の理論最小値は0

② 「一致」とは「モデルも100%確信」
  • 正解 $p = (1, 0)$
  • 完璧なモデル $q = (1, 0)$ ←これが「一致」
  • 損失 $H(p,q) = -1 \times \log 1 - 0 \times \log 0 = 0 - 0 = 0$

$\log 1 = 0$ なので、正解クラスに100%の確率を割り当てた瞬間に 損失がぴったり0 になります。

③ ズレるほど損失が増える
正解 $p$予測 $q$ズレ具合損失 $H(p,q) = -\log q_{\text{正解}}$
(1, 0) (1.00, 0.00) 完全一致 0.00(最小!)
(1, 0) (0.99, 0.01) 少しだけズレ 0.01
(1, 0) (0.80, 0.20) 結構ズレ 0.22
(1, 0) (0.50, 0.50) 大きくズレ(迷い) 0.69
(1, 0) (0.01, 0.99) 完全に逆 4.60(大ハズレ)
④ 直感での「なぜ最小?」

② の式 $H(p,q) = -\log q_{\text{正解}}$ を $q_{\text{正解}}$ を動かして眺める と:

  • $q_{\text{正解}} = 1$(最大可能値)→ $-\log 1 = 0$
  • $q_{\text{正解}}$ がそれより小さい値 → $-\log q_{\text{正解}} > 0$(必ず正の値)

つまり $-\log$ は単調減少関数なので、$q_{\text{正解}}$ を限界まで大きくすることが損失最小化と等価。 その「限界」が「正解クラスに確率 $1$ を割り当てる」 = $q = p$。

⑤ ワンホットじゃない場合(一般化)

$p$ がワンホットでなくても(例:知識蒸留やラベル平滑化では $p = (0.9, 0.1)$ のような分布)、ギブスの不等式から $q = p$ で最小になることが保証されます。

$p = (0.9, 0.1)$ の例で確認:

  • $q = (0.9, 0.1)$ → $H(p, q) = -0.9 \log 0.9 - 0.1 \log 0.1 \approx 0.325$(これが $H(p)$)
  • $q = (0.5, 0.5)$ → $H(p, q) = -0.9 \log 0.5 - 0.1 \log 0.5 = 0.693$(増えた)
  • $q = (0.1, 0.9)$ → $H(p, q) = -0.9 \log 0.1 - 0.1 \log 0.9 \approx 2.08$(大きく増えた)

💡 1行まとめ: $-\log$ は 確率が1に近いほど0、0に近いほど∞ の関数。 「正解の確率に1を割り当てる」「$-\log$ の入力を最大化」損失最小。 これが $p = q$ で最小化される機械学習的な意味。

4. 機械学習での対応

数式の意味機械学習で言うと
$p$(真の分布)正解ラベル $t$
$q$(予測の分布)モデルの予測 $y$
$H(p, q)$損失関数

2値分類なら:

  • $p = (t, 1-t)$(正解が1なら $(1, 0)$、0なら $(0, 1)$)
  • $q = (y, 1-y)$(予測が $y$)

これを $H(p, q)$ に代入すると:

$$H(p, q) = -[t \log y + (1-t) \log(1-y)]$$

これがまさに2値交差エントロピーの式

5. なぜ「交差」と呼ぶのか — 図で

交差エントロピー:$p$ と $q$ が「交差」する仕組み 真の分布 p (正解ラベル $t$) $p_i = t$ 「これは正解だ」という確信度 予測分布 q (モデルの予測 $y$) $\log(q_i)$ $y$ を log で評価 × この「×」が「交差」の正体 $p_i \times \log(q_i)$ これを全クラスで足して、マイナスを付ければ交差エントロピー 「自分の確率」で「相手の log」を重み付ける ← だから "交差" ($p$ の方は単なる重み係数、$q$ の方だけ log を取る)

「自分の log」を取らずに「相手の log」を取る から「交差」:

① 自己エントロピー H(p) = − Σ p · log(p) 「自分の確率」で「自分の log」を重み付ける(同じpを2回使う) 真の分布 p 確率 $p_i$ 真の分布 p $\log(p_i)$ × (同じpを掛ける) → 同じ分布同士 ② 交差エントロピー H(p, q) = − Σ p · log(q) 「自分の確率」で「相手の log」を重み付ける(pとqを掛ける = 交差) 真の分布 p 確率 $p_i$ 予測分布 q $\log(q_i)$ × (異なる分布を掛ける = 交差!) → 違う分布同士

6. 関連概念:KL ダイバージェンス

交差エントロピーと深い関係にある概念が KLダイバージェンス(Kullback-Leibler divergence)

$$D_{KL}(p \| q) = H(p, q) - H(p)$$

つまり:交差エントロピー − 自己エントロピー = KLダイバージェンス。 KLは「2つの分布の距離」を厳密に測る指標で、機械学習・統計学の中核概念。

機械学習では $H(p)$ は 正解 $p$ だけで決まる定数 なので、$H(p, q)$ を最小化することは、$D_{KL}$ を最小化することと等価。 だから「交差エントロピーを最小化 = 真の分布に予測を近づける」と解釈できる。

7. 歴史的背景

  • 1865年:クラウジウスが熱力学でエントロピーを導入
  • 1948年:シャノンが情報理論にエントロピーを持ち込む("A Mathematical Theory of Communication")
  • 1951年:Kullback と Leibler が KL ダイバージェンスを提案
  • 1980年代以降:機械学習・ニューラルネットの分類問題で交差エントロピーが標準的な損失関数に

💡 ひと言で: 交差エントロピーは 「真の分布と予測分布のズレ」を、情報理論的に正しく測る指標。 $p$ と $q$ を 掛け合わせて(交差させて) エントロピーを計算するから「交差エントロピー」と呼ばれる。

なぜ確率出力では MSE ではなく交差エントロピーを使うのか?

よくある疑問:「数値予測でMSEを使うなら、確率予測でもMSEでよくない?」 実は、確率出力でMSEを使うと 3つの問題 があります。

⚠️ MSEを確率に使うとダメな3つの理由

  1. 「正解と真逆を高確率で予測した誤り」を強く罰せない(最大ペナルティが頭打ち)
  2. 勾配消失を起こす(Sigmoid + MSE は学習が遅い)
  3. 確率の意味を尊重していない(情報理論的に不自然)
📊 補足:$-\log(y)$ という関数の形をもう一度単独で確認(クリックで展開)

上の「式全体をグラフで見る」で既に2本のカーブを見ましたが、$-\log(y)$ 単独でも形を確認しておきます。 交差エントロピーの中身は $-\log(y)$(マイナス・ログ・y)。

関数 L = −log(y) の形 y 予測値 L 損失 0 0.25 0.5 0.75 1.0 1 2 3 4 5 y=0.01 → L≈4.6 (正解と真逆を高確率で予測) y=0.5 → L≈0.69 (迷っている) y=1 → L=0 (完璧な正解) 無限大に発散

💡 このグラフの読み方: 横軸 $y$ は予測値(0=完全な誤り、1=完璧な正解)。
$y = 1$(正解)のとき → $L = 0$(罰なし)
$y = 0.5$(迷い)のとき → $L \approx 0.69$(中程度の罰)
$y \to 0$(正解と真逆を高確率で予測)のとき → $L \to \infty$(無限の罰!)

$-\log(y)$ が「罰」として優れている理由

$-\log(y)$ には決定的な特徴があります

  1. 正解($y=1$)のとき罰ゼロ — 当然
  2. 誤りに近づくほど指数的に罰が増える
  3. $y = 0$ で罰が無限大に発散 — 「絶対に許さん」という意思表示

この「無限大に発散する」性質が、「正解と真逆を高確率で予測した誤り」を厳しく罰する ことを可能にします。

理由1:「正解と真逆を高確率で予測した誤り」を強く罰せない(MSEとの比較)

さて、ここで MSE: $(1-y)^2$CE: $-\log(y)$同じグラフに重ねて 比較してみましょう。 これで MSE が「弱すぎる罰」だということが目で見て分かります。

正解 t = 1 のときの損失関数の形(予測 y を動かしたとき) y 予測値 L 損失 0 0.25 0.5 0.75 1 1 2 3 4 5 MSE: $(1-y)²$ 最大1.0で頭打ち CE: $-\ln(y)$ y→0で無限大に発散 ここがCEは大きい! 「真逆を高確率で予測」 を強く罰せる 正解 t=1 → y=0

💡 このグラフが示すこと: 正解は $y=1$(右端)。左に行くほど誤予測
🔵 MSE:左端でも損失は最大1(緑の頭打ち)
🔴 CE(交差エントロピー):左に行くほど 急激に上昇、$y \to 0$ で無限大に発散

数値で確認
予測 $y$ 状態 🔵 MSE: $(1-y)^2$ 🔴 CE: $-\log(y)$
0.99 ほぼ正解 0.0001 0.01
0.5 迷っている 0.25 0.69
0.01 大ハズレ 0.98 4.6(≒5倍!)
$y \to 0$ 確信を持って間違い 最大1.0で頭打ち 無限大に発散

MSEは最大でも 1.0 で頭打ち。一方、交差エントロピーは $-\log(y)$ なので $y \to 0$ で 無限大に発散。 これが「確信を持って間違えるな」という強い学習圧力をかける仕組みです。

理由2:勾配消失を防ぐ(実践上もっとも重要)

ニューラルネットの最終層は通常 Sigmoid(0〜1に押し込める)を通します。 その後ろの損失関数として何を使うかで、勾配の流れが激変します。

勾配は「パラメータをどっちに動かすか」を決める情報。 勾配が大きい = 速く学習、勾配が小さい = 学習が止まる、という関係です。

💭 よくある疑問:分類で「0.5と0.6」が連続的につながっているって本当?(クリックで展開)

素朴な疑問: 「数値予測なら 0.5 の隣に 0.6 があるのは分かる。でも分類だと 0.5 = 犬、0.6 = 猫 みたいに、隣り合う数値でも全く違う意味を持つはず。それで勾配がうまく機能するの?」

結論: その直感には1つだけ大きな誤解があります。 ニューラルネットの出力 $y$ は 「ラベル番号」ではなく「クラス1である確率」
だから 0.5 → 0.6 は連続的な確率の変化であって、「犬から猫に切り替わる」ような離散ジャンプは起きません。

📌 「猫 or 犬」を例に、$y$ の意味を厳密に
  • $y = 0.1$ → 「猫である確率 10%」(=「犬である確率 90%」)
  • $y = 0.5$ → 「猫である確率 50%」(=「犬である確率 50%」… 完全に迷っている
  • $y = 0.6$ → 「猫である確率 60%」(=「犬である確率 40%」… 少し猫寄り
  • $y = 0.99$ → 「猫である確率 99%」(ほぼ猫

$y$ は「猫っぽさのメーター」です。0.5 と 0.6 はどちらも同じメーターの近接した目盛り。 意味は連続的に変化します。

📌 「離散」になるのは推論時の閾値判定だけ
学習中            →  y は連続な確率(0〜1 のなめらかな値)
                     ↓ 損失と勾配はこの連続値の上で計算
推論時(=ラベルを出す時) →  y > 0.5 なら「猫」、それ以外は「犬」 ← ここだけ離散化

離散化(閾値処理)は予測ラベルを出す最後の一瞬だけ。 学習中はずっと連続的な確率を扱うので、損失関数も滑らかな関数になり、勾配が綺麗に流れます。

📌 数値予測との対比
数値予測(回帰)2値分類
$y$ の意味 予測したい数値そのもの(例:価格250円) クラス1である確率(例:猫である確率0.6)
$y$ の連続性 連続値そのもの 連続値(0〜1の確率)
$y$ の隣り合う値の意味 250 と 251 は「ほぼ同じ価格」 0.5 と 0.6 は「ほぼ同じ猫っぽさ」(どちらも迷い気味)
損失の滑らかさ $L = (y - t)^2$ で滑らか $L = -\log(y)$ で滑らか
勾配が流れるか OK OK(連続な確率の上で計算するから)
📌 多クラス(犬・猫・鳥・…1000種類)の場合

ImageNet のような多クラス分類でも考え方は同じです。出力 $y$ は 1個の数値ではなく1000個の確率ベクトル

y = [0.02, 0.85, 0.01, ..., 0.03]   ← 1000個の確率(合計1)
       犬    猫    鳥    ...   その他
                ↑ 「猫である確率0.85」

各クラスごとに 「そのクラスである確率」 が連続的に動きます。 交差エントロピーは「正解クラスの確率を 1 に近づける」方向に勾配を生成 — やはり連続値上の滑らかな最適化です。

💡 まとめ:「分類だから離散」というのは 入力ラベル ($t \in \{0, 1\}$) や最終的な予測ラベルだけの話。 モデルが内部で扱う $y$ は 常に連続な確率。 だから勾配は普通の連続関数のように滑らかに流れる ── これがニューラルネット分類の核心です。

勾配の大きさ|∂L/∂z|の比較(正解 t = 1 のとき) z Sigmoid前の値 |勾配| -10 -5 0 5 10 0.25 0.5 0.75 1.0 Sigmoid + MSE |勾配| = (1-y)·y(1-y) → z が大ハズレでも勾配がほぼ0 Sigmoid + 交差エントロピー |勾配| = (1-y) → 単純!消えない ↑ z=-10 (大ハズレ) CE勾配 ≈ 1 (大きい) ↓ MSE勾配は ほぼ0 (学習が止まる!)

💡 このグラフの読み方: 横軸 z は Sigmoid 前の値(-10 = 大ハズレ、+10 = ほぼ正解)。
🔴 CE 勾配(赤):左端で勾配が 1に近い大きさ → 学習がガッツリ進む
🔵 MSE 勾配(青):左端でも勾配が ほぼ0 → 学習が止まる!
これが「勾配消失問題」の正体。MSEを確率に使うと、間違えても学習しない。

Sigmoid + MSE の組み合わせ → 勾配消失

MSEを z で微分すると:

$$\frac{\partial L_{\text{MSE}}}{\partial z} = (y - t) \cdot y(1 - y)$$

ここで $y(1-y)$ が問題。$y$ が 0 か 1 に近いと、ほぼ 0 になります。

大ハズレでも勾配がほぼゼロ → 学習が止まる

Sigmoid + 交差エントロピー → 勾配が綺麗に消える

交差エントロピーを z で微分すると、数式の魔法のような結果に:

$$\frac{\partial L_{\text{CE}}}{\partial z} = y - t$$

驚くほどシンプル! 厄介な $y(1-y)$ の項が消える。

これが Sigmoid + 交差エントロピーが現代の分類タスクの標準 になっている数学的な理由です。

📐 補足:理由3 — 情報理論的に正しい(やや上級)(クリックで展開)

交差エントロピーは 「確率分布間の距離」 を測る情報理論的な指標。 最尤推定(Maximum Likelihood Estimation)と数学的に等価 で、確率を扱う統計学的に自然な選択です。

一方MSEは「数値の差」を測る指標で、確率の意味を尊重していません。 「予測 $0.7$ と正解 $1$ の差は $0.3$」と言うとき、これが「距離」として意味があるのは確率分布の文脈では微妙、というニュアンス。

使い分けの大原則

出力タイプ 損失関数
連続値(数値予測、回帰) MSE(二乗誤差) 住宅価格、評価値、温度
確率(0〜1、2値分類) 二値交差エントロピー スパム判定、勝率予測
多クラスの確率分布 交差エントロピー(カテゴリカル) 画像分類、次のトークン予測

💡 覚えるべきは1つ「確率出力には交差エントロピー」。 MSEを使うと正解と真逆を高確率で予測した誤りを強く罰せず、Sigmoidとの組み合わせで勾配消失する。 これは深層学習の常識として、ほぼすべての分類タスクで採用されています。

2.3 データセット全体の損失

実際は、データ1点ずつではなく、全データの平均を取ります:

$$L_{\text{total}}(\theta) = \frac{1}{N} \sum_{i=1}^{N} L(y_i, t_i)$$

ここで $y_i = f(x_i; \theta)$。$L_{\text{total}}$ は パラメータ $\theta$ の関数 として見るのがポイント。 学習は $L_{\text{total}}(\theta)$ を最小化する $\theta$ を見つける 問題になります。

3. 勾配降下法 — 損失の谷を下りる

$L_{\text{total}}(\theta)$ を最小化する $\theta$ を、どう見つけるか? 勾配降下法(Gradient Descent) という単純で強力なアルゴリズムを使います。

3.1 1次元での直感

まずは1変数で考えます。$L(w)$ のグラフが次のような谷型だとします:

L(w)
  │
  │ ●            ●
  │  ╲          ╱
  │   ╲        ╱
  │    ╲      ╱
  │     ╲    ╱
  │      ╲__╱
  │       ●  ←  ここが最小値(求めたい w*)
  └──────────── w
      w*

現在の点が $w_0$ にあるとき、「坂を下る方向」 に動けば $L$ は減ります。 坂の傾きは 微分 で測れます:

$$\frac{dL}{dw} = \text{$L$ の $w$ に対する微分(傾き)}$$

🎳 直感:「曲線の上にボールを置く」と考える

曲線をそのまま「丘の断面」だと思って、点 $w_0$ に ボール を置いてみてください。 重力でボールは 低い方へ 転がります。 その「転がる向き」が、まさに $L$ を下げる $w$ の動かし方です。

曲線の上にボールを置いたとき、どちらに転がる? w L 最小値 w* (谷) 傾き < 0 (右下がり) dL/dw < 0 → 右へ転がる = w を増やす方向 傾き > 0 (右上がり) dL/dw > 0 ← 左へ転がる = w を減らす方向

💡 覚えるべき1行ボールが転がる向き = $L$ を下げたい向き = $-\dfrac{dL}{dw}$ の符号
右上がりの坂 → ボールは 左へ($w$ を減らす)/ 右下がりの坂 → ボールは 右へ($w$ を増やす)。

📐 なぜ「傾きの符号と逆方向」に動かすと下がるのか — 言葉で詰める(クリックで展開)

「微分(傾き)」とは 「$w$ を1だけ右にずらすと $L$ がどれだけ増えるか」 を表す数字です。

  • $\dfrac{dL}{dw} = +4$ → 「$w$ を $+1$ ずらすと $L$ が $+4$ 増える」
    つまり 右に行くと損する。逆に 左 ($w$ を減らす) に行けば $L$ は $-4$ 減る。
  • $\dfrac{dL}{dw} = -4$ → 「$w$ を $+1$ ずらすと $L$ が $-4$ 減る」
    つまり 右 ($w$ を増やす) に行くと $L$ が減って得!

「微分の符号」は 「右に動いたときの損益サイン」 と読み替えてください。
損益が「+」なら左に逃げる、「−」ならそのまま右に進む — これが 「$-\dfrac{dL}{dw}$ の方向に動かす」 の本質です。

数式の上では「新しい $w$ = 古い $w$ − 学習率 × 傾き」だけ覚えれば、 符号が自動的に「ボールが転がる向き」に揃います。

まとめると、$w$ を $-\dfrac{dL}{dw}$ の方向に動かせば $L$ は必ず減る。これを式にすると:

$$w_{\text{new}} = w_{\text{old}} - \eta \cdot \frac{dL}{dw}$$

ここで $\eta$(イータ)は 学習率(learning rate)。「1ステップでどれくらい動くか」を決める正の小さい数(典型的には 0.001〜0.1)。

「$-\dfrac{dL}{dw}$ の方向」を分解して理解する

この言い回し、最初は混乱しやすいので具体例で確認しましょう。

$L(w) = w^2$ という単純な放物線で実験:

例1:現在地が $w = 2$ のとき

$L(2) = 4$、$\dfrac{dL}{dw} = 2w = 4$(正、右上がり)

w L(w) -2 -1 1 2 1 4 9 傾き = 4 (右上がり) 現在地 (w=2, L=4) ← 左へ動かす(wを減らす) ↑ ここに行きたい (最小点)

ここで $-\dfrac{dL}{dw} = -4$(負)。これは 「$w$ を減らす方向」 を意味する。
✅ 「$-\dfrac{dL}{dw}$ の方向 = $w$ を減らす方向 = $L$ が減る方向」が一致。

例2:現在地が $w = -2$ のとき

$L(-2) = 4$、$\dfrac{dL}{dw} = 2w = -4$(負、右下がり)

w L(w) -2 -1 1 2 1 4 9 傾き = −4 (右下がり) 現在地 (w=-2, L=4) 右へ動かす(wを増やす) → ↑ ここに行きたい (最小点)

ここで $-\dfrac{dL}{dw} = -(-4) = +4$(正)。これは 「$w$ を増やす方向」 を意味する。
✅ 「$-\dfrac{dL}{dw}$ の方向 = $w$ を増やす方向 = $L$ が減る方向」が一致。

両ケースで言えること
状況 $\dfrac{dL}{dw}$ $-\dfrac{dL}{dw}$ $w$ を動かす方向
右上がり($w = 2$) $+4$ $-4$(負) 減らす ← $L$が減る
右下がり($w = -2$) $-4$ $+4$(正) 増やす ← $L$が減る

いつでも、$-\dfrac{dL}{dw}$ の方向に動けば $L$ が減る。これが勾配降下法の核心です。

式 $w_{\text{new}} = w_{\text{old}} - \eta \cdot \dfrac{dL}{dw}$ の意味
w_new = w_old - η × dL/dw
        ↑       ↑   ↑
        現在地  学習率(ステップ幅)
                    (-勾配方向に動かす)
数値で更新を追ってみる

$L(w) = w^2$、現在地 $w=2$、学習率 $\eta=0.1$ で実際に動かしてみると:

$w$$L = w^2$$\dfrac{dL}{dw} = 2w$更新
12.004.004.00$2 - 0.1 \times 4 = 1.6$
21.602.563.20$1.6 - 0.1 \times 3.2 = 1.28$
31.281.642.56$1.28 - 0.1 \times 2.56 = 1.024$
41.021.052.05...
...$\to 0$$\to 0$$\to 0$最適点に収束!

$L$ の値が 4 → 2.56 → 1.64 → 1.05 → ... → 0 と着実に減っていく。これが「学習」の正体。

💡 直感まとめ: 「$-$勾配の方向」 = 「$L$ が減る方向」 = 「下り坂の方向」
微分が「上り方向」を教えてくれるので、マイナスを付ければ下り方向 になる。 これが「勾配降下法(Gradient Descent=下降)」と呼ばれる理由です。

3.2 インタラクティブデモ:勾配降下法を体感する

インタラクティブ・デモ
損失関数の谷を下りるアニメーション

「学習率」と「開始位置」を変えて、勾配降下が どう谷を下りるか を観察してください。学習率が大きすぎると振動・発散、小さすぎると収束が遅い。

学習率 η 0.10
開始位置 w -4.0

関数の形

ステップ 0 | w = -4.00 | L(w) = 16.00 | dL/dw = -8.00
更新式: w ← w - η · (dL/dw)

💡 試してみる

  • 学習率 0.05 → 収束は遅いが安定
  • 学習率 1.0 → 行き過ぎて振動
  • 学習率 1.5 → 発散(無限大に)
  • 「2つの谷」で開始位置を変えると、局所最適に捕まることがある

3.3 多次元への拡張 — 勾配ベクトル

実際のニューラルネットでは、$\theta$ は数百万次元のベクトル。 各パラメータごとに 偏微分 を取ります:

$$\nabla L = \left( \frac{\partial L}{\partial \theta_1}, \frac{\partial L}{\partial \theta_2}, \ldots, \frac{\partial L}{\partial \theta_M} \right)$$

これを 勾配(gradient)、$\nabla L$(ナブラ L)と書きます。 勾配ベクトルは空間の各点で 「$L$ が最も急に増える方向」 を指し、その逆方向 $-\nabla L$ が 最も急に減る方向

多次元の勾配降下法

$$\theta_{\text{new}} = \theta_{\text{old}} - \eta \cdot \nabla L(\theta_{\text{old}})$$

式の形は1次元と同じ。違いは「$\theta$ がベクトルなので、ベクトル全体を一気に更新する」点。

3.4 学習率の重要性

学習率 $\eta$ 挙動
大きすぎる(例 1.0+) 谷を飛び越えて振動・発散。学習が壊れる
適切(例 0.001〜0.1) 順調に谷を下りる
小さすぎる(例 1e-7) 進みが遅く、局所最適に捕まりやすい

実用上は 学習率を学習中に変化させる のが普通(学習率スケジューリング)。最初は大きめで、徐々に小さくする。

4. 誤差逆伝播法 — 多層NNでの勾配計算

§3で「勾配さえあれば谷を下れる」と言いました。問題は、ニューラルネットは何層にも重なった巨大な合成関数であり、深いところにある重み(例えば1層目の $W_1$)が損失 $L$ にどう影響するかは、間に挟まる全部の層を経由するという点。

核心の問い: 「$W_1$ をちょっと動かすと、$h_1$ が変わり、それで $h_2$ が変わり、それで $y$ が変わり、それで $L$ が変わる」 — この 多段の影響の伝わり方 を、どうやって 全パラメータ分・効率的に 計算するか?

これを劇的に効率化するのが 誤差逆伝播法(backpropagation)。1986年に再発見された、深層学習の根本技術です。

4.1 連鎖律(Chain Rule)の復習

合成関数の微分公式。$y = f(g(x))$ のとき:

$$\frac{dy}{dx} = \frac{df}{dg} \cdot \frac{dg}{dx}$$

「外側の微分」×「内側の微分」。3段の合成 $y = f(g(h(x)))$ なら:

$$\frac{dy}{dx} = \frac{df}{dg} \cdot \frac{dg}{dh} \cdot \frac{dh}{dx}$$

ニューラルネットは多層の合成関数なので、連鎖律がそのまま使えます。

4.2 多層NNでの勾配計算 — ドミノ倒しのイメージ

3層NN を例にします(入力 $x$ → 重み $W_1, W_2, W_3$ を通って出力 $y$):

h_1 = σ(W_1 · x + b_1)        ← 中間層1の出力
h_2 = σ(W_2 · h_1 + b_2)      ← 中間層2の出力
y   = W_3 · h_2 + b_3         ← ネットの最終出力
L   = (y - t)²                 ← 損失(出力と正解とのズレ)

まず「$W_1$ の勾配」は何を意味するか

$\dfrac{\partial L}{\partial W_1}$ は、ひと言で言うと 「1層目の重み $W_1$ をほんの少し動かしたら、最後の損失 $L$ はどれくらい変わるか」

ところが $W_1$ は $L$ に 直接 影響しません。間に $h_1$、$h_2$、$y$ が挟まっている:

W_1 を動かす
   ↓ (これが h_1 を変える)
h_1 が変わる
   ↓ (これが h_2 を変える)
h_2 が変わる
   ↓ (これが y を変える)
y が変わる
   ↓ (これが L を変える)
L が変わる

連鎖律は、この「リレー」を 各段の影響率を掛け算する ことで効率的に計算する仕組み:

$$\frac{\partial L}{\partial W_1} = \underbrace{\frac{\partial L}{\partial y}}_{\text{①}} \cdot \underbrace{\frac{\partial y}{\partial h_2}}_{\text{②}} \cdot \underbrace{\frac{\partial h_2}{\partial h_1}}_{\text{③}} \cdot \underbrace{\frac{\partial h_1}{\partial W_1}}_{\text{④}}$$

各項の意味を1つずつ言語化すると:

記号位置意味(〜が1動くと〜はどれくらい動く?)
① $\dfrac{\partial L}{\partial y}$出力層$y$ が1動くと $L$ がどれくらい動くか」
② $\dfrac{\partial y}{\partial h_2}$出力層付近「$h_2$ が1動くと $y$ がどれくらい動くか」
③ $\dfrac{\partial h_2}{\partial h_1}$中間層「$h_1$ が1動くと $h_2$ がどれくらい動くか」
④ $\dfrac{\partial h_1}{\partial W_1}$入力層付近「$W_1$ が1動くと $h_1$ がどれくらい動くか」

具体例で実感する(簡単な数字で)

仮に各「影響率」が次の値だったとします:

すると $W_1$ を1増やしたら、ドミノ倒しでこんな伝わり方をします:

「W_1 を 1 増やす」がドミノのように L まで伝わる W_1 +1 スタート × ④ 4倍 h_1 +4 1×4=4 × ③ 0.5倍 h_2 +2 4×0.5=2 × ② 3倍 y +6 2×3=6 × ① 2倍 L +12 6×2=12 影響率(各リンクの傾き) ④ ∂h_1/∂W_1 = 4 ③ ∂h_2/∂h_1 = 0.5 ② ∂y/∂h_2 = 3 ① ∂L/∂y = 2 結論:4つの影響率を全部掛け算するだけ! ∂L/∂W_1 = 4 × 0.5 × 3 × 2 = 12 「W_1 が 1 動くと L は 12 動く」 — これが連鎖律

つまり $\dfrac{\partial L}{\partial W_1} = 2 \times 3 \times 0.5 \times 4 = 12$。 連鎖律は 「各段の影響を順番に掛け算するだけ」 のシンプルな操作です。

🎮 インタラクティブデモ:ドミノを動かしてみる

各層の 影響率(傾き)を変えると、最終的な勾配 $\partial L/\partial W_1$ がどう変わるか体感できます:

インタラクティブ・デモ
ドミノを動かしてみる — 各影響率を変えて勾配の変化を観察

影響率を調整

伝播の様子

W_1 を 1 動かす
→ h_1: +4.0
→ h_2: +2.0
→ y: +6.0
→ L: +12.0
∂L/∂W_1
12.00

☝️ どれかの影響率が 0 になると → 全体も 0(情報が消える)
☝️ どれかが になると → 結果も逆向きに

なぜ「出力側から計算する」のか

「掛ける順番はどっちからでもいいのでは?」 — 数学的には可換ですが、計算の効率が桁違いに変わります。鍵は $\dfrac{\partial L}{\partial h_k}$ を共有して使い回せる こと。

実際の各層の重み $W_k$ の勾配を全部書き出すと:

∂L/∂W_3 = ∂L/∂y · ∂y/∂W_3
∂L/∂W_2 = ∂L/∂y · ∂y/∂h_2 · ∂h_2/∂W_2
                 ↑─同じ
∂L/∂W_1 = ∂L/∂y · ∂y/∂h_2 · ∂h_2/∂h_1 · ∂h_1/∂W_1
                 ↑─同じ ↑─────同じ

共通部分が大量にある。これを毎回ゼロから計算するのは無駄。 出力側から順に 「ここまで分の影響率」 を計算しておけば、各層の勾配は 1掛け算追加するだけ で求まる。

これが 誤差逆伝播法 の中心的アイデア=「出力で計算した $\dfrac{\partial L}{\partial y}$ を、層を逆順に1段ずつ拡張して伝播していく」。だから 伝播と呼びます。

4.3 順伝播 + 逆伝播の流れ

学習の1ステップは、必ず 「左から右」→「右から左」 の2パス構成になります。

① Forward pass(順伝播):左から右へ

入力 $x$ を流して、各層の出力 $h_1, h_2, y$ と損失 $L$ を計算します。

x → [W_1] → h_1 → [W_2] → h_2 → [W_3] → y → L
入力      層1      中間      層2      中間      層3    出力   損失

ここで 各層の出力 ($h_1, h_2, y$) を覚えておく のがポイント。逆伝播で再利用します。

② Backward pass(逆伝播):右から左へ

出力側から順に「ここまでの影響率 $\dfrac{\partial L}{\partial h_k}$」を計算し、その都度 その層の重みの勾配 $\dfrac{\partial L}{\partial W_k}$ を取り出します。

逆伝播:右から左へ「影響率」を伝播し、各層の重み勾配を取り出す x 入力 h_1 中間1 h_2 中間2 y 出力 L 損失 W_1 W_2 W_3 Step1 ∂L/∂y を計算 L = (y-t)² から ∂L/∂y = 2(y-t) ×∂y/∂h_2 Step2 ∂L/∂h_2 を計算 → ∂L/∂W_3 ✓ ×∂h_2/∂h_1 Step3 ∂L/∂h_1 を計算 → ∂L/∂W_2 ✓ ×∂h_1/∂W_1 Step4 ∂L/∂W_1 ✓ 出力側から入力側へ、影響率を1段ずつ拡張

💡 4ステップで全層の勾配が出る。各ステップでは前のステップの結果(影響率 $\dfrac{\partial L}{\partial h_k}$)に 1つの偏微分を掛けるだけ

各ステップで何が起きているか、文章でも書くと:

  1. Step 1:出力層で $\dfrac{\partial L}{\partial y}$ を計算。これは損失関数を直接微分するだけ。MSEなら $2(y - t)$。
  2. Step 2:$\dfrac{\partial L}{\partial h_2} = \dfrac{\partial L}{\partial y} \cdot \dfrac{\partial y}{\partial h_2}$ を計算。ついでに $\dfrac{\partial L}{\partial W_3}$ が決定する
  3. Step 3:$\dfrac{\partial L}{\partial h_1} = \dfrac{\partial L}{\partial h_2} \cdot \dfrac{\partial h_2}{\partial h_1}$ を計算。ついでに $\dfrac{\partial L}{\partial W_2}$ が決定する
  4. Step 4:$\dfrac{\partial L}{\partial W_1} = \dfrac{\partial L}{\partial h_1} \cdot \dfrac{\partial h_1}{\partial W_1}$ を計算。これで 全層の重み勾配が完成

各層で連鎖律を1ステップずつ適用するだけ。実装上は 行列演算の連続 に落ちます。

🎮 インタラクティブデモ:4ステップで逆伝播を進めてみる

「次へ」ボタンで 1ステップずつ逆伝播 を実行。各層の勾配がどう計算されるかを目で追えます。

インタラクティブ・デモ
誤差逆伝播 — Step 1 から Step 4 まで順に追体験
Step 0: スタート(順伝播完了、各層の活性値が決まっている) x 入力 W_1 h_1 ? W_2 h_2 ? W_3 y ? L 損失 ∂L/∂y = ? ∂L/∂h_2 = ? → ∂L/∂W_3 = ? ∂L/∂h_1 = ? → ∂L/∂W_2 = ? ∂L/∂W_1 = ?
「次のステップへ」を押して逆伝播を1ステップずつ進めてみてください。

4.4 何がすごいのか — 素朴な方法との比較

「順伝播の数倍で勾配が出る」と言われてもピンと来ないので、もし誤差逆伝播がなかったら どう計算するかを並べてみます。

素朴な方法:数値微分

微分の定義に立ち返ると:

$$\frac{\partial L}{\partial W_k} \approx \frac{L(W_k + \varepsilon) - L(W_k)}{\varepsilon}$$

つまり「$W_k$ を少しだけ動かして、$L$ がどれくらい変わったか測る」。これを 1つのパラメータごとに やるしかありません。

方法勾配1回ぶんの計算1050万パラメータでは
素朴な数値微分 1パラメータごとに 順伝播1回 順伝播 1050万回
誤差逆伝播 全パラメータをまとめて 順伝播1回 + 逆伝播1回(順伝播の数倍)

どれくらい速くなるか — 桁で考える

仮に1回の順伝播が 10ms かかるとすると:

その差は 約500万倍。「29時間 vs 20ミリ秒」と並べると衝撃。

💡 誤差逆伝播の本質: 単に「速い」のではなく、「全パラメータの勾配を1パスでまとめて」 計算できるところがすごい。 これは「各層で計算した中間結果($\partial L / \partial h_k$)を使い回す」というアルゴリズム的工夫の賜物です。

なぜまとめて計算できるのか

§4.2 で見たように、各層の勾配は 共通部分 を大量に含んでいました:

∂L/∂W_3 = (∂L/∂y) · ∂y/∂W_3
∂L/∂W_2 = (∂L/∂y · ∂y/∂h_2) · ∂h_2/∂W_2
∂L/∂W_1 = (∂L/∂y · ∂y/∂h_2 · ∂h_2/∂h_1) · ∂h_1/∂W_1
          └─────── 使い回せる部分 ───────┘

逆伝播は この共通部分(カッコ内)をメモリに置いて、1段ずつ右から左に伸ばしていく 戦略。 数値微分は毎回ゼロからやり直すので、同じ計算を1050万回繰り返す羽目になります。

1050万パラメータでも、1データ点あたり数十ms程度で勾配が出る。 これがなければ深層学習はそもそも実用化されていません。

💡 歴史的補足: 誤差逆伝播法は 1986年に Rumelhart, Hinton, Williams によって再発見 され、ニューラルネット研究に火がついた。 しかし当時はGPUもデータも足りず、本格的な開花は2012年以降に持ち越し。

5. 実用上の工夫

純粋な勾配降下法だけでは、現代のディープラーニングは動きません。実用上はいくつかの工夫が必須です。

5.1 ミニバッチ勾配降下法

問題:全データで勾配計算するのは重すぎる

§2.3 で見たように、本当は損失は 全データの平均

$$L_{\text{total}}(\theta) = \frac{1}{N} \sum_{i=1}^{N} L(y_i, t_i)$$

勾配 $\nabla L_{\text{total}}$ も「全データに対する勾配の平均」になります。 これを毎ステップ計算するとどうなるか — 具体例で見てみましょう:

NNUEの学習データ:約50億局面。1局面の勾配計算に 0.01ms かかるとして、1ステップ=50億 × 0.01ms ≈ 14時間
これを 数十万ステップ 回すと…数百年。絶対に終わらない

解決策:データから少数だけ抽出して近似する

全データの勾配 ≒ ランダムに選んだ少数データの勾配の平均、で近似してしまおう、というアイデア。

$$\nabla L \approx \frac{1}{B} \sum_{i \in \text{batch}} \nabla L(y_i, t_i)$$

ランダム抽出した $B$ 個のデータの平均勾配 ≒ 全データの平均勾配(統計的に大数の法則で成立)。 これを ミニバッチ勾配降下法(Mini-batch SGD)と呼びます。

3つのモードを比較で理解する

データの使い方には3つの極端があります:

方式1ステップで使うデータ1ステップの計算軌跡の特徴
Batch GD(バッチ勾配降下) 全データ N 個 重い(NNUEなら不可能) 滑らか、正確、超遅い
SGD(確率的勾配降下) 1個だけ 軽い ジグザグ、ノイジー、収束しにくい
ミニバッチ SGD $B$ 個(数百〜数万) 軽い + GPUで並列化 中間。実用的なバランス

「軌跡」を絵で見ると違いが一目でわかります。下の図は損失の等高線(同じ高さの線)の上を歩く様子:

3つのモードの軌跡(損失の等高線上) ① Batch GD 全データで毎ステップ計算 最小点 START 滑らかで最短 ⚠ 1ステップが超重い ② SGD(1個ずつ) 1データ点で毎ステップ計算 最小点 START ノイジー・ジグザグ ⚠ 収束しにくい ③ ミニバッチ SGD ⭐ B個ずつ計算 最小点 START そこそこ滑らか ✓ 軽い + 安定

💡 読み方: 同心の楕円は 損失の「等高線」(同じ高さ)。中心の緑点が最小点。
① Batch はまっすぐ降りるが毎回が超重い/② SGD は1個ずつなのでノイジー/③ ミニバッチ はその中間で実用的。

バッチサイズ・イテレーション・エポックの違い

学習を回すうえで、この3つの用語の関係をはっきりさせておきます:

N=10000データ / バッチサイズ B=1000 の場合 データセット B B B 📦 バッチサイズ B = 1000 → 1ミニバッチに含まれるデータ数 🔁 1イテレーション → 1ミニバッチで勾配を計算してパラメータを1回更新 🌍 1エポック → データセットを1周(10000 ÷ 1000 = 10イテレーションで1エポック完了)

💡 覚え方:「バッチサイズ × イテレーション数 = 1エポックぶんのデータ量」。
例:1000サイズで10回イテレーション → 10000データ全部見た → 1エポック完了。 通常は数十〜数百エポック回します。

🎮 インタラクティブデモ:バッチサイズを動かして軌跡を見る

「バッチサイズ」スライダーを動かすと、勾配降下法の 軌跡(ノイズの量)が劇的に変わる のを目で確認できます:

インタラクティブ・デモ
バッチサイズと軌跡 — Batch / Mini-batch / SGD の違いを体感

設定

1 (SGD) 1000 (Batch)
👀 観察ポイント:
  • B=1(SGD):軌跡がジグザグ激しい
  • B=50〜200:そこそこ滑らか、実用的
  • B=1000(Batch):ほぼ直線、でも各ステップ重い

損失地形と軌跡

ステップ数:0 / 現在の損失:

5.2 オプティマイザの進化

純粋な勾配降下法には、2つの困りごと があります:

  1. 細長い谷で振動する:勾配の急な方向では行ったり来たり、緩やかな方向では進みが遅い
  2. パラメータごとに「進みやすさ」が違う:同じ学習率を全パラメータに使うと、ある方向は急ぎすぎ・ある方向は遅すぎ、になる

これを改善する オプティマイザ が、次のように発明されてきました:

🚀 Momentum

過去の勾配の 慣性 を持たせる。谷の振動を抑え、平坦地でも進む。

$v \leftarrow \beta v + \nabla L$,   $\theta \leftarrow \theta - \eta v$
🚀 コラム:Momentum をボールの慣性で理解する(クリックで展開)
① 何が問題なのか — 細長い谷の振動

損失の地形が 細長い谷(横方向は急峻、縦方向は緩やか)だと、純粋なSGDは横方向に行ったり来たり振動し、縦方向(=最小点に向かう本筋)はほとんど進みません:

細長い谷でのSGD vs Momentum SGD(慣性なし) ⚠ 上下に振動、なかなか右に進まない Momentum(慣性あり)⭐ ✓ 縦の振動が打ち消し合い、横にぐんぐん進む
② ボールの慣性メタファー

純粋なSGDは 「毎ステップ、その瞬間の勾配の方向に瞬間移動する人」。前のステップで何をしたかは無視。

Momentum は 「斜面を転がる重いボール」。前のステップで動いていた方向の慣性を持ったまま、今の勾配で速度を少し修正する:

  • 毎回同じ向きに引っ張られる方向(細長い谷の縦方向)→ 慣性で どんどん加速 → 速く進む
  • 毎回逆向きに引っ張られる方向(横方向のジグザグ)→ 慣性同士が打ち消し合う → 振動が消える
③ 数式を分解

更新式は2行。$v$ は「速度」を覚えておく変数。

$$v \leftarrow \underbrace{\beta v}_{\text{前の速度を少し減衰}} + \underbrace{\nabla L}_{\text{今の勾配を足す}}, \qquad \theta \leftarrow \theta - \eta v$$
  • $\beta$(典型値 0.9):慣性の強さ。1に近いほど過去をよく覚えている
  • $v$:過去の勾配たちの「加重平均」。同じ方向に勾配が続けば $v$ は大きく育ち、向きが揺れる方向は0付近に収まる
④ 具体例で実感

$\beta = 0.9$、各ステップの勾配が $(\nabla L)_t = 1$(毎回同じ方向)のとき:

v_0 = 0
v_1 = 0.9 × 0   + 1 = 1     ← ステップ1
v_2 = 0.9 × 1   + 1 = 1.9   ← 速度が大きく育つ
v_3 = 0.9 × 1.9 + 1 = 2.71
v_4 = 0.9 × 2.71+ 1 = 3.44
... →  最終的に v ≈ 10 まで加速(= 同じ向き勾配の累積効果)

逆に勾配が $+1, -1, +1, -1, \ldots$ と振動すると:

v_1 =  1
v_2 = 0.9 × 1  − 1 = −0.1   ← 大きく相殺
v_3 = 0.9 × −0.1+1 = 0.91
... → 振動方向の v はほぼ 0 付近で抑制される

💡 1行まとめ: Momentum は 「勾配の指数移動平均」。一貫した向きは加速、振動する向きは抑制。

📊 RMSProp

パラメータごとに学習率を自動調整。頻繁に大きな勾配が来るところは学習率を下げる。

$s \leftarrow \beta s + (1-\beta)(\nabla L)^2$,   $\theta \leftarrow \theta - \dfrac{\eta}{\sqrt{s}+\varepsilon} \nabla L$
📊 コラム:RMSProp を「パラメータごとに歩幅を変える」で理解する(クリックで展開)
① 何が問題なのか — パラメータごとの「進みやすさ」

全パラメータに同じ学習率 $\eta$ を使うと、こんな不公平が起きます:

  • パラメータ $\theta_A$:勾配が毎回 $\nabla L \approx 10$(急峻)→ 学習率 0.01 でも歩幅が 0.1 で 大きすぎ=振動
  • パラメータ $\theta_B$:勾配が毎回 $\nabla L \approx 0.001$(緩やか)→ 学習率 0.01 でも歩幅が 0.00001 で 小さすぎ=動かない

1つの学習率では 「Aを抑える」と「Bが止まる」「Bを動かす」と「Aが暴れる」 のジレンマ。

② 解決:パラメータごとの「過去の勾配の大きさ」を覚えて、それで割る

各パラメータについて、勾配の2乗の指数移動平均 $s$ を別々に持ちます:

$$s \leftarrow \beta s + (1-\beta)\,(\nabla L)^2$$

そして更新時は $\sqrt{s}$ で割る

$$\theta \leftarrow \theta - \frac{\eta}{\sqrt{s}+\varepsilon}\, \nabla L$$
③ 何が起きるか
  • 勾配が大きいパラメータ:$s$ が育つ → $\sqrt{s}$ が大きい → 実効学習率 $\eta/\sqrt{s}$ が小さくなる=歩幅を縮める
  • 勾配が小さいパラメータ:$s$ が小さい → 実効学習率が大きくなる=歩幅を伸ばす

つまり 「パラメータごとに、それまでの勾配の大きさに応じて歩幅を自動調整」

④ 具体例で実感

$\beta = 0.9$、$\eta = 0.1$ として:

勾配 $\nabla L$$s$ の蓄積(収束時)$\sqrt{s}$実効歩幅 $\eta\nabla L / \sqrt{s}$
$\theta_A$(急峻)1010010$0.1 \times 10 / 10 = 0.1$
$\theta_B$(緩やか)0.001$10^{-6}$$10^{-3}$$0.1 \times 0.001 / 0.001 = 0.1$

勾配の絶対値が違っても、実効歩幅がほぼ同じに揃う。これがRMSPropの魔法です。

⑤ 「RMS」の意味

Root Mean Square = 二乗 → 平均 → 平方根、の順で計算する量。 勾配の「大きさの典型値」を測るのに使うので RMSProp(Root Mean Square Propagation)と名付けられました。

💡 1行まとめ: RMSProp は 「パラメータごとに、過去の勾配の大きさで割って歩幅を揃える」 オプティマイザ。 急なところは慎重に、緩いところは大胆に。

⚡ Adam(現代の主流)

Momentum + RMSProp のハイブリッド。実用上ほぼデフォルト。 ChatGPTやNNUEの学習でも使われている。

$m \leftarrow \beta_1 m + (1-\beta_1) \nabla L$,   $v \leftarrow \beta_2 v + (1-\beta_2) (\nabla L)^2$,   $\theta \leftarrow \theta - \eta \dfrac{m}{\sqrt{v}+\varepsilon}$
⚡ コラム:Adam = Momentum + RMSProp の合体技(クリックで展開)

Adam(Adaptive Moment Estimation)は2014年に発表され、瞬く間に 事実上のデフォルト になりました。 ChatGPT、Stable Diffusion、NNUE — どれもAdam(またはその派生)で学習されています。

① 数式を3つに分解
m ← β₁·m + (1−β₁)·∇L          ← Momentum の役割(1次モーメント = 平均)
v ← β₂·v + (1−β₂)·(∇L)²        ← RMSProp の役割(2次モーメント = 分散)
θ ← θ − η · m / (√v + ε)       ← 両方を組み合わせて更新
  • $m$:勾配の指数移動平均(向き)。Momentum と同じ役割で「慣性」を生む
  • $v$:勾配の二乗の指数移動平均(大きさ)。RMSProp と同じ役割で「歩幅調整」
  • $m / \sqrt{v}$:「向きの慣性」を「大きさ」で正規化 → 安定した方向に揃った歩幅で進む
② いいとこ取りの利点
  • Momentum 単体:振動は抑えるが、急峻方向では暴れがち
  • RMSProp 単体:歩幅は揃うが、慣性がないので平坦地で進まない
  • Adam:両方の弱点を同時に克服
③ デフォルトハイパーパラメータ
  • $\eta = 0.001$(学習率)
  • $\beta_1 = 0.9$(Momentumの慣性)
  • $\beta_2 = 0.999$(RMSPropの平滑化)
  • $\varepsilon = 10^{-8}$(ゼロ割防止)

多くの場合、このまま使うだけでまともに学習できてしまう。これがAdamの偉大さです。

💡 1行まとめ: Adam は 「勾配の向き(=Momentum)と大きさ(=RMSProp)の両方を覚えながら歩く」 ハイブリッドオプティマイザ。 現代深層学習のほぼ標準装備。

🎮 インタラクティブデモ:4つのオプティマイザを並べて比較

細長い谷の損失地形で、SGD / Momentum / RMSProp / Adam の4つを並列に走らせて軌跡を比較。 「同じスタート地点・同じ学習率」でも軌跡が劇的に違うのが目で見て分かります:

インタラクティブ・デモ
SGD vs Momentum vs RMSProp vs Adam — 軌跡を並べて見る

設定

大きいほど縦に細長い(=振動しやすい)

凡例

SGD:素直に勾配の方向へ
Momentum:慣性で振動抑制
RMSProp:歩幅を自動調整
Adam:M+R の合体
👀 観察ポイント:
  • 谷を細くする → SGDが大暴れ、Momentumは滑らか
  • Adamが最速で収束することが多い

損失地形と4つの軌跡

手法ステップ数現在の損失
SGD0
Momentum0
RMSProp0
Adam0

5.3 過学習と汎化

学習の目的は 「学習データで精度を出すこと」ではなく「未知データに対しても正しく予測すること」。これを 汎化(generalization) と呼びます。

⚠️ 過学習(overfitting)

学習データに過剰適応して、未知データへの予測精度が落ちる現象。 深いNNほど起きやすい。パラメータが多すぎて、訓練データを「丸暗記」してしまう状態。

5.4 過学習対策

まとめ

  1. 学習とは「損失関数 $L(\theta)$ を最小化する $\theta$ を見つける最適化問題」
  2. 損失関数は予測と正解のズレを数値化(MSE、交差エントロピー)
  3. 勾配降下法:勾配 $-\nabla L$ の方向にパラメータを少しずつ動かす
  4. 誤差逆伝播法:連鎖律を使って、出力側から入力側へ勾配を効率的に計算
  5. ミニバッチ + Adam:実用上の標準的な学習プロセス
  6. 過学習対策:早期停止、L2正則化、Dropout、データ拡張など

💡 核心まとめ: ニューラルネットの学習は 「巨大な凸凹地形を、勾配を頼りに歩いて、最も低い谷を探す」 行為。 それを高次元で、しかも自動で、しかも効率よくやる仕組みが揃ったから、現代の深層学習が成立しています。

次の章

ここまでで 「ネットの中身」と「学習の仕組み」 の基礎が揃いました。 次は、用途別に進化した深いNNの代表アーキテクチャ CNN(画像)Transformer(自然言語) を見ていきます。 畳み込みカーネルが画像をスライドする様子と、Self-Attentionで単語間の関係が見えるインタラクティブデモ付きです。

→ 第5章「CNN・Transformer」へ進む