什么是损失函数
- 估量模型的预测值f(x)与真实值Y的不一致程度
- 损失函数越小,一般就代表模型的鲁棒性越好
- 损失函数指导模型的学习
分类损失函数
0-1 loss
- 直接比较预测值和真实值是否相等
- 预测和标签相等,值为0(预测很准,loss很小),值为1(预测很不准,loss很大)
- 缺点:无法对x进行求导,所以在深度学习的反向传播中,不能被直接使用(一般用于启发新的loss)
负对数似然损失
- 公式: l o s s ( x , f ( x ) ) = − l o g ( f ( x ) ) loss(x,f(x))=-log(f(x)) loss(x,f(x))=−log(f(x))
- 惩罚预测的概率值小的,激励预测的概率值大的
- 预测的概率值越小,对数log值的值越小(负的越多),加一个负号,就是值越大,那么此时的loss也越大
- pytorch:
torch.nn.NLLLoss
###交叉熵
-
熵:物理学上表示一个热力学系统的无序程度
-
信息熵:
- 信息的量化度量,由香农提出
- 对数函数表示对不确定性的测量
- 熵越高,表示能传输的信息越多,熵越少,表示传输的信息越少。熵 =>信息量
- 原理:每个信息都存在冗余,冗余的大小与符号的出现概率或者不确定性有关。出现概率大,则不确定性小,可用对数函数表征。
-
为什么对数函数?
- 不确定性必须是出现概率的单调递减函数
- 离散的独立事件,其总的不确定性等于各自不确定性之和
- 不确定性: f = l o g ( 1 p ) = − l o g ( p ) f=log(\frac1p)=-log(p) f=log(p1)=−log(p)
-
信息熵:
- 单个符号的不确定性的统计平均
- 公式: − ∑ i = 0 n p i l o g ( p i ) -\sum_{i=0}^np_ilog(p_i) −∑i=0npilog(pi)
-
分类交叉熵:
- 所有样本在每个类别的信息熵的总和
- 公式: l ( f , y ) = − ∑ i n ∑ j m y i j l o g f ( x i j ) l(f,y)=-\sum_i^n\sum_j^my_{ij}logf(x_{ij}) l(f,y)=−∑in∑jmyijlogf(xij)
- 参数
n
:样本数量 - 参数
m
:类别数量 - 参数
y
i
j
y_{ij}
yij:第
i
个样本属于分类j
的标签,它是0或者1 - 参数
f
(
x
i
j
)
f(x_{ij})
f(xij):样本
i
预测为j
分类的概率
-
特点:
- 主要用于学习数据的概率分布
- 像MSE等是惩罚预测错误的,交叉熵对于高可信度预测错误的会有更大的惩罚
- 负对数损失:不会根据预测的可信度进行惩罚;交叉熵:也会惩罚预测错误且可信度很高的,或者预测正确且可信度很低的
-
pytorch:
torch.nn.CrossEntropyLoss
softmax loss
- 如果上面的 f ( x i j ) f(x_{ij}) f(xij)是softmax概率的形式(指数概率),此时就是softmax with cross-entropy loss,简称softmax loss
- softmax loss是交叉熵的一个特例
- 分类分割任务
- 不平衡样本:weighted softmax loss, focal loss
- 蒸馏学习的soft softmax loss
KL散度
- 估计两个分布的相似性
- 公式: D k l ( p ∣ q ) = ∑ i p i l o g ( p i q i ) D_{kl}(p\mid q)=\sum_ip_ilog(\frac{pi}{qi}) Dkl(p∣q)=∑ipilog(qipi)
- 当p和q处处相等时,上式才=0,即分布相同
- 变形: D k l ( p ∣ q ) = ∑ i ( p i l o g p i − p i l o g q i ) = − l ( p , p ) + l ( p , q ) D_{kl}(p\mid q)=\sum_i(p_ilogp_i-p_ilogq_i)=-l(p,p)+l(p,q) Dkl(p∣q)=∑i(pilogpi−pilogqi)=−l(p,p)+l(p,q)
l(p,p)
:p
的熵,当一个分布一定时,熵为常数值l(p,q)
:p
和q
的交叉熵- KL散度和交叉熵相差一个常数值,所以用哪个作为loss都是可以的,最小化交叉熵也是最小化KL散度
- 不是根据预测的可信度进行惩罚(这是交叉熵要做的),而是根据预测和真实值的差异进行惩罚
- 注意:KL的非对称性, D k l ( p ∣ q ) ≠ D k l ( q ∣ p ) D_{kl}(p\mid q)\neq D_{kl}(q\mid p) Dkl(p∣q)=Dkl(q∣p)
- pytorch:
torch.nn.KLDivLoss
hinge loss
- 主要用于SVM,解决间距最大化问题
- 公式: l ( f ( x ) , y ) = m a x ( 0 , 1 − y f ( x ) ) = { 0 y i = f ( x i ) 1 y i ≠ f ( x i ) l(f(x),y)=max(0,1-yf(x))=\left\{\begin{array}{ll}0&y_i=f(x_i)\\1&y_i\neq f(x_i)\end{array}\right. l(f(x),y)=max(0,1−yf(x))={01yi=f(xi)yi=f(xi)
hinge embedding loss
- 用于衡量两个输入是否相似或者不相似
- 公式: l n = { x n y n = 1 m a x { 0 , m a r g i n − x n } y n = − 1 l_n=\left\{\begin{array}{ll}x_n&y_n=1\\max\{0,margin-x_n\}&y_n=-1\end{array}\right. ln={xnmax{0,margin−xn}yn=1yn=−1
- margin: default = 1
- pytorch:
torch.nn.HingeEmbeddingLoss
指数损失与逻辑损失
- 指数形式,梯度比较大,主要用于Adaboost集成学习中
- 公式: l ( f ( x ) , y ) = e − β y f ( x ) l(f(x),y)=e^{-\beta yf(x)} l(f(x),y)=e−βyf(x)
- 取对数形式: l ( f ( x ) , y ) = 1 l n 2 l n ( 1 + e − y f ( x ) ) l(f(x),y)=\frac1{ln2}ln(1+e^{-yf(x)}) l(f(x),y)=ln21ln(1+e−yf(x)),梯度相对平缓
Cosine Embedding Loss
- 对于两个输入x1,x2,根据标签计算其cos相似性的loss
- 公式: l ( f ( x ) , y ) = { 1 − c o s ( x 1 , x 2 ) y = 1 m a x { 0 , c o s ( x 1 , x 2 ) − m a r g i n } y = − 1 l(f(x),y)=\left\{\begin{array}{ll}1-cos(x1,x2)&y=1\\max\{0,cos(x1,x2)-margin\}&y=-1\end{array}\right. l(f(x),y)={1−cos(x1,x2)max{0,cos(x1,x2)−margin}y=1y=−1
- 相似性: s i m i l a r i t y = c o s ( θ ) = A ∗ B ∣ A ∣ ∣ B ∣ similarity=cos(\theta)=\frac{A*B}{|A||B|} similarity=cos(θ)=∣A∣∣B∣A∗B
- 默认时marign=0
- 当y=1时,loss=1-cos(x1,x2)
- 当y=-1时,loss=max{0, cos(x1,x2)}。如果cos(x1,x2)>0,loss=cos(x1,x2);如果cos(x1,x2)<0,loss=0.
- pytorch:
torch.nn.CosineEmbeddingLoss
回归损失函数
L1 loss | MAE
- 以绝对误差作为距离
- Mean absolute loss,MAE
- 公式:$l(f(x),y)=\mid y-f(x)\mid $
- 具有稀疏性,常作为正则项添加到其他loss中,可以惩罚较大的值
- 问题:梯度在零点不平滑,导致会跳过极小值
- pytorch:
torch.nn.L1Loss
L2 loss | MSE | 均方差 | 平方损失
- 欧氏距离:以误差的平方作为距离
- Mean Squared Loss/Quadratic Loss,MSE loss
- 公式: L 2 = M S E = 1 n ∑ 1 n ( y i − y i ‾ ) L2=MSE=\frac1n\sum_1^n(y_i-\overline{y_i}) L2=MSE=n1∑1n(yi−yi)
- 平方使得放大大的loss,当模型范大的错误就惩罚它
- 也常常作为正则项
- 当预测值与目标值相差很大时, 梯度容易爆炸,因为梯度里包含了x−t。
- pytorch:
torch.nn.MSELoss
smooth L1 loss | Huber loss
- L1/L2 局限:
- L1:梯度不平滑
- L2:容易梯度爆炸
- 新的综合两者有点的loss
- 公式: s m o o t h L 1 ( x , f ( x ) ) = { 0.5 ( x − f ( x ) ) 2 , ∣ x − f ( x ) ∣ < 1 ∣ x − f ( x ) ∣ − 0.5 , o t h e r w i s e smooth_{L1}(x,f(x))=\left\{\begin{array}{ll}0.5(x-f(x))^2&,\mid x-f(x)\mid<1\\|x-f(x)\mid-0.5&,otherwise\end{array}\right. smoothL1(x,f(x))={0.5(x−f(x))2∣x−f(x)∣−0.5,∣x−f(x)∣<1,otherwise
- 当x-f(x)较小时,等价于L2 loss,保持平滑
- 当x-f(x)较大时,等价于L1 loss,可以限制数值的大小
- 与MSE相比,对于outliner更不敏感,当真实值和预测值差异较大值,此时类似于L1 loss,不像MSE loss的平方,所以可避免梯度爆炸
- pytorch:
torch.nn.SmoothL1Loss
GANs
Margin Ranking Loss
- 对于两个输入x1,x2,以及一个标签y(取值1和-1的tensor),评估x1和x2的排序
- 当y=1,x1的排序高于x2
- 当y=-1,x1的排序低于x2
- 公式: l o s s ( x , y ) = m a x ( 0 , − y ∗ ( x 1 − x 2 ) + m a r g i n ) loss(x,y)=max(0,-y*(x1-x2)+margin) loss(x,y)=max(0,−y∗(x1−x2)+margin)
- 如果x1、x2的排序和数据是吻合的,那么此时y * (x1-x2)是大于0的,-y * (x1-x2) + margin是小于0的,整个loss取值为0.
- 如果x1、x2的排序和数据是不吻合的,那么此时y * (x1-x2)是小于0的,-y * (x1-x2) + margin是大于0的,整个loss取值为大于0的一个值,相当于对这种错误的预测有一个惩罚.
- pytorch:
torch.nn.MarginRankingLoss