1. 程式人生 > >深度學習裡的損失函式與交叉熵

深度學習裡的損失函式與交叉熵

1.MSE損失函式

損失函式是機器學習與深度學習裡面的重要概念。從名字上就可以看出,損失函式(Loss Function)反應的是模型對資料的擬合程度。一般來說,損失函式越小,說明模型對資料的擬合也越好。同時我們還希望當損失函式比較大的時候,對應的梯度也會比較大,這樣梯度下降的時候更新也會快一些。
線性迴歸中,最常用的就是最小平方誤差(MSE)了。MSE也相當簡單:
L o s

s m s e = i
= 1
n
( y i y
~
) 2 Loss_{mse} = \sum _{i=1} ^n(y_i - \tilde{y}) ^ 2
其中, y i y_i 為樣本的真實值, y ~ \tilde{y} 為預測值。
MSE的意義相當明確:如果預測值與真實值的歐式距離越大,損失函式越大。歐式距離越小,損失函式越小。同時,求導也是相當容易:
L θ = 2 i = 1 n ( y i y ~ ) y ~ θ \frac{\partial L}{\partial \theta} = 2 \sum _{i=1} ^n(y_i - \tilde{y}) \frac{\partial \tilde y}{\partial \theta}
其中, θ \theta 是模型中待訓練的引數。

一般來說,MSE是個很中庸的選擇。用了MSE,一般不會有什麼大毛病,但同時也不要指望他有特別優秀的表現。

2.Sigmoid一般不與MSE配合使用

上面求MSE導數的時候,注意到最後有一項是 y ~ \tilde y 對引數求導。在深度學習裡,Sigmoid函式是常見的啟用函式。特別注意的是,當使用Sigmoid做啟用函式的時候,損失函式不能選擇MSE。因為Sigmoid的導數為 f ( x ) ( 1 f ( x ) ) f(x)(1-f(x)) 。假設當預測值為 f ( x ) = 1 f(x)=1 而真實值為0的時候,此時雖然 ( y i y ~ ) (y_i - \tilde{y}) 很大,但是 f ( x ) ( 1 f ( x ) ) f(x)(1-f(x)) 太小接近0,收斂速度同樣很慢。

3.常見的損失函式與啟用函式的組合

3.1 MSE + Sigmoid以外的啟用函式

第二部分特意提到,MSE一般不與Sigmoid函式配合使用。

3.2 Cross Entropy + Sigmoid

前面我們提到Sigmoid函式的導數為 f ( x ) ( 1 f ( x ) ) f(x)(1-f(x)) 。所以我們的損失函式最好是分母上有這一項。所以一般使用交叉熵作為損失函式:
J ( θ ) = c o s t ( h θ ( x ) , y ) = y i l o g ( h θ ( x ) ) ( 1 y i ) l o g ( 1 h θ ( x ) ) J(\theta)=cost(h_{\theta}(x),y) = -y_ilog(h_{\theta}(x)) - (1-y_i)log(1-h_{\theta}(x))

3.3 Softmat + Cross Entropy / log-likehood

對於多分類問題,Softmax是常用的方式。Softmax本質上是一個歸一化變換,能將普通的輸出變成一個概率輸出。

4.KL散度

如果我們有另一個獨立的隨機變數x相關的事件B,該怎麼計算它們之間的區別?
此處我們介紹預設的計算方法:KL散度,有時候也叫KL距離,一般被用於計算兩個分佈之間的不同。看名字似乎跟計算兩個點之間的距離也很像,但實則不然,因為KL散度不具備有對稱性。在距離上的對稱性指的是A到B的距離等於B到A的距離。
舉個不恰當的例子,事件A:張三今天買了2個土雞蛋,事件B:李四今天買了6個土雞蛋。我們定義隨機變數x:買土雞蛋,那麼事件A和B的區別是什麼?有人可能說,那就是李四多買了4個土雞蛋?這個答案只能得50分,因為忘記了"座標系"的問題。換句話說,對於張三來說,李四多買了4個土雞蛋。對於李四來說,張三少買了4個土雞蛋。選取的參照物不同,那麼得到的結果也不同。更嚴謹的說,應該是說我們對於張三和李四買土雞蛋的期望不同,可能張三天天買2個土雞蛋,而李四可能因為孩子滿月昨天才買了6個土雞蛋,而平時從來不買。

KL散度的數學定義:

對於離散事件我們可以定義事件A和B的差別為
D K L ( A B ) = i P A ( x i ) l o g ( P A ( x i ) P B ( x i ) ) = i P A ( x i ) l o g P A ( x i ) P A ( x i ) l o g P B ( x i ) D_{KL}(A||B) = \sum_i P_A(x_i)log\left(\frac{P_A(x_i)}{P_B(x_i)}\right) = \sum_i P_A(x_i)logP_A(x_i) - P_A(x_i)logP_B(x_i)
對於連續事件,將求和改為積分即可。 D K L ( A B ) = a ( x ) l o g ( a ( x ) b ( x ) )   D_{KL}(A||B) =\int a(x) log\left(\frac{a(x)}{b(x)}\right) 

由上面的公式可以看出:
K L = KL散度 = 交叉熵 - 熵

5.交叉熵

交叉熵的定義:
H ( A , B ) = i = 1 n A ( x i ) l o g ( B ( x i ) ) H(A, B) = -\sum_{i=1}^n A(x_i)log(B(x_i))