微積分 入門

ディープラーニング論文を読む前に必要な最低限の微積分。4 つの短いトピックで、 導関数とは何か、多変数を一度に扱う偏微分、なぜ連鎖律が逆伝播の核心なのか、 そして勾配がすべての偏微分を「上り坂方向」を指す 1 本の矢印にまとめる仕組み をカバーする。積分は出てこない —— 数十億パラメータのモデルを訓練するのに、 積分は一度も登場しない。

01

導関数(Derivative)

関数が今この瞬間どれだけ速く変化しているかを表す 1 つの数。

車を運転している。速度計が 60 km/h を指す。これは走った距離でも 運転時間でもなく、「距離が時間に対して変化する速さ」を、たった今この瞬間に切り取った値だ。導関数とは、まさにこの考え方の形式化:任意の関数 f(x) に対し、 導関数 f'(x) は、x が動くとき f が どれだけ速く変化しているかを返す。

幾何学的には、導関数は 接線の傾き —— 曲線にちょうど触れて、 曲線と同じ方向に走る直線の傾きだ。曲線が x = 3 で急に上っているなら、 そこの接線も急で f'(3) は大きな正の数。曲線が頂点に到達して 下りに転じる手前なら、接線は水平で f' は 0。落ちている途中なら傾きは負。

3 つの記法はどれも同じ意味で、ML 論文では平気で混在する:

  • f'(x) —— ラグランジュのプライム記法、コンパクト。
  • df/dx —— ライプニッツの比の記法、「fx あたりの変化」と読む。
  • d/dx [f(x)] —— 「いま微分するんだ」と動作を強調したいとき。

具体例。f(x) = x² をとる。グラフは左で下がり、右で上がる放物線。 その導関数は f'(x) = 2xx = 3 なら傾きは 6 —— かなり急。x = 0 では 0 —— 放物線がちょうど底をついた。x = −1 では −2 —— 下降中。 1 本の式が、曲線のすべての点での「上昇速度」を一挙に与える。

-2-1012x = -2傾き f'(x) = 2 · (-2) = -4
1 / 5
f(x) = x² なので f'(x) = 2x。点が動くと接線が回転 —— その傾きが導関数。

少数の規則だけで、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 が実際に大規模でこれらの導関数を計算するための 仕組みを順に組み立てる。

02

偏微分(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 が得られる。

f(x, y)xyy = y₀ での断面断面はまだ選んでいないf(x, y) = x² + 3xy + y³ —— 等高線で示した曲面。
1 / 3
1 つの変数を固定すると、曲面が 1 本の曲線になる。偏微分はその曲線の傾き。

「スライス」のイメージが直感の核心だ。yy₀ に固定すると、 曲面から 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ᵢ。一つひとつが 「この重みを少し上げると損失は上がるか下がるか」に答える。 次節の連鎖律こそが、この数十億個の偏微分を一度の処理で計算可能にする鍵だ。

03

連鎖律(Chain Rule)

関数が関数を呼ぶとき、鎖の各リンクの「変化率」を掛け合わせる。

噛み合う 3 つの歯車を想像する。歯車 A を 1° 回すと B が 2°、C が 5° 回る。 A を 1° 回すと C はどれだけ回るか? 比を掛けるだけ: A の 1° は C の 2 · 5 = 10 度になる。これが連鎖律。 変化が関数の連鎖を伝わるとき、全体の変化率は各リンクの局所変化率のになる。

形式的に:y = f(g(x)) —— つまり xg に入れ、 その出力を 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/dxN 個繋ぐ? 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 節以上の微積分は一度も登場していない。

x= 1u = x²= 1y = sin(u)= 0.84du/dx2x = 2dy/ducos(u) ≈ 0.54dy/dx = du/dx · dy/du = 2 · 0.54 ≈ 1.083 つの変数:x、u = x²、y = sin(u)。各矢印が 1 つの局所変化率を運ぶ。
1 / 4
y = sin(x²)。2 つの局所変化率の積が、x = 1 での全体の傾き。

多変数版が、ディープラーニング全体を支える連鎖律だ。L y に依存し、yw に依存する。 たとえ 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 ステップ。 連鎖律は瑣末な技ではない —— 機構的に見れば、ディープラーニングが成り立つ全理由だ。

04

勾配(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 に効く:

  • 方向。∇ff が最も速く増加する方向を指す。 滑らかな地形にビー玉を置き、重力を反転させたらどちらに転がるか —— それが勾配の向きだ。
  • 大きさ。ノルム ‖∇f‖ は、その最良方向への上昇の速さを表す。勾配が短いと地表はほぼ平ら、長いと急。

「最急上昇方向」というこの性質こそ、勾配が ML を駆動する理由だ。 損失関数は入力次元が数十億にも及ぶ地形で、私たちは低い点を探したい。 勾配を計算する —— それは最急上昇の向き —— そして反対方向に進む。 これが 勾配降下法だ:

w ← w − η · ∇f(w)

この 1 行を慎重に読む —— これがあらゆる訓練済みニューラルネットの中心アルゴリズムだ。 現在のパラメータベクトル w は勾配の反対側に動く。 スカラ η(イータ、学習率)が 1 ステップの大きさを決める。 小さすぎると訓練が這うように進み、大きすぎると行き過ぎて発散する。 妥当な η を選んで更新を数百万回繰り返せば、 パラメータは損失の極小値付近に落ち着く。

f(x, y) = x² + y² · 等高線∇f(1.5, 0.8) に立つ。∇f = (2x, 2y) = (3.0, 1.6) は原点から離れて上り方向。
1 / 4
勾配は極小から離れる方向を指し、勾配降下はその逆を進む。

覚えておくべき 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)は逼近すべき損失を、 連鎖律(前節)はそれを実際に計算するアルゴリズムを与える。