使用TensorFlow Probability實現(xiàn)最大似然估計
TensorFlow Probability是一個構建在TensorFlow之上的Python庫。它將我們的概率模型與現(xiàn)代硬件(例如GPU)上的深度學習結合起來。
極大似然估計
最大似然估計是深度學習模型中常用的訓練過程。目標是在給定一些數(shù)據(jù)的情況下,估計概率分布的參數(shù)。簡單來說,我們想要最大化我們在某個假設的統(tǒng)計模型下觀察到的數(shù)據(jù)的概率,即概率分布。
這里我們還引入了一些符號。連續(xù)隨機變量的概率密度函數(shù)大致表示樣本取某一特定值的概率。我們將表示這個函數(shù)??(??|??),其中??是樣本的值,??是描述概率分布的參數(shù):
當從同一個分布中獨立抽取多個樣本時(我們通常假設),樣本值??1,…,????的概率密度函數(shù)是每個個體????的概率密度函數(shù)的乘積:
可以很容易地用一個例子來計算上面的問題。假設我們有一個標準的高斯分布和一些樣本:??1=?0.5,??2=0和??3=1.5。正如我們上面定義的那樣,我只需要計算每個樣本的概率密度函數(shù),并將輸出相乘。
現(xiàn)在,我想直觀地告訴大家概率密度函數(shù)和似然函數(shù)之間的區(qū)別。它們本質上是在計算類似的東西,但角度相反。
從概率密度函數(shù)開始,我們知道它們是樣本??1,…,????的函數(shù)。參數(shù)??被認為是固定的。因此當參數(shù)??已知時,我們使用概率密度函數(shù),找出相同樣本??1,…,????的概率。簡單地說,當我們知道產生某個過程的分布并且我們想從它中推斷可能的抽樣值時,我們使用這個函數(shù)。
對于似然函數(shù),我們所知道的是樣本,即觀測數(shù)據(jù)??1,…,????。這意味著我們的自變量現(xiàn)在是??,因為我們不知道是哪個分布產生了我們觀察到的這個過程。所以當我們知道某個過程的樣本時,使用這個函數(shù),即我們收集了數(shù)據(jù),但我們不知道最初是什么分布生成了該過程。也就是說既然我們知道這些數(shù)據(jù),我們就可以對它們來自的分布進行推斷。
對于似然函數(shù),慣例是使用字母??,而對于概率密度函數(shù),我們引入了上面的符號。我們可以這樣寫:
我們準備定義參數(shù)為??和??的高斯分布的似然函數(shù):
作為對似然函數(shù)有更多直觀了解,我們可以生成足夠多的樣本來直觀地了解它的形狀。我們對從概率分布中生成樣本不感興趣,我們感興趣的是生成參數(shù)??,使觀測數(shù)據(jù)的概率最大化,即??(??1,…,????|??)。
我們使用與上面相同的樣本??1=?0.5,??2=0和??3=1.5。
為了能夠構建2D可視化,我們可以創(chuàng)建一個潛在參數(shù)的網(wǎng)格,在一段時間間隔內均勻采樣,??從[-2,2]采樣,??從[0,3]采樣。由于我們對每個參數(shù)采樣了100個值,得到了??^2個可能的組合。對于每個參數(shù)的組合,我們需要計算每個樣本的概率并將它們相乘。
現(xiàn)在準備繪制似然函數(shù)。注意這是觀察到的樣本的函數(shù),這些是固定的,參數(shù)是我們的自變量。
我們感興趣的是最大化數(shù)據(jù)的概率。這意味著想要找到似然函數(shù)的最大值,這可以借助微積分來實現(xiàn)。函數(shù)的一階導數(shù)對參數(shù)的零點應該足以幫助我們找到原函數(shù)的最大值。
但是,將許多小概率相乘在數(shù)值上是不穩(wěn)定的。為了克服這個問題,可以使用同一函數(shù)的對數(shù)變換。自然對數(shù)是一個單調遞增的函數(shù),這意味著如果x軸上的值增加,y軸上的值也會增加。這很重要,因為它確保概率對數(shù)的最大值出現(xiàn)在與原始概率函數(shù)相同的點。它為我們做了另一件非常方便的事情,它將乘積轉化為和。
讓我們執(zhí)行變換:
現(xiàn)在可以著手解決優(yōu)化問題了。最大化我們數(shù)據(jù)的概率可以寫成:
上面的表達式可以被求導以找到最大值。展開參數(shù)有l(wèi)og(??(??|??,??))。由于它是兩個變量??和??的函數(shù),使用偏導數(shù)來找到最大似然估計。
專注于??′("撇"表示它是一個估計值,即我們的輸出),我們可以使用以下方法計算它:
為了找到最大值,我們需要找到臨界值,因此需要將上面的表達式設為零。
得到
這是數(shù)據(jù)的平均值,可以為我們的樣本??1=?0.5,??2=0和??3=1.5計算μ和σ的最大值,并將它們與真實值進行比較。
最大似然估計在TensorFlow Probability中的實現(xiàn)
我們先創(chuàng)建一個正態(tài)分布隨機變量并從中取樣。通過繪制隨機變量的直方圖,可以看到分布的形狀。
然后計算隨機變量的均值,這是我們想用最大似然估計學習的值。
將TensorFlow Variable對象定義為分布的參數(shù)。這向TensorFlow說明,我們想在學習過程中學習這些參數(shù)。
下一步是定義損失函數(shù)。我們已經看到了我們想要達到的目標最大化似然函數(shù)的對數(shù)變換。但是在深度學習中,通常需要最小化損失函數(shù),所以直接將似然函數(shù)的符號改為負。
最后建立訓練程序,使用自定義訓練循環(huán),可以自己定義過程細節(jié)(即使用自定義損失函數(shù))。
使用tf.GradientTape(),它是訪問TensorFlow的自動微分特性的API。然后指定要訓練的變量,最小化損失函數(shù)并應用梯度。
現(xiàn)在訓練程序已經準備完畢了。
我們通過最大化在第一時間生成的抽樣數(shù)據(jù)的概率,計算了參數(shù)??的最大似然估計。它是有效的,因為能夠得到一個非常接近原始值的??值。
總結
本文介紹了最大似然估計的過程,和TensorFlow Probability的實現(xiàn)。通過一個簡單的例子,我們對似然函數(shù)的形狀有了一些直觀的認識。最后通過定義一個TensorFlow變量、一個負對數(shù)似然函數(shù)并應用梯度,實現(xiàn)了一個使用TensorFlow Probability的自定義訓練過程。