【机器学习基础】深入理解极大似然估计(MLE) 1: 引入问题
導讀:極大似然估計(MLE) 是統計機器學習中最基本的概念,但是能真正全面深入地理解它的性質和背后和其他基本理論的關系不是件容易的事情。極大似然估計和以下概念都有著緊密的聯系:隨機變量,無偏性質(unbiasedness),一致估計(consistent),asymptotic normality,最優化(optimization),Fisher Information,MAP(最大后驗估計),KL-Divergence,sufficient statistics等。在眾多闡述 MLE 的文章或者課程中,總體來說都比較抽象,注重公式推導。本系列文章受 3blue1brown 可視化教學的啟發,堅持從第一性原理出發,通過數學原理結合模擬和動畫,深入淺出地讓讀者理解極大似然估計。
相關鏈接:
用逆變換采樣方法構建隨機變量生成器
從零構建統計隨機變量生成器之離散基礎篇
拋硬幣問題
我們來思考這個老套問題,考慮手上有一枚硬幣,旋轉(拋)硬幣得到正反面的概率固定(令正面概率為)但未知,我們如何能通過實驗推測出
?樸素的想法是,不斷嘗試拋硬幣,隨著次數 n 的增多,正面的比例會趨近于
對應到數學形式上,令我們對于 的估計為 ,則希望
模擬試驗代碼
假設我們嘗試了n次,每次的結果為 ,為1(正面) 或 0(反面)。比如試了三次的結果是 [1, 0, 1],則 。一般,我們將觀察到的數據寫成向量形式
我們知道硬幣的正反結果符合伯努利分布,也就是
因為 x 只有0,1兩種取值,因此上式也可以寫成等價如下的不含條件分支的形式
假設 ,如果做 n=10 次試驗,結果應該比較接近7個1,3個0。
下面我們來模擬一下 n=10,看看結果如何。
下面代碼的實現上我們直接使用了pytorch 內置的 bernoulli 函數生成 n 個隨機變量實例
def?gen_coins(theta,?n=1):import?torchtheta_vec?=?torch.tensor(n*[theta])random_values?=?torch.bernoulli(theta_vec)return?random_values讓我們來做三次 n=10 的試驗
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()能發現 7個1,3個0 確實是比較可能的結果。
trial?0 head?#:?7.0 tail?#:?3.0trial?1 head?#:?9.0 tail?#:?1.0trial?2 head?#:?7.0 tail?#:?3.0生成概率
直覺告訴我們,當 時,根據 ,7個1,3個0 出現的概率應該是最大,6個1,4個0 或者 8個1,2個0 這兩種情況出現概率稍小,其他的情況概率更小。通過基本概率和伯努利公式,重復 n 次試驗 1和0出現的概率可以由下面公式算出。(注:7個1,3個0不是單一事件,需要乘以組合數算出實際概率)
| 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出現7次的概率確實最大。
?回到我們的問題,我們先假定 的硬幣做 n=10 次試驗的結果就是 7個1,3個0,或者具體序列為 [1, 0, 0, 1, 0, 1, 1, 1, 1, 1]。那么我們希望按照某種方法推測的估計值 也為 0.7。
若將這個方法也記做 ,它是 的函數
即
我們如何構建這個方法呢?很顯然, 中 1 的個數就可以勝任,。這個方式確實是正確的,后面的文章我們也會證明它是MLE在伯努利分布參數估計時的計算方法。
但是伯努利分布參數估計的問題中是最簡單的情況,背后對應的更一般的問題是:假設我們知道某個過程或者實驗生成了某種分布 P,但是不知道它的參數 ,如何能通過反復的試驗來推斷 ,同時,我們希望隨著試驗次數的增多, 能逼近 。
由于過程是有隨機性,試驗結果 并不能確定一定是從 生成的,因此我們需要對所有 打分。對于拋硬幣試驗來說,我們窮舉所有在 [0, 1] 范圍內的 ,定義它的打分函數 ,并且希望我們定義的 ?在 時得分最高。推廣到一般場景,有如下性質
如此,我們將推測參數問題轉換成了優化問題
樸素方法
一種樸素的想法是,由于 ,因此我們每次的結果應該稍微偏向 1,如果出現了 1,就記0.7分,出現了0,記0.3分,那么我們可以用10個結果的總分來定義總得分,即最大化函數
很可惜,我們定義的 f 并不符合 時取到最大的原則。下面畫出了 在 [0, 1] 范圍內 f 值,X 固定為 [1, 0, 0, 1, 0, 1, 1, 1, 1, 1]。顯然,極值在 0.5 左右。
?這種對于觀察到的變量實例在整個參數空間打分的方法是最大似然方法的雛形。我們將每次試驗結果對于不同 的打分就是似然函數的概念。
伯努利似然函數(Likelihood)
伯努利單個結果的似然函數 視為 的函數,x視為給定值,它等價于概率質量函數 PMF
極大似然估計(MLE)
有了單個結果的似然函數,我們如何定義 呢?我們定義的 需要滿足,在 ? , 的情況下,試驗最有可能的結果是 7 個1,3個0,此時 f 需要在 時取到最大值。
極大似然估計(MLE) 為我們定義了合理的 ,和樸素的想法類似,但是這次用單個結果的似然函數連乘而非連加
我們再來看一下當 時 ? 在 空間的取值情況,果然,MLE 能在 0.7時取到最大值。
?對數似然函數
最大似然函數 能讓我們找到最可能的 ,但現實中,我們一般采用最大其 log 的形式。
理論能證明,最大對數似然函數得到的極值等價于最大似然函數。但這么做有什么額外好處呢?
我們先將對數似然函數畫出來
?它的極大值也在 0.7,但是我們發現對數似然函數是個 concave 函數。在優化領域,最大化 concave 函數或者最小化 convex 函數可以有非常高效的解法。再仔細看之前的似然函數,它并不是一個 concave 函數。另一個非常重要的好處是,隨著 n 的增大,連乘會導致浮點數 underflow,而單個點的對數似然函數的和的形式就不會有這個問題。
Pytorch MLE 實踐
就讓我們來實踐一下,通過 pytorch 梯度下降來找到極值點。為什么是梯度下降呢,因為我們在代碼中的 loss 是上面對數似然函數取負值,這個就是最常見的負對數似然 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))有一點需要說明的是,在迭代過程中,我們保存最后三個導數的值,當最新的三個導數都很小時就退出迭代。
if?all(map(lambda?x:?abs(x)?<?1,?recent))運行代碼,能發現最大化對數似然函數能很穩定的找到 。
現在大家對于伯努利MLE有了一定了解,接著,我們來思考一下最大化似然函數方法是否隨著觀察次數的增多能不斷逼近真實的 呢?
MLE 估計的收斂性
?的情況下,我們來這樣做試驗,第一次做 n=1生成觀察數據 ,第二次做 n=2生成觀察數據
對于每個數據集 通過最大似然方法求得估計的
將這些 畫出來,可以看到,隨著 ,
?換一個角度來看一下,我們將 數列按照順序,離散化后再歸一化比例,如下圖畫出來,紅色的柱代表了最新的值 。可以發現,初始時候, 在較遠離 0.7 的地方出現,隨著 n 的增大,出現的位置比較接近 0.7。
但是不是所有 MLE 的結果都有無限接近目標參數的性質呢?這個懸念賣個關子留到后續的篇幅來揭示。
?MLE 估計的偏差和方差
我們已經知道 MLE 方法可以通過觀察數據推測出最有可能的 ,由于觀察數據 是伯努利過程產生的,具有隨機性,那么 可以看成是 的隨機變量。我們通過上面的試驗知道隨著試驗次數的增大,我們的估計會越來越逼近真實值,現在的問題是對于固定的n, 的方差是多少,它的均值是否是無偏的呢?
帶著這樣的疑問,我們現在做如下試驗:
固定 n=10,重復做實驗,畫出隨著次數增多 的分布,見圖中綠色部分。同樣的,紅色是 n=80 不斷試驗的分布變化。
?看的出來,隨著試驗次數的增多
? 都趨近于正態分布
的分散度比 要大,即方差要大
的均值都在 0.7
好了,本篇就到這里,更多深入的可視化概念以及MLE和其他概念的聯系,敬請后續篇幅為您呈現。
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯溫州大學《機器學習課程》視頻 本站qq群851320808,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【机器学习基础】深入理解极大似然估计(MLE) 1: 引入问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Outlook2010怎么关联邮箱 Ou
- 下一篇: win7系统去除图标箭头的方法