文章目录
- 损失函数
- 损失函数是什么
- 交叉熵损失函数-nn.CrossEntropyLoss
- 二分类交叉熵-nn.BCELoss
- L1损失(MAE)-nn.L1loss
- L2损失
- 平滑L1损失-nn.SmoothL1Loss
- 负对数似然损失函数-PoissonNLLLoss
- 相对熵损失-nn.KLDivLoss
- nn.MarginRankingLoss
- nn.MultiLabelMarginLoss
- nn.SoftMarginLoss
- nn.MultiLabelSoftMarginLoss
- nn.MultiMarginLoss
- nn.TripletMarginLoss
- nn.HingeEmbeddingLoss
- nn.CosineEmbeddingLoss
损失函数
损失函数是什么
损失函数:衡量模型输出与真实标签的差异
损失函数、代价函数、目标函数到底有什么区别
- 损失函数:
l o s s = ( f ^ , f ) loss =(\widehat{f} , f) loss=(f ,f) 代表是一个样本之间的差异 - 代价函数:
C o s t = 1 N ( ∑ i n f ( f i ^ , f i ) ) Cost = \cfrac{1}{N}(\sum_i^nf(\widehat{f_i}, f_i )) Cost=N1(∑inf(fi ,fi)) 代表的是所有样本的总差异 - 目标函数:
O b j = C o s t + R e g u l a r i z a t i o n Obj = Cost + Regularization Obj=Cost+Regularization
代表总的与真实标签的差异,主要区别与Cost,主要是加了正则约束,防止过拟合。
这三种一般都统称损失函数。
交叉熵损失函数-nn.CrossEntropyLoss
- nn.CrossEntropyLoss
- 功能:nn.LogSoftmax()与nn.NLLLoss()结合,进行交叉熵计算。
- 公式: H ( P , Q ) = − ∑ i n P ( x i ) l o g Q ( x i ) H(P,Q)=-\sum_i^nP(x_i)logQ(x_i) H(P,Q)=−∑inP(xi)logQ(xi)
- weight:各个类别的loss设置权重
- ignore_index:忽略某个类别
- reduction:计算模式,none sum mean
- 逐个元素计算,每个样本与真实标签的差异,单独计算出来
- 所有元素求和,每个样本与真实标签的差异,单独计算再相加
- 加权平均,每个样本与真实标签的差异,加权求平均
交叉熵损失通常使用到分类任务中,所以使用softmax归一化到一个概率中。当交叉熵越低,说明两个值的分布越接近。
常用于多分类任务,交叉熵损失对于一个样本,有N个神经元输出(N分类)这个样本的损失也只有一个值,即把所有神经元上的损失进行了相加。
但对于下文的二分类交叉熵损失,对于一个样本,有2个神经元输出(2分类),这个样本的损失也有2个,每个神经元都对应了一个损失。
交叉熵概念
如上节所说,交叉熵越低,两个值分布越接近,两个值越相似。但是为什么呢?首先要知道一点: 交叉熵 = 信息熵 + 相对熵 交叉熵=信息熵+相对熵 交叉熵=信息熵+相对熵
- 熵(信息熵):描述一个事件的不确定性,越不确定,就越大。其公式, H ( P ) = E ( I ( x ) ) H(P)=E(I(x)) H(P)=E(I(x)),其中I(x)是自信息,也就是说熵其实是自信息的期望。
- 自信息:衡量单个输出,单个事件的不确定性,其公式, I ( x ) = − l o g [ p ( x ) ] I(x)=-log[p(x)] I(x)=−log[p(x)]其实就是对某个事件的概率取负的对数
综上信息熵的公式可以拆开期望有: H ( P ) = E ( I ( x ) ) = − ∑ i n P ( x i ) l o g P ( x i ) H(P)=E(I(x))=-\sum_i^nP(x_i)logP(x_i) H(P)=E(I(x))=−∑inP(xi)logP(xi)
理解概率与熵:如下图
当概率为0.5时,可以发现熵是最大的,这个时候对这个事件发生概率是十分不确定的,都认为是0.5。
- 相对熵:衡量两个分布之间的差异,也就是两个分布之间的距离,虽然可以计算距离,但是其本身不是距离函数,因为距离函数有对称性(即,P到Q = Q到P)其公式, D ( P , Q ) = E ( l o g [ P ( x ) Q ( X ) ] ) D(P,Q)=E(log[\cfrac{P(x)}{Q(X)}]) D(P,Q)=E(log[Q(X)P(x)])。(用Q的分布取拟合P的真实分布)
- 交叉熵:也是衡量两个分布之间的差异,其公式 H ( P , Q ) = − ∑ i n P ( x i ) l o g Q ( x i ) H(P,Q)=-\sum_i^nP(x_i)logQ(x_i) H(P,Q)=−∑inP(xi)logQ(xi)
由相对熵与交叉熵的公式有如下推导:
D ( P , Q ) = E ( l o g [ P ( x ) Q ( X ) ] ) D(P,Q)=E(log[\cfrac{P(x)}{Q(X)}]) D(P,Q)=E(log[Q(X)P(x)])
= E ( l o g P ( x ) − l o g Q ( x ) ) =E(logP(x)-logQ(x)) =E(logP(x)−logQ(x))
拆开期望
= ∑ i N P ( x i ) [ l o g P ( x i ) − l o g Q ( x i ) ] =\sum_i^NP(x_i)[logP(x_i) - logQ(x_i)] =∑iNP(xi)[logP(xi)−logQ(xi)]
= ∑ i N P ( x i ) l o g P ( x i ) − ∑ i N P ( x i ) l o g Q ( x i ) =\sum_i^NP(x_i)logP(x_i)-\sum_i^NP(x_i)logQ(x_i) =∑iNP(xi)logP(xi)−∑iNP(xi)logQ(xi)
= H ( P , Q ) − H ( P ) =H(P,Q) -H(P) =H(P,Q)−H(P)
就有交叉熵: H ( P , Q ) = D ( P , Q ) + H ( P ) H(P,Q)=D(P,Q)+H(P) H(P,Q)=D(P,Q)+H(P)
其中P是训练集真实的样本分布,Q是模型输出的一个样本分布,所以H§其实就是一个常数。而我们对模型进行优化,也就是让loss最小优化损失函数,也就是优化这个交叉熵,而信息熵H§是常数,其实也就是优化相对熵。
二分类交叉熵-nn.BCELoss
- nn.BCELoss
- 功能:二分类交叉熵(注:输入取值在【0,1】,上一节的交叉熵没有要求在此区间,因为它结合了nn.LogSoftmax函数可以归一化到【0,1】)
- 公式: y n l o g x n + ( 1 − y n ) l o g ( 1 − x n ) y_nlogx_n+(1-y_n)log(1-x_n) ynlogxn+(1−yn)log(1−xn)
- weight:各个类别的loss设置权重
- ignore_index:忽略某个类别
- reduction:计算模式,none sum mean
- 逐个元素计算,每个样本与真实标签的差异,单独计算出来(此处每个神经元都有loss,所以一个样本的结果是一个形状大小为(1,2)的张量)
- 所有元素求和,每个样本与真实标签的差异,单独计算再相加
- 加权平均,每个样本与真实标签的差异,加权求平均
- nn.BCEWithLogitsLoss
- 功能:结合sigmiod与二分类交叉熵(注:网络最后不加sigmiod函数)
- 其他同
- pos_weight:正样本权值
L1损失(MAE)-nn.L1loss
- nn.L1loss
- 功能:计算inputs与target之差的绝对值
- 主要参数重要的有如上的计算模式
- 公式如下: l o s s = ∣ x n − y n ∣ loss =|x_n - y_n| loss=∣xn−yn∣
L2损失
均方误差(MSE)-nn.MSELoss
- nn.MSELoss
- 功能:计算inputs与target之差的平方
- 主要参数重要的有如上的计算模式
- 公式如下: l o s s = ( x n − y n ) 2 loss =(x_n - y_n)^2 loss=(xn−yn)2
平滑L1损失-nn.SmoothL1Loss
- nn.SmoothL1Loss
- 功能:平滑的L1Loss
- 主要参数如上的计算模式
- 公式如下:其中x是真实值与预测值的差值。
- 差异图:
负对数似然损失函数-PoissonNLLLoss
- nn.PoissonNLLLoss
- 功能:泊松分布的负对数似然损失函数
- log_input:输入是否为对数,决定计算公式
- full:计算所有loss,默认为False
- eps:修正项,避免log(input)为nan
- 公式:
和二分类交叉熵一样,是每个神经元都要计算loss
相对熵损失-nn.KLDivLoss
- nn.KLDivLoss
- 功能:计算KLD(divergence),KL散度,相对熵
- 注意事项,需要提前将输入计算取对数
- 主要参数同上的计算模式
- 公式:pytorch中实现的公式和前文中推导的相对熵有所不同,如下:
其中P是真实分布概率(就算标签),Q是模型输出概率。前文推导公式中,是对一个样本中所有神经元的计算结果进行了求和,而下方的pytorch实现公式中,没有求和,所以此损失也是每个神经元都要计算loss。
同时,pytorch实现公式中,没有对模型输出概率取对数。
nn.MarginRankingLoss
- 功能:计算两个向量之间的相似度,用于排序任务,该方法计算两租数据之间的差异,返回一个N*N的loss矩阵
- margin:x1,x2之间的差异值
- 同上计算模式
- 公式如下:
当y = 1 时,希望x1 > x2,此时不产生loss
当y = -1 时,希望x2 > x1, 不产loss
nn.MultiLabelMarginLoss
- 功能:多标签边界损失函数(一个样本有多个标签)
- 举例:样本x属于0,3类别,则标签是[0,3,-1,-1]
- 主要参数有计算模式,如上
- 公式:
x是模型预测结果,y是真实结果。当一个样本通过模型得到x的输出。只有当x输出中代表真实标签的那个神经元的概率值大于其他不是真实标签的那个神经元的概率值,才不会产生loss。
如上举例的四分类,y=[0,3,-1,-1],就要用x[3]和x[0] (即模型输出x中的第0个与第3个神经元概率值)减去另外两项。
nn.SoftMarginLoss
- 功能:计算二分类的logistic损失
- 主要参数同上计算模式
- 公式:(x.nelement是统计张量个数)
nn.MultiLabelSoftMarginLoss
- 功能:SoftMarginLoss多标签版本,标签是[0 1 0 1]
- weight:各个类别的loss权重
- 计算模式参数如上
- 公式:
nn.MultiMarginLoss
- 功能:计算多分类的折页损失
- P:可选1或2
- weight:各类别的loss设置权值
- margin:边界值
- 计算模式同上
- 公式:
公式中y是标签所在神经元
nn.TripletMarginLoss
- 功能:计算三元组损失,人脸验证中常用
- P:范数阶数
- margin:边界值
- 计算模式同上
- 公式:
nn.HingeEmbeddingLoss
- 功能:计算两个输入的相似性
- margin:边界值
- 计算模式同上
- 公式:
其中x应该为2个输入差的绝对值
nn.CosineEmbeddingLoss
- 功能:计算余弦相似度
- 参数同上
- 公式: