TL; DR (要約)
AIの学習は、長い「伝言ゲーム」。最後の間違いは、誰の責任?
その「責任」を、下流から上流へと遡って突き止める魔法の計算ルール、それが連鎖律 (Chain Rule)です。
① 課題
(長い伝言ゲーム)
AIは関数の「入れ子構造」。最初の工程での小さな変化が、最終出力にどう影響するか、直接知るのは困難でした。
② 連鎖律のアイデア
(「影響度」の掛け算)
全体の変化率は、各工程の変化率の「掛け算」で求まります。(A→Bの影響) × (B→Cの影響) = (A→Cの影響)。
③ AI学習への応用
(誤差逆伝播法)
最終的な間違い(損失)から出発し、連鎖律で「責任の大きさ(勾配)」を逆算。これにより、AIは賢く学習できます。
これまでの道のりで、私たちはついに、AIが学習するための魔法の「羅針盤」、すなわち勾配(Gradient)を手に入れましたね。このコンパス(勾配ベクトル)は、「最も急な下り坂」の方向をピタリと指し示してくれる、頼もしい相棒です。
でも、ここである疑問が頭をもたげます。私たちがこれまで見てきた山は、比較的シンプルな一つの関数でできた、なだらかな丘のようなものでした。実際のAI、特に深層学習モデルという「山脈」は、もっとずっと複雑で、いくつもの峰や谷が連なってできています。
これは、AIモデルが、無数の関数が何層にもわたって「入れ子」になった、非常に複雑な合成関数 (Composite Function) だからです。入力データは、最初の層(関数)で処理され、その出力が次の層(関数)の入力となり、さらにその出力がまた次の層へ…というプロセスを繰り返して、最終的な予測値が計算されます。
【ニューラルネットワークの計算の流れ(=合成関数)】
graph LR A["入力データ (x)"] --> B["層1: 関数h"]; B --> C["中間出力 (y)"]; C --> D["層2: 関数g"]; D --> E["最終出力 (z)"];
ここで、私たちの「山下り」の旅における、最大の難問に直面します。
最終出力\(z\)で、正解との間に大きな「間違い(損失)」が見つかったとしましょう。この間違いを正すには、一番最初の工程で使われたパラメータ(関数\(h\)の内部設定)を調整しなくてはなりません。
でも、最初の工程のパラメータは、最終的な間違いに直接関わっているわけではなく、中間出力\(y\)を通して、間接的にしか影響を与えていません。一体、どうやって「最初の工程の、どのネジを締めれば、最終的な製品が良くなるのか」を知れば良いのでしょうか?
この、一見すると絶望的な「責任の所在探し」を可能にするのが、微分の世界における最重要ルールの一つ、連鎖律 (Chain Rule) なのです。連鎖律は、この長く連なった因果関係の鎖を、下流から上流へと遡って、それぞれの工程が最終結果に与えた影響の大きさを、まるで「伝言ゲーム」のように伝えていくための、驚くほどエレガントな計算ルールを提供してくれます。
1. 合成関数とは? — 「関数の入れ子構造」を解き明かす
連鎖律というルールの話を始める前に、まずはその主役である合成関数と、しっかり顔なじみになっておきましょう。合成関数と聞くと難しそうですが、実は私たちの思考プロセスや、世の中の多くの現象と同じ、ごく自然な構造をしています。
それは、ある処理の結果を、次の処理の材料にするという、連続的なプロセスのことです。
簡単な計算でイメージを掴む
例えば、ここに2つの簡単な関数があるとします。
- 関数\(h\): 入力された数値を2倍する (\(y = 2x\))
- 関数\(g\): 入力された数値に1を加える (\(z = y + 1\))
もし、入力\(x\)として3を関数\(h\)に入れると、出力\(y\)は6になりますね。そして、その結果である6を次に関数\(g\)に入れると、最終的な出力\(z\)は7になります。
この一連の流れ 3 → 6 → 7 を一つの大きな関数として見たもの、それが合成関数 \(z = g(h(x))\) です。この例では、\(z = (2x) + 1\) という一つの式で表現できます。
工場の「組み立てライン」としての姿
この関係は、よく工場の「組み立てライン」に例えられます。
素材(\(x\))が最初の工程(\(h\))で部品(\(y\))になり、その部品が次の工程(\(g\))で最終製品(\(z\))に加工される。この全体の流れが、一つの大きな合成関数というわけです。
ニューラルネットワークとの関係
そして、この組み立てラインの構造こそ、何を隠そう、ニューラルネットワークの構造そのものなのです。
入力データ(例えば患者さんのベクトル)は、まず「第1層」という名の関数で処理され、その結果(中間的な特徴量)が、そのまま「第2層」という次の関数の入力になります。さらにその結果が「第3層」へ…と、このプロセスが何層にもわたって繰り返されます。
つまり、AIモデルというのは、こうした単純な関数が、何層にも、何百万個も「入れ子」になった、途方もなく巨大な合成関数だと言えるのです。この視点を持つことが、AIの学習メカニズムを理解する上で非常に重要になります。
2. 連鎖律(The Chain Rule)— 「変化の影響」を伝播させる連鎖の法則
さて、前のセクションで、私たちは関数が入れ子になった「合成関数」という、AIモデルの基本的な構造を見ました。ここでの本題は、「もし、最初の入力\(x\)をほんの少しだけ変えたら、長い工程を経た最終出力\(z\)は、いったいどれだけ変化するのだろうか?」という問いに答えることです。
この問い、つまり合成関数全体の微分 \(\frac{dz}{dx}\) を求めるためのルールこそが、連鎖律です。
連鎖律が教えてくれる答えは、驚くほどエレガントです。それは、「全体の変化率」は、「各部分の変化率」の掛け算で求められる、というものです。
\[\frac{dz}{dx} = \frac{dz}{dy} \cdot \frac{dy}{dx}\]
この式が、連鎖律のすべてを物語っています。一見すると、ただ分数の約分をしているだけのように見えますが、その一つ一つの項には、深い意味が込められています。私たちの数値例 \(y = 2x + 1\) と \(z = y^2\) (入力\(x=3\)のとき)と一緒に、この式の「気持ち」を読み解いていきましょう。
微分の「伝言ゲーム」で影響を追跡する
連鎖律は、まるで「伝言ゲーム」のように、変化の影響が次々と伝播していく様子を捉えることができます。
- \(\frac{dy}{dx}\) (川上での変化率):
これは「入力\(x\)が少し変わると、中間生成物\(y\)はどれだけ変わるか」という最初の感度です。私たちの例 \(y=2x+1\) では、\(x\)が1増えれば\(y\)は常に2増えます。なので、この感度は常に 2 です。これが最初の伝言ですね。 - \(\frac{dz}{dy}\) (川下での変化率):
これは「中間生成物\(y\)が少し変わると、最終製品\(z\)はどれだけ変化するか」という次の感度です。例の \(z=y^2\) では、この感度(傾き)は\(y\)の値に依存します。順伝播の計算で \(y=7\) でしたから、この地点での感度は \(2y = 2 \times 7 = 14\) となります。\(y\)が7あたりで1動くと、\(z\)はその14倍も動く、というわけですね。
これで、全ての「伝言」の準備が整いました。連鎖律によれば、入力\(x\)から出力\(z\)までの総合的な感度 \(\frac{dz}{dx}\) は、これらの感度をただ掛け合わせるだけです。
\[ \frac{dz}{dx} = 14 \times 2 = 28 \]
この「28」という数字が意味するのは、「\(x=3\)のあたりで入力\(x\)をほんの少し動かすと、その影響は各工程で増幅され、最終出力\(z\)はなんと28倍もの勢いで変化する」ということなのです。
この考え方は、歯車の比率の例え話と全く同じ構造です。「入力軸→歯車A」のギア比が2、「歯車A→歯車B」のギア比が14。この二つの歯車が連なっているなら、入力軸を1回転させれば、最終的な歯車Bは \(2 \times 14 = 28\) 回転しますよね。連鎖律は、この影響が次々と伝わっていく様子を、微分の言葉で美しく表現したルールなのです。
そして、この「掛け算でつなげていく」という性質こそが、複雑なニューラルネットワークの勾配計算を可能にする「誤差逆伝播法」の心臓部となります。その話は、次のセクションで詳しく見ていきましょう。
3. AIの学習と「誤差逆伝播法」への繋がり — 責任の所在を遡る「微分の逆再生」
さて、連鎖律が「影響の伝播」を計算するルールであることが分かりました。ここからが、AIの学習における最も美しく、そして重要なクライマックスです。
思い出してください、私たちの目標は、AIモデルという工場の「最終製品(予測)」と「設計図(正解)」を見比べて、その間違い(損失)を最小にすることでした。そのためには、工場の一番最初の工程で使われているパラメータ(ネジの一本一本)を、どう調整すれば良いかを知る必要があります。
このプロセスは、大きく分けて2つのステップで進みます。
【誤差逆伝播法(バックプロパゲーション)の2ステップ】
【各ステップの解説】
- 順伝播 (Forward Propagation)
まず、AIは普通に計算を行います。入力データ\(x\)が層1、層2を通って、最終的な予測値\(z\)を出力します。そして、その予測値\(z\)と正解を比べて「損失\(L\)」を計算します。ここまでは、ただの計算の流れです。「今の設定だと、これくらいの間違いが出てしまった」という事実確認ですね。 - 逆伝播 (Backward Propagation)
ここからが連鎖律の独壇場です。「なぜ、この損失Lが生まれたのか?」という原因、すなわち各パラメータの「責任の大きさ」を、下流から上流へと遡って突き止めていきます。- (A) 全ては損失から始まる: まず、一番下流である「損失\(L\)が、出力\(z\)の変化に対してどれだけ敏感か」、つまり \(\frac{\partial L}{\partial z}\) を計算します。これが全ての「責任追及」の出発点です。
- (B) 一つ遡る: 次に、連鎖律を使ってこの「責任」を一つ上流に伝播させます。層2のパラメータ(\(w_2, b_2\))が損失\(L\)に与えた影響(\(\frac{\partial L}{\partial w_2}\)など)と、中間出力\(y\)が損失\(L\)に与えた影響(\(\frac{\partial L}{\partial y}\))を計算します。
- (C) さらに遡る: そして、今度は\(\frac{\partial L}{\partial y}\)という「中間の責任」を、さらに上流の層1に伝播させ、層1のパラメータ(\(w_1, b_1\))が損失\(L\)に与えた影響(\(\frac{\partial L}{\partial w_1}\)など)を計算します。
- (D) 全員の責任が判明: この「微分の伝言ゲーム」を入力層まで繰り返すことで、最終的に、モデル内に存在する全てのパラメータが、最終的な損失に対してどれだけの責任を負っているか(=損失関数の勾配)が、一度の計算で明らかになるのです。
この驚くほど効率的な「責任の所在」の計算方法こそが、誤差逆伝播法(Backpropagation)です。
連鎖律という数学的な法則がなければ、何百万ものパラメータを持つ深層学習モデルの学習は、計算量的に不可能だったでしょう。AIの歴史における、最大級のブレークスルーの一つだと私は思います。

4. Pythonで連鎖律を体験する — 「微分の伝言ゲーム」をコードで追跡する
これまでの話は、少し抽象的だったかもしれませんね。ここからは、実際にPythonコードを動かしながら、あの「微分の伝言ゲーム」、つまり連鎖律がどのように計算され、情報が伝播していくのかを、ステップ・バイ・ステップで追体験してみましょう。
題材は、\(z = (2x + 1)^2\) というシンプルな合成関数です。これは、\(y = h(x) = 2x + 1\) と \(z = g(y) = y^2\) という2つの関数が繋がったものですね。
計算の全体像(計算グラフ)
まず、これから行う計算の全体像を「計算グラフ」という図で見てみましょう。これは、計算の流れをノード(箱)と矢印で表現したもので、AIの分野では頻繁に使われる考え方です。
【計算グラフと微分の流れ】
この図の「順伝播」と「逆伝播」の矢印の流れを、これからコードで一つずつ再現していきます。
Step 1: 関数の定義
まず、私たちの「組み立てライン」の各工程となる関数と、それぞれの「変化率」を計算する導関数を、Pythonで準備します。
# --- 各関数とその導関数を定義 ---
# 工程1: y = h(x) = 2x + 1
def h(x):
return 2 * x + 1
# 工程1の導関数 dy/dx
def dh_dx(x):
return 2
# 工程2: z = g(y) = y^2
def g(y):
return y**2
# 工程2の導関数 dz/dy
def dg_dy(y):
return 2 * y
Step 2: 順伝播 (Forward Pass) — 入力から出力を計算
次に、入力として x=3.0 を与え、計算を「順方向」に進めて、中間値と最終的な出力を計算します。これは、ごく普通の計算です。
# 入力値
x = 3.0
# 順伝播の計算
y = h(x) # y = 2*3 + 1 = 7
z = g(y) # z = 7^2 = 49
print(f"--- 順伝播の結果 ---")
print(f"入力 x = {x}")
print(f"中間出力 y = h({x}) = {y}")
print(f"最終出力 z = g({y}) = {z}\n")
▼上記コードの実行結果
--- 順伝播の結果 ---
入力 x = 3.0
中間出力 y = h(3.0) = 7.0
最終出力 z = g(7.0) = 49.0
この結果、入力\(x=3\)は、中間で\(y=7\)になり、最終的に\(z=49\)という値に変換されることがわかりました。
Step 3: 逆伝播 (Backward Pass) — 連鎖律で「感度」を逆算
ここからが連鎖律のハイライトです。「最終出力\(z\)」から出発して、微分の伝言ゲームを「逆方向」に進めていきます。
- 出発点: 全ての始まりは「自分自身の、自分自身に対する変化率」です。\(\frac{\partial z}{\partial z}\)は当然1ですよね。ここからスタートします。
- zからyへ: 次に、一つ手前の\(y\)が変化したとき、\(z\)がどれだけ影響を受けるか、つまり\(\frac{\partial z}{\partial y}\)を計算します。導関数\(dg_dy(y) = 2y\)に、順伝播で求めた\(y=7\)を代入します。結果は14。これは「yが1動くと、zは14動く」という感度を示します。
- yからxへ: さらに一つ手前の\(x\)が変化したとき、\(y\)がどれだけ影響を受けるか、\(\frac{dy}{dx}\)を計算します。導関数\(dh_dx(x) = 2\)なので、値は常に2です。
- 全体の感度を計算: 最後に、連鎖律のルールに従って、これらの感度を全て掛け合わせます。\(\frac{dz}{dx} = \frac{dz}{dy} \cdot \frac{dy}{dx} = 14 \times 2 = 28\)。これで、入力\(x\)が最終出力\(z\)に与える総合的な感度(微分値)が求まりました。
この流れをPythonコードで見てみましょう。
# --- 逆伝播の計算 ---
# y と x は前のコードブロックで計算した値 (y=7, x=3) を使います
# (A) 出発点:zのzに対する微分は当然「1」
dz_dz = 1.0
# (B) zからyへ:dz/dyを計算。順伝播のy=7を使う
# 「yが1動くと、zはどれだけ動くか」という感度
dz_dy = dg_dy(y) # dz/dy = 2*y = 2*7 = 14
# (C) yからxへ:dy/dxを計算
# 「xが1動くと、yはどれだけ動くか」という感度
dy_dx = dh_dx(x) # dy/dx = 2
# (D) 連鎖律を適用し、最終的な微分 dz/dx を求める
dz_dx = dz_dy * dy_dx # dz/dx = (dz/dy) * (dy/dx)
print(f"--- 逆伝播(連鎖律)による計算 ---")
print(f"zのyに対する感度 (dz/dy) @ y={y}: {dz_dy}")
print(f"yのxに対する感度 (dy/dx) @ x={x}: {dy_dx}")
print(f"最終的なxのzに対する感度 (dz/dx) = {dz_dy} * {dy_dx} = {dz_dx}")
▼上記コードの実行結果
--- 逆伝播(連鎖律)による計算 ---
zのyに対する感度 (dz/dy) @ y=7.0: 14.0
yのxに対する感度 (dy/dx) @ x=3.0: 2
最終的なxのzに対する感度 (dz/dx) = 14.0 * 2.0 = 28.0
結果の解説
最終的に得られた \(\frac{dz}{dx} = 28\) という値は、「入力\(x\)が3の地点で、もし\(x\)をほんのわずか動かしたら、最終出力\(z\)はその28倍の大きさで変化する」という、入力から出力までの総合的な感度を示しています。
このように、順伝播で各地点の値を計算・記録しておき、逆伝播でその値を使って各部分の微分(感度)を計算し、連鎖律に従って掛け合わせていく。この一連の流れこそ、AIモデルを学習させる「誤差逆伝播法」の、最も単純化したミニチュア版なのです。
まとめ:微分を「伝播」させる力
- 合成関数とは、ある関数の出力を別の関数の入力とする、「入れ子構造」の関数です。ニューラルネットワークは巨大な合成関数です。
- 連鎖律は、合成関数の微分を、各部分関数の微分の「積」として計算するためのルールです。
- 誤差逆伝播法(バックプロパゲーション)は、この連鎖律を応用して、AIモデルの最終的な誤差を、モデル内の全パラメータの勾配へと効率的に逆変換するアルゴリズムです。
連鎖律は、AIが自身の深い階層構造の、どの部分を修正すべきかを効率的に知るための、まさに「神経網」のような役割を果たしています。
微分に関する探求はここで一段落です。次回からは、AI数学の最後の柱である「0.4: 確率・統計」の世界へと進み、不確実なデータを扱うための知恵を学びます。
参考文献
- Strang G. Calculus. Wellesley-Cambridge Press; 2017. Chapter 4.
- Goodfellow I, Bengio Y, Courville A. Deep Learning. MIT Press; 2016. Chapter 6.
- Deisenroth MP, Faisal AA, Ong CS. Mathematics for Machine Learning. Cambridge, UK: Cambridge University Press; 2020. Chapter 6.
- Nielsen MA. Neural Networks and Deep Learning [Internet]. Determination Press; 2015. Chapter 2.
- Bishop CM. Pattern Recognition and Machine Learning. New York: Springer; 2006. Chapter 5.
ご利用規約(免責事項)
当サイト(以下「本サイト」といいます)をご利用になる前に、本ご利用規約(以下「本規約」といいます)をよくお読みください。本サイトを利用された時点で、利用者は本規約の全ての条項に同意したものとみなします。
第1条(目的と情報の性質)
- 本サイトは、医療分野におけるAI技術に関する一般的な情報提供および技術的な学習機会の提供を唯一の目的とします。
- 本サイトで提供されるすべてのコンテンツ(文章、図表、コード、データセットの紹介等を含みますが、これらに限定されません)は、一般的な学習参考用であり、いかなる場合も医学的な助言、診断、治療、またはこれらに準ずる行為(以下「医行為等」といいます)を提供するものではありません。
- 本サイトのコンテンツは、特定の製品、技術、または治療法の有効性、安全性を保証、推奨、または広告・販売促進するものではありません。紹介する技術には研究開発段階のものが含まれており、その臨床応用には、さらなる研究と国内外の規制当局による正式な承認が別途必要です。
- 本サイトは、情報提供を目的としたものであり、特定の治療法を推奨するものではありません。健康に関するご懸念やご相談は、必ず専門の医療機関にご相談ください。
第2条(法令等の遵守)
利用者は、本サイトの利用にあたり、医師法、医薬品、医療機器等の品質、有効性及び安全性の確保等に関する法律(薬機法)、個人情報の保護に関する法律、医療法、医療広告ガイドライン、その他関連する国内外の全ての法令、条例、規則、および各省庁・学会等が定める最新のガイドライン等を、自らの責任において遵守するものとします。これらの適用判断についても、利用者が自ら関係各所に確認するものとし、本サイトは一切の責任を負いません。
第3条(医療行為における責任)
- 本サイトで紹介するAI技術・手法は、あくまで研究段階の技術的解説であり、実際の臨床現場での診断・治療を代替、補助、または推奨するものでは一切ありません。
- 医行為等に関する最終的な判断、決定、およびそれに伴う一切の責任は、必ず法律上その資格を認められた医療専門家(医師、歯科医師等)が負うものとします。AIによる出力を、資格を有する専門家による独立した検証および判断を経ずに利用することを固く禁じます。
- 本サイトの情報に基づくいかなる行為によって利用者または第三者に損害が生じた場合も、本サイト運営者は一切の責任を負いません。実際の臨床判断に際しては、必ず担当の医療専門家にご相談ください。本サイトの利用によって、利用者と本サイト運営者の間に、医師と患者の関係、またはその他いかなる専門的な関係も成立するものではありません。
第4条(情報の正確性・完全性・有用性)
- 本サイトは、掲載する情報(数値、事例、ソースコード、ライブラリのバージョン等)の正確性、完全性、網羅性、有用性、特定目的への適合性、その他一切の事項について、何ら保証するものではありません。
- 掲載情報は執筆時点のものであり、予告なく変更または削除されることがあります。また、技術の進展、ライブラリの更新等により、情報は古くなる可能性があります。利用者は、必ず自身で公式ドキュメント等の最新情報を確認し、自らの責任で情報を利用するものとします。
第5条(AI生成コンテンツに関する注意事項)
本サイトのコンテンツには、AIによる提案を基に作成された部分が含まれる場合がありますが、公開にあたっては人間による監修・編集を経ています。利用者が生成AI等を用いる際は、ハルシネーション(事実に基づかない情報の生成)やバイアスのリスクが内在することを十分に理解し、その出力を鵜呑みにすることなく、必ず専門家による検証を行うものとします。
第6条(知的財産権)
- 本サイトを構成するすべてのコンテンツに関する著作権、商標権、その他一切の知的財産権は、本サイト運営者または正当な権利を有する第三者に帰属します。
- 本サイトのコンテンツを引用、転載、複製、改変、その他の二次利用を行う場合は、著作権法その他関連法規を遵守し、必ず出典を明記するとともに、権利者の許諾を得るなど、適切な手続きを自らの責任で行うものとします。
第7条(プライバシー・倫理)
本サイトで紹介または言及されるデータセット等を利用する場合、利用者は当該データセットに付随するライセンス条件および研究倫理指針を厳格に遵守し、個人情報の匿名化や同意取得の確認など、適用される法規制に基づき必要とされるすべての措置を、自らの責任において講じるものとします。
第8条(利用環境)
本サイトで紹介するソースコードやライブラリは、執筆時点で特定のバージョンおよび実行環境(OS、ハードウェア、依存パッケージ等)を前提としています。利用者の環境における動作を保証するものではなく、互換性の問題等に起因するいかなる不利益・損害についても、本サイト運営者は責任を負いません。
第9条(免責事項)
- 本サイト運営者は、利用者が本サイトを利用したこと、または利用できなかったことによって生じる一切の損害(直接損害、間接損害、付随的損害、特別損害、懲罰的損害、逸失利益、データの消失、プログラムの毀損等を含みますが、これらに限定されません)について、その原因の如何を問わず、一切の法的責任を負わないものとします。
- 本サイトの利用は、学習および研究目的に限定されるものとし、それ以外の目的での利用はご遠慮ください。
- 本サイトの利用に関連して、利用者と第三者との間で紛争が生じた場合、利用者は自らの費用と責任においてこれを解決するものとし、本サイト運営者に一切の迷惑または損害を与えないものとします。
- 本サイト運営者は、いつでも予告なく本サイトの運営を中断、中止、または内容を変更できるものとし、これによって利用者に生じたいかなる損害についても責任を負いません。
第10条(規約の変更)
本サイト運営者は、必要と判断した場合、利用者の承諾を得ることなく、いつでも本規約を変更することができます。変更後の規約は、本サイト上に掲載された時点で効力を生じるものとし、利用者は変更後の規約に拘束されるものとします。
第11条(準拠法および合意管轄)
本規約の解釈にあたっては、日本法を準拠法とします。本サイトの利用および本規約に関連して生じる一切の紛争については、東京地方裁判所を第一審の専属的合意管轄裁判所とします。
For J³, may joy follow you.

