這個是用pytorch蓋LeNet的時候,在輸出的時候加上softmax發現效果很差,所以就來研究softmax的數學特性,順便把LogSoftmax也一起比較.
softmax的功用:
softmax是把一群數據x=[x1,x2,…,xn],都指數化,然後加總,再把加總除每個分項,結果會讓每個分項都介於0~1,和sigmoid不同的,softmax後的數據組總和會是1
下圖是softmax的數學推導,主要是在反向傳遞上,softmax_xi對xi的微分後,可以拆成兩個分項,(1-softmax_xi)*softmax_xi,也就是說softmax算出來多少,誤差傳遞的鏈鎖上就會多乘這兩個分項,那這個在計算上會有什麼效果呢?
如果在softmax_xi很大的情況下(接近1),比如說0.999,那整個反向傳遞就會多乘上(0.999)(1–0.999)=0.999*0.001=0.000999,這代表你的誤差整整縮小超過1000倍,除非loss本身就很大,不然整體網路的訓練效果會非常非常差.
同理在softmax_xi很小(接近0)的情況下也會有一樣的情況.
還有一種是sofmax組內數據很多的時候,每個分項除下來都很小,這種時候整個網路的訓練效率就非常非常差.
因此softmax的限制其實不小,很容易就權重更新龜速.
logsoftmax的功用:
這個則是把softmax算出的結果取log,對於小於自然對數e的數字而言,取log後會小於零,所以輸出都是負值,而且越小的值取log後,輸出效果會越顯著,比如softmax=0.001,那取log會變成:-6.90775,因此經過logsoftmax以後的數據組就很難敘述他的特性了,運算如下圖
重點在於反向傳播的部分,他的微分後的結果是(1-softmax_xi),和softmax相比少了一項,因此就不會有softmax分項極大或極小的狀況下,誤差回傳效果極差的現象.
logsoftmax在輸出越負的狀況下,反向傳遞的倍率會越接近1,在輸出越接近0的情況下,反向傳遞的倍率會越接近0.(logsoftmax輸出都是負的,輸出越負,取絕對值後反而是越大的)
這個特殊的反向傳遞現象會有幾個結果,
- loss的magnitude很大,輸出的magnitude也很大,倍率接近1,因此反向傳遞的更新極快
- loss的magnitude很大,輸出的magnitude很小,倍率接近0,因此反向傳遞的更新偏慢
- loss的magnitude很小,輸出的magnitude很大,倍率接近1,因此反向傳遞的更新偏慢
- loss的magnitude很小,輸出的magnitude也很小,倍率接近0,因此反向傳遞幾乎無法更新
由於神經網路的配置很多樣化和初始權重隨機的條件下,各種可能性都有,但以本次講解的LeNet來說,訓練的中期以後就是loss magnitude偏小,輸出的magnitude也逐漸偏小,因此權重更新的速度也會慢慢降低.