[机器学习基础]为什么要使用 softmax 和 交叉熵 ?

在做数据拟合时,如果我们在线性函数中加入高斯噪声,通过极大似然的方法我们可以推导出均方误差(mean squared error,MSE)损失函数。从直观上来看,MSE通过最小化所有点到直线距离平方的加和来确定参数。

在做数据分类的时候,如果我们也想用距离的平方和作为损失函数,那就不是特别好,毕竟离分割超平面越远,损失应该越小。

对于分类问题,最经典的模型就是支持向量机(support vector machine,SVM),它的分割超平面由支撑向量所决定,非支撑向量的微小振动并不会改变最终模型。

今天我们从概率的角度介绍另一个分类标准。

在分类问题中使用交叉熵损失函数的两个合理解释

我们设训练集%5Cmathcal%20T%3D%5C%7B%28x_i%2Cy_i%29%5C%7D_%7Bi%3D1%2C...%2Cn%7D,其中x_i%5Cin%5Cmathbb%20R%5Eny_i是one-hot标签,设共有m个类别(因此y_i%5Cin%5Cmathbb%20R%5Em),我们期望学习到一个函数P来使得P%28x_i%29%5Cin%5Cmathbb%20R%5Emx_i属于每一类的概率。

如何学习?(我们假设函数P已经经过处理使得各分量加和为1)

对于第一种方法,我们可以使用最大似然:

P%3D%5Carg%5Cmax%5Cprod%5Climits_%7Bi%3D1%7D%5En%20P%28x_i%29%5Ccdot%20y_i

(注意这里y_i是one-hot编码,因此内积P%28x_i%29%5Ccdot%20y_i其实只有一小项相乘,在数值上等于 $P(x_i) $ 的第j项,jx_i所在的类)

最大似然等效于最小化负对数似然:

P%3D%5Carg%5Cmin%5B-%5Csum%5Climits_%7Bi%3D1%7D%5En%20y_i%5Ccdot%5Clog%20P%28x_i%29%5D

(因为是one-hot,所以我们可以把y_i从内积中提出来,这里对向量P%28x_i%29求对数等于对每一项求对数)

第二种方法,由于向量P%28x_i%29y_i都满足各分量的加和为1,因此可以看成是一种分布,在信息论中衡量分布的损失经常用交叉熵损失函数:

l%28P%28x_i%29%2Cy_i%29%3D-%5Csum%5Climits_%7Bj%3D1%7D%5Em%20y_i%5E%7B%28j%29%7D%5Clog%20P%28x_i%29%5E%7B%28j%29%7D%3D-y_i%5Ccdot%5Clog%20P%28x_i%29

我们发现这给出了与最大似然相同的结果,我们通常将此损失函数称为交叉熵损失函数。

函数的预处理P

一般我们神经网络某层的输出并不总是满足各分量的和为1,目前使用最多的处理方法是使用softmax的方法。

我浏览了很多讲解softmax的合理性的文章,其中这篇文章 https://intellipaat.com/community/2015/why-is-the-cross-entropy-method-preferred-over-mean-squared-error-in-what-cases-does-this-doesnt-hold-up 提到的softmax函数的二维形式与sigmoid很类似让我很受启发(我刚看了一下百度百科也有类似的介绍):
softmax%3A%20%5Cdfrac%7Be%5E%7Bx_i%7D%7D%7B%5Csum_j%20e%5E%7Bx_j%7D%7D%5C%5C%20sigmoid%3A%5Cdfrac%7B1%7D%7B1%2Be%5E%7B-x%7D%7D%3D%5Cdfrac%7Be%5Ea%7D%7Be%5Ea%2Be%5E%7Ba-x%7D%7D
事实上,这两个函数的导数很好地表示:

我们推导出交叉熵损失函数:(假设P%28x_i%29%3Dsoftmax%28o_i%29

%5Cdfrac%7B%5Cpartial%7D%7B%5Cpartial%20o_i%5E%7B%28j%29%7D%7D%5B-%20y_i%5Ccdot%5Clog%20softmax%28o_i%29%5D%20%3D%5Cdfrac%7B%5Cpartial%7D%7B%5Cpartial%20o_i%5E%7B%28j%29%7D%7D%5B-%5Csum%5Climits_%7Bj%3D1%7D%5Em%20y_i%5E%7B%28j%29%7D%2A%5Clog%20%5Cdfrac%7Bexp%28o_i%5E%7B%28j%29%7D%29%7D%7B%5Csum_%7Bk%3D1%7D%5Em%20exp%28o_i%5E%7B%28k%29%7D%29%7D%5D%5C%5C%20%3D%5Cdfrac%7B%5Cpartial%7D%7B%5Cpartial%20o_i%5E%7B%28j%29%7D%7D%5B%5Csum%5Climits_%7Bj%3D1%7D%5Em%20y_i%5E%7B%28j%29%7D%2A%5Clog%20%5Csum_%7Bk%3D1%7D%5Em%20exp%28o_i%5E%7B%28k%29%7D%29-%5Csum%5Climits_%7Bj%3D1%7D%5Em%20y_i%5E%7B%28j%29%7D%2Ao_i%5E%7B%28j%29%7D%5D%5C%5C%20%3D%5Cdfrac%7B%5Cpartial%7D%7B%5Cpartial%20o_i%5E%7B%28j%29%7D%7D%5B%5Clog%20%5Csum_%7Bk%3D1%7D%5Em%20exp%28o_i%5E%7B%28k%29%7D%29-%5Csum%5Climits_%7Bj%3D1%7D%5Em%20y_i%5E%7B%28j%29%7D%2Ao_i%5E%7B%28j%29%7D%5D%5C%5C%20%3Dsoftmax%28o_i%5E%7B%28j%29%7D%29-y_i%5E%7B%28j%29%7D

我们下面对sigmoid函数求导:(这个推导网上很多,就不重复了)
%5Cdfrac%7B%5Cpartial%20%7D%7B%5Cpartial%20x%7D%5Cdfrac%7B1%7D%7B1%2Be%5E%7B-x%7D%7D%3D%5Cdfrac%7B1%7D%7B1%2Be%5E%7B-x%7D%7D%281-%5Cdfrac%7B1%7D%7B1%2Be%5E%7B-x%7D%7D%29
我们发现这两个函数对原变量求导,得到导数值在计算过程中都不必知道原变量值的大小,只需要知道自身的值(交叉熵损失函数需要知道外部标签)即可,这在实现误差的反向传播(BP)算法的时候十分方便。

对于sigmoid函数,我们有它的改进版tanh和softsign ,可以参考https://baike.baidu.com/item/Sigmoid%E5%87%BD%E6%95%B0/7981407#%E6%BF%80%E6%B4%BB%E5%87%BD%E6%95%B0

对于Softmax来说,就目前的需求来说,它完全满足,因此目前来看它是合理的。我们可以等将来我们有更多的需求的时候再来构造新的传播函数。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2022年3月24日 下午3:06
下一篇 2022年3月24日 下午3:21

相关推荐