深度学习核心之损失函数
概述
损失函数(Loss Function)
是用来衡量模型预测值与真实值之间差异的函数,它是深度学习中的一个重要组成部分,用于评估模型的性能并指导模型的优化过程
损失函数、代价函数、目标函数的关系
- 损失函数(Loss Function):损失函数是用来衡量模型在单个样本上的预测结果与真实标签之间的差异。它是一个标量值,表示模型预测的误差或损失程度。损失函数通常是针对单个样本计算的,例如均方误差(MSE)、交叉熵损失等。在训练过程中,通过最小化损失函数来优化模型参数,使模型的预测结果与真实标签更接近
- 代价函数(Cost Function):代价函数是指整个训练集上的平均损失或误差函数。代价函数是损失函数的求和或平均,用于衡量模型在整个训练集上的预测结果与真实标签之间的总体差异。代价函数通常是在训练过程中使用的,用于计算梯度并更新模型参数
- 目标函数(Objective Function):目标函数是在训练过程中要最小化或最大化的函数,可以是损失函数或代价函数。目标函数是模型训练的目标,通过优化目标函数来调整模型参数,使得模型在训练集上的性能达到最优
定义 | 损失函数(Loss Function) | 代价函数(Cost Function) | 目标函数(Objective Function) |
---|---|---|---|
数据集 | 单个样本 | 整个训练集 | 训练要优化函数 |
在实际应用中,损失函数、代价函数和目标函数这些术语有时会被混用,但它们都涉及到衡量模型的预测结果与真实标签之间的差异,并在训练过程中用于优化模型
损失函数大致可分为两种:回归损失
(针对连续型变量)和分类损失
(针对离散型变量)
具体使用哪个术语取决于上下文和个人偏好,但它们都指向类似的概念
回归损失函数
L1 Loss
L1 Loss
也称为Mean Absolute Error
,即平均绝对误差(MAE),公式定义为
优点: 对离群点(Outliers)或者异常值更具有鲁棒性
缺点: 由图可知其在0点处的导数不连续,使得求解效率低下,导致收敛速度慢;对于较小的损失值,其梯度也同其他区间损失值的梯度一样大,所以不利于网络的学习
模型预测与真实值之间的误差服从拉普拉斯分布Laplace distribution
可以在一定的假设下通过最大化似然可以得到MAE损失的形式,假设模型预测与真实值之间的误差服从拉普拉斯分布
Laplace distribution ,则给定一个输入,模型输出真实值的概率为
对其求对数可以得到的负对数似然实际上就是MAE损失的形式
L2 Loss
L2 Loss
也称为Mean Squred Error
,即均方差(MSE),它衡量的是预测值与真实值之间距离的平方和
优点: 收敛速度快,能够对梯度给予合适的惩罚权重,而不是一视同仁,使梯度更新的方向可以更加精确
缺点: 对异常值十分敏感,梯度更新的方向很容易受离群点所主导,不具备鲁棒性,假如我们训练数据中存在较大的异常值,此时我们将会有一个巨大的权重更新,这有可能会使模型失去平衡
在模型输出与真实值的误差服从高斯分布的假设下,最小化均方差损失函数与极大似然估计本质上是一致的
MSE假设了误差服从高斯分布
,在高斯分布假设下,可以使用最大化似然得到均方差损失的形式,假设模型预测与真实值之间的误差服从标准高斯分布,则给定一个输入,模型输出真实值的概率为
进一步我们假设数据集中个样本点之间相互独立,则给定所有输出所有真实值的概率,即似然Likelihood为所有的累乘
通常为了计算方便,我们通常最大化对数似然Log-Likelihood
去掉与无关的第一项,然后转化为最小化负对数似然Negative Log-Likelihood
可以看到这个实际上就是均方差损失的形式,也就是说在模型输出与真实值的误差服从高斯分布的假设下,最小化均方差损失函数与极大似然估计本质上是一致的
因此在这个假设能被满足的场景中(比如回归),均方差损失是一个很好的损失函数选择
当这个假设没能被满足的场景中(比如分类),均方差损失不是一个好的选择
MAE和MSE作为损失函数的主要区别是
MSE损失相比MAE通常可以更快地收敛
当使用梯度下降算法时,MSE的梯度为,而MAE损失的梯度为,即MSE的梯度的scale会随误差大小变化,而MAE的梯度的scale则一直保持为1,即便在绝对误差很小的时候,MAE的梯度scale也同样为1,这实际上是非常不利于模型的训练的
当然你可以通过在训练过程中动态调整学习率缓解这个问题,但是总的来说,损失函数梯度之间的差异导致了MSE在大部分时候比MAE收敛地更快,这也是MSE更为流行的原因
MAE损失对于outlier更加健壮,即更加不易受到outlier影响,当误差非常大的时候,MSE损失会远远大于MAE损失
MSE假设了误差服从
高斯分布
,MAE假设了误差服从拉普拉斯分布
,拉普拉斯分布本身对于outlier更加robust
适用场景
Smooth L1 Loss
Smooth L1 Loss
即平滑的L1损失(SLL)
,出自Fast RCNN,也称为SLL,Smooth L1 loss也具备了L1 loss和L2 loss各自的优点,本质就是L1和L2的组合
Huber Loss
Huber Loss
是一种类似于Smooth L1 Loss的损失函数,它也能够平衡L2范数和L1范数之间的权衡
Huber loss和Smooth L1 loss具有相同的曲线走势,当Huber loss中的δ等于1时,Huber loss等价于Smooth L1 loss
对于Huber损失来说,的选择十分重要,它决定了模型处理局外点的行为。当残差大于时使用L1损失,很小时则使用更为合适的L2损失来进行优化
优点
零点导数连续: Huber损失函数克服了MAE和MSE的缺点,不仅可以保持损失函数具有连续的导数
解决离群点梯度爆炸的问题: 利用MSE梯度随误差减小的特性来得到更精确的最小值,也对局外点具有更好的鲁棒性
但Huber损失函数的良好表现得益于精心训练的超参数,当趋向于0时它就退化成了MAE,而当趋向于无穷时则退化为了MSE
Quantile Loss
分位数回归Quantile Regression
是一类在实际应用中非常有用的回归算法,通常的回归算法是拟合目标值的期望或者中位数,而分位数回归可以通过给定不同的分位点,拟合目标值的不同分位数
IoU Loss
分类损失函数
Binary Cross Entropy
对于分类问题,最常用的损失函数是交叉熵损失函数Cross Entropy Loss
考虑二分类,在二分类中我们通常使用Sigmoid函数将模型的输出压缩到区间内,用来代表给定输入,模型判断为正类的概率
由于只有正负两类, 因此同时也得到了负类的概率
将两条式子合并成一条
假设数据点之间独立同分布,则似然可以表示为
对似然取对数,然后加负号变成最小化负对数似然,即为交叉熵损失函数的形式
可视化
下图是对二分类的交叉熵损失函数的可视化,蓝线是目标值为0时输出不同输出的损失,黄线是目标值为1时的损失
可以看到约接近目标值损失越小,随着误差变差,损失呈指数增长
图中蓝线
是的图线,此时损失函数变为
图中黄线
是的图线,此时损失函数变为
从图形中我们可以发现:预测输出与差得越多,的值越大,也就是说对当前模型的惩罚越大,而且是非线性增大,是一种类似指数增长的级别
这是由log函数本身的特性所决定的,这样的好处是模型会倾向于让预测输出更接近真实样本标签
Cross Entropy Loss
在多分类的任务中,交叉熵损失函数的推导思路和二分类是一样的,变化的地方主要有两个
- 维度变化: 真实值现在是一个one-hot向量
- 激活函数: 模型输出的最后的激活函数由原来的Sigmoid函数换成Softmax函数
为什么分类用交叉熵损失,而不是均方差损失
均方差损失实际上均方差损失假设了误差服从高斯分布,在分类任务下这个假设没办法被满足,因此效果会很差
为什么是交叉熵损失呢? 有两个角度可以解释这个事情,一个角度从最大似然
的角度,另一个角度是可以用信息论
来解释交叉熵损失
最大似然角度
Softmax函数将每个维度的输出范围都限定在之间,同时所有维度的输出和为1,用于表示一个概率分布
其中表示个类别中的一类,同样的假设数据点之间独立同分布,可得到负对数似然为
由于是一个one-hot向量,除了目标类为1之外其他类别上的输出都为0,因此上式也可以写为
其中是样本的目标类。通常这个应用于多分类的交叉樀损失函数也被称为Softmax Loss
或者Categorical Cross Entropy Loss
信息论角度
假设对于样本存在一个最优分布真实地表明了这个样本属于各个类别的概率,那么我们希望模型的输出尽可能地逼近这个最优分布
在信息论中,我们可以使用KL散度(Kullback-Leibler Divergence)
来衡量两个分布的相似性
给定分布和分布,两者的KL散度公式如下
其中第一项为分布的信息熵,第二项为分布和的交叉熵。将最优分布和输出分布带入和得到
由于我们希望两个分布尽量相近,因此我们最小化KL散度。同时由于上式第一项信息熵仅与最优分布本身相关,因此我们在最小化的过程中可以忽略掉,变成最小化
我们并不知道最优分布,但训练数据里面的目标值可以看做是的一个近似分布
这个是针对单个训练样本的损失函数,如果考虑整个数据集,则
可以看到通过最小化交叉嫡的角度推导出来的结果和使用最大化似然得到的结果是一致的
Hinge Loss
合页损失Hinge Loss
是另外一种二分类损失函数,适用于maximum-margin的分类,支持向量机Support Vector Machine (SVM)模型的损失函数本质上就是Hinge Loss + L2正则化
下图是为正类,即时,不同输出的合页损失示意图
可以看到当为正类时,模型输出负值会有较大的惩罚,当模型输出为正值且在区间时还会有一个较小的惩罚
即合页损失不仅惩罚预测错的,并且对于预测对了但是置信度不高的也会给一个惩罚,只有置信度高的才会有零损失
使用合页损失直觉上理解是要找到一个决策边界,使得所有数据点被这个边界正确地、高置信地被分类
Focal Loss
Focal Loss for Dense Object Detection 2018
Focal loss
损失函数是为了解决one-stage目标检测中正负样本极度不平衡的问题,由何恺明(Kaiming He)团队提出
Focal loss是基于BCE(二分类交叉熵)的。它是一个动态缩放的交叉熵损失,通过一个动态缩放因子,可以动态降低训练过程中易区分样本的权重,从而将重心快速聚焦在那些难区分的样本(有可能是正样本,也有可能是负样本,但都是对训练网络有帮助的样本)
正负样本不平衡(Class Imbalance)
在一张图像中能够匹配到目标的候选框(正样本)个数一般只有十几个或几十个,而没有匹配到的候选框(负样本)则有10000~100000个
这么多的负样本不仅对训练网络起不到什么作用,反而会淹没掉少量但有助于训练的样本
Focal loss是为了解决一阶段目标检测模型,那为什么二阶段不用解决
在two-stage中分了两步,第一步时同样也会生成许多的负样本以及很少的正样本,但到第二步时,它会在第一步的基础上选取特定数量的正负样本去检测,所以正负样本并不会特别不平衡,二阶段模型还可以采用更复杂的采样策略
和hard negative mining (难例挖掘)
等方法来处理样本不平衡和难易样本的问题,因此对于二阶段目标检测模型来说,Focal Loss的优势可能相对较小
引出Focal loss
为了方便接下来的描述,这里先定义为
此时cross entropy可以定义为
解决类别不平衡的常见方法是为类别1引入一个权重因子,而对于类别非1引入权重因子,这里引出Balanced Cross Entropy(平衡交叉熵)
在论文实验中显示,密集检测器训练过程中遇到的类别不平衡问题使得交叉熵损失失去了效果,易于分类的负样本占据了大部分损失并主导了梯度
虽然平衡了正样本和负样本的重要性,但它无法区分易于和困难的样本
因此,论文提出了新的损失函数以减小易于样本的权重,从而将训练的重点放在困难的负样本上,更具体地说,论文提出在交叉熵损失中添加一个调制因子
,其中是可调的Focal参数
。我们将这个损失函数称为Focal loss
,定义Focal Loss公式如下
其中作用是调节难易,较小的值会使得易样本的损失权重下降更慢,而较大的值则会加速易样本的损失权重下降
而作用是平衡正负样(正负样本数量不均衡),当接近0时,负样本的损失贡献被放大,从而平衡了正负样本之间的重要性
通过调整和的值,可以根据具体情况调节模型对不同样本的关注程度,提高模型对难样本的学习和训练效果
可视化
下图可视化了的值,可以观察到
- 增加了分类不准确样本在损失函数中的权重
- 增加了难分样本在损失函数的权重,使得损失函数倾向于难分的样本,有助于提高难分样本的准确度
J{KL} = -\sum{i=0}^{C} y{i} \log \left(\hat{y}{i}\right)-y{i} \log \left(y{i}\right)=\sum{i=0}^{C} y{i}\left(\frac{y{i}}{\hat{y}{i}}\right)
$$
优点:
- 适用于近似复杂的目标分布,如图像
如上所示,KL散度损失是从我们网络预测的交叉熵分布与目标分布的熵之间的差异。它告诉我们模型离期望的分布有多远
那么我们什么情况下使用它
如果我们的任务是生成图像,那么目标分布要复杂得多,在这种情况下,使用KL散度损失的效果最好
正则化技术
L1正则化
在损失函数中添加模型参数的 L1 范数作为正则项。它促使模型参数稀疏化,即将一些参数压缩为零,从而实现特征选择和模型简化
L2正则化
在损失函数中添加模型参数的 L2 范数作为正则项。它对模型参数进行平滑约束,使模型参数值趋向于较小的值,有助于防止过拟合
弹性网正则化
弹性网正则化是 L1 正则化和 L2 正则化的一种结合。它同时对模型参数使用 L1 和 L2 正则化,从而综合考虑了稀疏性
和平滑性
的影响
其他正则
Dropout:Dropout 是一种在训练过程中随机丢弃部分神经元的技术。它可以防止神经网络过拟合,并提高模型的泛化能力。通过在训练过程中以一定概率将部分神经元置零,Dropout 可以强制模型在没有完整神经网络的情况下进行学习
数据增强(Data Augmentation):数据增强是一种通过对训练数据进行随机变换来扩充数据集的技术。常见的数据增强操作包括随机裁剪、旋转、翻转、平移、缩放等。数据增强可以增加训练数据的多样性,提高模型的泛化能力和鲁棒性
图像增强技术:了解常见的图像增强方法,如对比度调整、亮度调整、色彩平衡、直方图均衡化等,以及它们在图像处理和计算机视觉中的应用