为什么要用交叉熵来做损失函数:
在逻辑回归问题中,常常使用MSE(Mean Squared Error)作为loss函数,此时:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1sb3NzJTNEJTVDZnJhYyU3QjElN0QlN0IybSU3RCU1Q3N1bV8lN0JpJTdEJTVFJTdCbSU3RCUyOHlfJTdCaSU3RC15JTVFJTdCJTI3JTdEJTI5JTVFJTdCMiU3RCs=.png)
这里的
就表示期望输出,
表示原始的实际输出(就是还没有加softmax)。这里的m表示有m个样本,loss为m个样本的loss均值。MSE在逻辑回归问题中比较好用,那么在分类问题中还是如此么?我们来看看Loss曲线。
将原始的实际输出节点都经过softmax后拿出一个样例来看,使用MSE的loss为的loss函数为:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1sb3NzXyU3QmklN0QlM0QlMjh5XyU3QmklN0QteSU1RSU3QmklMjclN0QlMjklNUUlN0IyJTdEJTNEJTI4eV8lN0JpJTdELSU1Q2ZyYWMlN0JlJTVFJTdCeV8lN0JpJTI3JTdEJTdEJTdEJTdCJTVDc3VtXyU3QmorJTNEKzElN0QlNUUlN0JuJTdEJTdCZSU1RSU3QnlfJTdCaSUyNyU3RCU3RCU3RCU3RCslMjklNUUlN0IyJTdEKw==.png)
其中
和
为常数,那么loss就可以简化为
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1sb3NzXyU3QmklN0QrJTNEKyUyOGNfJTdCMSU3RC0lNUNmcmFjJTdCZSU1RSU3QnlpJTI3JTdEJTdEJTdCY18lN0IyJTdEJTdEJTI5JTVFJTdCMiU3RA==.png)
取c1=1,c2=2,绘制图像:

这是一个非凸函数,只有当损失函数为凸函数时,梯度下降算法才能保证达到全局最优解。所以MSE在分类问题中,并不是一个好的loss函数。
如果利用交叉熵作为损失函数的话,那么:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1sb3NzKyUzRCstJTVDc3VtXyU3QmklM0QxJTdEJTVFJTdCbiU3RCU3QnlfJTdCaSU3RCUyQWxvZyUyOHlfJTdCJTI3JTdEJTI5JTdE.png)
还是一样,
就表示期望输出,
表示原始的实际输出(就是还没有加softmax),由于one-hot标签的特殊性,一个1,剩下全是0,loss可以简化为:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1sb3NzXyU3QmklN0QlM0QtbG9nJTI4eSU1RSU3QiUyNyU3RCUyOQ==.png)
加入(softmax)得:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1sb3NzXyU3QmklN0QrJTNEKy1sb2clMjhjXyU3QjElN0QtJTVDZnJhYyU3QmUlNUUlN0J4JTdEJTdEJTdCY18lN0IyJTdEJTdEJTI5.png)
取C1=1,C2=2绘制曲线如下 :

相对MSE而言,曲线整体呈单调性,loss越大,梯度越大。便于梯度下降反向传播,利于优化。所以一般针对分类问题采用交叉熵作为loss函数。
Pytorch中的CrossEntropyLoss()函数,计算公式如下:

ref:https://zhuanlan.zhihu.com/p/145533813
交叉熵损失函数相对MSE避免了梯度消失的一些推导:

ref:https://www.cnblogs.com/wanghui-garcia/p/10862733.html
