項目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) ∑−yilog(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∑nyilog(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∑tilnyi
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=∑jejei=1−∑jej∑j=iej
接下來求導
∂ 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∑jej⋅∂i∂(∑jejei)=−ei∑jej⋅(−j=i∑ej)⋅∂i∂(∑jej1)=ei∑jej⋅∑j=iej⋅(∑jej)2−ei=−∑jej∑j=iej=−(1−∑jejei)=yi−1
由此可見,交叉熵函數與softmax函數配合,損失函數求導非常簡單!
參考文獻
1.https://blog.csdn.net/bitcarmanlee/article/details/51473567