【机器学习基础】深入理解极大似然估计(MLE) 1: 引入问题
導(dǎo)讀:極大似然估計(jì)(MLE) 是統(tǒng)計(jì)機(jī)器學(xué)習(xí)中最基本的概念,但是能真正全面深入地理解它的性質(zhì)和背后和其他基本理論的關(guān)系不是件容易的事情。極大似然估計(jì)和以下概念都有著緊密的聯(lián)系:隨機(jī)變量,無偏性質(zhì)(unbiasedness),一致估計(jì)(consistent),asymptotic normality,最優(yōu)化(optimization),Fisher Information,MAP(最大后驗(yàn)估計(jì)),KL-Divergence,sufficient statistics等。在眾多闡述 MLE 的文章或者課程中,總體來說都比較抽象,注重公式推導(dǎo)。本系列文章受 3blue1brown 可視化教學(xué)的啟發(fā),堅(jiān)持從第一性原理出發(fā),通過數(shù)學(xué)原理結(jié)合模擬和動(dòng)畫,深入淺出地讓讀者理解極大似然估計(jì)。
相關(guān)鏈接:
用逆變換采樣方法構(gòu)建隨機(jī)變量生成器
從零構(gòu)建統(tǒng)計(jì)隨機(jī)變量生成器之離散基礎(chǔ)篇
拋硬幣問題
我們來思考這個(gè)老套問題,考慮手上有一枚硬幣,旋轉(zhuǎn)(拋)硬幣得到正反面的概率固定(令正面概率為)但未知,我們?nèi)绾文芡ㄟ^實(shí)驗(yàn)推測出
?樸素的想法是,不斷嘗試拋硬幣,隨著次數(shù) n 的增多,正面的比例會(huì)趨近于
對(duì)應(yīng)到數(shù)學(xué)形式上,令我們對(duì)于 的估計(jì)為 ,則希望
模擬試驗(yàn)代碼
假設(shè)我們嘗試了n次,每次的結(jié)果為 ,為1(正面) 或 0(反面)。比如試了三次的結(jié)果是 [1, 0, 1],則 。一般,我們將觀察到的數(shù)據(jù)寫成向量形式
我們知道硬幣的正反結(jié)果符合伯努利分布,也就是
因?yàn)?x 只有0,1兩種取值,因此上式也可以寫成等價(jià)如下的不含條件分支的形式
假設(shè) ,如果做 n=10 次試驗(yàn),結(jié)果應(yīng)該比較接近7個(gè)1,3個(gè)0。
下面我們來模擬一下 n=10,看看結(jié)果如何。
下面代碼的實(shí)現(xiàn)上我們直接使用了pytorch 內(nèi)置的 bernoulli 函數(shù)生成 n 個(gè)隨機(jī)變量實(shí)例
def?gen_coins(theta,?n=1):import?torchtheta_vec?=?torch.tensor(n*[theta])random_values?=?torch.bernoulli(theta_vec)return?random_values讓我們來做三次 n=10 的試驗(yàn)
for?i?in?range(3):coins?=?gen_coins(theta=0.7,?n=10)print(f'trial?{i}')print(f'head?#:?{sum(coins)}')print(f'tail?#:?{sum(1-coins)}')print()能發(fā)現(xiàn) 7個(gè)1,3個(gè)0 確實(shí)是比較可能的結(jié)果。
trial?0 head?#:?7.0 tail?#:?3.0trial?1 head?#:?9.0 tail?#:?1.0trial?2 head?#:?7.0 tail?#:?3.0生成概率
直覺告訴我們,當(dāng) 時(shí),根據(jù) ,7個(gè)1,3個(gè)0 出現(xiàn)的概率應(yīng)該是最大,6個(gè)1,4個(gè)0 或者 8個(gè)1,2個(gè)0 這兩種情況出現(xiàn)概率稍小,其他的情況概率更小。通過基本概率和伯努利公式,重復(fù) n 次試驗(yàn) 1和0出現(xiàn)的概率可以由下面公式算出。(注:7個(gè)1,3個(gè)0不是單一事件,需要乘以組合數(shù)算出實(shí)際概率)
| head=0 | 0.000006 |
| head=1 | 0.000138 |
| head=2 | 0.000032 |
| head=3 | 0.001447 |
| head=4 | 0.036757 |
| head=5 | 0.102919 |
| head=6 | 0.200121 |
| head=7 | 0.266828 |
| head=8 | 0.233474 |
| head=9 | 0.121061 |
| head=10 | 0.028248 |
畫出圖看的很明顯,1出現(xiàn)7次的概率確實(shí)最大。
?回到我們的問題,我們先假定 的硬幣做 n=10 次試驗(yàn)的結(jié)果就是 7個(gè)1,3個(gè)0,或者具體序列為 [1, 0, 0, 1, 0, 1, 1, 1, 1, 1]。那么我們希望按照某種方法推測的估計(jì)值 也為 0.7。
若將這個(gè)方法也記做 ,它是 的函數(shù)
即
我們?nèi)绾螛?gòu)建這個(gè)方法呢?很顯然, 中 1 的個(gè)數(shù)就可以勝任,。這個(gè)方式確實(shí)是正確的,后面的文章我們也會(huì)證明它是MLE在伯努利分布參數(shù)估計(jì)時(shí)的計(jì)算方法。
但是伯努利分布參數(shù)估計(jì)的問題中是最簡單的情況,背后對(duì)應(yīng)的更一般的問題是:假設(shè)我們知道某個(gè)過程或者實(shí)驗(yàn)生成了某種分布 P,但是不知道它的參數(shù) ,如何能通過反復(fù)的試驗(yàn)來推斷 ,同時(shí),我們希望隨著試驗(yàn)次數(shù)的增多, 能逼近 。
由于過程是有隨機(jī)性,試驗(yàn)結(jié)果 并不能確定一定是從 生成的,因此我們需要對(duì)所有 打分。對(duì)于拋硬幣試驗(yàn)來說,我們窮舉所有在 [0, 1] 范圍內(nèi)的 ,定義它的打分函數(shù) ,并且希望我們定義的 ?在 時(shí)得分最高。推廣到一般場景,有如下性質(zhì)
如此,我們將推測參數(shù)問題轉(zhuǎn)換成了優(yōu)化問題
樸素方法
一種樸素的想法是,由于 ,因此我們每次的結(jié)果應(yīng)該稍微偏向 1,如果出現(xiàn)了 1,就記0.7分,出現(xiàn)了0,記0.3分,那么我們可以用10個(gè)結(jié)果的總分來定義總得分,即最大化函數(shù)
很可惜,我們定義的 f 并不符合 時(shí)取到最大的原則。下面畫出了 在 [0, 1] 范圍內(nèi) f 值,X 固定為 [1, 0, 0, 1, 0, 1, 1, 1, 1, 1]。顯然,極值在 0.5 左右。
?這種對(duì)于觀察到的變量實(shí)例在整個(gè)參數(shù)空間打分的方法是最大似然方法的雛形。我們將每次試驗(yàn)結(jié)果對(duì)于不同 的打分就是似然函數(shù)的概念。
伯努利似然函數(shù)(Likelihood)
伯努利單個(gè)結(jié)果的似然函數(shù) 視為 的函數(shù),x視為給定值,它等價(jià)于概率質(zhì)量函數(shù) PMF
極大似然估計(jì)(MLE)
有了單個(gè)結(jié)果的似然函數(shù),我們?nèi)绾味x 呢?我們定義的 需要滿足,在 ? , 的情況下,試驗(yàn)最有可能的結(jié)果是 7 個(gè)1,3個(gè)0,此時(shí) f 需要在 時(shí)取到最大值。
極大似然估計(jì)(MLE) 為我們定義了合理的 ,和樸素的想法類似,但是這次用單個(gè)結(jié)果的似然函數(shù)連乘而非連加
我們?cè)賮砜匆幌庐?dāng) 時(shí) ? 在 空間的取值情況,果然,MLE 能在 0.7時(shí)取到最大值。
?對(duì)數(shù)似然函數(shù)
最大似然函數(shù) 能讓我們找到最可能的 ,但現(xiàn)實(shí)中,我們一般采用最大其 log 的形式。
理論能證明,最大對(duì)數(shù)似然函數(shù)得到的極值等價(jià)于最大似然函數(shù)。但這么做有什么額外好處呢?
我們先將對(duì)數(shù)似然函數(shù)畫出來
?它的極大值也在 0.7,但是我們發(fā)現(xiàn)對(duì)數(shù)似然函數(shù)是個(gè) concave 函數(shù)。在優(yōu)化領(lǐng)域,最大化 concave 函數(shù)或者最小化 convex 函數(shù)可以有非常高效的解法。再仔細(xì)看之前的似然函數(shù),它并不是一個(gè) concave 函數(shù)。另一個(gè)非常重要的好處是,隨著 n 的增大,連乘會(huì)導(dǎo)致浮點(diǎn)數(shù) underflow,而單個(gè)點(diǎn)的對(duì)數(shù)似然函數(shù)的和的形式就不會(huì)有這個(gè)問題。
Pytorch MLE 實(shí)踐
就讓我們來實(shí)踐一下,通過 pytorch 梯度下降來找到極值點(diǎn)。為什么是梯度下降呢,因?yàn)槲覀冊(cè)诖a中的 loss 是上面對(duì)數(shù)似然函數(shù)取負(fù)值,這個(gè)就是最常見的負(fù)對(duì)數(shù)似然 loss (NLL)。
from?stats.coin?import?gen_coins from?collections?import?dequedef?train(num_head:?int,?num_tail:?int)?->?float:import?torchtheta?=?torch.tensor(0.5,?requires_grad=True)recent?=?deque(3*[100],?maxlen=3)lr?=?0.00001for?iter?in?range(2000):loss?=?-(num_head?*?torch.log(theta)?+?num_tail?*?torch.log(1?-?theta))loss.backward()with?torch.no_grad():theta?-=?lr?*?theta.grad#?print(f'{iter}:?{theta},?{theta.grad}')recent.append(theta.grad.item())if?all(map(lambda?x:?abs(x)?<?1,?recent)):breaktheta.grad.zero_()return?theta.item()if?__name__?==?'__main__':data?=?gen_coins(0.6,?n=200)num_head?=?(data.detach()?==?1).sum().item()num_tail?=?(data.detach()?==?0).sum().item()print(num_head,?num_tail)print(train(num_head,?num_tail))有一點(diǎn)需要說明的是,在迭代過程中,我們保存最后三個(gè)導(dǎo)數(shù)的值,當(dāng)最新的三個(gè)導(dǎo)數(shù)都很小時(shí)就退出迭代。
if?all(map(lambda?x:?abs(x)?<?1,?recent))運(yùn)行代碼,能發(fā)現(xiàn)最大化對(duì)數(shù)似然函數(shù)能很穩(wěn)定的找到 。
現(xiàn)在大家對(duì)于伯努利MLE有了一定了解,接著,我們來思考一下最大化似然函數(shù)方法是否隨著觀察次數(shù)的增多能不斷逼近真實(shí)的 呢?
MLE 估計(jì)的收斂性
?的情況下,我們來這樣做試驗(yàn),第一次做 n=1生成觀察數(shù)據(jù) ,第二次做 n=2生成觀察數(shù)據(jù)
對(duì)于每個(gè)數(shù)據(jù)集 通過最大似然方法求得估計(jì)的
將這些 畫出來,可以看到,隨著 ,
?換一個(gè)角度來看一下,我們將 數(shù)列按照順序,離散化后再歸一化比例,如下圖畫出來,紅色的柱代表了最新的值 。可以發(fā)現(xiàn),初始時(shí)候, 在較遠(yuǎn)離 0.7 的地方出現(xiàn),隨著 n 的增大,出現(xiàn)的位置比較接近 0.7。
但是不是所有 MLE 的結(jié)果都有無限接近目標(biāo)參數(shù)的性質(zhì)呢?這個(gè)懸念賣個(gè)關(guān)子留到后續(xù)的篇幅來揭示。
?MLE 估計(jì)的偏差和方差
我們已經(jīng)知道 MLE 方法可以通過觀察數(shù)據(jù)推測出最有可能的 ,由于觀察數(shù)據(jù) 是伯努利過程產(chǎn)生的,具有隨機(jī)性,那么 可以看成是 的隨機(jī)變量。我們通過上面的試驗(yàn)知道隨著試驗(yàn)次數(shù)的增大,我們的估計(jì)會(huì)越來越逼近真實(shí)值,現(xiàn)在的問題是對(duì)于固定的n, 的方差是多少,它的均值是否是無偏的呢?
帶著這樣的疑問,我們現(xiàn)在做如下試驗(yàn):
固定 n=10,重復(fù)做實(shí)驗(yàn),畫出隨著次數(shù)增多 的分布,見圖中綠色部分。同樣的,紅色是 n=80 不斷試驗(yàn)的分布變化。
?看的出來,隨著試驗(yàn)次數(shù)的增多
? 都趨近于正態(tài)分布
的分散度比 要大,即方差要大
的均值都在 0.7
好了,本篇就到這里,更多深入的可視化概念以及MLE和其他概念的聯(lián)系,敬請(qǐng)后續(xù)篇幅為您呈現(xiàn)。
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)筆記專輯《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯溫州大學(xué)《機(jī)器學(xué)習(xí)課程》視頻 本站qq群851320808,加入微信群請(qǐng)掃碼:總結(jié)
以上是生活随笔為你收集整理的【机器学习基础】深入理解极大似然估计(MLE) 1: 引入问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Outlook2010怎么关联邮箱 Ou
- 下一篇: 【效率】一次打包,无限复用!教你用 Py