softmax函数上溢出和下溢出(转载+自己理解)
《Deep Learning》(Ian Goodfellow & Yoshua Bengio & Aaron Courville)第四章「數(shù)值計(jì)算」中,談到了上溢出(overflow)和下溢出(underflow)對(duì)數(shù)值計(jì)算的影響,并以softmax函數(shù)和log softmax函數(shù)為例進(jìn)行了講解。
這里我再詳細(xì)地把它總結(jié)一下。
『1』什么是下溢出(underflow)和上溢出(overflow)
實(shí)數(shù)在計(jì)算機(jī)內(nèi)用二進(jìn)制表示,所以不是一個(gè)精確值,當(dāng)數(shù)值過(guò)小的時(shí)候,被四舍五入為0,這就是下溢出。
此時(shí)如果對(duì)這個(gè)數(shù)再做某些運(yùn)算(例如除以它)就會(huì)出問(wèn)題。
反之,當(dāng)數(shù)值過(guò)大的時(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
從公式上看含義不是特別清晰,所以借用知乎上的一幅圖來(lái)說(shuō)明(感謝原作者):
這幅圖極其清晰地表明了softmax函數(shù)是什么,一圖勝千言。
『2』計(jì)算softmax函數(shù)值的問(wèn)題
通常情況下,計(jì)算softmax函數(shù)值不會(huì)出現(xiàn)什么問(wèn)題,
例如,當(dāng)softmax函數(shù)表達(dá)式里的所有xix_ixi?都是一個(gè)“一般大小”的數(shù)值c時(shí)–也就是上圖中,
z1=z2=z3=cz_1=z_2=z_3=cz1?=z2?=z3?=c時(shí),那么,計(jì)算出來(lái)的函數(shù)值y1=y2=y3=13y_1=y_2=y_3=\frac{1}{3}y1?=y2?=y3?=31?
但是,當(dāng)某些情況發(fā)生時(shí),計(jì)算函數(shù)值就出問(wèn)題了:
①c 極其大,導(dǎo)致分子計(jì)算ece^cec時(shí)上溢出。
②c 為負(fù)數(shù),且 |c|很大,此時(shí)分母是一個(gè)極小的正數(shù),有可能四舍五入為0,導(dǎo)致下溢出。
『3』如何解決 (針對(duì)①)
所以怎樣所以怎樣規(guī)避這些問(wèn)題呢?我們可以用同一個(gè)方法一口氣解決倆:
令 M = max(xix_ixi?), i =1,2,3,….,n,即M為所有xix_ixi? 中最大的值,那么我們只需要計(jì)算f(xi?M)f(x_i- M)f(xi??M)的值,就可以解決上溢出、下溢出的問(wèn)題了,并且,計(jì)算結(jié)果理論上仍然和f(xi)f(x_i)f(xi?) 保持一致。
舉個(gè)實(shí)例:還是以前面的圖為例,本來(lái)我們計(jì)算f(z2)f(z_2)f(z2?)是用“常規(guī)”方法來(lái)算的:
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.12≈0.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.12≈0.12
通過(guò)這樣的變換,對(duì)任何一個(gè)xix_ixi?,減去M之后,exi?Me^{x_i-M}exi??M的最大值為0,所以不會(huì)發(fā)生上溢出;
同時(shí),分母中也至少會(huì)包含一個(gè)值為1的項(xiàng),所以分母也不會(huì)下溢出
(四舍五入為0,這里的意思是分母中某個(gè)xi=Mx_i=Mxi?=M,所以分母肯定大于1)。
所以這個(gè)技巧沒(méi)什么高級(jí)的技術(shù)含量。
總結(jié):這里是在分析和處理分子上溢出,分母下溢出的情況
『4』延伸問(wèn)題 (針對(duì)②)
看似已經(jīng)結(jié)案了,但仍然有一個(gè)問(wèn)題:如果softmax函數(shù)中的分子發(fā)生下溢出,也就是前面所說(shuō)的 c 為負(fù)數(shù),且 |c|很大,此時(shí)分母是一個(gè)極小的正數(shù),有可能四舍五入為0的情況,此時(shí),如果我們把softmax函數(shù)的計(jì)算結(jié)果再拿去計(jì)算 log,即 log softmax,其實(shí)就相當(dāng)于計(jì)算 log(0),所以會(huì)得到 ?∞,但這實(shí)際上是錯(cuò)誤的,因?yàn)樗怯缮崛胝`差造成的計(jì)算錯(cuò)誤。(這段話的意思是害怕分母為0)
所以,有沒(méi)有一個(gè)方法,可以把這個(gè)問(wèn)題也解決掉呢?
答案還是采用和前面類似的策略來(lái)計(jì)算 log softmax 函數(shù)值:
log∣f(xi)∣log|f(x_i)|log∣f(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(j∑n?e(xj??M))
=(xi?M)?log(∑jne(xj?M))=(x_i-M)-log(\sum_j^ne^{(x_j-M)})=(xi??M)?log(j∑n?e(xj??M))
在最后的表達(dá)式中,會(huì)產(chǎn)生下溢出的因素已經(jīng)被消除掉了——求和項(xiàng)中,至少有一項(xiàng)的值為1(因?yàn)橛幸豁?xiàng)xjx_jxj?-M是0),這使得log后面的值不會(huì)下溢出,也就不會(huì)發(fā)生計(jì)算 log(0) 的悲劇。
總結(jié):這里是在分析和處理分子下溢出,分母下溢出的情況
參考鏈接:
https://blog.csdn.net/m0_37477175/article/details/79686164
總結(jié)
以上是生活随笔為你收集整理的softmax函数上溢出和下溢出(转载+自己理解)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: hexo的yelee主题使用自定义字体并
- 下一篇: 第五章functions.py中的交叉熵