softmax函數計算時候為什麼要減去一個最大值?
一、softmax回顧
首先我們給出softma層的回顧。
softmax用於多分類過程中,它將多個神經元的輸出,映射到(0,1)區間內,可以看成概率來理解,從而來進行多分類!
假設我們有一個數組,V,Vi表示V中的第i個元素,那麼這個元素的softmax值就
更形象的如下圖表示:
softmax直白來說就是將原來輸出是3,1,-3通過softmax函數一作用,就映射成為(0,1)的值為(0.88,0.12,0),而這些值的累和為1(滿足概率的性質),那麼我們就可以將它理解成概率,在最後選取輸出結點的時候,我們就可以選取概率最大(也就是值對應最大的)結點,作為我們的預測目標!
二、存在問題
當我們運算比較小的值的時候是不會有什麼問題的,但是如果運算的值比較大的時候,比如 很大或很小的時候,樸素的直接計算會上溢出或下溢出,從而導致嚴重問題。
舉個例子,對於[3,1,-3],直接計算是可行的,我們可以得到(0.88,0.12,0)。
但對於[1000,1000,1000],卻並不可行,我們會得到inf(這也是深度學習訓練過程常見的一個錯誤,看了本文之後,以後出現inf的時候,至少可以考慮softmax運算的上溢和下溢);對於[-1000,-999,-1000],還是不行,我們會得到-inf。
這是因為你的浮點數只有64位,在計算指數函數的環節,exp{1000} =inf,會發生上溢出;exp{-1000} =0,會發生下溢出。
三、解決辦法
解決辦法很簡單:
對任意a都成立,這意味著我們可以自由地調節指數函數的指數部分,一個典型的做法是取 中的最大值:a=max{x1,x2.....xn}
這可以保證指數最大不會超過0,於是你就不會上溢出。即便剩餘的部分下溢出了,加了a之後,你也能得到一個合理的值。
四、正確性證明
證明softmax不受輸入的常數偏移影響,即
softmax(x)=softmax(x+c)
也就是證明加了偏移c之後,對整個softmax層的作用不起影響。如下:
希望對你理解有幫助~
推薦閱讀:
TAG:机器学习 | 深度学习DeepLearning | 统计学习方法 |