分類問題的loss
- MSE
- Cross Entropy Loss
- Hinge Loss (SVN用的比較多)
- ∑ i m a x ( 0 , 1 ? y i ? h θ ( x i ) ) \sum_imax(0,1-y_i*h_\theta(x_i)) ∑i?max(0,1?yi??hθ?(xi?))
Entropy(熵)
- Uncertainty(也叫不確定性)
- measure of surprise(驚喜度)
- higher entropy = less info
- E n t r o p y = ? ∑ i P ( i ) log ? P ( i ) Entropy=-\sum_iP(i)\log P(i) Entropy=?∑i?P(i)logP(i)
Entropy就是熵,也叫做不確定性,從某種程度上講是驚喜度
比如你長得很帥,我說你很帥,這句話的內容就比較少,uncertainty就比較低,entropy比較高
比如某個人能力很差,但是有一天中了大獎,這個消息的Uncertainty就比較高,信息量就比較大,就是說沒有能力但是卻突然很有錢了,意味著這句話很驚喜,Uncertainty比較高,entropy比較低
entropy定義為每個i的probability再乘以log probability
具體的例子
熵穩定效應是指在信息論中,熵越高的系統越不穩定,而熵越低的系統越穩定。
每個數字的中獎概率相同時,這個分布的熵比較高,因為不確定性大(不知道哪個數字會中獎)
a為[0.1,0.1,0.1,0.7]的時候,4這個數字的中獎率比較高,其他數字的中獎率只有0.1。此時的熵是比較低的。這是因為熵是衡量隨機變量不確定性的度量,而在這個分布中,數字4的中獎概率遠高于其他數字,這意味著結果的不確定性較低,因為數字4的中獎幾乎是確定的。
a為[0.001,0.001,0.001,0.999]的時候,非常極端的情況,前面都不可能中獎,這個熵非常低,因為幾乎可以確定第四個結果會發生
Cross Entropy (交叉熵)
Entropy:指的是一個分布,比如說p本身的一個穩定性
Cross Entropy (交叉熵):一般指的是兩個分布,衡量兩個分布的穩定性
第一步可以推導為第二步 H ( p ) H(p) H(p)再加上 D k l ( p ∣ q ) D_{kl}(p|q) Dkl?(p∣q), D k l ( p ∣ q ) D_{kl}(p|q) Dkl?(p∣q)這一部分是kl divergence,也叫KL散度,是真正衡量兩個概率分布差異的方法
舉例,兩個高斯分布
重疊部分比較少,因此它的kl散度比較高,假設是2
完全重合,kl散度就接近于0了
根據定義如果P和Q相等,cross Entropy = Entropy
如果采用01編碼比如說[0,1,0,0]只有第二項是1,所以是1log1,所以entropy是0 ,一般分類問題都是01編碼,對于01編碼來說,這個H§的entropy就等于0,然后根據H(p,q)推導之后的式子,如果H( p )等于0的話,H(p,q)就等于 D k l ( p ∣ q ) D_{kl}(p|q) Dkl?(p∣q),也就意味著當我們去優化P和Q的交叉熵的時候,如果是01編碼相當于直接優化P和Q的KL散度,KL散度剛好衡量的是兩個分布重疊的情況,如果用網絡預測出θ條件的分布,還有一個真實的分布,這兩個分布的kl散度接近于0的話,意味著P=Q,恰好是我們需要的情況
cross entropy 對于01編碼來說就是kl散度,而kl散度又說明了,如果交叉熵接近于0那kl散度就接近于0,意味著p和q的分布越來越近,恰好是我們要優化的目標
二分類問題
二分類問題的交叉熵如何運算
首先H(P,Q)是P乘以log Q再求和的問題
只有cat和dog兩種分類,所以只有兩種求和,但是由于P(dog)=1-P(cat),也就是說非貓即狗,這里假設P(cat)是y,Q(cat)是p,那式子就可以改寫為y和p的式子,因為PQ分布使用的是01編碼,所以y就是實際的值,p就是模型預測出的概率分布,由于二分類問題,非貓即狗,最后就會得出上圖中y和p的表達式
如何解釋這個y和p的表達式
如果y等于1的話,式子等于H(P,Q)=-log p,要最小化這個式子,有負號所以要最大化log p,即最大化p,最大化輸入x,y=1的概率
如果y等于0的話,式子等于H(P,Q)=-log(1-p),要最小化這個式子,有負號所以要最大化log(1-p),就是要最小化p,最小化輸入x,y=1的概率,即最大化輸入x,y=0的概率(切記這里是二分類,不是0就是1)
例子:
當前的實例時一只小狗,P值就是真實分布,Q值就是模型預測分布,經過softmax預測是對的,但是可能性不高,看一下交叉熵約等于0.9
如果變成圖右下角的情況就非常理想,狗的概率就非常高,這時交叉熵是0.02,也就是說變好了,交叉熵也從0.9下降到了0.02,說明了 p θ p_{θ} pθ?越來越逼近 p r p_{r} pr?
可以看出與MSE一樣,都能夠很好的迫使我們的預測朝著我們想要的方向去進行
總結
為什么分類問題不適用MSE,而使用Cross Entropy?
- 如果使用sigmoid和mse搭配的話,很容易出現sigmoid飽和的情況,會出現梯度彌散
- cross entropy概率的梯度信息更大,更容易收斂的更快,比如說當前label趨近于1,如果q的分布沒有靠近1的話,例如在左端,就會發現loss會非常大,所以梯度會很大,會收斂的很快,當接近于1的時候,梯度就開始慢慢變小
- 如果發現cross entropy不行也可以試mse,因為mse的梯度求導更加簡單
神經網絡的結構,最后一層(可以橫著看)叫logit,后面經過softmax層再經過cross entropy做計算,對于pytorch來說灰色部分是由一個現成的網絡結構的,如果把softmax和cross entropy分開的話會出現一個數據不穩定的情況,所以一般不建議大家直接自己用softmax來處理,最好直接得到logit的輸出以后,用pytorch一次完成不要自己去處理,因為會出現數據不穩定的情況
實例
F.cross_entropy
函數中必須使用logits
,因為pytorch中已經把softmax和log打包再一起了,如果傳入pred_log就意味著再做一遍softmax,會導致數據非常小
如果一定要自己計算的話用F.nll_loss
就行,但是這里就必須傳入softmax之后的數據
F.cross_entropy
函數等于softmax操作+log操作+F.nll_loss
操作