為什么要用交叉熵來做損失函數:
在邏輯回歸問題中,常常使用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
