【损失函数】完全解析(两万字解读)
损失函数:机器学习的度量之魂与学习之道
如果本文能对您有所帮助,希望点赞+收藏+关注,感谢!后续会持续产出AI领域算法论文
(目录见右侧)
前言:数据世界的度量衡
在浩瀚的数据海洋中,机器学习模型如同经验丰富的航海家,试图从纷繁复杂的现象中找出规律,预测未来,或识别模式。然而,模型如何知道自己是否“学得好”?它如何调整航向,避免迷失?答案在于一个看似简单却至关重要的概念——损失函数(Loss Function),也被称为代价函数(Cost Function)或目标函数(Objective Function)。
损失函数是机器学习模型学习过程中的“度量之魂”,它量化了模型预测值与真实值之间的“不一致”或“错误”程度。这个数值是模型进行优化的核心依据,指引着模型参数的调整方向。没有损失函数,机器学习模型就像一个没有指南针的船,无法知道自己的表现好坏,更无从改进。
本篇博客将带你深入探索损失函数的奥秘,从其基本原理到各类损失函数的具体形式、数学性质、优缺点以及在不同机器学习任务中的应用场景。我们将不仅仅停留在概念层面,更会探讨其背后的数学原理、对模型训练的影响,以及如何根据实际问题选择或设计合适的损失函数。这不仅是一次知识的梳理,更是一场对机器学习核心驱动力的深度剖析。
第一章:损失函数基础:为什么需要它?
1.1 什么是损失函数?
在机器学习中,我们的目标是找到一个函数 f(x)f(x)f(x),它能够尽可能准确地从输入 xxx 映射到输出 yyy。但是,“尽可能准确”如何量化呢?这就是损失函数的作用。
定义: 损失函数 L(y^,y)L(\hat{y}, y)L(y^,y) 是一个非负实值函数,用于衡量模型预测值 y^\hat{y}y^(或 f(x)f(x)f(x))与真实值 yyy 之间差异的程度。损失函数值越小,表示模型的预测越接近真实值,模型的性能越好。
- 输入: 模型的预测值 y^\hat{y}y^ 和对应的真实标签 yyy。
- 输出: 一个标量值,代表当前预测的“错误”或“代价”。
- 目标: 在模型训练过程中,我们通过最小化所有训练样本上的平均损失(通常称为经验风险),来优化模型的参数。这个平均损失通常被称为代价函数(Cost Function)或目标函数(Objective Function)。
J(θ)=1N∑i=1NL(f(xi;θ),yi) J(\theta) = \frac{1}{N} \sum_{i=1}^{N} L(f(x_i; \theta), y_i) J(θ)=N1i=1∑NL(f(xi;θ),yi)
其中,J(θ)J(\theta)J(θ) 是代价函数,θ\thetaθ 是模型的参数,NNN 是训练样本的数量,LLL 是针对单个样本的损失函数。
1.2 损失函数在机器学习中的核心作用
损失函数在机器学习的整个生命周期中扮演着不可或缺的角色:
- 指导模型学习: 损失函数为优化算法(如梯度下降)提供了一个明确的优化方向。通过计算损失函数对模型参数的梯度,我们可以知道如何调整参数,使得损失值减小。这就像为模型指明了“下山”的方向,最终达到“山谷”(最小损失)。
- 评估模型性能: 在训练过程中,我们可以通过监控损失函数值的变化来评估模型的学习进度。在训练结束后,损失函数也可以作为评估模型在未见过数据上泛化能力的一个指标。
- 防止过拟合与欠拟合: 损失函数与正则化项结合,可以有效控制模型的复杂度。例如,L1/L2正则化项可以作为损失函数的一部分,惩罚过大的模型参数,从而降低过拟合的风险。反之,如果损失函数设计不当,可能导致模型欠拟合(学习不足)或过拟合(过度学习训练数据)。
- 连接模型与问题: 不同的机器学习任务(回归、分类、聚类、生成等)有不同的目标,这决定了我们需要选择或设计不同的损失函数。损失函数是连接特定机器学习问题与通用优化算法之间的桥梁。
- 影响模型收敛性与稳定性: 损失函数的数学性质(如凸性、可微性)直接影响优化算法的收敛速度和稳定性。一个非凸或非平滑的损失函数可能导致优化过程陷入局部最优,或难以收敛。
1.3 损失函数与优化器、模型的关联
理解损失函数,离不开它与优化器(Optimizer)和模型(Model)的协同关系。
- 模型(Model): 是我们学习的载体,它定义了从输入到输出的映射关系,并包含待学习的参数。例如,线性回归模型 f(x)=θ0+θ1x1+⋯+θnxnf(x) = \theta_0 + \theta_1 x_1 + \dots + \theta_n x_nf(x)=θ0+θ1x1+⋯+θnxn,神经网络模型中的权重和偏置。
- 损失函数(Loss Function): 定义了衡量模型性能好坏的标准。对于给定的模型参数 θ\thetaθ,它计算出当前参数下的“错误”程度 L(f(x;θ),y)L(f(x;\theta), y)L(f(x;θ),y)。
- 优化器(Optimizer): 是根据损失函数的值(或其梯度)来更新模型参数的算法。它的目标是找到一组参数 θ∗\theta^*θ∗,使得损失函数达到最小值。常见的优化器包括梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam、RMSprop 等。
整个学习过程可以概括为:
- 初始化模型参数。
- 前向传播:给定输入 xxx,通过当前模型参数计算预测值 y^\hat{y}y^。
- 计算损失:使用损失函数计算 y^\hat{y}y^ 和真实值 yyy 之间的损失 L(y^,y)L(\hat{y}, y)L(y^,y)。
- 反向传播:计算损失函数对模型参数的梯度 ∇θL\nabla_\theta L∇θL。
- 参数更新:优化器利用梯度信息更新模型参数 θ←θ−α∇θL\theta \leftarrow \theta - \alpha \nabla_\theta Lθ←θ−α∇θL(其中 α\alphaα 是学习率)。
- 重复步骤2-5,直到损失函数收敛或达到预设的训练轮次。
可以说,损失函数是模型学习的“目标”,优化器是模型学习的“策略”,而模型本身则是“学习的主体”。三者紧密协作,共同完成了机器学习的整个学习过程。
第二章:回归问题的损失函数
回归问题旨在预测一个连续的数值输出。其损失函数通常衡量预测值与真实值之间的距离或差异。
2.1 均方误差 (Mean Squared Error, MSE / L2 Loss)
- 原理: MSE 是最常用和最基础的回归损失函数之一。它计算预测值与真实值之间差的平方的均值。其核心思想是,误差越大,惩罚越重,且惩罚是二次方增长的。
- 公式:
对于单个样本:L(y,y^)=(y−y^)2L(y, \hat{y}) = (y - \hat{y})^2L(y,y^)=(y−y^)2
对于 NNN 个样本:
MSE=1N∑i=1N(yi−y^i)2 MSE = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y}_i)^2 MSE=N1i=1∑N(yi−y^i)2 - 性质:
- 可微性: 处处可微,梯度为 2(y^−y)2(\hat{y} - y)2(y^−y),这使得优化(如梯度下降)非常方便。
- 凸性: 对于线性模型,MSE 是凸函数,确保可以找到全局最小值。
- 对称性: 预测值高于或低于真实值时,惩罚相同。
- 对异常值敏感: 由于平方项的存在,较大的误差(即异常值)会被放大,导致模型更倾向于拟合这些异常值,有时会牺牲在正常数据上的表现。
- 优点:
- 数学性质良好,易于优化,收敛速度快。
- 在概率角度上,MSE 对应于假设误差服从高斯分布时的最大似然估计。
- 提供了清晰的物理意义:误差平方的平均值。
- 缺点:
- 对异常值非常敏感。少量远离中心的离群点可能对模型产生巨大影响,导致模型偏向于这些离群点。
- 在某些情况下,过分惩罚大误差可能导致模型在小误差区域表现不佳。
- 应用场景:
- 最常见的回归问题,如房价预测、股票价格预测、温度预测等。
- 当数据集不含或极少异常值时,MSE 是一个非常好的选择。
- 在需要模型对大误差有较高惩罚且误差符合正态分布假设的场景。
2.2 平均绝对误差 (Mean Absolute Error, MAE / L1 Loss)
- 原理: MAE 计算预测值与真实值之间差的绝对值的均值。与 MSE 不同,它对误差的惩罚是线性的,而非二次方。
- 公式:
对于单个样本:L(y,y^)=∣y−y^∣L(y, \hat{y}) = |y - \hat{y}|L(y,y^)=∣y−y^∣
对于 NNN 个样本:
MAE=1N∑i=1N∣yi−y^i∣ MAE = \frac{1}{N} \sum_{i=1}^{N} |y_i - \hat{y}_i| MAE=N1i=1∑N∣yi−y^i∣ - 性质:
- 非处处可微: 在 y=y^y = \hat{y}y=y^ 处不可微,这可能给优化带来一点挑战(但现代优化器通常能很好处理)。
- 凸性: 对于线性模型,MAE 也是凸函数。
- 对称性: 与 MSE 类似,惩罚对称。
- 对异常值不敏感: 由于是绝对值,异常值不会被平方放大,使得 MAE 对异常值的鲁棒性更强。
- 优点:
- 对异常值具有更好的鲁棒性。当数据中存在大量离群点时,MAE 能提供更稳定的模型。
- 损失值直接反映了误差的平均大小,更具可解释性。
- 缺点:
- 在 y=y^y = \hat{y}y=y^ 处不可微,导致梯度下降在最小值附近可能跳动或难以精确收敛。
- 梯度是常数(除0点外),这意味着即使误差很小,梯度的大小也是固定的,可能导致在训练后期收敛速度变慢。
- 应用场景:
- 当数据中存在显著异常值时,例如金融数据、传感器数据中的噪声。
- 在某些统计分析中,MAE 更符合人们对误差的直观理解。
- 当需要模型对所有误差一视同仁,不希望过度惩罚大误差时。
2.3 Huber 损失 (Huber Loss / Smooth L1 Loss)
- 原理: Huber 损失是 MSE 和 MAE 的结合体。它在误差较小(小于某个阈值 δ\deltaδ)时使用 MSE 的平方惩罚,在误差较大时(大于 δ\deltaδ)使用 MAE 的线性惩罚。这使得 Huber 损失既能享受 MSE 在误差小时的平滑可微性,又能获得 MAE 在误差大时对异常值的鲁棒性。
- 公式:
Lδ(y,y^)={12(y−y^)2if ∣y−y^∣≤δδ∣y−y^∣−12δ2if ∣y−y^∣>δ L_\delta(y, \hat{y}) = \begin{cases} \frac{1}{2}(y - \hat{y})^2 & \text{if } |y - \hat{y}| \le \delta \\ \delta |y - \hat{y}| - \frac{1}{2}\delta^2 & \text{if } |y - \hat{y}| > \delta \end{cases} Lδ(y,y^)={21(y−y^)2δ∣y−y^∣−21δ2if ∣y−y^∣≤δif ∣y−y^∣>δ
其中 δ\deltaδ 是一个超参数,决定了从二次惩罚切换到线性惩罚的阈值。 - 性质:
- 处处可微: 在 ±δ\pm \delta±δ 处也是可微的,解决了 MAE 在0点不可微的问题。
- 平滑性: 结合了 MSE 的平滑特性。
- 鲁棒性: 对异常值具有鲁棒性,因为它在误差较大时切换到线性惩罚。
- 需要调优 δ\deltaδ: δ\deltaδ 的选择会影响损失函数的行为。
- 优点:
- 结合了 MSE 和 MAE 的优点,对异常值具有鲁棒性,同时在误差较小时保持平滑可微。
- 在实际应用中通常表现良好,是一个折衷的、更为通用的选择。
- 缺点:
- 引入了一个新的超参数 δ\deltaδ 需要调优。
- 计算略比 MSE 和 MAE 复杂。
- 应用场景:
- 大多数回归问题,尤其是数据可能包含一些异常值,但又希望在正常误差范围内保持良好平滑性的场景。
- 在深度学习中,Huber 损失(或其变体Smooth L1)在目标检测等任务中也常被用于回归边界框坐标。
2.4 Log-Cosh 损失 (Log-Cosh Loss)
- 原理: Log-Cosh 损失是另一种对 MSE 的平滑近似,并且具有对异常值的鲁棒性。它在数学上是 log(cosh(x))\log(\cosh(x))log(cosh(x)) 的形式,其中 xxx 是误差 y−y^y - \hat{y}y−y^。当误差很小时,log(cosh(x))\log(\cosh(x))log(cosh(x)) 约等于 x2/2x^2/2x2/2 (类似 MSE);当误差很大时,log(cosh(x))\log(\cosh(x))log(cosh(x)) 约等于 ∣x∣−log(2)|x| - \log(2)∣x∣−log(2) (类似 MAE)。
- 公式:
L(y,y^)=∑i=1Nlog(cosh(yi−y^i)) L(y, \hat{y}) = \sum_{i=1}^{N} \log(\cosh(y_i - \hat{y}_i)) L(y,y^)=i=1∑Nlog(cosh(yi−y^i)) - 性质:
- 处处可微: 比 Huber 损失具有更好的可微性,二阶导数也存在且平滑。
- 凸函数: 具有良好的优化特性。
- 鲁棒性: 对异常值比 MSE 更鲁棒,因为大误差的惩罚是接近线性的。
- 优点:
- 在保持鲁棒性的同时,具有更好的数学性质(二阶可导且平滑),这对于使用牛顿法或拟牛顿法等高级优化算法非常有利。
- 无需像 Huber 损失一样调优超参数 δ\deltaδ。
- 缺点:
- 计算相对复杂一些。
- 不如 MSE 和 MAE 直观。
- 应用场景:
- 当需要兼顾鲁棒性和优化的平滑性时。
- 在某些深度学习框架中,作为 Huber 损失的替代选择。
2.5 分位数损失 (Quantile Loss)
- 原理: 分位数回归(Quantile Regression)不仅仅预测输出的条件均值,还能预测输出的条件分位数(如中位数、25%分位数、75%分位数等)。分位数损失函数是非对称的,它对正误差和负误差施加不同的惩罚,使得模型能够关注特定的分位数。
- 公式:
Lγ(y,y^)={γ(y−y^)if y>y^(1−γ)(y^−y)if y≤y^ L_\gamma(y, \hat{y}) = \begin{cases} \gamma (y - \hat{y}) & \text{if } y > \hat{y} \\ (1 - \gamma) (\hat{y} - y) & \text{if } y \le \hat{y} \end{cases} Lγ(y,y^)={γ(y−y^)(1−γ)(y^−y)if y>y^if y≤y^
可以更简洁地写为:Lγ(y,y^)=γ⋅(y−y^)++(1−γ)⋅(y^−y)+L_\gamma(y, \hat{y}) = \gamma \cdot (y - \hat{y})^+ + (1 - \gamma) \cdot (\hat{y} - y)^+Lγ(y,y^)=γ⋅(y−y^)++(1−γ)⋅(y^−y)+
其中 γ∈(0,1)\gamma \in (0, 1)γ∈(0,1) 是分位数级别。- 当 γ=0.5\gamma = 0.5γ=0.5 时,分位数损失退化为 MAE,此时模型预测的是中位数。
- 当 γ>0.5\gamma > 0.5γ>0.5 时,模型对低估(即预测值 y^\hat{y}y^ 小于真实值 yyy)的惩罚更大,倾向于预测更高的值,适用于预测上分位数(如 75% 分位数)。
- 当 γ<0.5\gamma < 0.5γ<0.5 时,模型对高估(即预测值 y^\hat{y}y^ 大于真实值 yyy)的惩罚更大,倾向于预测更低的值,适用于预测下分位数(如 25% 分位数)。
- 性质:
- 非对称性: 核心特点,可以自定义对正负误差的惩罚权重。
- 非处处可微: 在 y=y^y = \hat{y}y=y^ 处不可微,与 MAE 类似。
- 鲁棒性: 继承了 MAE 对异常值的鲁棒性。
- 优点:
- 能够建模预测分布的形状,而不仅仅是均值。
- 对于预测区间、风险评估等场景非常有用。
- 对异常值具有鲁棒性。
- 缺点:
- 在 y=y^y = \hat{y}y=y^ 处不可微,可能影响优化。
- 需要为每个分位数训练一个模型或一个多输出模型。
- 可解释性相对于均值预测略复杂。
- 应用场景:
- 金融领域的风险管理,如预测股票价格的波动区间。
- 医疗领域的疾病预后,预测患者的恢复时间区间。
- 能源消耗预测,预测最高和最低消耗量。
- 任何需要理解预测不确定性或预测特定分位数的场景。
第三章:分类问题的损失函数
分类问题旨在预测一个离散的类别标签。其损失函数通常衡量模型对样本所属类别的预测概率与真实类别之间的差异。
3.1 二分类损失函数 (Binary Classification Loss Functions)
二分类问题预测样本属于两个类别中的哪一个(通常编码为0或1)。
3.1.1 二元交叉熵损失 (Binary Cross-Entropy Loss, BCE)
- 原理: 二元交叉熵损失是信息论中的交叉熵概念在二分类问题上的应用。它衡量了两个概率分布之间的差异。在二分类中,我们希望模型输出的概率分布(通过 Sigmoid 激活函数将输出压缩到 [0,1][0, 1][0,1] 之间)尽可能接近真实的标签分布(one-hot 编码)。
- 公式:
对于单个样本,真实标签 y∈{0,1}y \in \{0, 1\}y∈{0,1},模型预测概率 p^∈[0,1]\hat{p} \in [0, 1]p^∈[0,1]:
L(y,p^)=−(ylog(p^)+(1−y)log(1−p^)) L(y, \hat{p}) = -(y \log(\hat{p}) + (1 - y) \log(1 - \hat{p})) L(y,p^)=−(ylog(p^)+(1−y)log(1−p^))
对于 NNN 个样本的平均损失:
BCE=−1N∑i=1N[yilog(p^i)+(1−yi)log(1−p^i)] BCE = -\frac{1}{N} \sum_{i=1}^{N} [y_i \log(\hat{p}_i) + (1 - y_i) \log(1 - \hat{p}_i)] BCE=−N1i=1∑N[yilog(p^i)+(1−yi)log(1−p^i)]
当 y=1y=1y=1 时,损失为 −log(p^)-\log(\hat{p})−log(p^),我们希望 p^\hat{p}p^ 接近1;当 y=0y=0y=0 时,损失为 −log(1−p^)-\log(1-\hat{p})−log(1−p^),我们希望 p^\hat{p}p^ 接近0。 - 性质:
- 凸性: 对于逻辑回归模型,BCE 是凸函数。
- 可微性: 处处可微,梯度良好。
- 惩罚性: 当预测概率与真实标签偏离越大时,损失值呈指数级增长。例如,如果真实标签是1,但模型预测概率是0.001,−log(0.001)-\log(0.001)−log(0.001) 将是一个非常大的正数。
- 优点:
- 与最大似然估计原理一致,具有很好的统计学基础。
- 对预测值是概率的分类模型非常适用。
- 鼓励模型输出的概率与真实标签匹配。
- 收敛稳定,广泛应用于各种二分类任务。
- 缺点:
- 对类别不平衡问题敏感:如果某个类别样本数量远少于另一个类别,模型可能倾向于预测多数类别,导致少数类别的表现不佳。
- 应用场景:
- 逻辑回归(Logistic Regression)。
- 二分类神经网络的输出层(通常与 Sigmoid 激活函数结合)。
- 垃圾邮件检测、疾病诊断(是/否)、用户点击预测等。
3.1.2 合页损失 (Hinge Loss)
- 原理: 合页损失主要用于支持向量机(Support Vector Machines, SVMs)或类似的最大间隔分类器。它的目标是使分类边界与样本之间存在一个安全间隔。它惩罚被错误分类的样本,以及那些虽然分类正确但离决策边界太近的样本。
- 公式:
对于单个样本,真实标签 y∈{−1,1}y \in \{-1, 1\}y∈{−1,1}(注意这里标签是 -1 和 1),模型输出的原始分数 sss(而不是概率):
L(y,s)=max(0,1−y⋅s) L(y, s) = \max(0, 1 - y \cdot s) L(y,s)=max(0,1−y⋅s)
其中 y⋅sy \cdot sy⋅s 代表了模型输出分数与真实标签的符号一致性。- 如果 y⋅s≥1y \cdot s \ge 1y⋅s≥1,表示分类正确且距离决策边界足够远(间隔为1或更大),损失为0。
- 如果 y⋅s<1y \cdot s < 1y⋅s<1,表示分类错误或离决策边界太近,损失为 1−y⋅s1 - y \cdot s1−y⋅s,损失值会随着 y⋅sy \cdot sy⋅s 的减小而线性增加。
- 性质:
- 非处处可微: 在 y⋅s=1y \cdot s = 1y⋅s=1 处不可微(但次梯度存在,不影响优化)。
- 凸性: 对于线性模型,Hinge Loss 是凸函数。
- 稀疏性: 由于损失为0的区域存在,它鼓励模型找到一个稀疏的解(即只有支持向量影响决策边界),这在 SVM 中非常重要。
- 优点:
- 支持最大间隔分类,理论基础扎实。
- 对异常值相对不敏感,因为它关注的是间隔,而不是精确的概率。
- 对于处理线性可分或近似线性可分的数据集表现良好。
- 缺点:
- 对概率输出不敏感,直接应用于神经网络时通常不与 Sigmoid/Softmax 结合。
- 不适用于直接衡量模型的置信度。
- 应用场景:
- 支持向量机(SVM)。
- 一些最大间隔分类器。
- 在处理一些分类边界明确,且不需要精确概率输出的二分类问题。
3.2 多分类损失函数 (Multi-Class Classification Loss Functions)
多分类问题预测样本属于三个或更多类别中的哪一个。
3.2.1 交叉熵损失 (Cross-Entropy Loss / Categorical Cross-Entropy Loss, CCE)
- 原理: 交叉熵损失是二元交叉熵向多分类问题的泛化。它衡量真实类别分布(通常是 one-hot 编码)与模型预测的类别概率分布(通常通过 Softmax 激活函数得到)之间的差异。
- 公式:
对于单个样本,真实标签 yyy 是一个 one-hot 向量,如 [0,0,1,0][0, 0, 1, 0][0,0,1,0],模型预测概率 p^\hat{p}p^ 是一个概率分布向量,如 [0.1,0.2,0.6,0.1][0.1, 0.2, 0.6, 0.1][0.1,0.2,0.6,0.1]。
L(y,p^)=−∑k=1Kyklog(p^k) L(y, \hat{p}) = - \sum_{k=1}^{K} y_k \log(\hat{p}_k) L(y,p^)=−k=1∑Kyklog(p^k)
其中 KKK 是类别总数,yky_kyk 是真实标签向量的第 kkk 个元素(0 或 1),p^k\hat{p}_kp^k 是模型预测属于第 kkk 类的概率。由于 yky_kyk 只有一个为1,其余为0,所以上式简化为:
L(y,p^)=−log(p^true_class) L(y, \hat{p}) = - \log(\hat{p}_{\text{true\_class}}) L(y,p^)=−log(p^true_class)
对于 NNN 个样本的平均损失:
CCE=−1N∑i=1N∑k=1Kyiklog(p^ik) CCE = -\frac{1}{N} \sum_{i=1}^{N} \sum_{k=1}^{K} y_{ik} \log(\hat{p}_{ik}) CCE=−N1i=1∑Nk=1∑Kyiklog(p^ik) - 性质:
- 可微性: 处处可微,梯度良好。
- 凸性: 对于逻辑回归的泛化形式(多项逻辑回归),CCE 是凸函数。
- 惩罚性: 当模型对正确类别的预测概率越低时,损失值越大。
- 优点:
- 与最大似然估计一致,具有坚实的统计学基础。
- 适用于大部分多分类任务,鼓励模型输出的概率分布与真实标签匹配。
- 在深度学习中广泛应用,与 Softmax 激活函数是天作之合。
- 缺点:
- 与 BCE 类似,对类别不平衡问题敏感,可能导致模型偏向于多数类别。
- 对硬标签(one-hot 编码)敏感,可能使得模型过于自信,即对正确类别输出极高的概率,对错误类别输出极低的概率,这可能在标签不准确或存在噪声时导致过拟合。
- 应用场景:
- 图像分类(ImageNet 等)。
- 自然语言处理中的文本分类、序列标注。
- 几乎所有需要预测离散类别的深度学习模型。
深入探究:交叉熵损失的本质——信息论与最大似然估计
要真正理解交叉熵损失为何在分类问题中如此有效,我们需要追溯其数学根源——信息论和最大似然估计。
3.3.1 信息论基础:熵与信息量
在信息论中,我们关注的是信息的量化。一个事件发生的信息量,与该事件发生的概率成反比。事件越稀有、越出乎意料,它所包含的信息量就越大。
-
自信息 (Self-Information):
对于一个离散随机变量 XXX,当其取值为 xxx 时,所包含的自信息量定义为:
I(x)=−logbP(x) I(x) = -\log_b P(x) I(x)=−logbP(x)
其中 P(x)P(x)P(x) 是事件 xxx 发生的概率,bbb 是对数的底数,通常取2(单位为比特,bits)或 eee(单位为纳特,nats)。- 解释:
- 如果事件 P(x)=1P(x)=1P(x)=1,表示事件必然发生,信息量 I(x)=−log(1)=0I(x) = -\log(1) = 0I(x)=−log(1)=0。没有惊喜,没有信息。
- 如果事件 P(x)→0P(x) \to 0P(x)→0,表示事件几乎不可能发生,信息量 I(x)→∞I(x) \to \inftyI(x)→∞。极度惊喜,信息量巨大。
- 解释:
-
熵 (Entropy / Shannon Entropy):
熵是自信息量的期望,它衡量了整个概率分布的平均不确定性。
对于一个离散随机变量 XXX,其概率分布为 P(X)P(X)P(X),熵定义为:
H(P)=EX∼P[I(X)]=−∑xP(x)logbP(x) H(P) = E_{X \sim P}[I(X)] = -\sum_{x} P(x) \log_b P(x) H(P)=EX∼P[I(X)]=−x∑P(x)logbP(x)- 解释: 熵值越大,表示随机变量的不确定性越大,越“随机”;熵值越小,表示随机变量的确定性越高,越“有序”。例如,一个均匀分布的随机变量具有最大的熵,而一个确定性事件(概率为1)的熵为0。
- 在机器学习的分类任务中,真实标签的分布(通常是 One-Hot 编码)具有最低的熵(因为对于每个样本,真实类别是确定的)。
3.3.2 交叉熵 (Cross-Entropy):衡量两个分布的差异
-
定义: 交叉熵是衡量两个概率分布 PPP 和 QQQ 之间差异的指标。它表示使用模型预测的概率分布 QQQ 来编码(描述)真实概率分布 PPP 时所需的平均比特数。
H(P,Q)=EX∼P[−logbQ(X)]=−∑xP(x)logbQ(x) H(P, Q) = E_{X \sim P}[-\log_b Q(X)] = -\sum_{x} P(x) \log_b Q(x) H(P,Q)=EX∼P[−logbQ(X)]=−x∑P(x)logbQ(x)- 解释:
- PPP 代表真实(目标)概率分布,是我们想要模型学习的。
- QQQ 代表模型预测的概率分布。
- 当 PPP 和 QQQ 完全相同时,H(P,Q)H(P, Q)H(P,Q) 达到最小值,且等于 H(P)H(P)H(P)(真实分布的熵)。
- 当 PPP 和 QQQ 差异越大时,H(P,Q)H(P, Q)H(P,Q) 值越大。
- 解释:
-
为什么在分类中使用交叉熵?
在分类任务中,真实标签通常是 One-Hot 编码的。例如,对于一个三分类问题,如果样本的真实类别是第2类,那么其真实概率分布 PPP 可以表示为 [0,1,0][0, 1, 0][0,1,0]。模型预测的概率分布 QQQ 可能是 [0.1,0.7,0.2][0.1, 0.7, 0.2][0.1,0.7,0.2]。
此时,交叉熵计算为:
H(P,Q)=−(0⋅logQ1+1⋅logQ2+0⋅logQ3)=−logQ2 H(P, Q) = -(0 \cdot \log Q_1 + 1 \cdot \log Q_2 + 0 \cdot \log Q_3) = -\log Q_2 H(P,Q)=−(0⋅logQ1+1⋅logQ2+0⋅logQ3)=−logQ2
这与我们之前看到的单样本交叉熵公式 L(y,p^)=−log(p^true_class)L(y, \hat{p}) = -\log(\hat{p}_{\text{true\_class}})L(y,p^)=−log(p^true_class) 完全一致!这意味着,交叉熵损失只关心模型对真实类别的预测概率。它鼓励模型将真实类别的预测概率推向1,同时将其他类别的预测概率推向0。
3.3.3 KL 散度 (Kullback-Leibler Divergence):信息增益或相对熵
KL 散度是衡量一个概率分布 QQQ 与另一个概率分布 PPP 之间的差异程度的非对称度量。它也被称为信息增益。
-
定义:
DKL(P∣∣Q)=∑xP(x)logbP(x)Q(x) D_{KL}(P || Q) = \sum_{x} P(x) \log_b \frac{P(x)}{Q(x)} DKL(P∣∣Q)=x∑P(x)logbQ(x)P(x)
也可以写作:
DKL(P∣∣Q)=EX∼P[logP(X)−logQ(X)]=H(P,Q)−H(P) D_{KL}(P || Q) = E_{X \sim P}[\log P(X) - \log Q(X)] = H(P, Q) - H(P) DKL(P∣∣Q)=EX∼P[logP(X)−logQ(X)]=H(P,Q)−H(P)- 性质:
- 非负性: DKL(P∣∣Q)≥0D_{KL}(P || Q) \ge 0DKL(P∣∣Q)≥0。当且仅当 P=QP=QP=Q 时,DKL(P∣∣Q)=0D_{KL}(P || Q) = 0DKL(P∣∣Q)=0。
- 非对称性: DKL(P∣∣Q)≠DKL(Q∣∣P)D_{KL}(P || Q) \ne D_{KL}(Q || P)DKL(P∣∣Q)=DKL(Q∣∣P)。这意味着从 PPP 到 QQQ 的散度不等于从 QQQ 到 PPP 的散度。
- 不是距离: 因为它不满足对称性和三角不等式,所以严格来说它不是一个“距离”度量。
- 性质:
-
KL 散度与交叉熵的关系:
从 DKL(P∣∣Q)=H(P,Q)−H(P)D_{KL}(P || Q) = H(P, Q) - H(P)DKL(P∣∣Q)=H(P,Q)−H(P) 可以看出,最小化交叉熵 H(P,Q)H(P, Q)H(P,Q) 与最小化 KL 散度 DKL(P∣∣Q)D_{KL}(P || Q)DKL(P∣∣Q) 是等价的,前提是真实分布的熵 H(P)H(P)H(P) 是一个常数。在分类任务中,由于真实标签 PPP 是固定的(或者说对于每个样本是确定性的 One-Hot 向量),其熵 H(P)H(P)H(P) 也是固定的(通常为0),因此:
minH(P,Q) ⟺ min(DKL(P∣∣Q)+H(P)) ⟺ minDKL(P∣∣Q) \min H(P, Q) \iff \min (D_{KL}(P || Q) + H(P)) \iff \min D_{KL}(P || Q) minH(P,Q)⟺min(DKL(P∣∣Q)+H(P))⟺minDKL(P∣∣Q)
这解释了为什么交叉熵可以用来度量模型预测分布与真实分布之间的差异。当交叉熵最小化时,KL 散度也最小化,意味着模型预测的分布 QQQ 最接近真实分布 PPP。 -
KL 散度在 VAE 中的应用:
在变分自编码器(VAE)中,KL 散度被用于正则化损失(第二项)。它衡量了编码器输出的潜在变量分布 qϕ(z∣x)q_\phi(z|x)qϕ(z∣x)(近似后验)与预设的先验分布 p(z)p(z)p(z) 之间的差异。通过最小化 DKL(qϕ(z∣x)∣∣p(z))D_{KL}(q_\phi(z|x) || p(z))DKL(qϕ(z∣x)∣∣p(z)),我们鼓励编码器学习到的潜在空间分布与预设的简单分布(如标准正态分布)相似,从而使得潜在空间更平滑、连续和可采样,有助于生成高质量的新样本。
3.3.4 最大似然估计 (Maximum Likelihood Estimation, MLE)
最大似然估计是一种统计方法,用于估计给定观测数据的概率分布参数。其核心思想是:找到一组参数,使得在这些参数下,观测到当前数据的可能性(即似然)最大。
-
基本原理:
假设我们有一个数据集 D={(x1,y1),…,(xN,yN)}D = \{(x_1, y_1), \dots, (x_N, y_N)\}D={(x1,y1),…,(xN,yN)},并且我们假设 yiy_iyi 是由某个概率模型 P(Y∣X;θ)P(Y|X; \theta)P(Y∣X;θ) 生成的,其中 θ\thetaθ 是模型的参数。
似然函数 L(θ)L(\theta)L(θ) 定义为在给定参数 θ\thetaθ 的情况下,观察到整个数据集的联合概率:
L(θ)=P(D∣θ)=∏i=1NP(yi∣xi;θ) L(\theta) = P(D|\theta) = \prod_{i=1}^{N} P(y_i|x_i; \theta) L(θ)=P(D∣θ)=i=1∏NP(yi∣xi;θ)
我们的目标是找到 θ∗\theta^*θ∗ 使得 L(θ)L(\theta)L(θ) 最大化。
为了计算方便(乘积容易下溢,且对数可以把乘法变加法),我们通常最大化对数似然函数:
logL(θ)=∑i=1NlogP(yi∣xi;θ) \log L(\theta) = \sum_{i=1}^{N} \log P(y_i|x_i; \theta) logL(θ)=i=1∑NlogP(yi∣xi;θ)
最大化对数似然函数等价于最小化负对数似然函数:
min(−logL(θ))=min(−∑i=1NlogP(yi∣xi;θ)) \min (-\log L(\theta)) = \min \left( -\sum_{i=1}^{N} \log P(y_i|x_i; \theta) \right) min(−logL(θ))=min(−i=1∑NlogP(yi∣xi;θ)) -
MLE 与交叉熵的连接:
对于分类问题,假设模型输出的是类别概率 p^k=P(Y=k∣xi;θ)\hat{p}_k = P(Y=k|x_i; \theta)p^k=P(Y=k∣xi;θ)。真实标签 yiy_iyi 是 One-Hot 向量,例如 yi=[0,…,1,…,0]y_i = [0, \dots, 1, \dots, 0]yi=[0,…,1,…,0](第 k∗k^*k∗ 位为1)。
则对于单个样本 (xi,yi)(x_i, y_i)(xi,yi),其真实类别为 k∗k^*k∗ 的概率就是模型预测的 p^k∗\hat{p}_{k^*}p^k∗。
根据最大似然估计,我们希望最大化 P(yi∣xi;θ)P(y_i|x_i; \theta)P(yi∣xi;θ)。由于 yiy_iyi 是 One-Hot 编码,我们可以把 P(yi∣xi;θ)P(y_i|x_i; \theta)P(yi∣xi;θ) 写成:
P(yi∣xi;θ)=∏k=1K(p^ik)yik P(y_i|x_i; \theta) = \prod_{k=1}^{K} (\hat{p}_{ik})^{y_{ik}} P(yi∣xi;θ)=k=1∏K(p^ik)yik
其中,只有真实类别 k∗k^*k∗ 对应的 yik∗y_{ik^*}yik∗ 为1,其余 yiky_{ik}yik 为0。所以这个乘积实际上就是 p^i,true_class\hat{p}_{i, \text{true\_class}}p^i,true_class。
因此,负对数似然函数为:
−logP(yi∣xi;θ)=−log(∏k=1K(p^ik)yik)=−∑k=1Kyiklog(p^ik) -\log P(y_i|x_i; \theta) = -\log \left( \prod_{k=1}^{K} (\hat{p}_{ik})^{y_{ik}} \right) = -\sum_{k=1}^{K} y_{ik} \log(\hat{p}_{ik}) −logP(yi∣xi;θ)=−log(k=1∏K(p^ik)yik)=−k=1∑Kyiklog(p^ik)
这正是交叉熵损失的定义!- 总结: 在分类任务中,最小化交叉熵损失函数,等价于最大化模型在训练数据上的对数似然,或者等价于最小化模型预测概率分布与真实概率分布之间的 KL 散度。这意味着通过最小化交叉熵,模型被训练去学习一个概率分布,使其能够以尽可能高的概率预测出训练样本的真实类别。
3.3.5 交叉熵损失的梯度(以多分类为例)
理解梯度对于深度学习中的反向传播至关重要。让我们看看带有 Softmax 激活函数的交叉熵损失的梯度。
假设模型的最后一层输出是 logits 向量 z=[z1,z2,…,zK]z = [z_1, z_2, \dots, z_K]z=[z1,z2,…,zK]。
通过 Softmax 激活函数,得到预测概率 p^k=ezk∑j=1Kezj\hat{p}_k = \frac{e^{z_k}}{\sum_{j=1}^{K} e^{z_j}}p^k=∑j=1Kezjezk。
真实标签 yyy 是 One-Hot 编码,yky_kyk 为1表示真实类别为 kkk,否则为0。
单个样本的交叉熵损失为:
L=−∑k=1Kyklog(p^k)
L = -\sum_{k=1}^{K} y_k \log(\hat{p}_k)
L=−k=1∑Kyklog(p^k)
我们需要计算损失 LLL 对 logits zjz_jzj 的梯度 ∂L∂zj\frac{\partial L}{\partial z_j}∂zj∂L。
首先,利用链式法则:
∂L∂zj=∑m=1K∂L∂p^m∂p^m∂zj
\frac{\partial L}{\partial z_j} = \sum_{m=1}^{K} \frac{\partial L}{\partial \hat{p}_m} \frac{\partial \hat{p}_m}{\partial z_j}
∂zj∂L=m=1∑K∂p^m∂L∂zj∂p^m
-
计算 ∂L∂p^m\frac{\partial L}{\partial \hat{p}_m}∂p^m∂L:
∂L∂p^m=−∑k=1Kyk∂∂p^m(logp^k)=−ym1p^m \frac{\partial L}{\partial \hat{p}_m} = -\sum_{k=1}^{K} y_k \frac{\partial}{\partial \hat{p}_m} (\log \hat{p}_k) = -y_m \frac{1}{\hat{p}_m} ∂p^m∂L=−k=1∑Kyk∂p^m∂(logp^k)=−ymp^m1 -
计算 ∂p^m∂zj\frac{\partial \hat{p}_m}{\partial z_j}∂zj∂p^m:
Softmax 函数的偏导数是一个经典的结果:- 当 m=jm=jm=j 时:
∂p^j∂zj=∂∂zj(ezj∑l=1Kezl)=ezj∑ezl−ezjezj(∑ezl)2=p^j(1−p^j) \frac{\partial \hat{p}_j}{\partial z_j} = \frac{\partial}{\partial z_j} \left( \frac{e^{z_j}}{\sum_{l=1}^{K} e^{z_l}} \right) = \frac{e^{z_j} \sum e^{z_l} - e^{z_j} e^{z_j}}{(\sum e^{z_l})^2} = \hat{p}_j (1 - \hat{p}_j) ∂zj∂p^j=∂zj∂(∑l=1Kezlezj)=(∑ezl)2ezj∑ezl−ezjezj=p^j(1−p^j) - 当 m≠jm \ne jm=j 时:
∂p^m∂zj=∂∂zj(ezm∑l=1Kezl)=0⋅∑ezl−ezmezj(∑ezl)2=−p^mp^j \frac{\partial \hat{p}_m}{\partial z_j} = \frac{\partial}{\partial z_j} \left( \frac{e^{z_m}}{\sum_{l=1}^{K} e^{z_l}} \right) = \frac{0 \cdot \sum e^{z_l} - e^{z_m} e^{z_j}}{(\sum e^{z_l})^2} = -\hat{p}_m \hat{p}_j ∂zj∂p^m=∂zj∂(∑l=1Kezlezm)=(∑ezl)20⋅∑ezl−ezmezj=−p^mp^j
所以,∂p^m∂zj=p^m(δmj−p^j)\frac{\partial \hat{p}_m}{\partial z_j} = \hat{p}_m (\delta_{mj} - \hat{p}_j)∂zj∂p^m=p^m(δmj−p^j),其中 δmj\delta_{mj}δmj 是 Kronecker delta(当 m=jm=jm=j 时为1,否则为0)。
- 当 m=jm=jm=j 时:
-
将两部分代入链式法则:
∂L∂zj=∑m=1K(−ym1p^m)(p^m(δmj−p^j)) \frac{\partial L}{\partial z_j} = \sum_{m=1}^{K} \left( -y_m \frac{1}{\hat{p}_m} \right) \left( \hat{p}_m (\delta_{mj} - \hat{p}_j) \right) ∂zj∂L=m=1∑K(−ymp^m1)(p^m(δmj−p^j))
=∑m=1K(−ym(δmj−p^j)) = \sum_{m=1}^{K} (-y_m (\delta_{mj} - \hat{p}_j)) =m=1∑K(−ym(δmj−p^j))
=−∑m=1Kymδmj+∑m=1Kymp^j = -\sum_{m=1}^{K} y_m \delta_{mj} + \sum_{m=1}^{K} y_m \hat{p}_j =−m=1∑Kymδmj+m=1∑Kymp^j
由于 ymy_mym 只有当 mmm 为真实类别时才为1,其余为0,所以 −∑ymδmj=−yj-\sum y_m \delta_{mj} = -y_j−∑ymδmj=−yj。
同时,∑m=1Kym=1\sum_{m=1}^{K} y_m = 1∑m=1Kym=1 (因为是 One-Hot 编码)。
∂L∂zj=−yj+p^j∑m=1Kym=−yj+p^j⋅1 \frac{\partial L}{\partial z_j} = -y_j + \hat{p}_j \sum_{m=1}^{K} y_m = -y_j + \hat{p}_j \cdot 1 ∂zj∂L=−yj+p^jm=1∑Kym=−yj+p^j⋅1
∂L∂zj=p^j−yj \frac{\partial L}{\partial z_j} = \hat{p}_j - y_j ∂zj∂L=p^j−yj
结论: 损失函数对 Softmax 层输入的 logits 的梯度非常简洁,就是预测概率减去真实标签。这个简洁的梯度使得反向传播非常高效和稳定,是深度学习中广泛采用交叉熵损失的重要原因之一。
3.3.6 稀疏交叉熵损失 (Sparse Categorical Cross-Entropy Loss)
- 原理: 与普通交叉熵损失功能相同,但它的输入是整数编码的类别标签(如0, 1, 2…),而不是 one-hot 编码。在内部,它会自动将整数标签转换为 one-hot 编码后再计算交叉熵。
- 优点:
- 简化了数据预处理:无需手动将整数标签转换为 one-hot 向量,尤其在类别数量巨大时,这可以节省大量内存和计算资源。
- 在 PyTorch 或 TensorFlow 等深度学习框架中,通常有
torch.nn.CrossEntropyLoss
或tf.keras.losses.SparseCategoricalCrossentropy
,它们自动包含了 Softmax 激活和交叉熵计算,并接受整数标签作为输入。
- 缺点: 与 CCE 相同。
- 应用场景:
- 大型多分类问题,如拥有数千个类别的图像分类。
- 当数据集的标签已经以整数形式存在时。
3.3.7 Focal Loss
- 原理: Focal Loss 旨在解决在极端类别不平衡场景下,标准交叉熵损失效果不佳的问题。在这样的场景下,大量易分类的负样本(即模型已经预测得很准确的背景样本)产生的损失累积起来,会淹没少量难分类的正样本(如目标物体)的损失,导致模型倾向于预测多数类别。
Focal Loss 通过引入一个聚焦参数 γ\gammaγ 和一个平衡参数 α\alphaα,动态地调整每个样本的损失权重:- 聚焦机制 (Focusing Mechanism): 对于预测正确的样本,且置信度越高的样本,其损失的权重越小。它通过 (1−pt)γ(1 - p_t)^\gamma(1−pt)γ 项实现。
- 当 ptp_tpt 接近1(易分类样本)时,(1−pt)γ(1 - p_t)^\gamma(1−pt)γ 接近0,损失被大大衰减。
- 当 ptp_tpt 接近0(难分类样本)时,(1−pt)γ(1 - p_t)^\gamma(1−pt)γ 接近1,损失几乎不变。
- γ\gammaγ 越大,这种衰减作用越强,使得模型更专注于难分类样本。
- 平衡机制 (Balancing Mechanism): 通过 αt\alpha_tαt 参数来直接加权正样本或负样本的损失,进一步解决类别不平衡。
- 聚焦机制 (Focusing Mechanism): 对于预测正确的样本,且置信度越高的样本,其损失的权重越小。它通过 (1−pt)γ(1 - p_t)^\gamma(1−pt)γ 项实现。
- 公式:
FL(yt,pt)=−αt(1−pt)γlog(pt) FL(y_t, p_t) = -\alpha_t (1 - p_t)^\gamma \log(p_t) FL(yt,pt)=−αt(1−pt)γlog(pt)
其中:- ptp_tpt 是模型对真实类别的预测概率。如果真实类别是1,则 pt=p^p_t = \hat{p}pt=p^;如果真实类别是0,则 pt=1−p^p_t = 1 - \hat{p}pt=1−p^。
- γ≥0\gamma \ge 0γ≥0 是聚焦参数(focusing parameter)。当 γ=0\gamma = 0γ=0 时,Focal Loss 退化为标准交叉熵。γ\gammaγ 越大,对易分类样本的权重抑制越大。
- αt∈[0,1]\alpha_t \in [0, 1]αt∈[0,1] 是平衡参数,用于进一步平衡正负样本的权重(可选)。例如,对于正样本,αt=α\alpha_t = \alphaαt=α,对于负样本,αt=1−α\alpha_t = 1-\alphaαt=1−α。
- 性质:
- 动态缩放: 损失会根据预测的置信度进行动态缩放。
- 可微性: 处处可微。
- 对不平衡数据鲁棒: 核心优势。
- 优点:
- 有效缓解类别不平衡问题,尤其在目标检测等任务中,背景样本(负样本)远多于目标样本(正样本)。
- 使得模型更专注于学习那些难以区分的样本,提高模型对少数类别的识别能力。
- 缺点:
- 引入了新的超参数 γ\gammaγ 和 αt\alpha_tαt 需要调优。
- 在某些场景下,如果类别不平衡问题不严重,可能效果不如标准交叉熵。
- 应用场景:
- 目标检测(尤其是 One-Stage Detector 如 RetinaNet)。
- 语义分割等计算机视觉任务。
- 任何存在严重类别不平衡的分类问题。
深入探究:强化学习中的损失函数
强化学习(Reinforcement Learning, RL)与监督学习和无监督学习有着本质的区别。在RL中,智能体(Agent)在一个动态的环境中学习,通过试错来最大化其长期累积奖励。RL中的“损失函数”通常不是一个固定的公式,而是与学习目标、算法类型和策略更新方式紧密相关的。它通常是负的预期回报、预测误差或策略梯度。
3.4 强化学习基础:核心概念与目标
在深入探讨损失函数之前,我们首先回顾强化学习的一些核心概念:
- 智能体 (Agent): 学习者和决策者。
- 环境 (Environment): 智能体与之交互的外部世界。
- 状态 (State, sss): 环境在某一时刻的完整描述。
- 动作 (Action, aaa): 智能体在某一状态下可以执行的动作。
- 奖励 (Reward, rrr): 环境对智能体执行动作的反馈信号(标量值),可以是正的(鼓励)或负的(惩罚)。
- 策略 (Policy, π\piπ): 智能体在给定状态下选择动作的规则或概率分布。可以表示为 π(a∣s)=P(At=a∣St=s)\pi(a|s) = P(A_t=a|S_t=s)π(a∣s)=P(At=a∣St=s)。
- 价值函数 (Value Function): 衡量从某个状态开始,或在某个状态下采取某个动作后,未来能获得的预期累积奖励。
- 轨迹 (Trajectory, τ\tauτ): 一个状态-动作-奖励序列,如 (s0,a0,r1,s1,a1,r2,s2,…,sT)(s_0, a_0, r_1, s_1, a_1, r_2, s_2, \dots, s_T)(s0,a0,r1,s1,a1,r2,s2,…,sT)。
- 回报 (Return, GtG_tGt): 从时间步 ttt 开始的所有未来奖励的累积和,通常会打折扣(discounted return)以体现对未来奖励的不确定性或重要性衰减。
Gt=rt+1+γrt+2+γ2rt+3+⋯=∑k=0∞γkrt+k+1 G_t = r_{t+1} + \gamma r_{t+2} + \gamma^2 r_{t+3} + \dots = \sum_{k=0}^{\infty} \gamma^k r_{t+k+1} Gt=rt+1+γrt+2+γ2rt+3+⋯=k=0∑∞γkrt+k+1
其中 γ∈[0,1]\gamma \in [0, 1]γ∈[0,1] 是折扣因子。 - 目标: 学习一个最优策略 π∗\pi^*π∗,使得在任何状态下,都能最大化智能体的预期累积奖励。
3.4.1 价值函数 (Value Functions)
价值函数是强化学习中的核心概念,它们是策略评估和优化的基础。
-
状态价值函数 (State-Value Function, Vπ(s)V^\pi(s)Vπ(s)):
定义为在给定策略 π\piπ 下,从状态 sss 开始的预期回报。
Vπ(s)=Eπ[Gt∣St=s]=Eπ[∑k=0∞γkrt+k+1∣St=s] V^\pi(s) = E_{\pi}[G_t | S_t = s] = E_{\pi}[\sum_{k=0}^{\infty} \gamma^k r_{t+k+1} | S_t = s] Vπ(s)=Eπ[Gt∣St=s]=Eπ[k=0∑∞γkrt+k+1∣St=s]
Vπ(s)V^\pi(s)Vπ(s) 告诉我们,如果从状态 sss 开始并遵循策略 π\piπ,平均而言能获得多少奖励。 -
动作价值函数 (Action-Value Function, Qπ(s,a)Q^\pi(s, a)Qπ(s,a)):
定义为在给定策略 π\piπ 下,从状态 sss 开始,先采取动作 aaa,然后遵循策略 π\piπ 的预期回报。
Qπ(s,a)=Eπ[Gt∣St=s,At=a]=Eπ[∑k=0∞γkrt+k+1∣St=s,At=a] Q^\pi(s, a) = E_{\pi}[G_t | S_t = s, A_t = a] = E_{\pi}[\sum_{k=0}^{\infty} \gamma^k r_{t+k+1} | S_t = s, A_t = a] Qπ(s,a)=Eπ[Gt∣St=s,At=a]=Eπ[k=0∑∞γkrt+k+1∣St=s,At=a]
Qπ(s,a)Q^\pi(s, a)Qπ(s,a) 告诉我们,在状态 sss 采取动作 aaa 会有多好。 -
贝尔曼方程 (Bellman Equations):
价值函数满足递归关系,即贝尔曼方程。它将当前状态的价值与其后续状态的价值联系起来。
对于 Vπ(s)V^\pi(s)Vπ(s):
Vπ(s)=Eπ[Rt+1+γVπ(St+1)∣St=s]=∑aπ(a∣s)∑s′,rp(s′,r∣s,a)[r+γVπ(s′)] V^\pi(s) = E_{\pi}[R_{t+1} + \gamma V^\pi(S_{t+1}) | S_t = s] = \sum_a \pi(a|s) \sum_{s', r} p(s', r|s, a) [r + \gamma V^\pi(s')] Vπ(s)=Eπ[Rt+1+γVπ(St+1)∣St=s]=a∑π(a∣s)s′,r∑p(s′,r∣s,a)[r+γVπ(s′)]
对于 Qπ(s,a)Q^\pi(s, a)Qπ(s,a):
Qπ(s,a)=Eπ[Rt+1+γQπ(St+1,At+1)∣St=s,At=a]=∑s′,rp(s′,r∣s,a)[r+γ∑a′π(a′∣s′)Qπ(s′,a′)] Q^\pi(s, a) = E_{\pi}[R_{t+1} + \gamma Q^\pi(S_{t+1}, A_{t+1}) | S_t = s, A_t = a] = \sum_{s', r} p(s', r|s, a) [r + \gamma \sum_{a'} \pi(a'|s') Q^\pi(s', a')] Qπ(s,a)=Eπ[Rt+1+γQπ(St+1,At+1)∣St=s,At=a]=s′,r∑p(s′,r∣s,a)[r+γa′∑π(a′∣s′)Qπ(s′,a′)]
贝尔曼方程是强化学习算法(特别是价值迭代和Q-learning)的基础。 -
优势函数 (Advantage Function, Aπ(s,a)A^\pi(s, a)Aπ(s,a)):
优势函数衡量在特定状态 sss 下采取某个动作 aaa 比按照当前策略 π\piπ 的平均行为好多少。
Aπ(s,a)=Qπ(s,a)−Vπ(s) A^\pi(s, a) = Q^\pi(s, a) - V^\pi(s) Aπ(s,a)=Qπ(s,a)−Vπ(s)
如果 Aπ(s,a)>0A^\pi(s, a) > 0Aπ(s,a)>0,说明动作 aaa 比平均情况更好;如果 Aπ(s,a)<0A^\pi(s, a) < 0Aπ(s,a)<0,说明动作 aaa 比平均情况更差。优势函数在策略梯度方法中用于衡量动作的好坏,从而指导策略更新。
3.4.2 价值学习方法:Q-Learning 与 DQN
价值学习方法的目标是学习最优的动作价值函数 Q∗(s,a)Q^*(s, a)Q∗(s,a),一旦 Q∗(s,a)Q^*(s, a)Q∗(s,a) 被学习到,最优策略 π∗(s)\pi^*(s)π∗(s) 就可以通过在每个状态下选择 QQQ 值最大的动作来得到:π∗(s)=argmaxaQ∗(s,a)\pi^*(s) = \arg\max_a Q^*(s, a)π∗(s)=argmaxaQ∗(s,a)。
-
Q-Learning (Off-policy, Value Iteration):
Q-learning 是一种无模型(model-free)的离策略(off-policy)时序差分(Temporal-Difference, TD)控制算法。
它使用贝尔曼最优方程(Bellman Optimality Equation)来更新 Q 值:
Q(s,a)←Q(s,a)+α[r+γmaxa′Q(s′,a′)−Q(s,a)] Q(s, a) \leftarrow Q(s, a) + \alpha [r + \gamma \max_{a'} Q(s', a') - Q(s, a)] Q(s,a)←Q(s,a)+α[r+γa′maxQ(s′,a′)−Q(s,a)]
其中 α\alphaα 是学习率,r+γmaxa′Q(s′,a′)r + \gamma \max_{a'} Q(s', a')r+γmaxa′Q(s′,a′) 是 TD 目标,Q(s,a)Q(s, a)Q(s,a) 是当前预测的 Q 值。
Q-Learning 的损失函数:
其隐式目标是最小化 TD 误差 (Temporal Difference Error) 的平方:
δt=rt+1+γmaxa′Q(St+1,a′)−Q(St,At) \delta_t = r_{t+1} + \gamma \max_{a'} Q(S_{t+1}, a') - Q(S_t, A_t) δt=rt+1+γa′maxQ(St+1,a′)−Q(St,At)
损失函数可以看作是:
L(Q)=E[(TDtarget−Q(St,At))2] L(Q) = E[(TD_{target} - Q(S_t, A_t))^2] L(Q)=E[(TDtarget−Q(St,At))2]
这里 TDtarget=rt+1+γmaxa′Q(St+1,a′)TD_{target} = r_{t+1} + \gamma \max_{a'} Q(S_{t+1}, a')TDtarget=rt+1+γmaxa′Q(St+1,a′)。- 性质: Q-learning 可以在不了解环境动态(model-free)的情况下学习最优策略,并且是 off-policy(学习的策略和用于探索的策略可以不同)。
- 局限性: 传统的 Q-learning 使用 Q 表格来存储 Q 值,当状态和动作空间很大时,表格变得不可行。
-
深度Q网络 (Deep Q-Network, DQN):
DQN 将 Q-learning 与深度神经网络相结合,以解决 Q 表格在高维状态空间下的局限性。神经网络被用作 Q 函数的近似器,即 Q(s,a;θ)Q(s, a; \theta)Q(s,a;θ)。
DQN 的损失函数:
DQN 的核心思想是最小化 Q 网络的预测 Q 值与 TD 目标之间的均方误差(MSE)。
L(θ)=E(s,a,r,s′)∼U(D)[(YtQ−Q(s,a;θ))2] L(\theta) = E_{(s, a, r, s') \sim U(D)} \left[ (Y_t^Q - Q(s, a; \theta))^2 \right] L(θ)=E(s,a,r,s′)∼U(D)[(YtQ−Q(s,a;θ))2]
其中,YtQY_t^QYtQ 是 TD 目标 (Target),定义为:
YtQ=r+γmaxa′Q(s′,a′;θtarget) Y_t^Q = r + \gamma \max_{a'} Q(s', a'; \theta_{target}) YtQ=r+γa′maxQ(s′,a′;θtarget)- 重要改进: 为了训练稳定性,DQN 引入了两个关键机制:
- 经验回放 (Experience Replay): 将智能体与环境交互得到的经验 (st,at,rt+1,st+1)(s_t, a_t, r_{t+1}, s_{t+1})(st,at,rt+1,st+1) 存储在回放缓冲区 DDD 中。训练时从 DDD 中随机采样 mini-batch 数据来更新 Q 网络。这打破了数据之间的时序相关性,使得数据更独立同分布,提高了训练稳定性。
- 目标网络 (Target Network): 使用一个独立的、参数滞后的目标网络 Q(⋅,⋅;θtarget)Q(\cdot, \cdot; \theta_{target})Q(⋅,⋅;θtarget) 来计算 TD 目标。目标网络的参数 θtarget\theta_{target}θtarget 会定期从主网络 θ\thetaθ 复制过来,而不是每步更新。这使得 TD 目标更加稳定,减少了训练过程中的振荡。
- 优点: 能够处理高维状态空间,在 Atari 游戏等复杂任务中取得了巨大成功。
- 缺点: 仅限于离散动作空间;依然存在 Q 值过高估计(overestimation)问题。
- 重要改进: 为了训练稳定性,DQN 引入了两个关键机制:
3.4.3 策略学习方法:策略梯度 (Policy Gradient)
策略学习方法直接学习策略 πθ(a∣s)\pi_\theta(a|s)πθ(a∣s),而不需要显式地学习价值函数。策略梯度方法通常基于梯度上升来最大化预期回报。
- REINFORCE (蒙特卡洛策略梯度):
REINFORCE 是最基本的策略梯度算法,它使用蒙特卡洛方法来估计回报。
REINFORCE 的损失函数(负的预期回报):
REINFORCE 旨在最大化预期回报 J(θ)=Eτ∼πθ[G(τ)]J(\theta) = E_{\tau \sim \pi_\theta}[G(\tau)]J(θ)=Eτ∼πθ[G(τ)]。因此,其损失函数是负的预期回报:
L(θ)=−Eτ∼πθ[G(τ)] L(\theta) = - E_{\tau \sim \pi_\theta}[G(\tau)] L(θ)=−Eτ∼πθ[G(τ)]
对这个损失函数求导,得到策略梯度:
∇θJ(θ)=Eτ∼πθ[Gt∇θlogπθ(At∣St)] \nabla_\theta J(\theta) = E_{\tau \sim \pi_\theta}[G_t \nabla_\theta \log \pi_\theta(A_t|S_t)] ∇θJ(θ)=Eτ∼πθ[Gt∇θlogπθ(At∣St)]
在实际中,我们通过采样轨迹来估计梯度,并使用梯度上升更新参数:
θ←θ+αGt∇θlogπθ(At∣St) \theta \leftarrow \theta + \alpha G_t \nabla_\theta \log \pi_\theta(A_t|S_t) θ←θ+αGt∇θlogπθ(At∣St)- 性质: On-policy(需要当前策略生成数据),无模型。
- 优点: 能够学习随机策略,适用于连续动作空间。
- 缺点: 梯度估计的方差很高,导致训练不稳定和收敛慢。
3.4.4 Actor-Critic 方法:A2C / A3C
Actor-Critic 方法结合了价值学习(Critic)和策略学习(Actor)的优点,Critic 学习价值函数来帮助 Actor 学习策略,从而降低策略梯度的方差。
-
核心思想:
- Actor: 一个策略网络 πθ(a∣s)\pi_\theta(a|s)πθ(a∣s),负责学习和选择动作。它通过策略梯度更新。
- Critic: 一个价值网络 Vw(s)V_w(s)Vw(s)(或 Qw(s,a)Q_w(s, a)Qw(s,a)),负责评估 Actor 选择动作的好坏,并提供基线或优势函数来减少策略梯度的方差。它通过价值函数的预测误差更新。
-
A2C (Synchronous Advantage Actor-Critic):
A2C 是 A3C 的同步、单线程版本,更容易理解和实现。
A2C 的损失函数:
A2C 的总损失通常由三部分组成:- 策略损失 (Policy Loss / Actor Loss): 负责更新策略网络。它使用优势函数 AtA_tAt 来加权对数策略概率。我们希望最大化 E[logπθ(a∣s)At]E[\log \pi_\theta(a|s) A_t]E[logπθ(a∣s)At],所以损失是负数:
Lpolicy(θ)=−E[logπθ(At∣St)⋅At] L_{policy}(\theta) = - E[\log \pi_\theta(A_t|S_t) \cdot A_t] Lpolicy(θ)=−E[logπθ(At∣St)⋅At]
其中 At=Rt+γVw(St+1)−Vw(St)A_t = R_t + \gamma V_w(S_{t+1}) - V_w(S_t)At=Rt+γVw(St+1)−Vw(St)(TD 优势估计)。 - 价值损失 (Value Loss / Critic Loss): 负责更新价值网络。它最小化 Critic 预测的价值 Vw(s)V_w(s)Vw(s) 与实际回报(或 TD 目标)之间的误差,通常是 MSE。
Lvalue(w)=E[(Rt+γVw(St+1)−Vw(St))2]或 E[(TDtarget−Vw(St))2] L_{value}(w) = E[(R_t + \gamma V_w(S_{t+1}) - V_w(S_t))^2] \quad \text{或 } E[(TD_{target} - V_w(S_t))^2] Lvalue(w)=E[(Rt+γVw(St+1)−Vw(St))2]或 E[(TDtarget−Vw(St))2] - 熵正则化项 (Entropy Regularization): 鼓励策略探索,防止过早收敛到次优解。它惩罚策略的确定性(即鼓励高熵)。
Lentropy(θ)=−βH(πθ(a∣s))=β∑aπθ(a∣s)logπθ(a∣s) L_{entropy}(\theta) = -\beta H(\pi_\theta(a|s)) = \beta \sum_{a} \pi_\theta(a|s) \log \pi_\theta(a|s) Lentropy(θ)=−βH(πθ(a∣s))=βa∑πθ(a∣s)logπθ(a∣s)
其中 β\betaβ 是一个超参数,控制熵正则化的强度。
总损失函数:
Ltotal(θ,w)=Lpolicy(θ)+C1Lvalue(w)+C2Lentropy(θ) L_{total}(\theta, w) = L_{policy}(\theta) + C_1 L_{value}(w) + C_2 L_{entropy}(\theta) Ltotal(θ,w)=Lpolicy(θ)+C1Lvalue(w)+C2Lentropy(θ)
其中 C1,C2C_1, C_2C1,C2 是超参数,用于平衡各项损失的权重。 - 策略损失 (Policy Loss / Actor Loss): 负责更新策略网络。它使用优势函数 AtA_tAt 来加权对数策略概率。我们希望最大化 E[logπθ(a∣s)At]E[\log \pi_\theta(a|s) A_t]E[logπθ(a∣s)At],所以损失是负数:
-
A3C (Asynchronous Advantage Actor-Critic):
A3C 是 A2C 的异步版本,通过并行运行多个独立的智能体,并在中央模型上异步更新梯度来提高训练效率和稳定性。其损失函数与 A2C 类似,但更新机制是异步的。 -
优点:
- 相比纯策略梯度方法,方差更低,训练更稳定。
- 能够处理连续动作空间和离散动作空间。
- A3C 通过异步训练提高了数据效率和探索能力。
-
缺点:
- 需要同时训练两个网络(Actor 和 Critic),增加了模型复杂性。
- 超参数(如 C1,C2,βC_1, C_2, \betaC1,C2,β)的调优具有挑战性。
3.4.5 近端策略优化 (Proximal Policy Optimization, PPO)
PPO 是目前最流行和性能卓越的强化学习算法之一。它在 Actor-Critic 框架的基础上,通过引入“裁剪”机制来限制策略更新的幅度,从而在保证训练效率的同时,提高策略更新的稳定性。
-
PPO 的目标:
PPO 旨在通过限制新策略与旧策略之间的距离(通过概率比率来衡量),来避免过大的策略更新,这有助于防止训练过程中出现不稳定的跳跃。它优化一个裁剪版的替代目标函数。 -
PPO 的损失函数:
PPO 的总损失同样由策略损失、价值损失和熵正则化组成。其主要创新在于策略损失:- 裁剪策略损失 (Clipped Policy Loss):
LCLIP(θ)=Et[min(rt(θ)At,clip(rt(θ),1−ϵ,1+ϵ)At)] L^{CLIP}(\theta) = E_t \left[ \min(r_t(\theta) A_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) A_t) \right] LCLIP(θ)=Et[min(rt(θ)At,clip(rt(θ),1−ϵ,1+ϵ)At)]
其中:- rt(θ)=πθ(at∣st)πθold(at∣st)r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}rt(θ)=πθold(at∣st)πθ(at∣st) 是新策略 πθ\pi_\thetaπθ 与旧策略 πθold\pi_{\theta_{old}}πθold 下动作概率的比率。
- AtA_tAt 是优势函数(通过 Critic 网络估计)。
- ϵ\epsilonϵ 是裁剪参数(通常为 0.1 或 0.2),它定义了 rt(θ)r_t(\theta)rt(θ) 允许偏离 1 的最大范围。
min
函数和clip
函数的含义: min(r_t(\theta) A_t, \dots)
确保我们总是选择两个选项中较小的一个,从而限制了当 AtA_tAt 为正时策略更新的上限,以及当 AtA_tAt 为负时策略更新的下限。clip(r_t(\theta), 1-\epsilon, 1+\epsilon)
将概率比率 rt(θ)r_t(\theta)rt(θ) 限制在 [1−ϵ,1+ϵ][1-\epsilon, 1+\epsilon][1−ϵ,1+ϵ] 的范围内。- 如果 At>0A_t > 0At>0(动作是好的):我们希望 rt(θ)r_t(\theta)rt(θ) 越大越好(即新策略采取该动作的概率更高),但是一旦 rt(θ)r_t(\theta)rt(θ) 超过 1+ϵ1+\epsilon1+ϵ,就会被裁剪到 1+ϵ1+\epsilon1+ϵ,使得梯度不再进一步增加,从而防止策略更新过大。
- 如果 At<0A_t < 0At<0(动作是坏的):我们希望 rt(θ)r_t(\theta)rt(θ) 越小越好(即新策略采取该动作的概率更低),但是一旦 rt(θ)r_t(\theta)rt(θ) 跌破 1−ϵ1-\epsilon1−ϵ,就会被裁剪到 1−ϵ1-\epsilon1−ϵ,防止策略更新过大。
- 价值损失 (Value Loss): 与 A2C 类似,最小化 Critic 网络预测值与 TD 目标之间的 MSE。
Lvalue(w)=Et[(Vw(St)−(Rt+γVwold(St+1)))2] L_{value}(w) = E_t \left[ (V_w(S_t) - (R_t + \gamma V_{w_{old}}(S_{t+1})))^2 \right] Lvalue(w)=Et[(Vw(St)−(Rt+γVwold(St+1)))2]
或者使用广义优势估计(GAE)的TD目标。 - 熵正则化项 (Entropy Regularization): 与 A2C 类似,用于鼓励探索。
Lentropy(θ)=−βH(πθ(a∣s)) L_{entropy}(\theta) = -\beta H(\pi_\theta(a|s)) Lentropy(θ)=−βH(πθ(a∣s))
PPO 的总损失函数:
Ltotal(θ,w)=−LCLIP(θ)+C1Lvalue(w)+C2Lentropy(θ) L_{total}(\theta, w) = -L^{CLIP}(\theta) + C_1 L_{value}(w) + C_2 L_{entropy}(\theta) Ltotal(θ,w)=−LCLIP(θ)+C1Lvalue(w)+C2Lentropy(θ)
注意 LCLIPL^{CLIP}LCLIP 定义的是目标函数,PPO 实际上是最大化这个目标函数,所以在实际实现中,通常是对其负数进行最小化。 - 裁剪策略损失 (Clipped Policy Loss):
-
性质:
- On-policy: 需要从当前策略采样数据。
- 裁剪机制: 限制策略更新幅度,提高训练稳定性。
- 易于实现: 相对于 Trust Region Policy Optimization (TRPO) 等其他算法,PPO 更容易实现。
- 数据效率: 相对于纯蒙特卡洛策略梯度更高,因为它可以多次使用相同的经验数据(虽然仍然是 on-policy)。
-
优点:
- 稳定性和性能都非常优秀,是业界广泛使用的基线算法,在许多复杂环境中都能取得 SOTA 结果。
- 相对于 A2C/A3C 进一步提升了稳定性,降低了对学习率的敏感度。
- 实现相对简单,且超参数通常具有较好的通用性。
-
缺点:
- 仍然是 on-policy,数据效率相对 off-policy 算法(如 DDPG, SAC)较低。
- 超参数调优仍然是挑战,尤其是 ϵ\epsilonϵ 和 β\betaβ。
3.4.6 强化学习损失的相互关联
- 价值函数是基础: 无论是价值学习(DQN)还是 Actor-Critic 方法(A2C/PPO),价值函数都是核心。DQN 直接学习 Q 值,而 Actor-Critic 利用 Critic 学习 V 值或 Q 值来计算优势函数,从而改进策略梯度估计。
- TD 误差是驱动力: 绝大多数 RL 算法都基于 TD 误差来更新参数。无论是 Q-learning 的 TDtarget−Q(St,At)TD_{target} - Q(S_t, A_t)TDtarget−Q(St,At),还是 Critic 网络的 TDtarget−Vw(St)TD_{target} - V_w(S_t)TDtarget−Vw(St),都是衡量当前预测与未来估计之间差异的度量,这个差异就是损失函数优化方向的来源。
- 策略梯度与价值函数的结合: 纯策略梯度(REINFORCE)方差高,因为它依赖于完整的蒙特卡洛回报。Actor-Critic 方法通过引入价值函数作为基线,用优势函数 AtA_tAt 替代回报 GtG_tGt,大大降低了策略梯度的方差,使得训练更稳定高效。
- 稳定性的演变: 从原始的 Q-learning 和 REINFORCE 到 DQN、A2C/A3C、PPO,强化学习算法的发展历程很大程度上就是围绕如何设计更稳定的损失函数和优化目标。DQN 通过经验回放和目标网络解决 Q 值不稳定性,而 PPO 则通过裁剪策略更新幅度来稳定策略梯度。
- 多目标优化: 现代复杂的强化学习损失函数通常是多项的加权和,包括策略损失、价值损失和熵损失。这反映了多目标优化的思想:不仅要最大化回报,还要稳定训练,并鼓励探索。