| この記事で学ぶこと | 対象読者・前提知識 |
|---|---|
| 微分が「瞬間の変化率」を捉えるツールであることを、直感的な例で説明できる。 勾配が、多次元空間における「最も急な坂の方向」を示すベクトルであることを理解する。 AIの学習(パラメータ調整)において、なぜ勾配の「逆方向」へ進むのかを説明できる。 | AIの背景にある数学の考え方を、直感的に学びたいと考えている医療従事者、研究者、学生の方。 AIやプログラミングの経験は問いません。 これまでの講座(特に第2回)で学んだ、ベクトルと行列の基本的な概念を理解していると、よりスムーズに読み進められます。 |
はじめに:AIはどうやって「賢く」なるのか?
これまでの講座で、私たちはAIが扱うデータの「形」(ベクトルや行列)と、データ同士の「関係性」(内積や類似度)について学んできました。いわば、AIという料理人に、新鮮な食材とその特徴を教えた状態です。
しかし、ここからが本番です。優れた料理人が、味見を繰り返しながら調味料を調整し、料理を完成させていくように、AIもまた、自らの「間違い」を認識し、それを修正していくことで「賢く」なります。この、AIが自らを改善していくプロセスこそが「学習」です。
では、AIはどのようにして「進むべき正しい方向」を見つけ出すのでしょうか?闇雲にパラメータを調整していては、いつまで経っても賢くなれません。
このAIの学習の旅路において、進むべき道を照らす強力な「羅針盤」の役割を果たすのが、今回のテーマである微分 (Differentiation) と勾配 (Gradient) なのです。これらは、AIが学習するための、まさに「エネルギー源」と言えるでしょう。
1. 微分との再会 — 「瞬間の変化率」を捉える虫眼鏡
「微分」と聞くと、難しい数式を思い浮かべるかもしれませんが、その本質は驚くほどシンプルです。それは、「ある一点における、ごくわずかな変化の割合」を捉えることです。グラフの世界で言えば、その点における「接線の傾き」に完全に一致します(1)。
車のスピードメーターを想像してみてください。スピードメーターが示すのは、旅行全体の平均速度ではなく、「今、この瞬間」の速度ですよね。微分は、まさに関数における「瞬間の勢い」を、傾きという一つの数値として正確に捉える、虫眼鏡のような道具なのです。
最もシンプルな二次関数 \(y = x^2\) のグラフで、この「瞬間の傾き」を見てみましょう。
【実行前の準備】
以下のコードで日本語のグラフを表示させるには、あらかじめターミナルやコマンドプロンプトで pip install japanize-matplotlib を実行してライブラリをインストールしてください。
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib # matplotlibの日本語表示を簡単にする
# 微分の対象となる関数 y = x^2 を定義
def function_f(x):
return x**2
# 関数のグラフデータを作成
x_range = np.arange(-1.0, 5.0, 0.1)
y_range = function_f(x_range)
# x=3 における接線を計算 (y=x^2 の導関数は y'=2x なので、x=3での傾きは6)
x_point = 3.0
slope = 2 * x_point
y_point = function_f(x_point)
tangent_line = slope * (x_range - x_point) + y_point
# グラフを描画
plt.figure(figsize=(8, 6))
plt.plot(x_range, y_range, label='y = x² (元の関数)')
plt.plot(x_range, tangent_line, 'r--', label=f'x={x_point}での接線 (傾き = {slope:.1f})')
plt.scatter(x_point, y_point, color='red', s=100, zorder=5, label=f'接点 (x={x_point})')
plt.title('関数とその点における接線(瞬間の傾き)')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.legend()
plt.show()
(注:上記コードを実行すると、関数のグラフと、指定した点における接線が描画されます。)

このグラフが示すように、微分は、ある点における関数の「進む方向」と「勢い」を正確に教えてくれます。
2. 勾配 (Gradient) とは? — 多次元世界の「コンパス」
しかし、AIの性能(間違いの大きさ)を決めるのは、たった一つの要因ではありません。何百万というパラメータ(変数)が複雑に絡み合って、最終的な結果が決まります。
これは、山の高さが緯度だけで決まるのではなく、「緯度」「経度」「標高」「湿度」といった無数の要素で決まる、超多次元の山を歩くようなものです。このような多次元空間において、「瞬間の傾き」はどのように考えれば良いのでしょうか。
ここで登場するのが勾配 (Gradient) です。勾配とは、「全ての変数(パラメータ)を考慮した上で、関数値が最も大きくなる方向と、その勢いを一本のベクトル(矢印)として示したもの」です。
もう一度、あの「霧深い山で谷底を探す旅」の例えに戻りましょう。
- 勾配: あなたが立っている地点で、360度見渡したときに「最も急な上り坂」を指し示すコンパスの矢印です。矢印の向きが最も険しい上りの方向を、矢印の長さがその坂の急さを示します。
- 学習の方向: 私たちが目指すのは「谷底(間違いが最小の地点)」です。ならば、進むべき方向は明らかですね。勾配が指す方向と真逆の方向へ進めば、最も効率的に山を下ることができるはずです。
この「最も急な下り坂」の方向こそが、負の勾配 (-Gradient) であり、AIが学習の各ステップで進むべき「正しい方向」なのです。
以下の図は、お椀型の関数(損失関数に見立てたもの)の、いくつかの地点における「負の勾配」を赤い矢印で示しています。どの地点から出発しても、矢印が常に関数の最小値である中心点を指しているのが分かります。
# (このコードは、前の講座 0.3.2 で使用したものを再掲・簡略化しています)
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
def function_2d(x):
return x[0]**2 + x[1]**2
def numerical_gradient(f, x):
h = 1e-4
grad = np.zeros_like(x)
for idx in range(x.size):
tmp_val = x[idx]
x[idx] = float(tmp_val) + h
fxh1 = f(x)
x[idx] = float(tmp_val) - h
fxh2 = f(x)
grad[idx] = (fxh1 - fxh2) / (2 * h)
x[idx] = tmp_val
return grad
# 関数の等高線プロット
x0, x1 = np.arange(-10, 10.1, 1.0), np.arange(-10, 10.1, 1.0)
X0, X1 = np.meshgrid(x0, x1)
Z = X0**2 + X1**2
plt.figure(figsize=(8, 8))
plt.contour(X0, X1, Z, levels=np.arange(0, 201, 20), colors='gray')
# いくつかの点における負の勾配を描画
points = [np.array([-8.0, 6.0]), np.array([5.0, -5.0]), np.array([-2.0, -8.0]), np.array([7.0, 7.0])]
for p in points:
grad = numerical_gradient(function_2d, p.copy())
plt.quiver(p[0], p[1], -grad[0], -grad[1], angles="xy", color="red", scale_units='xy', scale=15)
plt.plot(p[0], p[1], 'bo')
plt.xlim(-10, 10); plt.ylim(-10, 10); plt.xlabel("パラメータ1"); plt.ylabel("パラメータ2")
plt.title('損失関数の地形と、各地点での「進むべき方向」(負の勾配)')
plt.gca().set_aspect('equal', adjustable='box'); plt.grid(True); plt.show()
(注:上記コードを実行すると、関数の等高線と、各点における勾配の逆方向を示す矢印が描画されます。)

3. AIの学習と勾配降下法
これまでの話をまとめると、AIの学習プロセスは次のようなステップを繰り返す、非常にシンプルなアルゴリズムとして表現できます。この手法を、その名の通り勾配降下法 (Gradient Descent) と呼びます (2), (3)。
これは、研修医が指導医からのフィードバック(間違いの指摘)を元に、手技(パラメータ)を少しずつ修正していくプロセスにも似ています。一度に大きく修正するのではなく、確実なフィードバック(勾配)に基づいて、少しずつ改善を繰り返すことで、最終的に最適な手技を身につけていくのです。
理解度チェッククイズ
1. 一次関数のグラフにおいて、「微分」が表すものは何ですか?
- グラフのy切片
- グラフの傾き
- グラフが囲む面積
2. 多変数関数において、勾配ベクトルが指し示す方向はどれですか?
- 最も急な下り坂の方向
- 等高線に沿った方向
- 最も急な上り坂の方向
3. 勾配降下法において、AIモデルのパラメータはどの方向に更新されますか?
- 勾配の方向
- 負の勾配の方向
- 勾配と直交する方向
答え1-b, 2-c, 3-b
まとめ:学習の原動力としての勾配
- 微分は、関数の「ある一点での瞬間の傾き」を求める操作です。
- 勾配は、この傾きの概念を多次元に拡張したもので、「関数値が最も増加する方向を示すベクトル」です。
- AIは、損失関数の「負の勾配」を道しるべに、パラメータを少しずつ更新していくことで学習します。この手法が勾配降下法です。
私たちは、AIが膨大なパラメータの山を駆け下りるための、最も基本的なコンパスを手に入れました。この勾配という概念が、AIの「学習」と呼ばれるプロセスの、まさに原動力となっているのです。
しかし、まだいくつかの疑問が残ります。「間違い(損失)」とは、具体的にどうやって計算するのでしょうか?そして、勾配を使ってパラメータを更新する際に、何か賢い工夫はないのでしょうか?
次回、第5回「誤差と損失関数 — AIが『間違い』をどう数えるか?」では、学習の目的地である「山の地形」そのもの、すなわち損失関数について詳しく見ていきます。
参考文献
- Strang G. Calculus. Wellesley-Cambridge Press; 2017.
- Goodfellow I, Bengio Y, Courville A. Deep Learning. MIT Press; 2016. Chapter 4 & 5.
- Ruder S. An overview of gradient descent optimization algorithms. arXiv preprint arXiv:1609.04747. 2016.
- Deisenroth MP, Faisal AA, Ong CS. Mathematics for Machine Learning. Cambridge, UK: Cambridge University Press; 2020.
- Nielsen MA. Neural Networks and Deep Learning [Internet]. Determination Press; 2015. Available from: http://neuralnetworksanddeeplearning.com/
ご利用規約(免責事項)
当サイト(以下「本サイト」といいます)をご利用になる前に、本ご利用規約(以下「本規約」といいます)をよくお読みください。本サイトを利用された時点で、利用者は本規約の全ての条項に同意したものとみなします。
第1条(目的と情報の性質)
- 本サイトは、医療分野におけるAI技術に関する一般的な情報提供および技術的な学習機会の提供を唯一の目的とします。
- 本サイトで提供されるすべてのコンテンツ(文章、図表、コード、データセットの紹介等を含みますが、これらに限定されません)は、一般的な学習参考用であり、いかなる場合も医学的な助言、診断、治療、またはこれらに準ずる行為(以下「医行為等」といいます)を提供するものではありません。
- 本サイトのコンテンツは、特定の製品、技術、または治療法の有効性、安全性を保証、推奨、または広告・販売促進するものではありません。紹介する技術には研究開発段階のものが含まれており、その臨床応用には、さらなる研究と国内外の規制当局による正式な承認が別途必要です。
- 本サイトは、情報提供を目的としたものであり、特定の治療法を推奨するものではありません。健康に関するご懸念やご相談は、必ず専門の医療機関にご相談ください。
第2条(法令等の遵守)
利用者は、本サイトの利用にあたり、医師法、医薬品、医療機器等の品質、有効性及び安全性の確保等に関する法律(薬機法)、個人情報の保護に関する法律、医療法、医療広告ガイドライン、その他関連する国内外の全ての法令、条例、規則、および各省庁・学会等が定める最新のガイドライン等を、自らの責任において遵守するものとします。これらの適用判断についても、利用者が自ら関係各所に確認するものとし、本サイトは一切の責任を負いません。
第3条(医療行為における責任)
- 本サイトで紹介するAI技術・手法は、あくまで研究段階の技術的解説であり、実際の臨床現場での診断・治療を代替、補助、または推奨するものでは一切ありません。
- 医行為等に関する最終的な判断、決定、およびそれに伴う一切の責任は、必ず法律上その資格を認められた医療専門家(医師、歯科医師等)が負うものとします。AIによる出力を、資格を有する専門家による独立した検証および判断を経ずに利用することを固く禁じます。
- 本サイトの情報に基づくいかなる行為によって利用者または第三者に損害が生じた場合も、本サイト運営者は一切の責任を負いません。実際の臨床判断に際しては、必ず担当の医療専門家にご相談ください。本サイトの利用によって、利用者と本サイト運営者の間に、医師と患者の関係、またはその他いかなる専門的な関係も成立するものではありません。
第4条(情報の正確性・完全性・有用性)
- 本サイトは、掲載する情報(数値、事例、ソースコード、ライブラリのバージョン等)の正確性、完全性、網羅性、有用性、特定目的への適合性、その他一切の事項について、何ら保証するものではありません。
- 掲載情報は執筆時点のものであり、予告なく変更または削除されることがあります。また、技術の進展、ライブラリの更新等により、情報は古くなる可能性があります。利用者は、必ず自身で公式ドキュメント等の最新情報を確認し、自らの責任で情報を利用するものとします。
第5条(AI生成コンテンツに関する注意事項)
本サイトのコンテンツには、AIによる提案を基に作成された部分が含まれる場合がありますが、公開にあたっては人間による監修・編集を経ています。利用者が生成AI等を用いる際は、ハルシネーション(事実に基づかない情報の生成)やバイアスのリスクが内在することを十分に理解し、その出力を鵜呑みにすることなく、必ず専門家による検証を行うものとします。
第6条(知的財産権)
- 本サイトを構成するすべてのコンテンツに関する著作権、商標権、その他一切の知的財産権は、本サイト運営者または正当な権利を有する第三者に帰属します。
- 本サイトのコンテンツを引用、転載、複製、改変、その他の二次利用を行う場合は、著作権法その他関連法規を遵守し、必ず出典を明記するとともに、権利者の許諾を得るなど、適切な手続きを自らの責任で行うものとします。
第7条(プライバシー・倫理)
本サイトで紹介または言及されるデータセット等を利用する場合、利用者は当該データセットに付随するライセンス条件および研究倫理指針を厳格に遵守し、個人情報の匿名化や同意取得の確認など、適用される法規制に基づき必要とされるすべての措置を、自らの責任において講じるものとします。
第8条(利用環境)
本サイトで紹介するソースコードやライブラリは、執筆時点で特定のバージョンおよび実行環境(OS、ハードウェア、依存パッケージ等)を前提としています。利用者の環境における動作を保証するものではなく、互換性の問題等に起因するいかなる不利益・損害についても、本サイト運営者は責任を負いません。
第9条(免責事項)
- 本サイト運営者は、利用者が本サイトを利用したこと、または利用できなかったことによって生じる一切の損害(直接損害、間接損害、付随的損害、特別損害、懲罰的損害、逸失利益、データの消失、プログラムの毀損等を含みますが、これらに限定されません)について、その原因の如何を問わず、一切の法的責任を負わないものとします。
- 本サイトの利用は、学習および研究目的に限定されるものとし、それ以外の目的での利用はご遠慮ください。
- 本サイトの利用に関連して、利用者と第三者との間で紛争が生じた場合、利用者は自らの費用と責任においてこれを解決するものとし、本サイト運営者に一切の迷惑または損害を与えないものとします。
- 本サイト運営者は、いつでも予告なく本サイトの運営を中断、中止、または内容を変更できるものとし、これによって利用者に生じたいかなる損害についても責任を負いません。
第10条(規約の変更)
本サイト運営者は、必要と判断した場合、利用者の承諾を得ることなく、いつでも本規約を変更することができます。変更後の規約は、本サイト上に掲載された時点で効力を生じるものとし、利用者は変更後の規約に拘束されるものとします。
第11条(準拠法および合意管轄)
本規約の解釈にあたっては、日本法を準拠法とします。本サイトの利用および本規約に関連して生じる一切の紛争については、東京地方裁判所を第一審の専属的合意管轄裁判所とします。
For J³, may joy follow you.

