編者按:Feedly聯(lián)合創(chuàng)始人、大數(shù)據(jù)與機器學(xué)習(xí)主管Kireet Reddy講解了LogSumExp原理。
機器學(xué)習(xí)中有很多巧妙的竅門,可以加速訓(xùn)練,提升表現(xiàn)……今天我將討論LogSumExp這一機器學(xué)習(xí)中常見的模式。首先給出定義:
我們什么時候會見到這樣的式子?常見的一個地方是計算softmax函數(shù)的交叉熵?fù)p失。如果這聽起來冗長難解,那么:1) 習(xí)慣一下,ML中太多東西有著瘋狂的名字;2) 直接意識到這沒什么復(fù)雜的。有必要的話可以看看斯坦福cs231n的出色講解,或者,就本文而言,只需了解softmax是這樣一個函數(shù)就可以:
其中,分子中的xj是分母中的一個值(其中一個xi)。所以softmax做的基本上是對一些值取冪,然后歸一化,使得所有xj的可能值總和為1,以生成所需的概率分布。
所以,你可以把softmax函數(shù)看成一種接受任何數(shù)字并轉(zhuǎn)換為概率分布的非線性方法。至于交叉熵,只需了解它是對函數(shù)取對數(shù)。這就涌現(xiàn)出了LogSumExp模式:
為什么這是一種生成概率分布的好方法,也許看起來有點神秘。目前而言,不妨把這當(dāng)成是信條。
數(shù)值穩(wěn)定性
我們還是接著談?wù)凩ogSumExp吧。首先,從純數(shù)學(xué)的角度來說,LogSumExp沒什么特別的。但是,當(dāng)我們討論計算機上的數(shù)學(xué)時,LogSumExp就特別起來了。原因在于計算機表示數(shù)字的方式。計算機使用固定數(shù)目的位元表示數(shù)字。幾乎所有時刻這都沒什么問題,但是,因為不可能用固定數(shù)目的位元精確表示數(shù)字的無限集合,所以有時這會導(dǎo)致誤差。
讓我們舉例演示這個問題,從xi中取樣兩個樣本:{1000, 1000, 1000}和{-1000, -1000, -1000}。將這兩個序列傳入softmax函數(shù)會得到同一概率分布{1/3, 1/3, 1/3},然后1/3的對數(shù)是一個合理的負(fù)數(shù)。現(xiàn)在讓我們嘗試用Python算下求和中的一項:
>>> import math
>>> math.e**1000
Traceback (most recent call last):
File "", line 1, in
OverflowError: (34, 'Result too large')
哎喲。也許-1000的運氣要好些:
>>> math.e**-1000
0.0
也不對勁。所以我們碰到了某種數(shù)值穩(wěn)定性問題,即使看起來合理的輸入值也會導(dǎo)致溢出。
迂回方案
幸運的是,人們找到了一個很好的緩解方法,根據(jù)冪的乘法法則:
以及對數(shù)的和差公式:
我們有:
上述變換的關(guān)鍵在于,我們引入了一個不牽涉log或exp函數(shù)的常數(shù)項c。現(xiàn)在我們只需為c選擇一個在所有情形下有效的良好的值。結(jié)果發(fā)現(xiàn),max(x1…xn)很不錯。
由此我們可以構(gòu)建對數(shù)softmax的新表達(dá)式:
現(xiàn)在我們用這個新表達(dá)式計算之前的兩個樣本。對{1000, 1000, 1000}而言,c = 1000,所以xi-c恒為零,代入上式,我們有:
log(3)是一個很合理的數(shù)字,計算機計算起來毫無問題。所以上面的樣本沒問題。同理,{-1000, -1000, -1000}也沒問題。
關(guān)鍵點
思考一些例子后,我們可以得到以下結(jié)論:
如果xi的值都不會造成穩(wěn)定性問題,那么“樸素”版本的LogSumExp可以很好地工作。但“改良”版同樣可以工作。
如果至少有一個xi的值很大,那么樸素版本會溢出,改良版不會。其他類似的大數(shù)值xi同理,而并不大的那些xi,基本上逼近零。
對于絕對值較大的負(fù)數(shù),翻轉(zhuǎn)下符號,道理是一樣的。
所以,盡管并不完美,我們在大多數(shù)情況下能夠得到相當(dāng)合理的表現(xiàn),而不會溢出。我創(chuàng)建了一個簡單的python腳本,這樣,你可以通過親自試驗驗證這一點:git.io/fx5Vx
LogSumExp是一個巧妙的竅門,分解了它的機制后,實際上相當(dāng)容易理解。一旦了解了LogSumExp和數(shù)值穩(wěn)定性問題,你就不會感到一些庫的文檔和源代碼難以理解了。
為了鞏固記憶(同時操練下數(shù)學(xué)),我建議你過一段時間嘗試自行推導(dǎo)下數(shù)學(xué),并在腦海中設(shè)想各種例子,做下推理。接著運行我的代碼(或者自己動手重寫),以驗證你的直覺。
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4381瀏覽量
64866 -
機器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8503瀏覽量
134611
原文標(biāo)題:機器學(xué)習(xí)常見模式LogSumExp解密
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
單片機學(xué)習(xí)中常見的問題和誤區(qū)
谷歌帶你體驗一把什么是機器學(xué)習(xí)

人工智能之機器學(xué)習(xí)常見算法

淺析機器學(xué)習(xí)建模中常見的7個誤區(qū)
機器學(xué)習(xí)研究中常見的七大謠傳總結(jié)

評論