貝葉斯分析助你成爲優秀的調參俠:先驗和似然對後驗的影響

©PaperWeekly 原創 · 作者|龐龍剛

學校|華中師範大學

研究方向|能核物理、人工智能

上一節介紹了科學的研究方法,先驗、似然、後驗以及如何使用 MCMC 方法中的 Metropolis-Hastings 方法從模型參數 滿足的非歸一化後驗分佈抽樣。

這一節以一個具體的例子介紹先驗和似然對後驗的影響。

學習內容

  • 舉例:扔硬幣實驗

  • 扔硬幣實驗的先驗

  • 扔硬幣實驗的似然函數與後驗分佈

  • 先驗與測量如何影響後驗分佈

  • 使用 MCMC 算法從後驗分佈抽樣



舉例:扔硬幣實驗

這裏以扔硬幣實驗深入介紹先驗、似然和後驗。

如果一個人投幣 10 次,發現 7 次正面朝上,

問:如果投幣無數次,正面朝上的概率 是多少?

頻率學派的會說:概率爲 ,其中 k 是 n 次投幣中正面朝上的次數。

但只有當投幣次數無窮多的情況下可以這樣算,只投 10 次,總不能說 吧?

貝葉斯學派的會說,我們需要算個後驗概率

這是一個條件概率,表示 n 次投幣觀測到 m 次正面向上的情況下, 所滿足的分佈。

  • m out of n 表示實驗數據

  • 表示模型參數,待定

根據前一節介紹,只需要一個非歸一化的貝葉斯公式,


扔硬幣實驗的先驗

上面式子中 表示先驗(a prior)。

先驗指一個人根據過去經驗,腦海中對某事件發生的概率估計(或信仰 Belief)。

對於一枚硬幣,估計大部分人會認爲正面向上的概率爲 50%, 即 或寫成:

如果做了 10 次投幣實驗,7 次正面朝上,部分人可能會完全改變信仰,認爲

另一部分人可能認爲 在 0.5 和 0.7 之間,滿足某種分佈。

在先驗概率未知時,可以用 Beta 分佈函數來表示。忽略歸一化常數,

是 Beta 分佈的兩個參數,改變這兩個參數,Beta 分佈會有很多不同的形狀。

下面可視化一下 Beta 函數的表示能力,(注意代碼接上一節)

from scipy.stats import beta    
import numpy as np
import matplotlib.pyplot as plt
# 需要安裝 SciencePlots 庫:
# pip install SciencePlots
plt.style.use(['science', 'ieee'])

def plot_beta_dist(axis, a=1, b=1):
    '''plot the Beta distribution function
    :a: parameter $\alpha$ in Beta distribution
    :b: parameter $\beta$ in Beta distribution'''
    x = np.linspace(0, 1, 10000)
    y = beta.pdf(x, a, b)
    axis.plot(x, y)
    axis.set_ylabel(r"$P(\theta)$")
    axis.set_xlabel(r"$\theta$")
    axis.set_title(r"$\alpha=%.1f, \beta=%.1f$"%(a, b))
# Let's investigate how does Beta distribution change with alpha and beta

# parameters in 2 rows, 3 columns
params = [[(1, 1), (0.6, 0.6), (10, 10)],
          [(0.3, 1.0), (10, 1), (1, 10)]]

fig, ax = plt.subplots(nrows=2, ncols=3, figsize=(9, 6))
for i in range(2):
    for j in range(3):
        plot_beta_dist(ax[i][j], *params[i][j])

plt.tight_layout()

上面第一行最左邊這張圖對應 ,此時 Beta 分佈是均勻分佈,即某人相信硬幣正面朝上的概率 都一樣。

第一行中間這張圖對應 ,此時 Beta 分佈是 U 型,表示有另一人相信硬幣被做了手腳,要麼正面朝上的概率非常大 ,要麼反面朝上的概率非常大, 。

第一行右邊這張圖對應 ,此時 Beta 分佈是鍾型,表示還有人相信硬幣沒大問題,正面朝上概率爲 50%( )的可能最大,也有其它可能, 非 函數。

下面一行對應偏到一邊的先驗。

無論是哪種先驗,經過多次實驗,隨着不確定性的減少,大腦會逐漸調整對這枚硬幣正面朝上概率的估計。

後面會調整先驗的參數 ,觀察先驗對後驗分佈的影響。


扔硬幣實驗的似然與後驗

做 n 次實驗有 m 次正面朝上,與正面朝上概率爲 的模型的似然函數爲,

即二項分佈函數(Binomial distribution)。

二項分佈很特殊,一般情況下,我們並不知道模型輸出與實驗數據的似然函數(likelihood)如何定義。一個比較常用的似然函數是,

其中 是歸一化係數,在貝葉斯分析中不重要。

後面的 exp 函數是一個多變量的正態分佈函數,方差 裏保存模型或數據的不確定性。

選擇了 Beta 分佈函數做先驗,知道了似然函數是二項分佈,接下來就可以定義扔硬幣實驗的後驗分佈,

後驗分佈同時受到先驗分佈參數 的影響以及測量結果 的影響。


先驗和測量如何影響後驗分佈

from ipywidgets import interact
import ipywidgets as widgets
print_to_pdf = False

def plot_posterior(m, n, a, b):
    theta = np.linspace(0.0001, 1, 100, endpoint=False)
    #poster = theta**(a + m - 1) * (1 - theta)**(b + n - m - 1)
    ln_poster = (a +m - 1) * np.log(theta) + (b + n - m - 1) * np.log(1 - theta)
    poster = np.exp(ln_poster)
    prior =  beta.pdf(theta, a, b)
    plt.axvline(m/n, color='c', label='frequency')
    plt.plot(theta, poster/poster.max(), label="posterior")
    plt.plot(theta, prior/prior.max(), 'k--', label="prior")
    plt.legend(loc='best', fontsize="small")
    plt.xlabel(r"$\theta$")

if print_to_pdf:
    plot_posterior(m=35, n=162, a=0.6, b=10)
else:
    interact(plot_posterior, 
         m=(10, 100), n=(20,200), 
         a = (0, 10.0, 0.2), b = (0, 10.0, 0.2))

接下來我們改變先驗的參數 ,看看對後驗分佈的影響。

第一組,實驗 110 次,55次正面向上。先驗(prior)是虛線,中心在 0.5,但有很寬的分佈,後驗(posterior)分佈是實線,寬度比較窄,表示測量減小了不確定度。頻率(frequency)等於 55/110。

第二組,觀測數據不變,先驗參數爲 。先驗( Prior ) 偏向右邊,而後驗分佈的中心不在頻率(frequency)處,微微偏向先驗。如果選 ,先驗和後驗都會偏向左邊。

第三組,觀測數據變少,做 20 次實驗,10 次正面朝上。先驗參數仍爲 ,即初始信仰爲正面朝上的概率很大。此時可以看到先驗對後驗的影響增大。後驗向先驗靠近更多。

總結一下:

  • 後驗分佈的中心一般在先驗和頻率之間

  • 測量次數少時,先驗對後驗的影響比較大

  • 測量次數很多時,先驗的影響可忽略不計



使用 MCMC 算法從後驗分佈抽樣

接下來,就要對投硬幣任務, 滿足的後驗分佈函數進行抽樣,找到對於給定的實驗觀測,最可能的 的值以及 的分佈。

▲ 對投硬幣任務,正面朝上概率滿足的後驗分佈抽樣。

代碼如下:

def draw_posterior(m, n, a, b, nsamples=1000000):
    def poster(theta, m=m, n=n, a=a, b=b):
        ln_poster = (a +m - 1) * np.log(theta) \
                  + (b + n - m - 1) * np.log(1 - theta)
        poster = np.exp(ln_poster)
        return poster


    samples = mcmc(poster, np.array([[0.0001, 0.9999]]),
                   n=nsamples, warmup=0.1, thin=10)

    # compute the distribution of these samples using histogram
    hist, edges = np.histogram(samples.flatten(), bins=100)

    x = 0.5 * (edges[1:] + edges[:-1])
    theta = np.linspace(0.0001, 0.9999, 100)
    y = poster(theta)

    plt.plot(x, hist/hist.max(), '-', label="MCMC")
    plt.plot(theta, y/y.max(), '-', label = r"$P(\theta | \rm m\ out\ of\ n)$")

    plt.legend(loc='best', fontsize='small')
    plt.xlabel(r'$\theta$')
    plt.xlim(x[0], x[-1])

draw_posterior(m=100, n=150, a=10, b=10, nsamples=2000000)

總結

這一節以一個扔硬幣任務,更加詳細的介紹了何爲先驗,以及先驗、測量對後驗分佈的影響。使用前一節引入的 MCMC 算法,對非歸一化的後驗分佈抽樣。推薦大家在一個具體的物理模型調參任務上走一遍流程,會對貝葉斯推理和 MCMC 有更深刻的認識。

如果物理模型運行速度很慢,可使用 Latin Cube 方法在參數空間取點,使用 Gauss Process Emulator 對參數空間插值,如果實驗的可觀測量比較多,還可以使用主成分分析將數據降維。LBNL 的 Ke WeiYao 博士曾到我們實驗室給過一個貝葉斯分析的講座,介紹了很多這方面的知識,這一節很多內容借鑑了他開源的 jupyter-notebook。

參考文獻

[1] https://github.com/keweiyao/BayesExample

[2] http://lgpang.gitee.io/mlcphysics/htmls/bayes_analysis.slides.html#/

更多閱讀

#投 稿 通 道#

 讓你的論文被更多人看到 

如何才能讓更多的優質內容以更短路徑到達讀者羣體,縮短讀者尋找優質內容的成本呢?答案就是:你不認識的人。

總有一些你不認識的人,知道你想知道的東西。PaperWeekly 或許可以成爲一座橋樑,促使不同背景、不同方向的學者和學術靈感相互碰撞,迸發出更多的可能性。 

PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優質內容,可以是最新論文解讀,也可以是學習心得技術乾貨。我們的目的只有一個,讓知識真正流動起來。

???? 來稿標準:

• 稿件確係個人原創作品,來稿需註明作者個人信息(姓名+學校/工作單位+學歷/職位+研究方向) 

• 如果文章並非首發,請在投稿時提醒並附上所有已發佈鏈接 

• PaperWeekly 默認每篇文章都是首發,均會添加“原創”標誌

???? 投稿郵箱:

• 投稿郵箱:[email protected] 

• 所有文章配圖,請單獨在附件中發送 

• 請留下即時聯繫方式(微信或手機),以便我們在編輯發佈時和作者溝通

????

現在,在「知乎」也能找到我們了

進入知乎首頁搜索「PaperWeekly」

點擊「關注」訂閱我們的專欄吧

關於PaperWeekly

PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公衆號後臺點擊「交流羣」,小助手將把你帶入 PaperWeekly 的交流羣裏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章