確率と統計 入門
LLM の訓練論文を読む前に必要な最低限の確率と統計。5 つの短いトピックで、 確率とは何か、分布と「合計が 1」という制約、条件付き確率、期待値 / 平均 / 分散、 そしてあらゆる言語モデルの裏で静かに動いている対数確率をカバーする。 高校レベルの代数を超える前提知識は不要。
確率(Probability)
0 から 1 のあいだの 1 つの数で、ある出来事がどれだけ起こりそうかを表す。
公平なコインを投げる。落ちる前は表か裏か分からない —— けれど、一つだけ確かに言えることがある: 2 つの結果は同じくらいに起こりそうだ。確率とは、 この感覚を 1 つの数に固定したもの。表は 0.5、裏も 0.5。 形式的には P(表) = 0.5 と書き、「表が出る確率は 2 分の 1」と読む。
この数は常に閉区間 [0, 1] に収まる。両端は誰もが知る 2 つの極端、 ただ正式な姿に着替えただけ:
P(事象) = 0—— 事象は起こり得ない。コインが立ったまま羽が生えて飛び去る。P(事象) = 1—— 事象は必ず起こる。明日も太陽が昇る(ほぼ)。P(事象) = 0.5—— 完全に中立、コイン投げ。P(事象) = 0.99—— ほぼ確実、けれどあと一歩。P(事象) = 0.001—— 起こりそうにないが、不可能ではない。
この数には等価な 2 つの読み方があり、どちらもよく使う:
- 長期的な頻度として。コインを 100 万回投げれば、 およそ 50 万回は表。確率とは、その比率がやがて収束する数。
- 信念の強さとして。1 回しか投げないとしても、事前なら 50/50 で賭ける。 確率とは、ある結果にどれだけコミットするかの度合い。
なぜ 1 つの数で済むのか?それを手に入れた途端、後続の問いがちょっとした算数で答えられる からだ。P(表でない) = 1 − P(表) = 0.5。独立な 2 回の投擲が両方とも表になる確率は 0.5 × 0.5 = 0.25。2 回のうち少なくとも 1 回は表になる確率は 1 − 0.25 = 0.75。「何が起こり得るか」の演算は、結局のところ [0, 1] の数の足し算・引き算・掛け算に帰着する。
確率はコインやサイコロだけのものではない。「不確実なもの」にはすべて確率があり、 誰も書き留めていないだけだ:
- 天気。「明日の降水確率 70%」=
P(雨) = 0.7。 - スパムフィルタ。各メールに数値が付き、閾値を超えるとスパム箱へ。
- 医療検査。陽性は病気を意味しない —— 確率を引き上げるだけ。
- スポーツ。「本命 1.4 倍」≈ ブックメーカーの含意確率
0.71程度。 - LLM。「The quick brown」の次のトークンが cat である確率を、モデルが計算する。
先に覚えておきたい記法。P(A) は事象 A の確率。P(A かつ B) ——P(A ∩ B) や P(A, B) とも書く —— は両方起こる確率。P(A または B) ——P(A ∪ B) とも書く —— は少なくとも一方が起こる確率。そして P(A でない)、P(¬A) または P(Aᶜ) は、定義上 1 − P(A) に等しい。
Transformer では:あらゆる LLM の最終層は、 「次のトークン候補」ごとに [0, 1] の数を 1 つ出す —— 語彙にあるサブワード 1 つにつき 1 個、合計で数万個になる。 次のトークンを生成するときは、モデルはその数たちに従って 1 つを選ぶ。 あなたのお気に入りのチャットボットが書いた言葉の一つ一つは、 いつもその区間の確率値として生まれている。 以降の 4 節では、これらの数をどう組み合わせ、どう足し、どう条件付け、 そしてどうデータから学ぶのかを順に見ていく。
確率分布(Probability Distribution)
各結果の確率を並べたリスト —— ただし合計は必ず 1。
コイン 1 枚なら確率は 2 つ:P(表) = 0.5 と P(裏) = 0.5。 6 面サイコロなら 6 つで、各目が 1/6 ≈ 0.167。 10 万語の語彙を持つ言語モデルなら 10 万個。 起こり得るすべての結果の確率をひとまとめにしたものが 確率分布 —— 「結果ごとに 1 つの数」を、まとめて一気に眺める形だ。
どんな分布も 2 つのルールに従う。両方とも丸暗記する価値がある:
- 各値は
[0, 1]に収まる —— どのエントリも妥当な確率。 - すべての値の合計はちょうど 1 —— 何かは必ず起こる。
「合計 1」のルールこそが核心。一見もっともらしいだけだが、なぜ成り立つかを思い出すと納得する: 起こり得る結果をすべて列挙すれば、確率 1(= 必ず)でそのうちの 1 つが実際に起こる。 確率を扱うときによく出てくる操作 —— スコアを確率に正規化する、確率をサブケースに分ける、 周辺確率を計算する —— の大半は「合計を 1 に揃える」ことに帰着する。
簡単な例。明日の天気は 4 つの排他的な結果を持つ:
P(晴れ) = 0.55 P(曇り) = 0.25 P(雨) = 0.15 P(雪) = 0.05 ───────────────── 合計 = 1.00 ✓
4 つの数、いずれも [0, 1] で、合計は 1。これが分布。 単一結果の確率も読めるし、複数をまとめても良い:P(降水) = P(雨) + P(雪) = 0.20。 まとめは単なる足し算 —— 4 つの結果は排他的(同じ日に雨かつ雪は出ない、というモデル)で、 可能性の空間をきれいに分割しているから。
分布には 2 種類の姿があちこちで登場する。ルールは同じ 2 つ、台帳の付け方が違うだけだ:
- 離散分布。結果が有限個(または可算個)。コイン、サイコロ、 語彙の中のトークン、カテゴリラベル。分布はただの数のリストで、「合計」は普通の和。
- 連続分布。結果が連続値 —— 身長(cm)、気温、時刻 —— をとる。 リストではなく密度曲線
p(x)を扱う。 確率はその曲線の下の面積に対応し、「合計 1」は「総面積 1」に変わる。 直感は同じ、表記が微積分の風味になるだけ。
最も有名な連続分布は 正規分布(ガウス分布)—— テスト点数のグラフでよく見る あのベル型曲線だ。記述に必要な数はたった 2 つ:山の位置(μ、平均)と ベルの幅(σ、標準偏差)。大人の身長、測定誤差、 ニューラルネットワークの重み初期化に加える雑音は、どれもおおむね正規分布に従う。
離散側で LLM の主役は カテゴリカル分布(categorical distribution)。 上の天気の表とまったく同じ構造で、ただ幅がぐっと広いだけ。 言語モデルが次のトークンを選ぶたびに、語彙全体上のカテゴリカル分布からサンプリングしている。
では分布はどう手に入れるのか。よく使う 2 つの方法、いずれも見慣れたものだ:
- カウントから。サイコロを 6000 回振って、そのうち 1003 回が 4 だったなら、 経験的推定は
P(4) ≈ 1003/6000 ≈ 0.167。 すべてのカウントを総数で割れば、自然に合計 1 の確率になる。 - スコアから softmax で。1 本の式 ——
softmax(zᵢ) = exp(zᵢ) / Σⱼ exp(zⱼ)—— 任意の実数列をきちんとした分布に変換する。LLM すべてがこの処理を使うので、 中身を分解してみる価値がある。
softmax がしていること。入力は実数スコアの列 (z₁, z₂, …, z_n) —— 正でも負でも何でもよい。 出力は同じ長さの列で、各値は [0, 1]、合計はぴったり 1。 常に妥当な確率分布になる。
なぜ必要か。ニューラルネットの最終層は加重和に過ぎず、−5.2 でも 17.8 でも何でも出してくる。 これを確率として使うには(a)すべて非負にし、(b)合計を 1 にする必要がある。 もっと単純に「最小値が 0 になるよう平行移動して、合計で割る」でも良さそうに思える。 だが平行移動は情報を捨てる —— −2 と −10 はどちらも 「小さな正の数」に変わってしまうが、もとは確信度の強さが大きく違う。 さらに、スコアが偶然打ち消し合えば合計が 0 になり、ゼロ除算に陥る。 softmax はまず指数を取ることで、この両方の罠を回避する。
レシピは 3 行。logit (z₁, z₂, …, z_n) に対して:
- 各要素を指数化:
exp(zᵢ)。任意の実数の指数は正。 - 合計を取る:
S = Σⱼ exp(zⱼ)。 - 合計で割る:
softmax(zᵢ) = exp(zᵢ) / S。
具体例。プロンプト「The quick brown」のあと、 LLM は 3 つの続き候補にスコアを付ける:
fox dog hen
logit 4.50 3.20 0.80
exp 90.02 24.53 2.23
──────────────────────────────────────
sum = 116.78
softmax 0.77 0.21 0.02 ✓ 合計 = 1.00指数が何をしたか観察しよう。logit 上では fox と dog の差はわずか 1.3 だが、softmax のあと fox は dog の 約 3.7 倍あり得ることになる。dog と hen の差は logit で 2.4、確率では 10 倍。指数は差を増幅する —— logit のわずかな優位が、 softmax のあとには明確な確率差になる。 これが設計上の意図だ —— あいまいな相対順位を、モデルがサンプリングできる鋭い確率地形に変える。
Transformer では:LLM の最終層は、語彙のトークン 1 つにつき 実数スコアを 1 つ出す —— これを logit と呼ぶ。 softmax をかけると 1 行で、その logit ベクトル全体(数万個の数)が 語彙上のカテゴリカル分布になる。 この分布から次のトークンがサンプリングされる。 あなたが読んだ各チャット応答は、何千個ものこの分布から 1 トークンずつ引いた結果だ。
条件付き確率(Conditional Probability)
B が起こっているという前提のもとでの、A の確率。
地球上の成人を 1 人ランダムに選ぶ。スマートフォンを持つ確率は P(スマホ) ≈ 0.7 ぐらい。さて、視点をぐっと絞る:東京に住む成人を 1 人ランダムに選ぶと、その確率はおそらく 0.95 まで跳ね上がる。 同じ問いでも、出発集団が違えば答えが変わる。この第 2 の数こそが条件付き確率で、P(スマホ | 東京住み) と書き、 「東京に住んでいるという条件のもとでスマホを持つ確率」と読む。
この縦棒 | がこの記法のすべてだ。読むときは「〜の条件のもとで」と読む: 棒の右側は既に成り立っていると分かっていること、左側はその前提のもとで問いたいこと。P(A | B) は「B のもとでの A の確率」。
定義は機械的に 1 行で書ける:
P(A | B) = P(A かつ B) / P(B)
抽象的に見えるが、絵にすれば具体だ。B が真である断面だけを残し、その中で同時に A も真である 割合を問う —— その割合が P(A | B)。 分母 P(B) はその断面を再び合計 1 の分布に正規化する役目で、 分子 P(A かつ B) が両者の重なり部分。
具体例。成人 1000 人のうち:
· スマホ持ち、東京住み = 19 ← A かつ B · スマホ持ち、東京住みでない = 681 · スマホなし、東京住み = 1 · スマホなし、東京住みでない = 299 ──────────────────────────────── 合計 = 1000 P(スマホ) = 700 / 1000 = 0.70 P(東京住み) = 20 / 1000 = 0.02 ← P(B) P(スマホ かつ 東京) = 19 / 1000 = 0.019 ← P(A かつ B) P(スマホ | 東京) = 0.019 / 0.02 = 0.95
何が起きたか観察しよう。全体での P(スマホ) は 0.7。 ところが東京住みの 20 人だけに絞ると、そのうち 19 人がスマホを持っているので、 条件付き確率は 0.95 になる。条件付けはズームイン操作だ: B が偽の行を捨て、残った部分を再正規化する。
2 つの事象が 独立とは、条件付けても答えが変わらないこと —— つまりP(A | B) = P(A)。B が起こったと知ることが A について何も教えてくれない。 2 回のコイントスは独立で、1 回目が表でも裏でも 2 回目は 50/50。 そうでなければ 従属 関係:B を知ると A についての確信が動く。 実世界の興味ある事象ペアはほぼすべて従属的 —— だからこそ条件付き確率が モデルの引くレバーになる。
定義を並べ替えると、ML 論文で頻出する 連鎖律が得られる:
P(A かつ B) = P(A | B) · P(B) = P(B | A) · P(A)
A と B の同時確率を計算する 2 つの経路で、扱いやすい条件を選んで使い分けられる。 右辺どうしを等号で結び、両辺を P(B) で割ると、ベイズの定理:P(A | B) = P(B | A) · P(A) / P(B) —— 条件の向きを反転する公式が現れる。検査問題、スパム判定、 ベイズ推論という分野全体は、この並べ替え 1 つに支えられている。
典型的な落とし穴:P(A | B) と P(B | A) は同じ数ではない。P(雨 | 歩道が濡れている) は高い —— 濡れた歩道のほとんどは雨のせい。P(歩道が濡れている | 雨) も高い(1 でもよい)。 次に P(病気 | 陽性) と P(陽性 | 病気) を比べてみる: 感度 99%(P(陽性 | 病気) = 0.99)の検査でも、病気がまれなら陽性のほとんどが 偽陽性になる。同じ数字でも条件の向きを変えると、結論はまったく変わる。 ベイズの定理は、その両者をつなぎ直す橋だ。
Transformer では:LLM が出すあらゆる確率は条件付き確率だ。 「フランスの首都は」の続きを尋ねたとき、モデルはP(次のトークン | これまでのトークン列) を計算している —— その縦棒をよく見ること。プロンプト全体が縦棒の右に、予測対象が左に来る。 LLM の訓練とは、巨大なテキストコーパスからこの巨大な条件付き分布を推定すること: コーパスのあらゆる断片に対して「ここまで見たうえで、次は何?」とモデルに問う。 生成は同じ手続きを前向きに 1 つずつ繰り返すこと。チャットボットが書く 1 通の応答は、 上の連鎖律で次々と繋ぎ合わされた条件付き確率の鎖そのものだ。
期待値、平均、分散
分布全体を 2 つの数に圧縮 —— どこにいるか、どれだけ広がっているか。
分布のエントリは数十、数千、ときに無限大 —— 目視ではとても捉えきれない。 だから 2 つの要約数値に圧縮する。避けて通れないのは平均(分布が平均してどこにあるか)と分散(その平均のまわりにどれだけ広がっているか)。
4 種類の賞金を払い出すルーレットを想像してほしい。確率は以下:
賞金 $0 $10 $50 $1000 P 0.70 0.20 0.09 0.01
1 回回したとき「期待」される賞金は?もちろん 1 回ではこの値は出ない —— 4 つのどれかが出る。 だが 100 万回回して賞金を平均すれば、長期の平均は期待値(期待値あるいはそのまま 平均)E[X] に収束する。式は「結果と確率の積の総和」:
E[X] = Σ xᵢ · P(xᵢ)
このルーレットなら:
E[X] = 0·0.70 + 10·0.20 + 50·0.09 + 1000·0.01
= 0 + 2 + 4.5 + 10
= 16.51 回あたりの賞金は平均 $16.50 —— ぴったり $16.50 を出す回は一度もないが。 平均は加重平均だ:各結果が、その発生頻度で重み付けされる。 ほとんど出ない結果($1000 ジャックポット)は自分の小さな分だけ寄与し、 頻繁な結果($0)が全体を引っ張る。
1 つの概念に 3 つの呼び方。平均、アベレージ、期待値 はほぼ同義に使われるが、微妙な使い分けは把握しておきたい:
- 数列の平均 —— 算術平均。全部足して個数で割る。
mean([2, 4, 9]) = 5。 - 分布の期待値 —— その分布から永遠にサンプリングしたら、 算術平均が収束する先。同じ発想を確率の眼鏡で見たもの。
- 標本平均 —— 実際に観測したサンプルから、背後の期待値を推定した経験値。 サンプルが増えるほど真の期待値に近づく。
平均は分布がどこにいるかを教えてくれる。だがどれだけ広がっているかは教えない。 平均 0 の収益分布を 2 つ思い浮かべる:毎日きっちり 0 を払う預金口座と、 50/50 で +100 か −100 を出すルーレット。平均は同じ、体験はまったく違う。 広がりを捉える 2 つ目の数値が必要だ。
それが 分散 Var(X)。 アイデア:各結果が平均からどれだけ離れているかを測り(偏差)、 それを 2 乗し(符号をなくし、大きい偏差をより重く効かせる)、 最後にその 2 乗偏差の期待値を取る:
Var(X) = E[(X − μ)²]
ここで μ(ギリシャ文字「ミュー」)は E[X] の略記 —— 統計では平均を μ で書く慣習だ。ルーレット(μ = 16.5)なら:
Var(X) = (0 − 16.5)²·0.70
+ (10 − 16.5)²·0.20
+ (50 − 16.5)²·0.09
+ (1000 − 16.5)²·0.01
= 190.575 + 8.45 + 101.0025 + 9672.7225
≈ 9972.75大きな分散で、稀な $1000 がほぼすべてを支配している。 分散はちょっと扱いにくい性質を持つ:単位が2 乗(ここではドルの 2 乗)になるから、 普通はその平方根 —— 標準偏差 σ = √Var(X) —— を報告する。このルーレットなら σ ≈ $99.86。 平均と同じ単位なので「典型的な賞金は $16.50 ± $99.86」のように比較が意味を持つ。
いたるところに現れる 3 つの便利な事実:
- 期待値の線型性。
E[X + Y] = E[X] + E[Y]は常に成立。 X と Y がどれだけ絡み合っていても関係ない —— 独立性は不要。 入門確率の中でも特に強力な恒等式。 - 分散と定数。
Var(aX) = a² · Var(X)—— 分散は 2 乗で伸びる。 賞金を 2 倍にすれば分散は 4 倍。 - 独立な和の分散。X と Y が独立なら
Var(X + Y) = Var(X) + Var(Y)—— 分散は足し算で結合する。 多数の独立な測定を平均するとノイズが縮むのはこのため:Var(n 個の平均) = σ² / nなのでσは1/√nで縮む。
Transformer では:あらゆる LLM の訓練に使う損失関数(交差エントロピー)は、 本質的に期待値だ。トークンごとの損失を訓練コーパス全体で平均し、勾配降下がその平均を最小化する。 分散はさらに 2 回登場する:LayerNorm は各トークン・ベクトルを平均 0・分散 1 に 揃え、活性化を安定に保つ。そして勾配降下が各ミニバッチで観測する勾配ノイズそのものに分散があり —— だからバッチを大きくすると訓練曲線は滑らかになる (より多くのサンプルを平均するとノイズが √n で縮む)。 現代 ML の中核的な 3 つのトリック ——「平均損失の最小化」「活性化の正規化」「勾配のバッチ化」 —— はすべて平均と分散の応用である。
対数確率(Log Probability)
確率は小さくてしかも掛け算。対数は手頃な大きさで足し算で済む。
実用上、確率には問題がある:とても速く小さくなる。 ある特定の文が現れる確率はおよそ 10⁻³⁰。 100 語の段落なら?10⁻³⁰⁰。これらは64 ビット浮動小数点に収まらないほど小さい —— double が表せる最小の正の数はおよそ 10⁻³⁰⁸ で、それ以下はすべて 0 に丸められる。 確率を次々と掛け合わせていけば、すぐにこの崖から落ちる。
解決策は 対数 を取ること。ある数の対数は「e(約 2.718)を何乗するとこの数になる?」 を答える —— log(0.5) ≈ −0.693、log(0.01) ≈ −4.605、log(10⁻³⁰⁰) ≈ −690.78。ごく小さな正の確率が、 ほどよく扱える負の数になり、保存も計算もしやすくなる。
対数の 3 つの性質が、確率と相性抜群にする。3 つともたった 1 つの規則 log(a · b) = log(a) + log(b) から従う:
- 掛け算が足し算になる。N 個の独立事象の同時確率は
p₁ · p₂ · … · pN—— このまま掛けるとアンダーフローする。 対数を取ればlog p₁ + log p₂ + … + log pN—— 項をいくら積み上げても破綻しない。 - 順序を保つ。log は単調増加 ——
p > q⇔log p > log q。だから「比較したい」「順位を付けたい」だけなら (どのトークンが最も尤もらしい?どのクラスのスコアが最大?)、log 同士を比べれば答えは同じ。 最大化したいものはそのまま log を最大化すればよい。 - 数値レンジが整う。確率は
[0, 1]に分布するが、 面白いことのほとんどは 0 のすぐそばに集中する ——0.001と0.0001は見た目は似ているが頻度では 10 倍違う。 log を取ると−6.91と−9.21になり、差がはっきり見える。 勾配ベースの最適化器が見る損失地形がずっと素直になる。
慣例:ML での既定は 自然対数(底 e)で、log あるいは ln と書く。教科書によっては底 2(単位は bit)や底 10 を使うが、 定性的な振る舞いはどれも同じ —— 底を変えるのは全 log を定数倍するだけ。
具体例。簡素な言語モデルで文「the cat sat」の確率を、第 3 節の連鎖律で分解して計算する:
P("the cat sat")
= P(the) · P(cat | the) · P(sat | the cat)
= 0.04 · 0.001 · 0.0002
= 0.000000008 ← 3 トークンでもう厳しい;100 トークンなら無理。
log P("the cat sat")
= log(0.04) + log(0.001) + log(0.0002)
= −3.22 + −6.91 + −8.52
= −18.65 ← 3 つを足すだけ;アンダーフローしない。同じ情報、2 つのスケール。掛け算は浮動小数レジスタの中で 0 に潰れるが、 和は気持ちのいい −18.65。100 トークンの系列なら積はすぐに尽きるが、 和は数百のオーダーまで増えるだけだ。 あらゆる LLM のスコアリング、パープレキシティ計算、ビームサーチの順位付けが log 空間で動いているのはこのため。
ML 論文を読み始めるとすぐ出会う、関連する 2 つの量:
- 負の対数尤度(NLL)。単に
−log Pのこと。 符号を反転して「より尤もらしい」がより小さい数になるようにする —— 最適化器は すべて最小化が好物だ。尤度の最大化と NLL の最小化は同じ手続き。 - 交差エントロピー損失。あらゆる LLM の訓練目標:
L = −Σ log P(正解トークン | これまでのトークン)をコーパス上で平均する。 各位置で正解の確率の負の対数を取って合計するだけ。 実体は NLL だが、論文では必ず「cross-entropy」と書かれる。
もう一つの定番:log-sum-exp。log 空間にある確率たちを足す必要があるとき(たとえば複数の推論経路の log-prob を 1 つの確率にまとめるとき)、log(p + q) ≠ log p + log q なので扱いに注意がいる。 コツは log(Σ exp(log pᵢ))。どのフレームワークも数値的に安定な実装を logsumexp として提供している。第 2 節の softmax はその一応用に過ぎない。
Transformer では:モデルが出すのは logits で、 実際に損失関数に渡すのは log_softmax(logits) —— つまり対数確率だ。 訓練ループは cross_entropy = −mean(log P(正解トークン)) を計算して逆伝播する。 推論時のビームサーチやサンプリングは、候補の続きを「累積対数確率」で順位付けする —— 各トークンを 1 つ伸ばすごとにその log-prob を足していく。 本記事で P(x) と書いた確率は、実際の訓練・推論コード上では ほぼ確実に log P(x) として保持・操作されている。 数学的には同じ、ただ浮動小数レジスタが生き残るというだけだ。