©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 的交流羣裏。