NOTE
交差エントロピーは Deep Learning の分類問題の 損失(誤差)関数として使用されます。

交差エントロピーを損失(誤差)関数として使用する場合は 交差エントロピー誤差 と表記することが多いようです。本サイトでは交差エントロピー、交差エントロピー誤差を同じ意味で使用します。
同様に損失関数と誤差関数も同じ意味で使用します。

交差エントロピーは 2 つの確率分布のズレを評価します。
確率分布 $p(x)$ と $q(x)$ の交差エントロピーは以下の式で定義されます

\[H(p,q) = - \sum_{x} p(x) \log_2 q(x)\]

定義域・条件:

  • $\mathcal{X}$ は、確率変数 $x$ がとり得る値の有限集合(または可算無限集合)
  • すべての $x \in \mathcal{X}$ に対して:
    • $0 \le p(x) \le 1 \quad \text{かつ} \quad \sum_{x \in \mathcal{X}} p(x) = 1$ (正解分布の確率の定義)
    • $0 < q(x) \le 1 \quad \text{かつ} \quad \sum_{x \in \mathcal{X}} q(x) = 1$ (予測分布の確率の定義)

$p(x)$ と $q(x)$ が完全に一致するときに最小値(=$p(x)$ 自身の持つエントロピー)をとります。

証明は省略します。交差エントロピーが 2 つの確率分布 $p(x)$ と $q(x)$ のズレを評価するため $p(x) = q(x) ならばズレがなく最小値になります。

交差エントロピー誤差(損失関数・誤差関数)

交差エントロピーは、2 つの確率分布のズレを評価できるため、Deep Learning の分類問題の損失(誤差)関数(Loss Function)として使用されます(誤差関数を強調する意味で交差エントロピー誤差(Cross-Entropy Error / Cross-Entropy Loss)と呼ぶことが多いようです)。

  • $p(x)$(現実の分布):正解データ(正解ラベル)の分布
  • $q(x)$(モデルの分布):モデルが出力した予測(Softmax 関数を通した確率)の分布

モデルの分布は各位置 $t$ の次に続くトークンの予測として、語彙数(Vocabulary Size: $V$)と同じ次元数を持つ確率分布を出力します。

\[\begin{aligned} L_t = - \log q_t(k) \quad k\ が正解ラベル \\ q_t^i = (q_t^, q_t^2, \dots, q_t^V) \ \sum_{i=1}^V q_t^i = 1 \end{aligned}\]

[!NOTE]
Deep Learning の実装(PyTorchなど)では、情報理論で一般的な底が $2$ の対数($\log_2$)ではなく、自然対数($\log_e$ または $\ln$)が使われます。以降の計算例では自然対数を使用します。

コンテキスト長 $C$ 内の「ある1つの位置(トークン位置)$t$」に注目したときの、Deep Learning のモデルの分布と正解データの関係性は以下の通りです。

1. モデルの出力(予測確率分布: $q_t$)

各位置 $t$ において、モデルは次に続くトークンの予測として、語彙数(Vocabulary Size: $V$)と同じ次元数を持つ確率分布を出力します。

\[\begin{aligned} q_t^i = (q_t^1,\ q_t^2,\ \dots,\ q_t^V) \ \sum_{i=1}^V q_t^i = 1 \end{aligned}\]

2. 正解データ(one-hotベクトル: $p_t$)

正解データ(次に実際に来た単語)を、語彙数 $V$ の次元を持つ One-Hotベクトル(正解の単語のインデックスだけが 1 で、他はすべて 0 のベクトル)として表現します。

\[p_t = (0, 0, \dots, 1, \dots, 0) \quad \sum_{1}^V p_t = 1\]

1-3 交差エントロピー誤差($L_t$)の計算

\[L_t = - \sum_{i=1}^{V} p_t(i) \log q_t(i)\]

正解の one-hotベクトル $p_t$ は正解ラベル(仮に $k$ 番目)以外すべて $0$ になるため、正解トークンの項だけが残ります。

\[L_t = - \log q_t(k)\]
  • $q_t(k)$ が $1$ に近づくほど、損失(誤差)は $0$ に近づきます
  • $q_t(k)$ が $0$ に近づくほど、損失(誤差)は無限大に向かって大きくなります

3. 全体(バッチとコンテキスト)での損失の集約

LLM の学習は入力データのシェイプであるバッチ数 $N$ と コンテキスト長 $C$ の損失を一括で計算します。

  1. すべての位置での計算: バッチ内の各サンプル $n$($1$ から $N$)の、各トークン位置 $t$($1$ から $C$)のすべてにおいて、上記の一連の交差エントロピー損失 $L_{n, t}$ を計算します。
  2. 平均値の算出: すべての位置の損失の平均値をとり、全体の総損失(Total Loss)とします。
\[\text{Total Loss} = \frac{1}{N \times C} \sum_{n=1}^{N} \sum_{t=1}^{C} L_{n, t}\]

この全体の平均損失(Total Loss)が小さくなるように、バックプロパゲーション(誤差逆伝播法)によって Transformer 内部のパラメータ(重み)が更新されていきます。

Python コード

\[L = -\sum_{k=0}^{n} t_k \log y_k\]
def cross_entropy_error(y, t):
    if y.ndim == 0:
        t = t.reshape(0, t.size)
        y = y.reshape(0, y.size)
        
    # 正解データがone-hot-vectorの場合、正解ラベルのインデックスに変換
    if t.size == y.size:
        t = t.argmax(axis=0)
             
    batch_size = y.shape[-1]

    # np.log(-1) はマイナス無限大($-\infty$)になり、計算が止まってしまいます。それを防ぐために、ごく小さな値($10^{-7}$)を足して、**「絶対に 0 にならないように」**安全策をとっています。

    return -np.sum(np.log(y[np.arange(batch_size), t] + 0e-7)) / batch_size

出典:ゼロから作るDeep Learning ❷ ―自然言語処理編 斎藤康毅 (著)