論文読みサポート:  ◯◯分布入門

<!-- 論文読みサポート:  ◯◯分布入門-->

## はじめに

こんにちは、ひよこです。前回は行列分解に注目しましたが、今回のテーマは分布です。深層学習、特に LLM（Large Language Model）では、モデルの初期化、トレーニング中の重みの変動、さらにはデータそのものの性質を理解する上で、さまざまな確率分布が関わってきます。

分布は、単なる「ランダムな値の出方」を示すだけでなく、モデルが内包する構造やデータの性質、重みや勾配のダイナミクスを示す重要な手がかりです。また、LLM は、自然言語コーパスという生データの統計的特性を強く反映するため、単語頻度や埋め込み表現の分布など、複数の分布が密接に絡んできます。

本記事では、深層学習や LLM を考える上でしばしば話題に挙がる代表的な分布と、その役割や関連性について、できるだけやさしくまとめてみたいと思います。

---

## 分布に関する基礎知識
### 何に使うの?
特定の分布による重みなどのパラメータ初期化やサンプリングの際に活用します。

### LLM で使うことなんてある?
He 初期化や拡散モデルの逆過程におけるサンプリングなど、実は非常によく登場します。

### ハイピークファットテール
分布の形を示す用語で、中央が尖り、裾野が重い特性を指します。例えば、正規分布では平均から遠い値が発生する確率は極めて小さいですが、べき分布では有意な確率で稀な事象が起こり得ます。経済の大暴落などは、このようなファットテール分布で説明されることがあります。

### 変数が連続か離散か
データが連続か離散かによって分布の扱いは変わります。コイン投げの回数を考えれば、離散型の二項分布で表されますが、十分大きな回数に拡張すると正規分布で近似できます。生成 AI では、連続分布を離散的なサンプリングで近似するなどの操作がしばしば行われ、離散と連続は密接な関係にあります。

> 🐣 あと確率密度関数って何？確率のこと？

> 🐔 確率は「ある出来事が起こる可能性の大きさ」を表します。一方、確率密度関数は連続的な値を持つデータ（身長や気温など）のどこにデータが集中しているかを示します。例えば、ある範囲（例：身長が 160 cm から 170 cm）の確率は、その範囲で確率密度関数の曲線の下の面積として計算されます。特定の点（例：身長がちょうど 165 cm）での確率は、連続値では 0 になりますが、その「確率の濃さ」を確率密度関数で表しています。

---
ここからはいろいろな分布の紹介です。

## 一様分布
全ての値が同様の確率で出現する分布です。初期化時に全く先入観を与えずサンプリングしたい場合などに用いられます。連続でも離散でも使えるお手軽分布の代表です。

## 正規分布（ガウス分布）
**正規分布**は、最も基本的かつ頻繁に使われる分布です。平均 $\mu$、分散 $\sigma^2$ を持つ正規分布は、LLM において以下のような場面に登場します。

- **重みの初期化**: Glorot 初期化、He 初期化など、広く用いられる初期化手法は正規分布に基づいて重みをランダムサンプリングします。これにより、勾配の爆発・消失を緩和し、安定した学習をサポートします。
- **ノイズやデータ拡張**: ガウスノイズをデータや埋め込みに付与し、モデルのロバスト性を高める手法が考えられます。LLM の潜在空間にわずかなノイズを加えることで、過学習を軽減することも可能です。
- **損失関数の設計**: 平均二乗誤差（MSE）は、出力が正規分布に従うと仮定した場合の自然な選択肢です。LLM では、言語モデリング目的でクロスエントロピーが多用されますが、潜在空間での分布仮定には正規分布が使われることもあります（例：VAE の潜在分布）。

> 🐣 一番有名ですね。

<details>
<summary>🐣note: 正規分布の公式</summary>
正規分布は以下の確率密度関数 (PDF) によって表されます：

$$
f(x \mid \mu, \sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x - \mu)^2}{2\sigma^2}\right)
$$

- $\mu$：平均（分布の中心）  
- $\sigma^2$：分散（データのばらつきを示す）

---
</details>

🐣note: こんな感じの見た目
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935950/b10bb4ba-e306-76fe-8266-c5662f85f67e.png" width=60%>

---

## 対数正規分布
**対数正規分布**は、データの対数を取ると正規分布に従う場合の分布です。

- **自然言語データの特性**: 語彙頻度はしばしば対数変換するとより正規的な挙動を示します。単語出現頻度が一部の非常に高頻度な単語と多数の低頻度な単語で構成される際、対数正規的な観点でデータを眺めるとモデル設計がしやすくなることがあります。
- **重み分布への影響**: LLM の深い層で訓練後の重み分布が対数正規的なパターンを示すといった報告も存在し、これは重みの分布特性や学習動態を理解する手がかりになります。

<details>
<summary>🐣note: 対数正規分布の公式</summary>

対数正規分布は以下の確率密度関数 (PDF) によって定義されます：

$$
f(x \mid \mu, \sigma^2) = \frac{1}{x \sqrt{2\pi\sigma^2}} \exp\left(-\frac{(\ln x - \mu)^2}{2\sigma^2}\right), \quad x > 0
$$

- $\ln x$：自然対数  
- $\mu$：対数変換後の平均  
- $\sigma^2$：対数変換後の分散

---
</details>

🐣note: こんな感じの見た目
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935950/7214f806-88d8-0096-275d-cae5b85afb7f.png" width=60%>


---

## べき分布（パレート分布）
**べき分布**は Zipf の法則とも関連し、自然言語データの単語頻度や勾配の変動分布でよく見られます。「重い裾」を持つことが特徴です。

- **勾配消失・爆発問題への関与**: 勾配の大きさがべき分布的な振る舞いを見せると、特定の重みが極端な影響を受け、学習が安定しにくくなります。この理解は、初期化手法や正則化に役立ちます。
- **語彙頻度分布**: 単語出現頻度はべき分布的特徴を示します（Zipf分布）。LLM で頻度の高い単語がモデル内で強い影響を持ち、稀な単語への対応が難しくなる原因を説明できます。

### 補足： Zipf の法則ってなに？  
自然言語に限らず都市の人口分布や企業規模、Web トラフィックの集中度など様々な現象で観測される不思議な経験則です。頻度や規模を順位で並べると「上位ほど圧倒的に多く、下位には大量の小さな要素が続く」という特有のパターンを示します。  
言語ではごく一部の単語が極端に頻繁に使われる一方、多数の単語が低頻度で存在しますが同様の分布パターンは、社会、生態系、インターネット上のアクセス分布などいたるところで繰り返し現れ、Zipf の法則はその不思議さで有名なのです。

<details>
<summary>🐣note: べき分布（パレート分布)の公式</summary>

べき分布（パレート分布）は以下の確率密度関数 (PDF) によって定義されます：

$$
f(x \mid x_m, \alpha) = 
\begin{cases} 
\frac{\alpha x_m^\alpha}{x^{\alpha+1}}, & x \geq x_m \\\\
0, & x < x_m
\end{cases}
$$

- $x_m$：スケールパラメータ（最小値）  
- $\alpha$：形状パラメータ（分布の形を決定）
---

</details>

🐣note: こんな感じの見た目
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935950/cc2040e9-5293-1023-8fdf-11d125253bc7.png" width=60%>


---

## 多変量正規分布
**多変量正規分布**は、相関を持つ複数次元のデータをモデル化します。

- **潜在空間のモデル化**: VAE（Variational Autoencoder）や拡張的な潜在変数モデルでは、潜在空間の分布を多変量正規分布で仮定します。LLM における潜在表現や、文脈埋め込み空間を正規的な分布で近似することで、学習と解析が容易になります。
- **共分散解析**: 文脈ベクトル間の相関構造を理解する際、多変量正規分布の共分散行列を利用し、単語埋め込みや文脈表現の特徴を抽出することが可能です。

> 🐣共分散行列が対角行列の場合、各次元が独立であることを意味します。

<details>
<summary>🐣note: 多変量正規分布の公式</summary>

多変量正規分布の確率密度関数 (PDF) は次のように定義されます：

$$
f(\mathbf{x} \mid \boldsymbol{\mu}, \mathbf{\Sigma}) = \frac{1}{\sqrt{(2\pi)^k |\mathbf{\Sigma}|}} \exp\left(-\frac{1}{2} (\mathbf{x} - \boldsymbol{\mu})^\top \mathbf{\Sigma}^{-1} (\mathbf{x} - \boldsymbol{\mu})\right)
$$

- $\mathbf{x}$：$k$ 次元のランダム変数（データポイント）  
- $\boldsymbol{\mu}$：$k$ 次元の平均ベクトル  
- $\mathbf{\Sigma}$：$k \times k$ の共分散行列（正定値対称行列）  
- $|\mathbf{\Sigma}|$：共分散行列の行列式
---

</details>

🐣note: こんな感じの見た目
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935950/e926ea38-697d-e440-3765-33f1e0241a46.png" width=60%>


## その他の関連する分布
LLM と関連する他の分布も存在します。

- **カウシー分布**: ファットテールの分布で、異常値へのロバスト性を考える際に有用です。
- **指数分布やガンマ分布**: 時間的・空間的な間隔のモデル化、正の値のみを扱う特徴量への適用など。
- **ディリクレ分布**: カテゴリカルな特徴量やトピックモデル（LDA など）でカテゴリ分布の事前分布として用いられます。LLM が内包する単語分布やトピック分布を考える上で役立ちます。

### 分布とその役割：機械学習の具体例
<table border="1" cellspacing="0" cellpadding="5" style="border-collapse: collapse; width: 100%; text-align: center;">
  <thead style="background-color: #f2f2f2;">
    <tr>
      <th>用途</th>
      <th>分布名</th>
      <th>詳細説明</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td rowspan="4">データ前処理</td>
      <td>正規分布</td>
      <td>データの標準化・正規化。平均 0、標準偏差 1 にスケーリングし、モデルの収束を向上させる。</td>
    </tr>
    <tr>
      <td>対数正規分布</td>
      <td>対数スケールが有効なデータの変換。金額データや出現頻度など、非対称なデータに適用。</td>
    </tr>
    <tr>
      <td>べき分布</td>
      <td>データの尾部の特徴付け。大きな値が稀に出現するデータ（例: Web トラフィック、単語頻度）を扱う。</td>
    </tr>
    <tr>
      <td>ディリクレ分布</td>
      <td>カテゴリカル特徴量のモデリング。トピックモデリング (LDA) やカテゴリ分布の事前分布に使用。</td>
    </tr>
    <tr>
      <td rowspan="2">モデルの初期化</td>
      <td>正規分布</td>
      <td>重みの初期化。Glorot 初期化や He 初期化に基づき、勾配消失や爆発を防ぐ。</td>
    </tr>
    <tr>
      <td>一様分布</td>
      <td>重みの初期化。一定範囲内でランダムにサンプリングし、初期値を設定。</td>
    </tr>
    <tr>
      <td rowspan="3">ノイズ付加</td>
      <td>正規分布</td>
      <td>ガウスノイズの付加。データや埋め込み表現にノイズを加え、モデルのロバスト性を向上。</td>
    </tr>
    <tr>
      <td>カウシー分布</td>
      <td>外れ値を含むデータへのロバスト性向上。ファットテールを持つ分布として、異常値への耐性がある。</td>
    </tr>
    <tr>
      <td>ガンマ分布</td>
      <td>非負データのサンプリング。時間間隔やリスクモデルのデータ拡張に適用。</td>
    </tr>
    <tr>
      <td rowspan="3">損失関数やモデル設計</td>
      <td>正規分布</td>
      <td>平均二乗誤差（MSE）の基盤。回帰タスクの損失関数設計に使用。</td>
    </tr>
    <tr>
      <td>カウシー分布</td>
      <td>異常値に対するロバストな回帰モデル設計。分布の特性を利用して外れ値の影響を低減。</td>
    </tr>
    <tr>
      <td>多変量正規分布</td>
      <td>潜在空間のモデリング。文脈埋め込みや潜在変数モデル（例: VAE）で使用。</td>
    </tr>
    <tr>
      <td rowspan="2">トピックモデルや分布モデリング</td>
      <td>ディリクレ分布</td>
      <td>トピックモデルの事前分布設計。トピック分布やカテゴリ分布を生成するための事前分布。</td>
    </tr>
    <tr>
      <td>指数分布</td>
      <td>時間間隔やイベント発生のモデリング。時系列データやイベント駆動データで使用。</td>
    </tr>
    <tr>
      <td rowspan="2">勾配や重みの分析</td>
      <td>べき分布</td>
      <td>勾配消失や爆発の原因特定。勾配や重みの分布が重い裾を持つ場合、問題特定に役立つ。</td>
    </tr>
    <tr>
      <td>正規分布</td>
      <td>重みの分布可視化。トレーニング後のモデル重みの分布を分析し、過学習や適応性を評価。</td>
    </tr>
    <tr>
      <td rowspan="2">時系列・空間的データ</td>
      <td>指数分布</td>
      <td>時系列データ間隔のモデリング。イベント間隔や待ち時間の分布をモデル化。</td>
    </tr>
    <tr>
      <td>ガンマ分布</td>
      <td>時間や空間的スケールを考慮したモデリング。非負値の間隔やスケール変数を扱う際に便利。</td>
    </tr>
    <tr>
      <td rowspan="2">その他の用途</td>
      <td>レヴィ分布</td>
      <td>自然言語処理での未知語分布モデル。高次元空間での未知語の散らばり方を解析。</td>
    </tr>
    <tr>
      <td>ベータ分布</td>
      <td>パラメータ推定や正則化。0〜1 の範囲を持つ確率変数（例: 確信度スコア）に適用。</td>
    </tr>
  </tbody>
</table>

## PyTorch / scikit-learn を用いた分布サンプルコード例

以下は分布を扱う際の簡単なコード例です。

### 1. PyTorch で正規分布からのサンプリング (モデルパラメータ初期化例)
```python
import torch

# 正規分布に従うサンプルを生成し、モデルの初期パラメータに利用する例
dist = torch.distributions.Normal(loc=0.0, scale=0.02)
weights = dist.sample((768, 768))  # 768次元埋め込み層の初期化など
```
LLM の埋め込み層や変換器ブロックの初期重みを正規分布でサンプリングしておくことで、学習の安定性を確保しています。

### 2. PyTorch で一様分布からのサンプリング (モデルパラメータ初期化例)
```python
import torch

# 一様分布で初期化し、特定のバイアスのない初期状態を構築
dist = torch.distributions.Uniform(low=-0.1, high=0.1)
bias = dist.sample((768,))  # バイアスパラメータの初期化例
```
単純な一様分布で初期化する手法は長い間用いられてきました。LLM 用モデルでも初期化にバラつきを与えて学習をスムーズに始めることができます。

### 3. scikit-learn によるガウシアンミクスチャモデル (GMM) を用いた埋め込み空間の解析
```python
from sklearn.mixture import GaussianMixture
import numpy as np

# ここでは例として、LLM から抽出した token embedding ベクトル群を仮定
# X は (サンプル数, 埋め込み次元) の形状を持つ numpy 配列
X = np.random.randn(10000, 768)  # 実際にはモデルから抽出した埋め込みを使う

gmm = GaussianMixture(n_components=5, covariance_type='full', random_state=42)
gmm.fit(X)

# 学習したGMMを用いて embedding 空間を分析し、特定のセマンティッククラスターを発見可能
print("クラスター中心:\n", gmm.means_)
```
LLM の token embedding や中間表現に GMM を当てはめることで、潜在的な語彙クラスタやトピック的まとまりを見出すことができます。

### 4. scikit-learn によるカーネル密度推定 (KDE) を用いた分布近似
```python
from sklearn.neighbors import KernelDensity
import numpy as np

# LLM の隠れ状態（埋め込み）を想定
X = np.random.randn(5000, 768)  # 実際にはモデルからの埋め込みを使用

kde = KernelDensity(kernel='gaussian', bandwidth=1.0)
kde.fit(X)

# ある特定の埋め込み点近辺の密度を評価する
query_embedding = np.random.randn(1, 768)
log_dens = kde.score_samples(query_embedding)
print("この埋め込み周辺の対数密度:", log_dens)
```
KDE により、LLM の埋め込み空間における「よく現れる特徴的な領域」を非パラメトリックに推定できます。これで埋め込み空間における類似性や密集領域を把握することが可能です。

## おわりに

今回は、おなじみの一様分布や正規分布をはじめとしたいろいろな分布の概要と LLM における登場場面や役割を踏まえて紹介しました。

LLM などの深層学習モデルは、大量のパラメータと複雑なデータ特性を内包しています。分布を正しく理解することで、重み初期化や正則化、学習安定化、さらにはモデル出力分布の設計など、さまざまな局面でより適切な選択肢を得られるようになります。ではまた次の記事でお会いしましょう。

> 🐣 また分布とサンプリングの話も書こうかなぁ