微積分 入門
ディープラーニング論文を読む前に必要な最低限の微積分。4 つの短いトピックで、 導関数とは何か、多変数を一度に扱う偏微分、なぜ連鎖律が逆伝播の核心なのか、 そして勾配がすべての偏微分を「上り坂方向」を指す 1 本の矢印にまとめる仕組み をカバーする。積分は出てこない —— 数十億パラメータのモデルを訓練するのに、 積分は一度も登場しない。
導関数(Derivative)
関数が今この瞬間どれだけ速く変化しているかを表す 1 つの数。
車を運転している。速度計が 60 km/h を指す。これは走った距離でも 運転時間でもなく、「距離が時間に対して変化する速さ」を、たった今この瞬間に切り取った値だ。導関数とは、まさにこの考え方の形式化:任意の関数 f(x) に対し、 導関数 f'(x) は、x が動くとき f が どれだけ速く変化しているかを返す。
幾何学的には、導関数は 接線の傾き —— 曲線にちょうど触れて、 曲線と同じ方向に走る直線の傾きだ。曲線が x = 3 で急に上っているなら、 そこの接線も急で f'(3) は大きな正の数。曲線が頂点に到達して 下りに転じる手前なら、接線は水平で f' は 0。落ちている途中なら傾きは負。
3 つの記法はどれも同じ意味で、ML 論文では平気で混在する:
f'(x)—— ラグランジュのプライム記法、コンパクト。df/dx—— ライプニッツの比の記法、「f の x あたりの変化」と読む。d/dx [f(x)]—— 「いま微分するんだ」と動作を強調したいとき。
具体例。f(x) = x² をとる。グラフは左で下がり、右で上がる放物線。 その導関数は f'(x) = 2x。x = 3 なら傾きは 6 —— かなり急。x = 0 では 0 —— 放物線がちょうど底をついた。x = −1 では −2 —— 下降中。 1 本の式が、曲線のすべての点での「上昇速度」を一挙に与える。
少数の規則だけで、ML 論文に出てくる導関数のほとんどはカバーできる:
d/dx [c] = 0 (定数は動かない) d/dx [x] = 1 d/dx [x^n] = n · x^(n−1) (べき乗則) d/dx [eˣ] = eˣ (e の指数は自分自身が導関数) d/dx [ln x] = 1/x d/dx [f + g] = f' + g' (線型性) d/dx [c · f] = c · f'
なぜこれが ML に関係するのか。モデルの訓練は本質的に「谷底探し」だからだ。 「谷」は損失関数 —— パラメータの組ごとに 1 つの数が決まり、小さいほど良い。 導関数は、今いる場所からの「下り方向」を教えてくれる。勾配降下は、 負の導関数方向に小さく 1 歩進み、繰り返す。何百万回も繰り返した結果、 谷の近くに辿り着く —— データに合うモデルだ。
Transformer では:すべての学習可能パラメータ(数十億個ある)に対して、 「自分に関する損失の導関数」が定義される。オプティマイザは各導関数を 「この重みを少し上げると損失がこれだけ上下する」と読む。そしてすべての重みを 「損失が下がる方向」へ少しずつ押す。この押しに学習率を掛けたものが、1 ステップ分の訓練だ。 以降の 3 節では、Transformer が実際に大規模でこれらの導関数を計算するための 仕組みを順に組み立てる。
偏微分(Partial Derivative)
多変数関数の導関数 —— 一度に 1 つの変数だけ動かし、残りは固定する。
第 1 節の導関数は 1 変数の関数を仮定していた:入力 x、出力 f(x)。 現実のモデルは一度に何百万もの入力を持つ —— 重み、バイアス、前層からの活性。 多変数関数に対応した導関数の概念が必要だ。これが 偏微分。
2 変数の関数 f(x, y) から始めよう。地形を想像する —— 各経緯度 (x, y) に高度 f(x, y) が定義される。地点 (x₀, y₀) に立つ。問えるのは 2 つ: 「東に小さく一歩(x だけ動かす)、高度はどれだけ速く変わる?」 「北に一歩(y だけ動かす)、同じ問い」。 その 2 つの答えが、その地点での 2 つの 偏微分。
記法では、第 1 節の真っ直ぐな d ではなく丸まった ∂(「ラウンド・ディー」あるいは「偏」)を使い、 「他の変数は固定中」というフラグを立てる:
∂f/∂x——yを固定したままxを動かしたときの変化率。∂f/∂y——xを固定したままyを動かしたときの変化率。
計算は機械的:他の変数を定数とみなし、第 1 節の 1 変数規則を当てはめる。f(x, y) = x² + 3xy + y³ の例:
∂f/∂x (y を定数とみなす)
= d/dx [x²] + d/dx [3xy] + d/dx [y³]
= 2x + 3y + 0
= 2x + 3y
∂f/∂y (x を定数とみなす)
= d/dy [x²] + d/dy [3xy] + d/dy [y³]
= 0 + 3x + 3y²
= 3x + 3y²∂f/∂x = 2x + 3y はこう読む:「地表のどこに立っていても、 純粋に x 方向へ押した瞬間の高度の上昇率はこの値」。 点 (x, y) = (1, 2) を代入すれば数値 8 が得られる。
「スライス」のイメージが直感の核心だ。y を y₀ に固定すると、 曲面から 1 本の曲線が切り出される —— 断面は y = y₀。 その 2 次元断面の上では x だけが変数で、その点の接線の傾きこそが まさに ∂f/∂x。偏微分は普通の微分そのもので、 「偏」の記号は「どこを切ったか」を記録しているにすぎない。
D 変数への拡張も同じ手順。関数 f(x₁, x₂, …, x_D) は D 個の偏微分を持ち、各変数ごとに 1 個; それぞれは他の D − 1 個を固定して計算する。 機械的な難しさは増えず、台帳が長くなるだけ。
小さいが重要な点:∂f/∂x 自身も全変数の関数だ ——y を変えれば「x 方向の傾き」も普通変わる。 ある点での偏微分は 1 つの数だが、関数としての偏微分は f と同じ次元数を持つ多変数関数だ。
Transformer では:損失はスカラ —— 訓練サンプルごとに 1 つの数で、 バッチ全体で平均する。モデルは数十億個のパラメータ w₁, w₂, …, w_n を持つ。 訓練が必要とするのは、「各パラメータに関する損失の偏微分」だ: 各 i について ∂L/∂wᵢ。一つひとつが 「この重みを少し上げると損失は上がるか下がるか」に答える。 次節の連鎖律こそが、この数十億個の偏微分を一度の処理で計算可能にする鍵だ。
連鎖律(Chain Rule)
関数が関数を呼ぶとき、鎖の各リンクの「変化率」を掛け合わせる。
噛み合う 3 つの歯車を想像する。歯車 A を 1° 回すと B が 2°、C が 5° 回る。 A を 1° 回すと C はどれだけ回るか? 比を掛けるだけ: A の 1° は C の 2 · 5 = 10 度になる。これが連鎖律。 変化が関数の連鎖を伝わるとき、全体の変化率は各リンクの局所変化率の積になる。
形式的に:y = f(g(x)) —— つまり x を g に入れ、 その出力を f に入れる —— なら:
dy/dx = f'(g(x)) · g'(x)
あるいはより透明なライプニッツ記法、補助変数 u = g(x) を導入して:
dy/dx = dy/du · du/dx
ライプニッツ形式は「分数の約分」のように見える —— 実際そういうものだ。 微分は掛け算で合成する。関数を 3 つ繋ぐ?dy/dx = dy/du · du/dv · dv/dx。N 個繋ぐ? N 個の積。 レシピは変わらない。
具体例。y = sin(x²)。u = x² と置くと y = sin(u):
dy/du = cos(u) (sin の導関数)
du/dx = 2x (x² の導関数)
dy/dx = dy/du · du/dx
= cos(u) · 2x
= cos(x²) · 2x (u を戻す)x = 1 を代入:cos(1) · 2 ≈ 0.54 · 2 ≈ 1.08。 これが sin(x²) の x = 1 での傾き。 1 変数の導関数を 2 つ掛けただけ —— 第 1 節以上の微積分は一度も登場していない。
多変数版が、ディープラーニング全体を支える連鎖律だ。L が y に依存し、y が w に依存する。 たとえ y がベクトルや層全体の活性であっても、同じ掛け算が成り立つ —— ただし、普通の導関数の代わりに偏微分を使い、中間変数について和を取る。 骨格は同じ:入力から出力までの経路上の局所導関数を掛け合わせる。
これがまさに 逆伝播(backpropagation) の正体だ。 現代モデルは深い合成だ:入力 → 第 1 層 → 第 2 層 → … → 第 N 層 → 損失。 第 5 層内の重み w に対する ∂L/∂w を得るには、L から第 N、N−1、… と逆向きにたどって第 5 層、最終的に w に到達する 鎖上の導関数をすべて掛け合わせる。アルゴリズム全体で、第 1 節より深い微積分は どこにも現れない —— ただ連鎖律を数十億回適用するだけ。
backprop の「逆」は鎖をたどる向きを指す。順向き(入力 → 損失)で 予測と損失値を計算し、逆向き(損失 → 入力)で勾配を計算する。 連鎖律はどちら向きでも成り立つが、「損失がスカラ、パラメータが数百万」のとき、 逆向きに計算する方が劇的に安い。
Transformer では:Transformer の各演算 —— 行列積、softmax、 LayerNorm、GELU、残差加算 —— が、順伝播中に自身を計算グラフに登録する。 逆伝播が始まると、フレームワークはそのグラフを損失から入力へとたどり、 各ノードで局所勾配を掛け合わせる。各重みは、こうして連鎖律が積を「精算」することで 自分の ∂L/∂w を受け取る。順伝播 1 回 + 逆伝播 1 回 = 訓練 1 ステップ。 連鎖律は瑣末な技ではない —— 機構的に見れば、ディープラーニングが成り立つ全理由だ。
勾配(Gradient)
すべての偏微分を 1 本のベクトルに束ね、それは「上り坂」を指す。
多変数関数には多くの偏微分がある —— 入力変数 1 つに 1 個。 個別に並べてもいいが、より便利なのは 1 本のベクトルに束ねること。 それが 勾配、∇f(「デルエフ」または「グラッドエフ」)と書く:
∇f = (∂f/∂x₁, ∂f/∂x₂, …, ∂f/∂x_D)
勾配は入力と同じ空間にすむ。2 変数関数なら勾配は 2 次元、D 変数関数なら D 次元。ある点での勾配 —— たとえば ∇f(1, 2) —— は、その数値を代入したベクトル。
第 2 節の f(x, y) = x² + 3xy + y³ を例にとる:
∂f/∂x = 2x + 3y
∂f/∂y = 3x + 3y²
∇f = ( 2x + 3y, 3x + 3y² )
∇f(1, 2) = ( 2·1 + 3·2, 3·1 + 3·4 )
= ( 8, 15 )点 (1, 2) での勾配は 2 次元ベクトル (8, 15)。 このベクトルの 2 つの性質が特別で、どちらも ML に効く:
- 方向。
∇fはfが最も速く増加する方向を指す。 滑らかな地形にビー玉を置き、重力を反転させたらどちらに転がるか —— それが勾配の向きだ。 - 大きさ。ノルム
‖∇f‖は、その最良方向への上昇の速さを表す。勾配が短いと地表はほぼ平ら、長いと急。
「最急上昇方向」というこの性質こそ、勾配が ML を駆動する理由だ。 損失関数は入力次元が数十億にも及ぶ地形で、私たちは低い点を探したい。 勾配を計算する —— それは最急上昇の向き —— そして反対方向に進む。 これが 勾配降下法だ:
w ← w − η · ∇f(w)
この 1 行を慎重に読む —— これがあらゆる訓練済みニューラルネットの中心アルゴリズムだ。 現在のパラメータベクトル w は勾配の反対側に動く。 スカラ η(イータ、学習率)が 1 ステップの大きさを決める。 小さすぎると訓練が這うように進み、大きすぎると行き過ぎて発散する。 妥当な η を選んで更新を数百万回繰り返せば、 パラメータは損失の極小値付近に落ち着く。
覚えておくべき 3 つの実用的事実:
- 極小点(あるいは任意の平らな場所)では、勾配はゼロベクトル
(0, 0, …, 0)—— どの方向も上りでないからだ。 オプティマイザは勾配の大きさが 0 に近づくのを見て収束を判定する。 - 勾配は常に
fの 等高線に垂直 —— 等高線はfが一定値をとる線。等高線をたどる登山者は 上りも下りもしない;勾配(上り方向)はその線を 90° で横切らねばならない。 - D 入力 → D 出力の関数(スカラ 1 つではない出力)では、 自然な一般化は ヤコビ行列(Jacobian) —— 出力ごとに 1 行、入力ごとに 1 列。勾配は出力がスカラ 1 つの特殊例で、 ヤコビが単 1 行に縮んだものだ。
Transformer では:訓練は 2 つのステップの繰り返しに帰着する。 順伝播:1 バッチから損失 L を計算。逆伝播:∇L を計算 —— パラメータ 1 つに 1 成分の、数十億成分のベクトル。 そして更新 w ← w − η · ∇L を適用する (Adam や Lion などの装飾はあれど、骨格は同じ)。 モメンタム、重み減衰、学習率スケジュール、勾配クリッピング、混合精度訓練 —— ディープラーニングの興味深い話題はすべて、この 1 つの更新規則の改良に過ぎない。 勾配こそ中心的対象だ:線形代数(第 1 の primer)はそれが住む空間を、 確率(第 2 の primer)は逼近すべき損失を、 連鎖律(前節)はそれを実際に計算するアルゴリズムを与える。