日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

softmax函数上溢出和下溢出(转载+自己理解)

發(fā)布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 softmax函数上溢出和下溢出(转载+自己理解) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

《Deep Learning》(Ian Goodfellow & Yoshua Bengio & Aaron Courville)第四章「數(shù)值計算」中,談到了上溢出(overflow)和下溢出(underflow)對數(shù)值計算的影響,并以softmax函數(shù)和log softmax函數(shù)為例進行了講解。
這里我再詳細地把它總結(jié)一下。

『1』什么是下溢出(underflow)和上溢出(overflow)
實數(shù)在計算機內(nèi)用二進制表示,所以不是一個精確值,當數(shù)值過小的時候,被四舍五入為0,這就是下溢出。
此時如果對這個數(shù)再做某些運算(例如除以它)就會出問題。
反之,當數(shù)值過大的時候,情況就變成了上溢出。

『2』softmax函數(shù)是什么
softmax函數(shù)如下:
f(x)i=exi∑j=1nexj,j=1,2,???,nf(x)_i=\frac{e^{x_i}}{\sum_{j=1}^ne^{x_j}},j=1,2,···,nf(x)i?=j=1n?exj?exi??,j=1,2,???,n
從公式上看含義不是特別清晰,所以借用知乎上的一幅圖來說明(感謝原作者):

這幅圖極其清晰地表明了softmax函數(shù)是什么,一圖勝千言。

『2』計算softmax函數(shù)值的問題
通常情況下,計算softmax函數(shù)值不會出現(xiàn)什么問題,
例如,當softmax函數(shù)表達式里的所有xix_ixi?都是一個“一般大小”的數(shù)值c時–也就是上圖中,
z1=z2=z3=cz_1=z_2=z_3=cz1?=z2?=z3?=c時,那么,計算出來的函數(shù)值y1=y2=y3=13y_1=y_2=y_3=\frac{1}{3}y1?=y2?=y3?=31?

但是,當某些情況發(fā)生時,計算函數(shù)值就出問題了:

①c 極其大,導致分子計算ece^cec時上溢出。
②c 為負數(shù),且 |c|很大,此時分母是一個極小的正數(shù),有可能四舍五入為0,導致下溢出。

『3』如何解決 (針對①)
所以怎樣所以怎樣規(guī)避這些問題呢?我們可以用同一個方法一口氣解決倆:
令 M = max(xix_ixi?), i =1,2,3,….,n,即M為所有xix_ixi? 中最大的值,那么我們只需要計算f(xi?M)f(x_i- M)f(xi??M)的值,就可以解決上溢出、下溢出的問題了,并且,計算結(jié)果理論上仍然和f(xi)f(x_i)f(xi?) 保持一致。

舉個實例:還是以前面的圖為例,本來我們計算f(z2)f(z_2)f(z2?)是用“常規(guī)”方法來算的:

ez2ez1+ez2+ez3\frac {e^{z_2}} {e^{z_1} + e^{z_2} + e^{z_3}}ez1?+ez2?+ez3?ez2??

=e1e3+e1+e?3=\frac {e^{1}} {e^{3} + e^{1} + e^{-3}}=e3+e1+e?3e1?

≈0.12\approx 0.120.12


ez2ez1+ez2+ez3\frac {e^{z_2}} {e^{z_1} + e^{z_2} + e^{z_3}}ez1?+ez2?+ez3?ez2??

=ez2eMez1eM+ez2eM+ez3eM=\frac {\frac{e^{z_2}}{e^M} }{\frac{e^{z_1}}{e^M} + \frac{e^{z_2}}{e^M} + \frac{e^{z_3}}{e^M}}=eMez1??+eMez2??+eMez3??eMez2???

=e1?3e1?3+e3?3+e?3?3=\frac {e^{1-3}} {e^{1-3} + e^{3-3} + e^{-3-3}}=e1?3+e3?3+e?3?3e1?3?

≈0.12\approx 0.120.12

通過這樣的變換,對任何一個xix_ixi?,減去M之后,exi?Me^{x_i-M}exi??M的最大值為0,所以不會發(fā)生上溢出;
同時,分母中也至少會包含一個值為1的項,所以分母也不會下溢出
(四舍五入為0,這里的意思是分母中某個xi=Mx_i=Mxi?=M,所以分母肯定大于1)。
所以這個技巧沒什么高級的技術(shù)含量。
總結(jié):這里是在分析和處理分子上溢出,分母下溢出的情況

『4』延伸問題 (針對②)
看似已經(jīng)結(jié)案了,但仍然有一個問題:如果softmax函數(shù)中的分子發(fā)生下溢出,也就是前面所說的 c 為負數(shù),且 |c|很大,此時分母是一個極小的正數(shù),有可能四舍五入為0的情況,此時,如果我們把softmax函數(shù)的計算結(jié)果再拿去計算 log,即 log softmax,其實就相當于計算 log(0),所以會得到 ?∞,但這實際上是錯誤的,因為它是由舍入誤差造成的計算錯誤。(這段話的意思是害怕分母為0
所以,有沒有一個方法,可以把這個問題也解決掉呢?
答案還是采用和前面類似的策略來計算 log softmax 函數(shù)值:

log∣f(xi)∣log|f(x_i)|logf(xi?)
=log(exiex1+ex2+???+exn)=log(\frac{e^{x_i}}{e^{x_1}+e^{x_2}+···+e^{x_n}})=log(ex1?+ex2?+???exn?exi??)
=log(exieMex1eM+ex2eM+???+exneM)=log(\frac{\frac{e^{x_i}}{e^M}}{\frac{e^{x_1}}{e^M}+\frac{e^{x_2}}{e^M}+···+\frac{e^{x_n}}{e^M}})=log(eMex1??+eMex2??+???+eMexn??eMexi???)
=log(e(xi?M)∑jne(xj?M))=log(\frac{e^{(x_i-M)}}{\sum_j^ne^{(x_j-M)}})=log(jn?e(xj??M)e(xi??M)?)
=log(e(xi?M))?log(∑jne(xj?M))=log(e^{(x_i-M)})-log(\sum_j^ne^{(x_j-M)})log(e(xi??M))?log(jn?e(xj??M))
=(xi?M)?log(∑jne(xj?M))=(x_i-M)-log(\sum_j^ne^{(x_j-M)})=(xi??M)?log(jn?e(xj??M))

在最后的表達式中,會產(chǎn)生下溢出的因素已經(jīng)被消除掉了——求和項中,至少有一項的值為1(因為有一項xjx_jxj?-M是0),這使得log后面的值不會下溢出,也就不會發(fā)生計算 log(0) 的悲劇。

總結(jié):這里是在分析和處理分子下溢出,分母下溢出的情況

參考鏈接:
https://blog.csdn.net/m0_37477175/article/details/79686164

總結(jié)

以上是生活随笔為你收集整理的softmax函数上溢出和下溢出(转载+自己理解)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。