在机器学习和深度学习领域,损失函数是模型训练过程中的核心要素之一。它用于衡量模型预测结果与真实标签之间的差异,通过最小化损失函数,模型能够不断调整自身的参数,以提高预测的准确性。在分类任务中,交叉熵损失函数是一种被广泛使用的损失函数,本文将详细介绍交叉熵损失函数的原理,并结合 TensorFlow 进行示例说明。
熵(Entropy)是信息论中的一个重要概念,用于衡量一个随机变量的不确定性。对于一个离散随机变量 $X$,其取值为 $x1, x_2, \cdots, x_n$,对应的概率为 $p(x_1), p(x_2), \cdots, p(x_n)$,则 $X$ 的熵定义为:
[H(X) = -\sum{i=1}^{n} p(x_i) \log p(x_i)]
熵越大,表示随机变量的不确定性越大;熵越小,表示随机变量的不确定性越小。当随机变量的取值只有一个时,其熵为 0,因为此时没有任何不确定性。
交叉熵(Cross Entropy)是用来衡量在给定的真实分布下,使用非真实分布所指定的策略消除系统的不确定性所需要付出的努力的大小。对于两个概率分布 $p$ 和 $q$,它们的交叉熵定义为:
[H(p, q) = -\sum_{i=1}^{n} p(x_i) \log q(x_i)]
其中,$p(x_i)$ 是真实分布的概率,$q(x_i)$ 是预测分布的概率。交叉熵的值越小,表示两个分布越接近。
相对熵(Kullback-Leibler Divergence,简称 KL 散度)也是衡量两个概率分布之间差异的一种方法,它定义为:
[D{KL}(p || q) = \sum{i=1}^{n} p(xi) \log \frac{p(x_i)}{q(x_i)} = H(p, q) - H(p)]
由于真实分布 $p$ 的熵 $H(p)$ 是一个常数,因此最小化交叉熵 $H(p, q)$ 等价于最小化 KL 散度 $D{KL}(p || q)$,即让预测分布 $q$ 尽可能接近真实分布 $p$。
在二分类问题中,真实标签 $y$ 通常取值为 0 或 1,模型的预测输出 $\hat{y}$ 是一个概率值,表示样本属于正类的概率。交叉熵损失函数可以表示为:
[L = - [y \log \hat{y} + (1 - y) \log (1 - \hat{y})]]
当 $y = 1$ 时,损失函数变为 $L = - \log \hat{y}$,此时要使损失最小,就需要 $\hat{y}$ 尽可能接近 1;当 $y = 0$ 时,损失函数变为 $L = - \log (1 - \hat{y})$,此时要使损失最小,就需要 $\hat{y}$ 尽可能接近 0。
在多分类问题中,真实标签通常使用 one-hot 编码表示,即一个长度为 $C$(类别数)的向量,其中只有一个元素为 1,其余元素为 0。模型的预测输出是一个长度为 $C$ 的概率向量 $\hat{y} = (\hat{y}1, \hat{y}_2, \cdots, \hat{y}_C)$,表示样本属于各个类别的概率。交叉熵损失函数可以表示为:
[L = - \sum{i=1}^{C} y_i \log \hat{y}_i]
其中,$y_i$ 是真实标签向量的第 $i$ 个元素,$\hat{y}_i$ 是预测概率向量的第 $i$ 个元素。由于 $y$ 是 one-hot 编码,因此只有一个 $y_i$ 为 1,其余为 0,损失函数实际上只对真实类别的预测概率取负对数。
import tensorflow as tf
# 定义真实标签和预测输出
y_true = tf.constant([1, 0, 1], dtype=tf.float32)
y_pred = tf.constant([0.9, 0.1, 0.8], dtype=tf.float32)
# 计算交叉熵损失
binary_crossentropy = tf.keras.losses.BinaryCrossentropy()
loss = binary_crossentropy(y_true, y_pred)
print("Binary Cross Entropy Loss:", loss.numpy())
import tensorflow as tf
# 定义真实标签和预测输出
y_true = tf.constant([[1, 0, 0], [0, 1, 0], [0, 0, 1]], dtype=tf.float32)
y_pred = tf.constant([[0.8, 0.1, 0.1], [0.1, 0.8, 0.1], [0.1, 0.1, 0.8]], dtype=tf.float32)
# 计算交叉熵损失
categorical_crossentropy = tf.keras.losses.CategoricalCrossentropy()
loss = categorical_crossentropy(y_true, y_pred)
print("Categorical Cross Entropy Loss:", loss.numpy())
交叉熵损失函数是分类任务中一种非常有效的损失函数,它通过衡量真实分布和预测分布之间的差异,引导模型不断调整参数,使预测结果尽可能接近真实标签。在 TensorFlow 中,提供了方便的 API 来计算二分类和多分类问题的交叉熵损失,大大简化了模型的训练过程。理解交叉熵损失函数的原理,对于深入学习和应用深度学习模型具有重要的意义。