はじめに
こんにちは、ひよこです。前回まで、行列や確率の基盤を解説してきましたが、微分積分も深層学習や LLM (Large Language Model) に不可欠な要素です。
特に、モデルパラメータを更新して損失を最小化する「最適化」には、関数の偏微分(勾配計算)が欠かせません。多変数関数の勾配を用いる勾配降下法や、学習率スケジューリング、モーメント考慮など、さまざまな手法が提案されており、これらは全て微分積分的な発想から成り立っています。
また、LLM 内部で確率分布を扱う際には積分が必要であり、期待値やエントロピー、KL ダイバージェンスなどの計量にも密接に関わります。
本記事では、常微分・偏微分の基本をさらいつつ、微分積分が最適化アルゴリズム(オプティマイザ)でどのように使われるかを強調します。さらに、PyTorch でのオプティマイザ使用例を示し、実用的な視点から微分積分知識がどのように応用されているかをお伝えします。
常微分と偏微分の違い
1 変数関数 $f(x)$ の微分 $f'(x)$ は、その点での変化率を示します。たとえば $f(x)=x^2$ なら $f'(x)=2x$ です。これは 常微分 と呼ばれ、変数が 1 つの場合に適用します。
一方、深層学習モデルはパラメータが数十万~数億の次元に渡ります。多変数関数 $f(\theta_1,\theta_2,\dots,\theta_n)$ の場合は、どの変数についての変化率かを明示する必要があります。これが 偏微分 で、
\frac{\partial f}{\partial \theta_i}
で表します。これらを全パラメータ成分について並べたベクトルが勾配 $\nabla_\theta f$ です。
オプティマイザは偏微分計算機
深層学習におけるモデル学習は、損失関数 $L(\theta)$ を最小化する過程であり、パラメータ $\theta$ に対する勾配(偏微分)を用いてパラメータ更新を反復します。基本的な勾配降下法では、勾配をそのまま用いて更新します。
\theta \leftarrow \theta - \eta \nabla_\theta L(\theta)
ここで $\eta$ は学習率で、$\nabla_\theta L(\theta)$ はパラメータ $\theta$ に関する損失関数の偏微分ベクトルです。この簡素な更新則により、損失が減る方向へパラメータを前進させます。
より発展的な最適化手法
現代の深層学習では、勾配降下法を拡張した多数のオプティマイザが実用されています。これらは、勾配(微分積分の応用)を洗練して扱うことで、学習を安定・高速化します。
Momentum
勾配に「慣性」の概念を取り入れ、過去の勾配傾向を参考にして更新方向をスムーズにします。
v \leftarrow \beta v + (1-\beta)\nabla_\theta L(\theta)
\quad \Rightarrow \quad
\theta \leftarrow \theta - \eta v
ここで $v$ は勾配の指数移動平均、$\beta$ はモーメント係数(典型的には 0.9 程度)です。これにより、局所的な浅い谷底に囚われにくくなります。
Adam
勾配の 1 次モーメント(平均)と 2 次モーメント(分散)を同時に追跡し、パラメータごとに自動調整された学習率を付与する手法です。
m \leftarrow \beta_1 m + (1-\beta_1)\nabla_\theta L(\theta)
\quad , \quad
v \leftarrow \beta_2 v + (1-\beta_2)(\nabla_\theta L(\theta))^2
バイアス補正後、
\hat{m} = \frac{m}{1-\beta_1^t}
\quad , \quad
\hat{v} = \frac{v}{1-\beta_2^t}
を用いてパラメータ更新は
\theta \leftarrow \theta - \eta \frac{\hat{m}}{\sqrt{\hat{v}}+\epsilon}
で行われます。$\beta_1,\beta_2,\epsilon$ はハイパーパラメータで、Adam は多くのタスクで標準的な手法となっています。
AdamW
Adam では L2 正則化を学習率スケジュールと分離できていない問題が指摘されました。AdamW では、ウェイト減衰 (weight decay) を別項として明示的に扱い、理論的な妥当性を強化しています。
例えば、パラメータ更新は
\theta \leftarrow \theta - \eta \frac{\hat{m}}{\sqrt{\hat{v}}+\epsilon} - \eta \lambda \theta
のように、最後にウェイト減衰項 $\eta \lambda \theta$($\lambda$ は減衰率)を加えることで、汚染なく正則化を行います。
AdamW は LLM の学習にも多用され、性能と安定性が認められています。
近年の改良版・代替手法
AdamW を基盤として、さらなる高速化・メモリ効率化・堅牢性向上を目指した最適化手法が登場しています。これらも結局のところ、勾配(微分)情報をどう活用するかが本質であり、微分積分学的理解が非常に重要です。
-
AdEMAMix:
AdamW の改良版で、約 95% のトレーニング速度向上が報告されています。
学習則は AdamW に準じますが、勾配履歴の取り扱いや更新戦略を工夫することで計算効率を高めています。\theta \leftarrow \theta - \eta \frac{\hat{m}_{\text{AdEMAMix}}}{\sqrt{\hat{v}_{\text{AdEMAMix}}}+\epsilon}
(ここで $\hat{m}{\text{AdEMAMix}}, \hat{v}{\text{AdEMAMix}}$ は AdEMAMix 独自の更新規則で求めるモーメント)
-
Lion オプティマイザー:
AdamW と同等の性能およびハイパーパラメータ設定の頑健性を維持しつつ、メモリ要件を大幅削減します。
独自の更新則でパラメータをアップデートし、\theta \leftarrow \theta - \eta \mathcal{G}(\nabla_\theta L(\theta))
といった形で、計算コストやメモリ使用量が抑えられるよう設計されています。
-
Adafactor:
モメンタムを考慮しつつ、AdamW 同等の性能をメモリ削減しながら実現します。巨大な LLM を扱う際にメモリがボトルネックとなる問題を軽減するため、2 次モーメントを近似的・構造的に格納し、メモリ使用量を削減します。 -
Signum オプティマイザー:
モメンタムを持たせたサイン付き SGD 的な更新で、AdamW に匹敵する性能を発揮します。
勾配の符号情報とモメンタム情報に基づき、\theta \leftarrow \theta - \eta \operatorname{sign}(m)
といった更新則($m$ はモメンタム付与後の勾配平均)を用いて効率的な探索を実現します。
-
APOLLO オプティマイザー:
学習率更新ルールを構造的に組み込み、メモリ消費を抑えつつ AdamW と同等の性能を目指します。
APOLLO-Mini と呼ばれるランク1バリアントでは、SGD 並みのメモリコストで AdamW を凌駕する事前トレーニング性能を示しており、\theta \leftarrow \theta - \eta \frac{\hat{m}_{\text{APOLLO}}}{\sqrt{\hat{v}_{\text{APOLLO}}}+\epsilon}
のような形で、低ランク近似によるモーメント管理が行われます。
オプティマイザまとめ
これらのオプティマイザ全てに共通する基盤は、損失関数の偏微分による勾配計算です。微分積分学を背景知識として持つことで、勾配の扱い方・モーメント(平均・分散)の考え方・正則化や学習率調整の意味を正しく理解できます。
なぜ新たなオプティマイザがメモリ効率や学習速度を向上できるのか、その理論的理由や設計哲学も、微分積分学の観点を踏まえるとより明瞭になります。
最終的に、これら洗練された最適化手法はすべて「偏微分計算機」としてのオプティマイザの本質を磨き上げた成果であり、微分積分の基礎があってこそ可能な進歩なのです。
ヘッセ行列とニュートン法 (補足)
勾配のみならず、2 次偏微分で構成されるヘッセ行列を用いるニュートン法は理論的には高速な収束をもたらします。
ただし、実用にはヘッセ行列の逆行列や近似計算が必要となり、大規模モデルには不向きな場合が多いです。
それでも、分布近似(Laplace 近似)や自然勾配法(Fisher 情報行列との関係)など、理論的考察では 2 次情報が活躍します。
🐣 勾配は 1 変数だけで微分するのでベクトルですが 2 次微分は 2 変数 $x_i$, $x_j$ が関係するのでぜんたいが行列になります
フレームワークでの実用例 (PyTorch)
以下は、初心者向けブログ用にかみ砕いた解説と、それぞれの例に対応するコード例を示します。
ディープラーニング(PyTorch)の微分例と、確率モデル(LLMなど)での積分近似例の両方に実際のコードを付けています。
ディープラーニングでの自動微分(PyTorchの例)
深層学習モデルの学習では、パラメータ更新に偏微分が必要ですが、PyTorch が自動で勾配を計算してくれます。下記のコードは、単純な線形モデルを例に、損失関数に対するパラメータの勾配を自動計算し、最適化する一連の流れを示します。
import torch
import torch.nn as nn
import torch.optim as optim
# 単純なモデル:1層の線形変換(入力10次元→出力1次元)
model = nn.Linear(10, 1)
# 最適化手法 (Adam)
optimizer = optim.Adam(model.parameters(), lr=0.01)
# ダミーデータ:入力 x (バッチサイズ32, 入力次元10), ターゲット y (32,1)
x = torch.randn(32, 10)
y = torch.randn(32, 1)
# 順伝播(Forward)
pred = model(x) # 予測値 = xW + b
loss_fn = nn.MSELoss() # 損失関数(平均二乗誤差)
loss = loss_fn(pred, y)
# 逆伝播(Backward)
optimizer.zero_grad() # 勾配初期化
loss.backward() # 偏微分の自動計算(ここで勾配がmodelパラメータに格納される)
optimizer.step() # パラメータの更新(勾配情報を使ってWやbを更新)
loss.backward()
が微分計算の核心です。これだけで計算グラフ上を逆方向に辿り、モデルパラメータに対する勾配が求まります。
「計算グラフ」「自動微分」などは内部で隠蔽されているため、ユーザは微分式を手で書く必要がありません。
確率モデルと積分(LLMでの応用例)
LLM の訓練や評価、確率分布の扱いでは、分布の正規化や期待値・KLダイバージェンスなど、積分が必要な場面があります。しかし、多次元かつ複雑な場合、解析的な積分は非常に難しいことが多いです。そこで、サンプリングによる「モンテカルロ近似」がよく使われます。
以下は、1次元の標準正規分布 $p(x)$ からサンプルを取り、ある関数 $f(x)=x^2$ の期待値
E_{p(x)}[f(x)] = \int_{-\infty}^{\infty} x^2 p(x) dx
をモンテカルロ近似する例です。理論的には $E[x^2]=1$(分散1の正規分布)のはずなので、多くのサンプルを取ると結果が1に近づきます。
import torch
from torch.distributions import Normal
# 標準正規分布 p(x) = N(0,1)
dist = Normal(0, 1)
# 期待値を求めたい関数 f(x) = x^2
def f(x):
return x**2
# サンプル数
num_samples = 100000
# p(x) からサンプリング(num_samples個)
samples = dist.sample((num_samples,))
# f(x) の期待値をモンテカルロ近似
# E[f(x)] ≈ (1/N) Σ f(x_i)
f_values = f(samples)
expectation_approx = f_values.mean().item()
print("近似された期待値 E[f(x)] ≈", expectation_approx)
# 理論値は E[x^2] = 1, サンプル数を増やせば 1 に近づくはず
サンプルを増やすほど、結果は1に近づきます。この手法は、LLMが扱うような高次元かつ複雑な分布でも基本原理は同じで、実践ではより洗練されたサンプリングや近似手法が利用されます。
- ディープラーニングの微分:PyTorchの自動微分により、手書きの偏微分式は不要です。
- LLMと積分:確率分布の扱いには積分が必要で、解析的に難しい場合はサンプリング(モンテカルロ近似)で期待値やKLダイバージェンスなどを求めます。
おわりに
微分積分は、勾配降下法や Adam などのオプティマイザの根底にあり、LLM を含む深層学習モデルの学習で必須の概念です。偏微分計算によってパラメータ更新が実現し、損失最小化が進むこと、さらに分布や評価指標の計算で積分が必要となることから、微分積分の基礎がモデルの開発・解釈に大いに役立ちます。
これまで扱ってきた行列、確率、そして微分積分は、LLM 理論や実装を理解するための強力な基盤です。これらを踏まえて、より高度なトピックに進んでいくと、モデルの中身や改善点がよりクリアに見えてくるでしょう。