交差エントロピー | 情報理論
NOTE
交差エントロピーは Deep Learning の分類問題の 損失(誤差)関数として使用されます。交差エントロピーを損失(誤差)関数として使用する場合は
交差エントロピー誤差と表記することが多いようです。本サイトでは交差エントロピー、交差エントロピー誤差を同じ意味で使用します。
同様に損失関数と誤差関数も同じ意味で使用します。
交差エントロピーは 2 つの確率分布のズレを評価します。
確率分布 $p(x)$ と $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 のベクトル)として表現します。
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$ の損失を一括で計算します。
- すべての位置での計算: バッチ内の各サンプル $n$($1$ から $N$)の、各トークン位置 $t$($1$ から $C$)のすべてにおいて、上記の一連の交差エントロピー損失 $L_{n, t}$ を計算します。
- 平均値の算出: すべての位置の損失の平均値をとり、全体の総損失(Total Loss)とします。
この全体の平均損失(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 ❷ ―自然言語処理編 斎藤康毅 (著)