pytorch中常见的损失函数
参考自:https://mp.weixin.qq.com/s/2oUNYUwkrVUN1fV4zDER7Q
文章目录
- pytorch中常见的损失函数
- 1.交叉熵损失
-
- 交叉熵简介
-
- BCELoss
- BCEWithLogitsLoss
- NLLLoss
- CrossEntropyLoss
- 2.KL散度
-
- KL散度简介
-
- KLDivLoss
- 3.平均绝对误差(L1范数)
-
- L1范数简介
-
- L1Loss
- l1_loss
- 04 均方误差损失(L2范数)
-
- L2范数简介
-
-
- MSELoss
- mse_loss
-
- 5.铰链损失函数
-
- Hinge loss简介
-
- HingeEmbeddingLoss
- 6.余弦相似度
-
- 余弦相似度简介
-
- CosineEmbeddingLoss
1.交叉熵损失
交叉熵简介
在分类问题模型中,如逻辑回归、神经网络等,在这些模型的最后通常会经过一个sigmoid函数(softmax函数),输出一个概率值(一组概率值),这个概率值反映了预测为正类的可能性(一组概率值反应了所有分类的可能性)。而对于预测的概率分布和真实的概率分布之间,使用交叉熵来计算他们之间的差距。
-
二分类交叉熵损失公式:
L = 1 N ∑ i L i = 1 N ∑ i − [ y i ⋅ log ( p i ) + ( 1 − y i ) ⋅ log ( 1 − p i ) ] L=\frac{1}{N} \sum_{i} L_{i}=\frac{1}{N} \sum_{i}-\left[y_{i} \cdot \log \left(p_{i}\right)+\left(1-y_{i}\right) \cdot \log \left(1-p_{i}\right)\right] L=N1∑iLi=N1∑i−[yi⋅log(pi)+(1−yi)⋅log(1−pi)]
y i y_i yi 表示样本标签,正类为,负类为0, p i p_i pi 表示样本 i i i预测为正的概率
-
多分类下的交叉熵损失公式:
L = 1 N ∑ i L i = 1 N ∑ i − ∑ c = 1 M y i c log ( p i c ) L=\frac{1}{N} \sum_{i} L_{i}=\frac{1}{N} \sum_{i}-\sum_{c=1}^{M} y_{i c} \log \left(p_{i c}\right) L=N1∑iLi=N1∑i−∑c=1Myiclog(pic)
M M M 表示类别的数量
y i c y_{ic} yic 表示变量(0或1),如果该类别和样本 i的类别相同就是1,否则是0
p i c p_{ic} pic 表示对于观测样本 i i i 属于类别 c c c 的预测概率。
BCELoss
BCELoss 是CrossEntropyLoss的一个特例,只用于二分类问题
BCELoss前面需要加上Sigmoid函数
参数:
- weight:每个分类的缩放权重,传入的大小必须和类别数量一至
- size_average:bool类型,为True时,返回的loss为平均值,为False时,返回的各样本的loss之和
- reduce:bool类型,返回值是否为标量,默认为True
- reduction:string类型,‘none’ | ‘mean’ | 'sum’三种参数值
参数中的weight决定单个样本所占权值,默认为1.0。
Loss_function = torch.nn.BCELoss()
loss = Loss_function(output, target)
BCEWithLogitsLoss
在BCELoss的基础上融合了Sigmoid
参数:
- weight:每个分类的缩放权重,传入的大小必须和类别数量一至
- size_average:bool类型,为True时,返回的loss为平均值,为False时,返回的各样本的loss之和
- reduce:bool类型,返回值是否为标量,默认为True
- reduction:string类型,‘none’ | ‘mean’ | 'sum’三种参数值
- pos_weight:正样本的权重, 当p>1,提高召回率,当p<1,提高精确度。可达到权衡召回率(Recall)和精确度(Precision)的作用。
NLLLoss
多分类的交叉熵函数,在使用前需要对input进行log_softmax处理
CrossEntropyLoss
相当于整合了log_softmax和NLLLoss()
参数:
- weight:每个分类的缩放权重,传入的大小必须和类别数量一至
- size_average:bool类型,为True时,返回的loss为平均值,为False时,返回的各样本的loss之和
- ignore_index:忽略某一类别,不计算其loss,其loss会为0,并且,在采用size_average时,不会计算那一类的loss,除的时候的分母也不会统计那一类的样本
- reduce:bool类型,返回值是否为标量,默认为True
- reduction:string类型,‘none’ | ‘mean’ | 'sum’三种参数值
2.KL散度
KL散度简介
KL散度(相对熵)是用来衡量两个概率分布之间的差异。
D ( P ∥ Q ) = ∑ P ( x ) log P ( x ) Q ( x ) \mathrm{D}(\mathrm{P} \| \mathrm{Q})=\sum P(x) \log \frac{P(x)}{Q(x)} D(P∥Q)=∑P(x)logQ(x)P(x)
KL散度可以化简为信息熵和交叉熵
KLDivLoss
参数:
- size_average:bool类型,为True时,返回的loss为平均值,为False时,返回的各样本的loss之和
- reduce:bool类型,返回值是否为标量,默认为True
- reduction-三个值,none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean
- log_target:默认False,指定是否在日志空间中传递目标
3.平均绝对误差(L1范数)
L1范数简介
L1范数损失函数,也被称为最小绝对值偏差(LAD),最小绝对值误差(LAE)。总的说来,它是把目标值 Y i Y_i Yi与估计值 f ( x i ) f(x_i) f(xi) 的绝对差值的总和 S S S 最小化:
S = ∑ i = 1 n ∣ Y i − f ( x i ) ∣ S=\sum_{i=1}^{n}\left|Y_{i}-f\left(x_{i}\right)\right| S=∑i=1n∣Yi−f(xi)∣
缺点:
- 梯度恒定,不论预测值是否接近真实值,这很容易导致发散,或者错过极值点。
- 导数不连续,导致求解困难。这也是L1损失函数不广泛使用的主要原因。
优点:
- 收敛速度比L2损失函数要快,L1能提供更大且稳定的梯度。
- 对异常的离群点有更好的鲁棒性
L1Loss
参数:
- size_average:bool类型,为True时,返回的loss为平均值,为False时,返回的各样本的loss之和
- reduce:bool类型,返回值是否为标量,默认为True
- reduction-三个值,none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean
l1_loss
04 均方误差损失(L2范数)
L2范数简介
L1范数损失函数,也被称为最小平方误(LSE)。总的说来,它是把目标值 Y i Y_i Yi与估计值 f ( x i ) f(x_i) f(xi) 的差值的平方和 S S S 最小化:
S = ∑ i = 1 n ( Y i − f ( x i ) ) 2 S=\sum_{i=1}^{n}\left(Y_{i}-f\left(x_{i}\right)\right)^{2} S=∑i=1n(Yi−f(xi))2
缺点:
- 收敛速度比L1慢,因为梯度会随着预测值接近真实值而不断减小。
- 对异常数据比L1敏感,这是平方项引起的,异常数据会引起很大的损失。
优点:
- 它使训练更容易,因为它的梯度随着预测值接近真实值而不断减小,那么它不会轻易错过极值点,但也容易陷入局部最优。
- 它的导数具有封闭解,优化和编程非常容易,所以很多回归任务都是用MSE作为损失函数。
MSELoss
torch.nn.MSELoss(size_average=None, reduce=None, reduction: str = 'mean')
参数:
size_average:bool类型,为True时,返回的loss为平均值,为False时,返回的各样本的loss之和
reduce:bool类型,返回值是否为标量,默认为True
reduction-三个值,none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean
mse_loss
5.铰链损失函数
Hinge loss简介
有人把hinge loss称为铰链损失函数,它可用于“最大间隔(max-margin)”分类,其最著名的应用是作为SVM的损失函数。
L i = ∑ j ≠ y i max ( 0 , s j − s y i + Δ ) L_{i}=\sum_{j \neq y_{i}} \max \left(0, s_{j}-s_{y_{i}}+\Delta\right) Li=∑j=yimax(0,sj−syi+Δ)
HingeEmbeddingLoss
参数:
- margin:float类型,默认为1.
- size_average:bool类型,为True时,返回的loss为平均值,为False时,返回的各样本的loss之和
- reduce:bool类型,返回值是否为标量,默认为True
- reduction-三个值,none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean
6.余弦相似度
余弦相似度简介
余弦相似度是机器学习中的一个重要概念,在Mahout等MLlib中有几种常用的相似度计算方法,如欧氏相似度,皮尔逊相似度,余弦相似度,Tanimoto相似度等。其中,余弦相似度是其中重要的一种。余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。
余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分用户兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦相似度对绝对数值不敏感),公式如下:
sim ( X , Y ) = cos θ = x ⃗ ⋅ y ⃗ ∥ x ∥ ⋅ ∥ y ∥ \operatorname{sim}(X, Y)=\cos \theta=\frac{\vec{x} \cdot \vec{y}}{\|x\| \cdot\|y\|} sim(X,Y)=cosθ=∥x∥⋅∥y∥x
⋅y
CosineEmbeddingLoss
参数:
- margin:float类型,应为-1到1之间的数字,建议为0到0.5,默认值为0
- size_average:bool类型,为True时,返回的loss为平均值,为False时,返回的各样本的loss之和
- reduce:bool类型,返回值是否为标量,默认为True
- reduction-三个值,none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean