损失函数是什么?
损失函数衡量模型输出与真实标签的差异
损失函数、代价函数、目标函数的关系?
损失函数:计算目标是单个样本
代价函数:计算目标是整个样本,计算每个样本的损失函数求和再取均值。
目标函数:在代价函数的基础上加上正则化项,目的是为了防止过拟合,造成代价函数小但泛化能力差。
下面介绍Pytorch中的十四种损失函数
损失函数 | 功能 | 注意事项 | 主要参数 | 使用场景 | 计算公式 |
---|---|---|---|---|---|
nn.CrossEntropyLoss | nn.LogSoftMax()与nn.NLLLoss()结合,进行交叉熵计算 | - | weight:各类别的loss设置取值 ignoe_index:忽略某个类别 reduction:计算模式,可为none/sum/mean |
常用于分类任务 | H ( P , Q ) = − ∑ i = 1 N P ( x i ) l o g Q ( x i ) H(P,Q) = -\sum_{i=1}^NP(x_i)logQ(x_i) H(P,Q)=−∑i=1NP(xi)logQ(xi) |
nn.NLLLoss | 实现负对数似然函数中的负号功能 | - | weight:各类别的loss设置取值 ignoe_index:忽略某个类别 reduction:计算模式,可为none/sum/mean |
常用于分类任务 | l ( x , y ) = L = { l 1 , . . . , l N } l , l n = − w y n x n , y n l(x,y) = L = \{l_1, ..., l_N\}^l, l_n= -w_{y_n}x_{n,y_n} l(x,y)=L={l1,...,lN}l,ln=−wynxn,yn |
n.BCELoss | 二分类交叉熵 | - | weight:各类别的loss设置取值 ignoe_index:忽略某个类别 reduction:计算模式,可为none/sum/mean |
常用于分类任务 | l n = − w n [ y n ⋅ l o g x n + ( 1 − y n ) ⋅ l o g ( 1 − x n ) ] l_n = -w_n[y_n \cdot logx_n + (1-y_n) \cdot log(1-x_n)] ln=−wn[yn⋅logxn+(1−yn)⋅log(1−xn)] |
nn.BCEWithLogitsLoss | 结合Sigmoid与二分类交叉熵 | 网络最后不加sigmoid函数 | pos:正样本的权值 weight:各类别的loss设置取值 ignoe_index:忽略某个类别 reduction:计算模式,可为none/sum/mean |
常用于分类任务 | l n = − w n [ y n ⋅ l o g σ ( x n ) + ( 1 − y n ) ⋅ l o g ( 1 − σ ( x n ) ) ] l_n = -w_n[y_n \cdot log\sigma(x_n) + (1-y_n) \cdot log(1-\sigma(x_n))] ln=−wn[yn⋅logσ(xn)+(1−yn)⋅log(1−σ(xn))] |
nn.L1Loss | 计算inputs与target之差的绝对值 | - | reduction:计算模式,可为none/sum/mean | 常用于回归任务 | l n = a b s ( x n , y n ) l_n = abs(x_n, y_n) ln=abs(xn,yn) |
nn.MSELoss | 计算inputs与target之差的平方 | - | reduction:计算模式,可为none/sum/mean | 常用于回归任务 | l n = ( x n − y n ) 2 l_n = (x_n - y_n)^2 ln=(xn−yn)2 |
nn.SmoothL1Loss | 对L1Loss进行平滑 | - | reduction:计算模式,可为none/sum/mean | 常用于回归任务 | z i = { 0.5 ( x i − y i ) 2 , i f a b s ( x i , y i ) < 1 a b s ( x i , y i ) − 0.5 , o t h e r w i s e z_i=\begin{cases} 0.5(x_i - y_i)^2 , \qquad if \ abs(x_i, y_i) < 1 \\ abs(x_i, y_i) -0.5, \qquad otherwise \end{cases} zi={0.5(xi−yi)2,if abs(xi,yi)<1abs(xi,yi)−0.5,otherwise |
nn.PoissonNLLLoss | 泊松分布的负对数似然损失函数 | - | log_input :输入是否为对数形式,决定计算公式 full :计算所有loss,默认为False eps :修正项,避免log(input)为nan |
常用于回归任务 | log_input = True loss(input, target) = exp(input) - target *input log_input = False loss(input, target) = input - target * log(input+eps) |
nn.KLDivLoss | 计算KLD(divergence),KL散度,相对熵 | 需提前将输入计算 log-probabilities,如通过nn.logsoftmax() | reduction :none/sum/mean/batchmean batchmean- batchsize维度求平均值 |
用于连续分布的的距离度量,并且对离散采用的连续输出空间进行回归很有用 | D K L ( P ∥ Q ) = E x p [ l o g P ( x ) − l o g Q ( X ) ] = ∑ i = 1 N P ( x i ) ( l o g P ( x i ) − l o g Q ( x i ) ) D_{KL}(P \| Q)= E_{x~p[logP(x) - logQ(X)]}\\ =\sum_{i=1}^NP(x_i)(logP(x_i) - logQ(x_i)) DKL(P∥Q)=Ex p[logP(x)−logQ(X)]=∑i=1NP(xi)(logP(xi)−logQ(xi)) l n = y n ⋅ ( l o g y n − x n ) l_n = y_n \cdot (logy_n - x_n) ln=yn⋅(logyn−xn) |
nn.MarginRankingLoss | 计算两个向量之间的相似度 y = 1时, 希望x1比x2大,当x1>x2时,不产生loss y = -1时,希望x2比x1大,当x2>x1时,不产生loss |
该方法计算两组数据之间的差异,返回一个n*n的 loss 矩阵 | margin :边界值,x1与x2之间的差异值 reduction :计算模式,可为none/sum/mean |
常用于排序任务 | 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*(x_1 - x_2) + margin) loss(x,y)=max(0,−y∗(x1−x2)+margin) |
nn.MultiLabelMarginLoss | - | - | - | 常用于图像的多分类任务, | - |
nn.SoftMarginLoss | 计算二分类的logistic损失 | - | reduction :计算模式,可为none/sum/mean | 常用于分类任务 | l o s s ( x , y ) = ∑ i l o g ( 1 + e x p ( − y [ i ] ∗ x [ i ] ) ) x . n e l e m e n t ( ) loss(x,y) = \sum_i \frac {log(1 +exp(-y[i] * x[i]))} {x.nelement()} loss(x,y)=∑ix.nelement()log(1+exp(−y[i]∗x[i])) |
nn.MultiLabelSoftMarginLoss | SoftMarginLoss多标签版本 | - | weight:各类别的loss设置权值 reduction :计算模式,可为none/sum/mean |
常用于图像的多分类任务 | l o s s ( x , y ) = − 1 C ∗ ∑ i y [ i ] ∗ l o g ( 1 + e x p ( − x [ i [ ) ) − 1 ) + ( 1 − y [ i ] ) ∗ l o g ( e x p ( − x [ i ] ) 1 + e x p ( − x [ i ] ) ) ) loss(x,y) = - \frac 1 C * \sum_i y[i] * log(1+exp(-x[i[))^{-1}) + (1-y[i]) * log(\frac {exp(-x[i] )} {1+exp(-x[i]))} ) loss(x,y)=−C1∗∑iy[i]∗log(1+exp(−x[i[))−1)+(1−y[i])∗log(1+exp(−x[i]))exp(−x[i])) |
nn.MultiMarginLoss | 计算多分类的折页损失 | - | p :可选1或2 weight:各类别的loss设置权值 margin :边界值 reduction :计算模式,可为none/sum/mean |
常用于分类任务 | l o s s ( x , y ) = ∑ i m a x ( 0 , m a r g i n − x [ y ] + x [ i ] ) ) p x . s i z e ( 0 ) loss(x,y) = \frac {\sum_i max(0, margin - x[y] + x[i]))^p} {x.size(0)} loss(x,y)=x.size(0)∑imax(0,margin−x[y]+x[i]))p |
nn.TripletMarginLoss | 计算三元组损失 | - | p :可选1或2 margin :边界值 reduction :计算模式,可为none/sum/mean |
常用于人脸识别任务 | L ( a , p , n ) = m a x { d ( a i , p i ) − d ( a i , p i ) + m a r g i n , 0 } L(a,p,n) = max\{d(a_i, p_i) - d(a_i, p_i) + margin, 0\} L(a,p,n)=max{d(ai,pi)−d(ai,pi)+margin,0} d ( x i , p i ) = ∥ x i − y i ∥ p d(x_i, p_i) = \| x_i - y_i\|_p d(xi,pi)=∥xi−yi∥p |
nn.HingeEmbeddingLoss | 计算两个输入的相似性 | 输入x应为两个输入之差的绝对值 | margin :边界值 reduction :计算模式,可为none/sum/mean |
常用于非线性embedding和半监督学习 | l n = { x n , i f y n = 1 m a x { 0 , Δ − x n } , i f y n = − 1 l_n = \begin{cases} x_n , \qquad if \ y_n = 1 \\ max\{0, \Delta - x_n\}, \quad if y_n = -1 \end{cases} ln={xn,if yn=1max{0,Δ−xn},ifyn=−1 |
nn.CosineEmbeddingLoss | 采用余弦相似度计算两个输入的相似性 | - | margin :可取值[-1, 1] , 推荐为[0, 0.5] reduction :计算模式,可为none/sum/mean |
常用于非线性embedding和半监督学习 | l n = { 1 − c o s ( x 1 , x 2 ) , i f y n = 1 m a x { 0 , c o s ( x 1 , x 2 ) − m a r g i n } , i f y n = − 1 l_n = \begin{cases} 1-cos(x_1, x_2) , \qquad if \ y_n = 1 \\ max\{0, cos(x_1,x_2) - margin\}, \quad if y_n = -1 \end{cases} ln={1−cos(x1,x2),if yn=1max{0,cos(x1,x2)−margin},ifyn=−1 |
nn.CTCLoss | 计算CTC损失 | - | blank :blank label zero_infinity :无穷大的值或梯度置0 reduction :计算模式,可为none/sum/mean |
解决时序类数据的分类 | - |