softmax函數計算時候為什麼要減去一個最大值?

一、softmax回顧

首先我們給出softma層的回顧。

softmax用於多分類過程中,它將多個神經元的輸出,映射到(0,1)區間內,可以看成概率來理解,從而來進行多分類!

假設我們有一個數組,V,Vi表示V中的第i個元素,那麼這個元素的softmax值就S_{i}=frac{e^{i}}{sum_{j}^{}{e^{j}}}

更形象的如下圖表示:

softmax直白來說就是將原來輸出是3,1,-3通過softmax函數一作用,就映射成為(0,1)的值為(0.88,0.12,0),而這些值的累和為1(滿足概率的性質),那麼我們就可以將它理解成概率,在最後選取輸出結點的時候,我們就可以選取概率最大(也就是值對應最大的)結點,作為我們的預測目標!

二、存在問題

當我們運算比較小的值的時候是不會有什麼問題的,但是如果運算的值比較大的時候,比x_{n} 很大或很小的時候,樸素的直接計算會上溢出或下溢出,從而導致嚴重問題。

舉個例子,對於[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都成立,這意味著我們可以自由地調節指數函數的指數部分,一個典型的做法是取 x_{1}、x_{2}....x_{n}中的最大值:a=max{x1,x2.....xn}

這可以保證指數最大不會超過0,於是你就不會上溢出。即便剩餘的部分下溢出了,加了a之後,你也能得到一個合理的值。

四、正確性證明

證明softmax不受輸入的常數偏移影響,即

softmax(x)=softmax(x+c)

也就是證明加了偏移c之後,對整個softmax層的作用不起影響。如下:

希望對你理解有幫助~


推薦閱讀:

TAG:机器学习 | 深度学习DeepLearning | 统计学习方法 |