损失函数与Pytorch

均方误差/MSE/二次损失/L2损失

M S E = 1 N ∑ i = 1 N ( y − y ˉ ) 2 如果 y 和 y ˉ 是向量,那么 ( y − y ˉ ) 2 = ( ∑ i = 1 m ( y i − y i ˉ ) 2 ) 2 MSE=\frac{1}{N}\sum_{i = 1}^{N}(y-\bar{y})^2\\ 如果y和\bar{y}是向量,那么(y-\bar{y})^2=(\sqrt{\sum_{i = 1}^{m}(y_i-\bar{y_i})^2})^2 MSE=N1i=1N(yyˉ)2如果yyˉ是向量,那么(yyˉ)2=(i=1m(yiyiˉ)2 )2

理论上N表示batch_size,但在实现上通常还会再除以一个y向量的维度,这样并不会改变梯度方向和优化方向**

y = torch.tensor([1,2,3,0,2])
y = F.one_hot(y, 4)

out = torch.randn(5, 4)

F.mse_loss(y, out)
Out[21]: tensor(2.0983)
    
torch.mean(torch.square(y - out))
Out[21]: tensor(2.0983)
    
torch.square((y-out).norm(2)) / (4*5)
Out[21]: tensor(2.0983)

平均绝对误差/MAE/L1损失

M A E = 1 N ∑ i = 1 N ∣ y − y ˉ ∣ 如果 y 和 y ˉ 是向量,那么 ∣ y − y ˉ ∣ = ∑ i = 1 m ( y i − y i ˉ ) 2 MAE=\frac{1}{N}\sum_{i = 1}^{N}|y-\bar{y}|\\ 如果y和\bar{y}是向量,那么|y-\bar{y}|=\sqrt{\sum_{i = 1}^{m}(y_i-\bar{y_i})^2} MAE=N1i=1Nyyˉ如果yyˉ是向量,那么yyˉ=i=1m(yiyiˉ)2

使用平方误差MSE更容易收敛,但使用绝对误差MAE对异常值更稳健

理论上N表示batch_size,但在实现上通常还会再除以一个y向量的维度,这样并不会改变梯度方向和优化方向**

y = torch.tensor([1,2,3,0,2])
y = F.one_hot(y, 4)

out = torch.randn(5, 4)

F.l1_loss(y.float(), out)
Out[25]: tensor(1.0248)
    
torch.mean(torch.abs(y-out))
Out[27]: tensor(1.0248)
    
(y-out).norm(1) / (4*5)
Out[28]: tensor(1.0248)

交叉熵损失/Cross Entropy

熵越小 信息量越大 越不稳定 惊喜度越大
连续: E n t r o p y = − ∫ p l o g 2 p 离散: E n t r o p y = − ∑ i p i l o g 2 p i 连续:Entropy=-\int plog_2p\\ 离散:Entropy=-\sum_{i}p_ilog_2p_i 连续:Entropy=plog2p离散:Entropy=ipilog2pi

交叉熵

H ( p , q ) = − ∑ i p i l o g 2 q i H ( p , q ) = H ( p ) + K L ( p ∣ ∣ q ) 注: H ( p , q ) 和 H ( p ) 可以直接计算, K L ( p ∣ ∣ q ) 通过 H ( p , q ) − H ( p ) 来计算 对于独热编码,其熵为 0 ,例如 H ( p : [ 0 , 1 , 0 ] ) = − ( 0 ∗ l o g 2 0 + 1 ∗ l o g 2 1 + 0 ∗ l o g 2 0 ) = 0 H ( p , q ) 若 p 为独热编码 [ 0 , 1 , 0 ] ,则 H ( p , q ) = K L ( p ∣ ∣ q ) = − l o g 2 q 1 ,若 p , q 相同则 H ( p , q ) = 0 所以其可以作为分类任务的目标函数 ( p 为 l a b e l , q 为 o u t ) , H ( p , q ) 越小 p 和 q 越接近 H(p,q)=-\sum_{i}p_ilog_2q_i\\ H(p,q)=H(p)+KL(p||q)\\ 注:H(p,q)和H(p)可以直接计算,KL(p||q)通过H(p,q)-H(p)来计算\\ 对于独热编码,其熵为0,例如H(p:[0,1,0])=-(0*log_20+1*log_21+0*log_20)=0\\ H(p,q)若p为独热编码[0,1,0],则H(p,q)=KL(p||q)=-log_2q_1,若p,q相同则H(p,q)=0\\ 所以其可以作为分类任务的目标函数(p为label,q为out),H(p,q)越小p和q越接近 H(p,q)=ipilog2qiH(p,q)=H(p)+KL(p∣∣q)注:H(p,q)H(p)可以直接计算,KL(p∣∣q)通过H(p,q)H(p)来计算对于独热编码,其熵为0,例如H(p:[0,1,0])=(0log20+1log21+0log20)=0H(p,q)p为独热编码[0,1,0],则H(p,q)=KL(p∣∣q)=log2q1,若p,q相同则H(p,q)=0所以其可以作为分类任务的目标函数(plabelqout)H(p,q)越小pq越接近

特别的,对于二分类任务: H ( p , q ) = − ( p l o g 2 q + ( 1 − p ) l o g 2 ( 1 − q ) ) 其中, p 为真实是正例的概率, q 是预测是正例的概率。 特别的,对于二分类任务:\\ H(p,q)=-(plog_2q+(1-p)log_2(1-q))\\ 其中,p为真实是正例的概率,q是预测是正例的概率。 特别的,对于二分类任务:H(p,q)=(plog2q+(1p)log2(1q))其中,p为真实是正例的概率,q是预测是正例的概率。

理论上对数以2为底,但是实践上通常对数以e为底,这样并不会改变梯度方向和优化方向**

Pytorch中 CrossEntropyLoss = LogSoftmax + NLLLoss

NLLLoss(negative log likelihood loss)
H ( p , q ) = − ∑ i p i l o g q i 先对 q 做 s o f t m a x : H ( p , q ) = − ∑ i p i l o g e x p ( q i ) ∑ j e x p ( q j ) 假设 p 为 o n e _ h o t 且 p k ≠ 0 ,则 H ( p , q ) = − l o g e x p ( q k ) ∑ j e x p ( q j ) = − q k + l o g ∑ j e x p ( q j ) H(p,q)=-\sum_{i}p_ilogq_i\\ 先对q做softmax:H(p,q)=-\sum_{i}p_ilog\frac{exp(q_i)}{\sum_{j}exp(q_j)}\\ 假设p为one\_hot且p_k\neq0,则\\ H(p,q)=-log\frac{exp(q_k)}{\sum_{j}exp(q_j)}=-q_k+log\sum_{j}exp(q_j) H(p,q)=ipilogqi先对qsoftmax:H(p,q)=ipilogjexp(qj)exp(qi)假设pone_hotpk=0,则H(p,q)=logjexp(qj)exp(qk)=qk+logjexp(qj)

C r o s s E n t r o p y L o s s : H ( p , q ) = − l o g e x p ( q k ) ∑ j e x p ( q j ) = − q k + l o g ∑ j e x p ( q j ) L o g S o f t m a x ( x i ) = l o g e x p ( x i ) ∑ j e x p ( x j ) N L L L o s s ( p , q ) = − q k      ( p 为 o n e _ h o t 且 p k ≠ 0 ) CrossEntropyLoss:H(p,q)=-log\frac{exp(q_k)}{\sum_{j}exp(q_j)} =-q_k+log\sum_{j}exp(q_j)\\ LogSoftmax(x_i)=log\frac{exp(x_i)}{\sum_{j}exp(x_j)}\\ NLLLoss(p,q)=-q_k\:\:\:\:(p为one\_hot且p_k\neq0) CrossEntropyLoss:H(p,q)=logjexp(qj)exp(qk)=qk+logjexp(qj)LogSoftmax(xi)=logjexp(xj)exp(xi)NLLLoss(p,q)=qk(pone_hotpk=0)

out
Out[91]: 
tensor([[-1.9675, -0.0030,  1.4072,  0.6208],
        [-1.1345, -0.5482,  0.9298,  1.0552],
        [ 1.1224,  1.8556,  0.0283,  1.6605],
        [ 0.5614, -0.2457, -0.4221, -1.6666],
        [ 0.8162, -0.9078, -1.0052, -0.2580]])
y
Out[92]: tensor([1, 2, 3, 0, 2])
    
#  LogSoftmax
torch.log(F.softmax(out, dim=1))
Out[94]: 
tensor([[-3.9250, -1.9605, -0.5503, -1.3367],
        [-2.9760, -2.3897, -0.9117, -0.7864],
        [-1.6350, -0.9018, -2.7290, -1.0969],
        [-0.6564, -1.4636, -1.6399, -2.8844],
        [-0.5198, -2.2438, -2.3413, -1.5941]])

F.log_softmax(out, dim=1)
Out[95]: 
tensor([[-3.9250, -1.9605, -0.5503, -1.3367],
        [-2.9760, -2.3897, -0.9117, -0.7864],
        [-1.6350, -0.9018, -2.7290, -1.0969],
        [-0.6564, -1.4636, -1.6399, -2.8844],
        [-0.5198, -2.2438, -2.3413, -1.5941]])

# NLLLoss
-out[[0,1,2,3,4], y]
Out[106]: tensor([ 0.0030, -0.9298, -1.6605, -0.5614,  1.0052])
    
F.nll_loss(out, y, reduction='none')
Out[107]: tensor([ 0.0030, -0.9298, -1.6605, -0.5614,  1.0052])
    
# CrossEntropyLoss
# 不加reduction='none'则取均值
F.cross_entropy(out, y, reduction='none')
Out[108]: tensor([1.9605, 0.9117, 1.0969, 0.6564, 2.3413])
    
F.nll_loss(F.log_softmax(out, dim=1), y, reduction='none')
Out[109]: tensor([1.9605, 0.9117, 1.0969, 0.6564, 2.3413])
    
- out[[0,1,2,3,4], y] + torch.log(torch.sum(torch.exp(out), dim=1))
Out[111]: tensor([1.9605, 0.9117, 1.0969, 0.6564, 2.3413])

Info NCE

对比学习,有的称为自监督学习/无监督学习(实际上自监督学习是无监督学习的一种形式)。目标就是聚类。

image-20220522085247819

代理任务(pretext task)+目标函数(objective function)

代理任务定义正负样本(实际上就是为样本生成一个label),目标函数最大化一致。

例如上图:代理任务 对于同一样本x生成xi和xj两个样本;特征提取;MLP映射;优化损失。

Information Noise Contrastive Estimation,该损失函数在数学上比CrossEntropyLoss仅多一个温度系数
I n f o _ N C E = − l o g e x p ( q ⋅ k + / τ ) ∑ j e x p ( q ⋅ k j / τ ) q   k 均为特征向量 , k + 和 q 同类, k j ( j ≠ + ) 和 q 不同类 Info\_NCE=-log\frac{exp(q·k_+/\tau)}{\sum_{j}exp(q·k_j/\tau)}\\ q\:k均为特征向量,k_+和q同类,k_j(j\neq+)和q不同类 Info_NCE=logjexp(qkj/τ)exp(qk+/τ)qk均为特征向量,k+q同类,kj(j=+)q不同类

例如现有batch_size个图片x,通过代理任务(例如旋转,裁剪等操作)生成两种图片x_q和x_k(均为batch_size个,共2*batch_size个图片)。经过特征图提取,MLP映射之后得到q shape[batch_size, feature_len],k shape[batch_size, feature_len]。q和k对应位置的特征向量表示的是同一张图片(同类),通过Info NCE可以最大化其相关性,同时最小化与其他负例的相关性。
处理 1 : q i 有 k i   1 个正例, k j ( j ≠ i )   ( b − 1 ) 个负例, q ⋅ k T 得到 [ b , b ] 的矩阵, 第 i 行的主对角线元素为 q i 与对应的 k + 的相关性分数 处理 2 : q i 有 q i , k i   2 个正例, q j , k j ( j ≠ i )   ( 2 b − 2 ) 个负例, [ q , k ] ⋅ [ q , k ] T 得到 [ 2 b , 2 b ] 的矩阵, 第 i 行( i ∈ [ 1 , b a t c h _ s i z e ] )的第 b + i 个元素为 q i 与对应的 k + 的相关性分数 第 i 行( i ∈ [ b a t c h _ s i z e + 1 , 2 ∗ b a t c h _ s i z e ] )的第 b + i 个元素为 q i 与对应的 k + 的相关性分数 处理1:q_i有k_i\:1个正例,k_j(j\neq i)\:(b-1)个负例,q·k^T得到[b, b]的矩阵,\\ 第i行的主对角线元素为q_i与对应的k_+的相关性分数\\\\ 处理2:q_i有q_i,k_i\:2个正例,q_j,k_j(j\neq i)\:(2b-2)个负例,[q,k]·[q,k]^T得到[2b, 2b]的矩阵,\\ 第i行(i\in[1,batch\_size])的第b+i个元素为q_i与对应的k_+的相关性分数\\ 第i行(i\in[batch\_size+1,2*batch\_size])的第b+i个元素为q_i与对应的k_+的相关性分数\\ 处理1qiki1个正例,kj(j=i)(b1)个负例,qkT得到[b,b]的矩阵,i行的主对角线元素为qi与对应的k+的相关性分数处理2qiqi,ki2个正例,qj,kj(j=i)(2b2)个负例,[q,k][q,k]T得到[2b,2b]的矩阵,i行(i[1,batch_size])的第b+i个元素为qi与对应的k+的相关性分数i行(i[batch_size+1,2batch_size])的第b+i个元素为qi与对应的k+的相关性分数

import torch
from torch.nn import functional as F

# 温度系数
tau = 1
batch_size = 4
feature_len = 10
q = torch.randn(batch_size, feature_len)
k = torch.randn(batch_size, feature_len)


# 处理1
# k+在每一行的位置
position_positive = torch.arange(batch_size)
# cross_entropy不加reduction='none'则包含取均值的操作即 batch_size行共batch_size个值取均值
info_nce = F.cross_entropy(q@k.t()/tau, position_positive) # 单向聚类
info_nce = (F.cross_entropy(q@k.t()/tau, position_positive) + F.cross_entropy(k@q.t()/tau, position_positive)) / 2 # 双向聚类

# 处理2
# k+在每一行的位置
position_positive = torch.cat((torch.arange(batch_size) + batch_size, torch.arange(batch_size)))
qk = torch.cat((q, k), dim=0)
info_nce = F.cross_entropy(qk@qk.t()/tau, position_positive) # 双向聚类
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MallocLu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值