1. 程式人生 > >Hulu機器學習問題與解答系列 | 十四:如何對高斯分布進行采樣

Hulu機器學習問題與解答系列 | 十四:如何對高斯分布進行采樣

系列 number 神經網絡 res per 功能 rand 生成器 如果

歡迎回到“采樣”系列~

今天的內容是

【如何對高斯分布進行采樣】

場景描述

高斯分布,又稱正態分布,是一個在數學、物理及工程領域都非常重要的概率分布。在實際應用中,我們經常需要對高斯分布進行采樣。雖然在很多編程語言中,直接調用一個函數就可以生成高斯分布隨機數,但了解其中的具體算法能夠加深我們對相關概率統計知識的理解;此外,高斯分布的采樣方法有多種,通過展示不同的采樣方法在高斯分布上的具體操作以及性能對比,我們會對這些采樣方法有更直觀的印象。

問題描述

如果讓你來實現一個高斯分布隨機數生成器,你會怎麽做?

背景知識:概率統計

解答與分析

首先,假設隨機變量z服從標準正態分布N

(0,1),令

x = σ·z + μ

x服從均值為μ、方差為σ2的高斯分布N(μ, σ2)。因此,任意高斯分布都可以由標準正態分布通過拉伸和平移得到,所以這裏我們只考慮標準正態分布的采樣。另外,幾乎所有的采樣方法都是以均勻分布隨機數作為基本操作,因此這裏假設我們已經有均勻分布隨機數生成器了。均勻分布隨機數一般用線性同余法來生成(偽隨機數),具體參見文獻[1]。

常見的采樣方法有逆變換法 (Inverse Transform Method)、拒絕采樣法 (Rejection Sampling)、重要性采樣及其重采樣 (Importance Sampling, Sampling-Importance-Resampling)、馬爾科夫蒙特卡洛采樣法 (Markov Chain Monte Carlo) 等。具體到高斯分布,我們需要如何采樣呢?

如果直接用逆變換法,基本操作如下:

技術分享圖片

上述逆變換法需要求解erf(x)的逆函數,這並不是一個初等函數,沒有顯式解,計算起來比較麻煩。為了避免這種非初等函數的求逆操作,Box-Muller算法采用如下解決方案:既然單個高斯分布的累計分布函數不好求逆,那麽兩個獨立的高斯分布的聯合分布呢?假設x, y是兩個服從標準正態分布的獨立隨機變量,它們的聯合概率密度為:

技術分享圖片

考慮(x, y)在圓盤{(x, y) | x2 + y2 R2}上的概率:

技術分享圖片

通過極坐標變換將(x, y)轉化為(r, θ),可以很容易求得上述二重積分:

技術分享圖片

這裏F(R)可以看成是極坐標中r的累積分布函數。由於F(R)的計算公式比較簡單,逆函數也很容易求得,所以可以利用逆變換法來對r

進行采樣;對於θ,在[0, 2π]上進行均勻采樣即可。這樣就得到了(r,θ),經過坐標變化即可得到符合標準正態分布的(x, y)。具體采樣過程如下:

技術分享圖片

Box–Muller算法由於需要計算三角函數,相對來說還是比較耗時,而Marsaglia polar method則避開了三角函數的計算,因而更快,其具體采樣操作如下:

技術分享圖片

除了逆變化法,我們還可以利用拒絕采樣法,選擇一個比較好計算累積分布逆函數的參考分布來覆蓋當前正態分布(可以乘以一個常數倍),進而轉化為對參考分布的采樣以及對樣本點的拒絕/接收操作。考慮到高斯分布的特性,這裏可以用指數分布來作為參考分布。指數分布的累積分布及其逆函數都比較容易求解。由於指數分布的樣本空間為x≥0,而標準正態分布的樣本空間為(-∞, +∞),因此還需要利用正態分布的對稱性來在半坐標軸和全坐標軸之間轉化。具體來說,取λ=1的指數分布作為參考分布,

技術分享圖片

實際應用時,M需要盡可能小,這樣每次的接受概率大,采樣效率更高。因此,可以取

技術分享圖片

因此,具體的采樣過程如下:

技術分享圖片

拒絕采樣法的效率取決於接受概率的大小:參考分布與目標分布越接近,則采樣效率越高。有沒有更高效的拒絕采樣算法呢?這就是Ziggurat算法,該算法本質也是拒絕采樣,但采用多個階梯矩形來逼近目標分布(如圖1所示)。Ziggurat算法雖然看起來稍微繁瑣,但實現起來並不復雜,操作也非常高效,其具體采樣步驟可以參考文獻[2]。

技術分享圖片

圖1 Ziggurat算法

(圖片來源於Numerical Computing with MATLAB第九章Random Numbers)

總結與擴展

高斯分布的采樣方法還有很多,我們只列舉了幾種最常見的。具體面試時,候選人不需要回答所有的方法,知道其中一兩種即可,面試官可以針對這一兩種方法深入提問,如理論證明、優缺點、性能等。如果候選人沒有思路,面試官可以引導其回憶那些通用的采樣方法,如何將那些策略用到高斯分布這個具體案例上。另外,本題還可以適當擴展,把一般的高斯分布換成截尾高斯分布 (Truncated Gaussian Distribution) ,如何采樣?如果是高維隨機變量,拒絕采樣法會存在什麽問題?怎麽解決呢?

參考文獻:

[1] Linear congruential generator,

https://en.wikipedia.org/wiki/Linear_congruential_generator

[2] Ziggurat algorithm,

https://en.wikipedia.org/wiki/Ziggurat_algorithm


下一題預告

【多層感知機與布爾函數

場景描述

神經網絡概念的誕生很大程度上受到了神經科學的啟發。生物學研究表明,大腦皮層的感知與計算功能是通過分多層實現的,例如視覺圖像,首先光信號進入大腦皮層的V1區,即初級視皮層,之後依次通過V2層,V4層,即紋外皮層,進入下顳葉參與物體識別。深度神經網絡,除了其模擬人腦功能的多層結構,最大的優勢在於能夠以緊湊簡潔的方式來表達比淺層網絡更復雜的函數集合(這裏的“簡潔”可定義為隱層單元的數目與輸入單元的數目呈多項式關系)我們的問題將從一個簡單的例子引出,已知神經網絡中每個節點都可以進行“邏輯與/或/非”的運算,如何構造一個多層感知機 (Multi-Layer Perceptron, MLP) 網絡實現n個輸入比特的奇偶校驗碼(任意布爾函數)?

問題描述

  1. 如何用多層感知機實現一個異或邏輯(僅考慮二元輸入)?

  2. 如果只使用一個隱層,需要多少隱節點能夠實現包含n元輸入的任意布爾函數?

  3. 上面的問題中,由單隱層變為多隱層,需要多少節點?

  4. 合理配置後所需的最少網絡層數是多少?

Hulu機器學習問題與解答系列 | 十四:如何對高斯分布進行采樣