原文链接在这里:https://kexue.fm/archives/4293
文本情感分类其实就是一个二分类问题,事实上,对于分类模型,都会存在这样一个毛病:优化目标跟考核指标不一致。通常来说,对于分类(包括多分类),我们都会采用交叉熵作为损失函数,它的来源就是最大似然估计(参考《梯度下降和EM算法:系出同源,一脉相承》)。但是,我们最后的评估目标,并非要看交叉熵有多小,而是看模型的准确率。一般来说,交叉熵很小,准确率也会很高,但这个关系并非必然的。
要平均,不一定要拔尖 #
一个更通俗的例子是:一个数学老师,在努力提高同学们的平均分,但期末考核的指标却是及格率(60分及格)。假如平均分是100分(也就意味着所有同学都考到了100分),那么自然及格率是100%,这是最理想的。但现实不一定这么美好,平均分越高,只要平均分还没有达到100,那么及格率却不一定越高,比如两个人分别考40和90,那么平均分就是65,及格率只有50%;如果两个人的成绩都是60,平均分就是60,及格率却有100%。这也就是说,平均分可以作为一个目标,但这个目标并不直接跟考核目标挂钩。
那么,为了提升最后的考核目标,这个老师应该怎么做呢?很显然,首先看看所有学生中,哪些同学已经及格了,及格的同学先不管他们,而针对不及格的同学进行补课加强,这样一来,原则上来说有很多不及格的同学都能考上60分了,也有可能一些本来及格的同学考不够60分了,但这个过程可以迭代,最终使得大家都在60分以上,当然,最终的平均分不一定很高,但没办法,谁叫考核目标是及格率呢?
更好的更新方案 #
对于二分类模型,我们总希望模型能够给正样本输出1,负样本输出0,但限于模型的拟合能力等问题,一般来说做不到这一点。而事实上在预测中,我们也是认为大于0.5的就是正样本了,小于0.5的就是负样本。这样就意味着,我们可以“有选择”地更新模型,比如,设定一个阈值为0.6,那么模型对某个正样本的输出大于0.6,我就不根据这个样本来更新模型了,模型对某个负样本的输出小于0.4,我也不根据这个样本来更新模型了,只有在0.4~0.6之间的,才让模型更新,这时候模型会更“集中精力”去关心那些“模凌两可”的样本,从而使得分类效果更好,这跟传统的SVM思想是一致的。
不仅如此,这样的做法理论上还能防止过拟合,因为它防止了模型专门挑那些容易拟合的样本来“拼命”拟合(使得损失函数下降),这就好比老师只关心优生,希望优生能从80分提高到90分,而不想办法提高差生的成绩,这显然不是一个好老师。
修正的交叉熵损失 #
怎样才能达到我们上面说的目的呢?很简单,调整损失函数即可,这里主要借鉴了hinge loss和triplet loss的思想。一般常用的交叉熵损失函数是:
选定一个阈值m=0.6m=0.6,这个阈值原则上大于0.5均可。引入单位阶跃函数θ(x)θ(x):
那么,考虑新的损失函数:
其中
LnewLnew就是在交叉熵的基础上加入了修正项λ(ytrue,ypred)λ(ytrue,ypred),这一项意味着什么呢?当进入一个正样本时,那么ytrue=1ytrue=1,显然
这时候,要是ypred>mypred>m,那么λ(1,ypred)=0λ(1,ypred)=0,这时候交叉熵自动为0(达到最小值),反之,ypred<mypred<m则有λ(1,ypred)=1λ(1,ypred)=1,这时候保持交叉熵,也就是说,正样本如果输出已经大于mm了,那就不更新了(因为达到了最小值,可以认为最小值梯度是0),小于mm才继续更新;类似地可以分析负样本的情形,结论是负样本如果输出已经小于1−m1−m了,那就不更新了,大于1−m1−m才继续更新。
这样一来,只要将原始的交叉熵损失,换成修正的交叉熵LnewLnew,就可以达到我们开始设计的目的了。