はじめに
こんにちは、ひよこです。前回までは行列や分布といった数学的・統計的基盤についてお話ししてきました。今回は、それらの背景として根幹を成す確率をテーマに取り上げます。
LLM (Large Language Model) を含む深層学習モデルは、本質的に不確定なデータから学習し、その出力も確率的性質を持ちます。モデルが単語を予測したり、新たな入力に応じた回答を生成したりする際、その背後には「確率に基づく意思決定」が存在します。
本記事では、確率の基本概念から LLM における確率的視点、そして機械学習ライブラリを用いた簡単なサンプルコードまで、できるだけやさしくまとめてみたいと思います。
🐣 確立の間違いだけには気をつけないと
確率の基礎
確率変数と事象
コイン投げやサイコロ振り、データセットからのサンプリングなど、「結果が不確定」な状況を表すために確率変数を導入します。確率変数は、結果が定まると特定の実数値を取る量です。コイン投げなら「表=1、裏=0」のように割り当てられます。このとき「表が出る」「裏が出る」といった出来事を事象と呼び、それぞれに確率が割り当てられます。
確率空間
確率を厳密に扱うには、すべての可能な結果の集合 (標本空間) と、その部分集合 (事象) および確率測度で構成される $(\Omega, \mathcal{F}, P)$ を考えます。これを確率空間と呼びます。直感的には、$\Omega$ が「全結果集合」、$\mathcal{F}$ が「事象の集合族」、$P$ が「各事象への確率割当」を表します。
和事象と積事象
2 つの事象 $A$, $B$ に対して、$A \cup B$ は「$A$ または $B$ が起きる事象」、$A \cap B$ は「$A$ かつ $B$ が起きる事象」です。これらには次の基本関係式が成立します。
P(A \cup B) = P(A) + P(B) - P(A \cap B)
条件付き確率と独立性
ある事象 $B$ が起きたときに $A$ が起きる確率は条件付き確率 $P(A|B)$ で表されます。
P(A|B) = \frac{P(A \cap B)}{P(B)}
事象 $A$ と $B$ が独立であるとは、片方の発生がもう片方の確率に影響を与えないことを指します。独立なら以下が成立します。
P(A \cap B) = P(A)P(B)
🐣 独立性は直感的でない場合もありますので注意ですね
🐣note:独立性が直感に反する例
例えば、$A$: サイコロが偶数、$B$: サイコロが 5 または 6 の目が出るとします。一見、6 は偶数なので独立でないように思えますが、計算すると $P(A \cap B) = P(A)P(B)$ が成立し、実は独立です。このように直感と独立性は食い違うことがある点に注意して下さい。
過去情報と条件付き確率
LLM はトークン列 $(w_1, w_2, \dots, w_n)$ に基づき、次のトークン $w_{n+1}$ の確率を条件付きで扱います。これは複雑な条件付き確率の典型例です。
- 単純な場合: $P(x_{n+1})$
- マルコフ性を仮定した場合: $P(x_{n+1} \mid x_n)$
- 過去 2 ステップ考慮: $P(x_{n+1} \mid x_n, x_{n-1})$
- 全履歴考慮: $P(x_{n+1} \mid x_n, x_{n-1}, \dots, x_1)$
計算コストやモデルの複雑性とのトレードオフで、どこまで過去を条件とするか選択します。
🐣 マルコフ性があると計算が楽です
ベイズの定理
観測データから事後確率を更新するベイズの定理は機械学習で頻繁に登場します。
P(A|B) = \frac{P(B|A)P(A)}{P(B)}
LLM がテキストから文脈を読み取り、次に出てくるであろう単語を「推測」する過程は、このような条件付き確率評価の繰り返しに似ています。
確率分布との関係
前回の記事で扱った分布は、確率変数が従うルールを明示したものです。確率分布は、確率密度関数(連続型)や確率質量関数(離散型)で表され、期待値や分散などの統計量を計算できます。
LLM は巨大な確率分布を内部に保持し、次の単語をサンプリングする際にこの分布を利用します。
期待値と分散
確率変数 $X$ の期待値は「平均的な値」、分散は「散らばり度」を表します。
離散型の場合:
E[X] = \sum_x x P(X=x), \quad Var(X)=E[(X-E[X])^2]
期待値や分散は、LLM の学習や勾配計算時の確率的挙動理解に役立ちます。
極限定理と大数の法則
多くのデータを用いる LLM では、サンプル数が増えるほど統計量が安定します。
- 大数の法則: 標本平均は母平均に収束
- 中心極限定理: 独立同分布な確率変数の和は、サンプル数を増やすと正規分布に近づく
これらは、大規模データで学習する LLM の安定性や汎用性を裏付ける基本原理です。
エルゴード性
少しマニアックですが、確率過程においてエルゴード性は「時間平均とアンサンブル平均が一致する性質」を意味します。
通常のサイコロなら、無限回振る平均と無限に多くのサイコロを同時に振った平均は一致し、これはエルゴード性を持つ典型例です。
エルゴード性は理論的な解析や難解な証明で登場することがあり、論文内で出てきたら「お、来たな」と密かに笑顔になれるトピックです。
🐣 拡散モデルや確率的プロセスの論文で見かけることがあります
LLM と確率
LLM は以下のような因子分解によってテキスト列の確率をモデル化します。
P(w_1, w_2, \dots, w_n) = \prod_{k=1}^{n} P(w_k \mid w_1,\dots,w_{k-1})
LLM が次の単語を生成するときは $P(w_{n+1}|w_1,\dots,w_n)$ に基づいて確率的にサンプリングするわけです。つまり、LLM は巨大な確率モデルそのものと言えます。
PyTorch / scikit-learn を用いた確率関連サンプル
1. PyTorch による確率分布からのサンプリング
import torch
# Bernoulli 分布 (p=0.3) からのサンプル
dist = torch.distributions.Bernoulli(probs=0.3)
samples = dist.sample((1000,))
# 約 30% が 1, 残りが 0 の結果が得られるはず
2. PyTorch のログ確率計算
import torch
# 標準正規分布からの対数確率密度評価
normal_dist = torch.distributions.Normal(loc=0.0, scale=1.0)
x = torch.tensor([0.0, 1.0, -1.0])
log_probs = normal_dist.log_prob(x)
# 各 x に対して log P(x) が得られる
3. scikit-learn によるガウシアン過程 (確率的モデル)
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF
import numpy as np
X = np.random.rand(50,1)*10
y = np.sin(X).ravel() + 0.1*np.random.randn(50)
gp = GaussianProcessRegressor(kernel=RBF(length_scale=1.0))
gp.fit(X, y)
X_test = np.linspace(0,10,100).reshape(-1,1)
y_mean, y_std = gp.predict(X_test, return_std=True)
# y_mean ± y_std で予測分布の広がりを表現
4. scikit-learn による確率的クラスタリング (GaussianMixture)
from sklearn.mixture import GaussianMixture
import numpy as np
X = np.vstack([np.random.randn(100,2), np.random.randn(100,2)+5])
gmm = GaussianMixture(n_components=2)
gmm.fit(X)
clusters = gmm.predict(X)
probabilities = gmm.predict_proba(X)
# 各サンプルがどのクラスタに属するか、その確率分布を与える
🐣 機械学習モデルは内部で確率を扱うことが多く、scikit-learn では様々な確率モデルを簡便に利用できます
おわりに
今回は、確率の基本的な概念、条件付き確率やベイズの定理といった重要事項、そして LLM への応用や Python ライブラリでの実用例を紹介しました。
行列・分布と理解を深めるにつれ、LLM が本質的に「不確実性」と対峙していることが見えてきます。確率論は、深層学習において初期化や正則化、サンプリング戦略など幅広い応用領域を持つ基礎理論です。
それでは、またお会いしましょう。