深度学习场景下的常用损失函数(Loss Function)

3,270 阅读5分钟

无论是在有监督场景还是在无监督场景,各种各样的深度学习方法一般都会有对应的损失函数,最小化损失函数代表了模型优化的方向。在回归学习问题中,常见的损失函数有:均方误差损失函数(MSE)、平均绝对误差损失函数(MAE)、均方根误差损失函数(RMSE)以及加上相应的L1正则项或者L2正则项的损失函数。下面主要总结在分类场景或者排序场景中常见的损失函数。

  1. 交叉熵损失函数Cross-entropy loss function) 毫无疑问,交叉熵损失函数是二分类问题中最常使用的损失函数,其公式如下:
L=i=1Nyilog(pi)+(1yi)log(1pi)L = -\sum^{N}_{i=1}{y_{i}log(p_i)}+(1-y_i)log(1-p_i)

其中NN为样本的个数,yiy_i为样本的真实标签,pip_i表示模型预测的输出。交叉熵损失函数一般与sigmoid激活函数搭配,如果sigmoid激活函数搭配均方误差损失函数,那么优化问题会变成一个非凸优化问题,而搭配交叉熵损失函数则依旧是个凸优化问题,更利于问题的求解。

  1. 对数损失函数(Log loss)

对数损失函数应用于多分类问题中,在二分类情况下等价于交叉熵损失函数,其公式如下:

L=i=1Nj=1Myijlog(pij)L = -\sum^{N}_{i=1}\sum^{M}_{j=1}y_{ij}log(p_{ij})

其中MM是分类的类别数,多分类问题中最后网络的激活函数是softmaxsigmoid也是softmax的一种特例,上述的损失函数可通过最大似然估计推导而来。

  1. NCE Loss 在多分类问题中,如果类别过大,例如NLP中word2vec的语料库可能上百万,这种情况下的计算量会非常大,如果通过softmax计算每一个类的预测概率显然不现实。NCE Loss的思路是将多分类问题转化为二分类问题(适用于对比学习或者某些预训练任务),XX和真实标签组成正样本对,同时通过负采样 kk 个样本组成负样本对(有时候会使用同一个batch里面的其他样本做负样本),激活函数采用sigmoid,然后使用交叉熵损失函数进行计算。

  2. Info NCE Loss

Info NCE loss是对比学习中常用的损失函数形式,对比学习不同于度量学习(监督式学习),它是一种无监督或者自监督的学习方式,对比学习的思想是拉近与正样本的距离,拉开与负样本的距离,正样本的构造可以通过数据增强完成,负样本可以是同一个batch里的其他样本或者通过memory bank来实现,对比学习的效果和如何构造正负样本有着很大的关系。Info NCE loss的公式如下:

L=logexp(q.k+/τ)i=1kexp(q.ki/τ)L = -log\frac{exp(q.k_+/\tau)}{\sum^{k}_{i=1}exp(q.k_i/\tau)}

τ\tau是温度系数,kk是负样本的数量,分母总共有k+1k+1项,包括一个正样本和kk个负样本。Nce Loss是一个二分类问题,相当于把所有的负样本一视同仁,而Info NCE loss则看成了一个多分类问题,在Moco论文中提到,Info NCE loss其实就是一个多分类的对数损失。温度系数τ\tau是一个超参数,温度系数调节的是对困难样本的关注程度,当τ\tau变大时,会使得分布变的更加平滑,这种情况下会难以区分困难的样本,当τ\tau变小时,分布会更加集中,这种情况下会使得样本与最相似的困难样本分开,困难样本和原始样本相似程度比较高,甚至一些困难负样本和原始样本属于同一个类别。

  1. Triplet Loss

Triplet loss常用于差异度比较小的分类任务中,例如人脸识别和细粒度分类,也可用于一些预训练任务。Triplet loss的输入是一个三元组<a,p,n><a,p,n>aa表示本体Anchor,pp表示与aa是同一类别的样本Positive,nn表示与aa不同类别的样本Negative,其目的是通过学习后使得a与p的距离变小,而和n的距离变大,如下图所示:

Triplet loss的公式如下:

L=max(d(a,p)d(a,n)+margin,0)L = max(d(a,p)-d(a,n)+margin,0)

其中marginmargin是一个大于0的超参数,表示正例和负例之间的最小间隔。当marginmargin很小甚至为0的时候,a与正例p的距离和a与负例n的距离不需要差别太大,这样模型很难区分正例和负例。如果marginmargin取值很大时,那么损失可能是一个较大的值,难以趋近于0,所以设置合适的marginmargin值十分关键。

  1. Pairwise ranknet Loss

Ranknet是基于神经网络的排序模型,属于pairwise方法,它的计算过程为:首先两两样本组成pair<u,v>,然后为该pair打上标签1或-1,表示排序在前或者排序在后(相关或者不相关),最后将u和v的特征xux_uxvx_v输入到模型中,得到相应的分数,可通过下列的sigmoid函数来得到概率:

puv(f)=exp(f(xu)f(xv))1+exp(f(xu)f(xv))p_{uv}(f) = \frac{exp(f(x_u)-f(x_v))}{1+exp(f(x_u)-f(x_v))}

得到上述的概率之后可通过交叉熵损失函数计算最终的loss。

  1. Pairwise hinge Loss

Pairwise有多种方式,每一种方式都有对应的损失函数,其中pairwise hinge loss可用于衡量正负样本的差距,公式如下:

L=max(0,maigindot(u,d+)+dot(u,d))L = max(0, maigin-dot(u,d_+)+dot(u,d_-))

该损失函数可用于推荐中双塔模型,uu为用户的Embedding,正样本d+d_+为用户点击过的样本,负样本dd_-为随机采样样本(包括曝光未点击)。

  1. BPR Loss BPR loss和pairwise hinge lossl类似,在pairwise hinge loss中margin的取值对最后的效果影响巨大,而BPR loss中不含有人为调整的超参数,可能会有更好的效果,公式如下:
L=log(1+exp(dot(u,d)dot(u,d+))L = log(1+exp(dot(u,d_-)-dot(u,d_+))

以上总结了部分形式的损失函数,依旧是冰山一角,后续会继续学习,加以补充。