天天看點

交叉熵損失函數(Cross Entropy Error Function)與均方差損失函數(Mean Squared Error)

項目github位址:bitcarmanlee easy-algorithm-interview-and-practice

歡迎大家star,留言,一起學習進步

1.均方差損失函數(Mean Squared Error)

均方差損失函數是預測資料和原始資料對應點誤差的平方和的均值。計算方式也比較簡單

M S E = 1 N ( y ^ − y ) 2 MSE = \frac{1}{N}(\hat y - y) ^ 2 MSE=N1​(y^​−y)2

其中,N為樣本個數。

2.交叉熵損失函數(Cross Entropy Error Function)

在分類問題中,尤其是在神經網絡中,交叉熵函數非常常見。因為經常涉及到分類問題,需要計算各類别的機率,是以交叉熵損失函數又都是與sigmoid函數或者softmax函數成對出現。

比如用神經網絡最後一層作為機率輸出,一般最後一層神經網絡的計算方式如下:

1.網絡的最後一層得到每個類别的scores。

2.score與sigmoid函數或者softmax函數進行計算得到機率輸出。

3.第二步得到的類别機率與真實類别的one-hot形式進行交叉熵計算。

二分類的交叉熵損失函數形式

∑ − y i l o g ( y ^ i ) − ( 1 − y i ) l o g ( 1 − y ^ i ) \sum -y_ilog(\hat y_i) - (1-y_i)log(1-\hat y_i) ∑−yi​log(y^​i​)−(1−yi​)log(1−y^​i​)

上面的 y i y_i yi​表示類别為1, y ^ i \hat y_i y^​i​表示預測類别為1的機率。

而多分類的交叉熵損失函數形式為

− ∑ i = 1 n y i l o g ( y ^ i ) -\sum_{i=1} ^n y_i log(\hat y_i) −i=1∑n​yi​log(y^​i​)

上面的式子表示類别有n個。單分類問題的時候,n個類别是one-hot的形式,隻有一個類别 y i = 1 y_i=1 yi​=1,其他n-1個類别為0。

3.MSE與sigmoid函數不适合配合使用

MSE的loss為

M S E = − 1 N ( y ^ − y ) 2 MSE =- \frac{1}{N}(\hat y - y) ^ 2 MSE=−N1​(y^​−y)2

如果其與sigmoid函數配合使用,偏導數為

∂ L o s s i ∂ w = ( y − y ^ ) σ ′ ( w x i + b ) x i \frac{\partial Loss_i}{\partial w} = (y - \hat y) \sigma '(wx _i+ b)x_i ∂w∂Lossi​​=(y−y^​)σ′(wxi​+b)xi​

其中

σ ′ ( w x i + b ) = σ ( w x i + b ) ( 1 − σ ( w x i + b ) ) \sigma '(wx _i+ b) = \sigma (wx _i+ b) (1 - \sigma (wx _i+ b)) σ′(wxi​+b)=σ(wxi​+b)(1−σ(wxi​+b))

于是,在 σ ( w x i + b ) \sigma (wx _i+ b) σ(wxi​+b)的值接近0或者1的時候,其導數都接近0。這樣會導緻模型一開始的學習速度非常慢,是以MSE一般不會與sigmoid函數配合使用。

4.交叉熵損失函數與sigmoid函數配合使用

交叉熵損失函數與sigmoid函數配合使用,最終損失函數求導的結果為

∂ L o s s i ∂ w = ( y ^ i − y i ) x i \frac{\partial Loss_i}{\partial w} = (\hat y_i - y_i)x_i ∂w∂Lossi​​=(y^​i​−yi​)xi​

由此可見,求導的結果與 y ^ i − y i \hat y_i - y_i y^​i​−yi​與 x i x_i xi​的值有關,不會出現模型開始訓練速度很慢的現象。

具體的推導過程見參考文獻1

交叉熵損失函數求導

5.交叉熵損失函數與softmax函數配合使用

前面提到,在神經網絡中,交叉熵損失函數經常與softmax配合使用。

L o s s = − ∑ i t i l n y i Loss = - \sum_i t_i lny_i Loss=−i∑​ti​lnyi​

softmax函數

y i = e i ∑ j e j = 1 − ∑ j ≠ i e j ∑ j e j y_i = \frac{e^i}{\sum_j e^j} = 1 - \frac{\sum_{j \neq i} e^j}{\sum_j e^j} yi​=∑j​ejei​=1−∑j​ej∑j​=i​ej​

接下來求導

∂ L o s s i ∂ i = − ∂ l n y i ∂ i = − ∑ j e j e i ⋅ ∂ ( e i ∑ j e j ) ∂ i = − ∑ j e j e i ⋅ ( − ∑ j ≠ i e j ) ⋅ ∂ ( 1 ∑ j e j ) ∂ i = ∑ j e j ⋅ ∑ j ≠ i e j e i ⋅ − e i ( ∑ j e j ) 2 = − ∑ j ≠ i e j ∑ j e j = − ( 1 − e i ∑ j e j ) = y i − 1 {\begin{aligned} \frac{\partial Loss_i}{\partial _i} & = - \frac{\partial ln y_i}{\partial _i} \\ & = -\frac{\sum_j e^j}{e^i} \cdot \frac {\partial (\frac{e_i}{\sum_j e^j})}{\partial_i} \\ & = -\frac{\sum_j e^j}{e^i} \cdot (- \sum _ {j \neq i}e^j ) \cdot \frac{\partial( \frac {1} {\sum_j e^j} ) } { \partial _i} \\ & = \frac { \sum_j e^j \cdot \sum_{j \neq i} e^j} {e^i } \cdot \frac { - e^i} { (\sum_j e^j) ^ 2} \\ & = -\frac { \sum_{j \neq i} e^j } { \sum_j e^j } \\ & = -(1 - \frac{ e ^ i } { \sum_j e^j } ) \\ & = y_i - 1 \end{aligned}} ∂i​∂Lossi​​​=−∂i​∂lnyi​​=−ei∑j​ej​⋅∂i​∂(∑j​ejei​​)​=−ei∑j​ej​⋅(−j​=i∑​ej)⋅∂i​∂(∑j​ej1​)​=ei∑j​ej⋅∑j​=i​ej​⋅(∑j​ej)2−ei​=−∑j​ej∑j​=i​ej​=−(1−∑j​ejei​)=yi​−1​

由此可見,交叉熵函數與softmax函數配合,損失函數求導非常簡單!

參考文獻

1.https://blog.csdn.net/bitcarmanlee/article/details/51473567

繼續閱讀