在深度學習中,我們常常選用sigmoid函數作為激活函數。sigmoid函數的具體形式如下:
曲線表示為:
再畫大一點,取x區間更大一些,則為:
顯然從圖像上看,sigmoid函數是數值穩定的,即對于更大范圍的x,y的取值是連續的,有效的。
從理論上看,
且中間數值可以從數學上證明是穩定的。
但我們考慮1-f(x)呢?
我們用matlab繪制其曲線:
我們發現這時,當x趨向負無窮,甚至僅僅x趨向-800,此時1-f(x)就不再穩定了,在matlab的值變成了NAN了。
其實我們發現,對于 1- f(x),顯然當x趨向正無窮時,還是穩定的,此時:
分子:e?x→0,而分母:1+e?x→1,
顯然01,結果趨向0.
但是當x趨向負無窮時,此時,
分子: e?x→+∞,而分母:1+e?x→+∞,
此時:
e?x1+e?x就會變得不穩定,盡管理論上趨向1。
因此就出現了以上的圖像。
那么如何解決這種不穩定問題的解呢?
其實有兩種辦法:
(一)先計算穩定的f(x),結果賦予y,再計算1-y .
乍看從數學上,好像完全一致,但是在數值解上不等價。 y=f(x)是穩定的,因此對于1-f(x)=1-y也變成了穩定的解。
我們從圖像上證明:
此時就正確了,與理論解完全一致。
(二)直接從1-f(x)著手
這里我們從caffe的sigmoid_cross_entropy_loss_layer.cpp得到啟發。
主要辦法就是對于
分別考慮正負x.
當x≥0時,維持上式不變;
當x<0時,分子分母同時乘以ex,則有:
此時繪制曲線為:
因此在實際coding中,我們需要考慮計算的穩定性。