貝葉斯神經網絡


概述

貝葉斯神經網絡是一類神經網絡模型,模型的參數不是固定的值,而是分布,如$(圖1)$所示。這樣設置,我們就能夠對數據和模型的不確定性(uncertainty)進行評估。例如有一個函數$f(x)=y$,當函數$f$確定時,輸入$x$能得到唯一確定的y,如果我們調整$f$,得到的$y$就會發生變化。

現實中,數據內部通常會存在不確定性,$x$和$y$之間存在一定隨機性。對於數據$x$和$y$,函數$f$的參數$w$服從后驗$p(w|x,y)$,而不是確定的值。但是像在之前變分推斷的文章中分析的,后驗難以計算,所以我們要想辦法將它轉換為簡單的可計算的問題。其中一種求近似問題的方法就是變分推斷。變分推斷是解決貝葉斯神經網絡中的后驗估計的流形方法,因為這種方法計算較快,而且適用於大規模數據——另一種方法是MCMC(Markov Chain Monto Carlo,馬爾科夫鏈蒙特卡洛),它適合處理小規模數據,今后會介紹。

 

(圖1,來自論文《Weight Uncertainty in Neural Networks》)

 

不確定性

上面說了,貝葉斯神經網絡可以評估不確定性。論文$[1]$中將不確定性分為兩類,偶然不確定性(aleatoric uncertainty)和認知不確定性(epistemic uncertainty)。偶然不確定性是指數據本身存在的不確定性,它可能是現實中各種原因造成的,例如傳感器接收信號時產生的波動。這類不確定性並不會隨着我們采集的數據的增加而減小。同時,這類不確定性又可以划分為同方差不確定性(homoscedastic uncertainty)和異方差不確定性(heteroscedastic uncertainty),其中前者表示所有子數據集中的不確定性都相同,而后者指不同子數據集中不確定性並不相同,可能某一部分數據中不確定性更大,而其他子數據集的不確定性較小。而認知不確定性性又稱為模型不確定性(model uncertainty),這種不確定性隨着處理的數據的增長,會逐漸降低,這就像當我們接觸到越來越多的外國人時,我們對他們的認識就更全面。當我們缺乏對某樣東西的認識時,我們會隨意地相信我們相信的東西,模型也是一樣。當模型沒有見過某類數據時,它可以自由地設定它的參數$w$。對於參數的這種不確定性,我們可以用后驗$p(w|x,y)$來評估。

 

變分推斷

因為后驗$p(w|x,y)$難以計算,所以我們用變分推斷來求它的近似。設后驗的近似是變分分布$q(w|x,y)$,為了讓變分分布接近后驗,我們設定目標函數為KL散度$KL(q(w|x,y) \parallel p(w|x,y))$。就像之前變分推斷的文章中說的,后驗$p(w|x,y)$難以計算,所以我們將目標函數替換為$ELBO$(Evidence Lower BOund)。我們可以把數據$x$和$y$都統一看成數據$D$,此時$ELBO$的形式如下:

\begin{align} ELBO(q) &= E_q [\log{p(D|w)} ] - KL(q(w|D) \parallel p(w)) \label{1} \\ &= E_q [\log{p(w,D)} ]- E_q [\log{q(w)} ] \nonumber \end{align}

為了求解$ELBO$,我們需要對$w$進行采樣。我們可以假設$w$服從高斯分布$w \sim q(w|D)=N(\mu,\sigma^2)$——其他分布也可以——這樣$w$就可以通過$z=g(\epsilon, D)=\mu + \sigma \epsilon$來采樣。這里$\epsilon$是一個隨機噪音,服從高斯分布$N(0,I)$,也就是說向量$\epsilon$中的元素的值在[0,1]區間,所以$z$是服從$N(\mu,\sigma^2)$分布的樣本。但是為了避免$\sigma$取負值,從而導致數值穩定性(numerical stability)問題,實踐中會采用$\rho$代替$\sigma$,並用softplus函數計算$\sigma$:

\begin{equation} \sigma = \log{(1+\exp{(\rho)})} \nonumber \end{equation}

用$\mu$和$\sigma^2$,或者說用$\mu$和$\rho$代替$w$,這種方法被稱為重參數法(reparameterization trick)。這樣,我們就可以采用stochastic的方法,優化我們的目標函數$ELBO$:

\begin{align} &ELBO= \frac{1}{M} \sum_{m=1}^M {\log{p(D_i, w_{i,m})}} - \log{q(w_{i,m},D_i)} \label{2} \\ &w_{i,m} = g(\epsilon_{i,m}, D_i) \nonumber \end{align}

因為式$(\ref{1})$中的KL散度是可以求解析解的,所以也可以采用下面的式子:

\begin{align} &ELBO = \frac{1}{M} \sum_{m=1}^M {\log{p(D_i| w_{i,m})}} -KL(q(w|D) \parallel p(w)) \nonumber \\ &w_{i,m} = g(\epsilon_{i,m}, D_i) \nonumber \end{align}

采用stochastic的方法,我們可以處理大規模的數據,因為$M$是批數據的數據量,它可以是較小的值,甚至是1。但是,我們可以發現,普通的神經網絡模型的參數是$w$,而現在變成了$\mu$和$\rho$,參數的規模為原來的兩倍。

 

參數先驗

我們可以用$(\ref{2})$的方法計算參數的先驗,但這樣計算出來的先驗是基於訓練集的。除了$(\ref{2})$,還有其他方法設定可以先驗,例如論文$[2]$中采用的混合尺度先驗:

\begin{equation} p(w) = \prod_i {\pi N(w_i|0, \sigma_1^2) + (1-\pi)N(w_i|0, \sigma_2^2)} \nonumber \end{equation}

其中$\pi$是[0,1]區間的隨機數,當$\pi=1$時$w$來自等號右邊的第一個高斯分布,而當$\pi=0$時$w$來自第二個高斯分布,當$0<\pi<1$時是兩個分布的混合。另外,第一個高斯分布的方差$\sigma_1^2$大於$\sigma_2^2$,且$\sigma_2^2$遠小於1,從而使這些參數趨近於0。

除了混合尺度先驗外,還有spike-and-slab先驗、馬蹄鐵先驗(horsehoe prior)等先驗。

 

優化過程

 我們采用隨機優化的方法來優化$(\ref{1})$$ELBO$。假設每次只處理一條數據,並且取負的$ELBO$,從而將目標轉換為最小化目標函數,那么$(\ref{1})$可以這樣表示:

\begin{align} L &= -ELBO = - \log{p(D|w)} + \log{q(w|D)} - \log{p(w)} \nonumber \\ &= \log{q(w|D)} -\log{p(w)p(D|w)} \nonumber \end{align}

其中變分分布$q(w|D)$可以替換為$q(w|\mu,\rho)$。此時,優化參數$\mu$和$\rho$,可以采用隨機梯度下降法(Stochastic Gradient Descent,SGD):

\begin{align} &\mu^{t+1} = \mu^{t} - \lambda \Delta \mu \nonumber \\ &\rho^{t+1} = \rho^{t} - \lambda \Delta \rho \nonumber \\ &\Delta \mu = \frac{\partial L}{\partial w} + \frac{\partial L}{\partial \mu} \nonumber \\ & \Delta \rho = \frac{\partial L}{\partial w}\frac{\varepsilon}{1+ \exp{-\rho}} + \frac{\partial L}{\partial \rho} \nonumber \end{align}

可以發現,$\frac{\partial L}{\partial w}$就是普通的神經網絡的梯度。

 

局部重參數技巧

前面說到,對模型參數進行重參數化處理,會使模型參數的規模增大,而采用局部重參數化的方法,可以降低模型的計算量。局部重參數化,是將對參數的重參數化處理,替換為對激活函數的輸出的重參數處理。這種方法假設激活函數的輸出服從下面的高斯分布:

\begin{equation} o_{j,n}^l \sim N(\sum_{i=1}^{dim \, l-1}{\mu_{j,i}^l a_{i,n}^{l-1}}, \sum_{i=1}^{dim \, l-1}{(\sigma_{j,i}^l)^2 (a_{i,n}^{l-1})^2}) \nonumber \end{equation}

其中$a_{i,n}^{l-1}$是第$n$個數據對應在神經網絡的第$l-1$層的第$i$個單元的輸出,$dim \, l-1$表示第$l-1$層的維度,也就是神經元數目,$\mu_{j,i}^l$和$\sigma_{j,i}^l$是從第$l-1$層的神經元$i$到第$l$層的第$j$個神經元的參數。另外,$a_{j,n}^l=f(o_{j,n}^l)$,其中$f$是激活函數。所以:

\begin{equation} o_{j,n}^l = \sum_{i=1}^{dim \, l-1}{\mu_{j,i}^l  a_{i,n}^{l-1} +\varepsilon_{j,n}^l \sqrt{(\sigma_{j,i}^l)^2 (a_{i,n}^{l-1})^2} } \nonumber \end{equation}

其中$\varepsilon_{j,n}^l \sim N(0,1)$。

局部重參數化有一個缺點,就是它只能用於沒有參數共享的神經網絡,例如全連接網絡(fully-connected neural network)。但是收局部重參數技巧的啟發,有一種通用的方法可以用各種模型,它就是variational dropout(這里就不細講了,以后有時間在補充吧)。

 

預測

貝葉斯神經網絡將神經網絡嵌套到貝葉斯框架中。在貝葉斯推斷(Bayesian inference)中,預測$y$值采用:

\begin{align} p(\hat{y}|\hat{x}) &= E_{p(w|x,y}[p(\hat{y}|\hat{x},w)] \nonumber \\ &= \int{p(w|x,y)p(\hat{y}|\hat{x},w)}dw \end{align}

其中$\hat{y}$是未知的預測值,$\hat{x}$是新數據,$x$和$y$來自訓練集,$w$是模型參數,$p(w|x,y)$是$w$的后驗,是我們上面變分推斷所近似的分布。事實上,經過上面的變分推斷以及重參數處理,后驗已經替換為變分分布$q(w|\mu,\rho)$。另外,后驗又可以看作是以$w$為參數的模型$p(\hat{y}|\hat{x},w)$的權重,因此貝葉斯神經網絡相當於集成模型,計算模型平均。 

$(圖2)$展示了貝葉斯神經網絡和標准神經網絡預測的區別。圖中黑色的交叉是訓練集數據點,紅色的是線條和淺藍色區域是對所有數據(包括訓練集)預測的結果,其中紅線是預測的中位數(median),藍色區域是四分位數區域(interquartile range)。可以看到,對訓練集沒有覆蓋的區域,標准的神經網絡從試圖使預測結果的方差減小為0,這會使某些趨向於擬合到某個確定的函數,而這個函數未必是正確的——就像我們對不了解的東西可能有某種偏見,例如歧視。而貝葉斯神經網絡則給這些區域的預測結果較低的置信度(confidence),也就是有更多可能的結果。貝葉斯神經網絡,在認知不確定性較高的區域,其預測結果一定程度上取決於先驗$p(w)$。不同的先驗選擇會帶來不同的預測結果。

 

 

 

(圖2,來自論文《Weight Uncertainty in Neural Networks》)

 

 結語

經過三篇變分推斷、一篇自編碼器以及這篇貝葉斯神經網絡,我們對變分推斷應該是有了一個比較全面的認識。為了控制時間,文章的質量可能不是很好,而且刪除了一些知識點。被刪掉的知識點以后可能會補充進來(看心情)。不管怎么,希望這幾篇文章對讀者能夠有幫助。 

 

 

[1] Kendall, A., Gal, Y. (2017). "What Uncertainties Do We Need in Bayesian Deep Learning for Computer Vision?".

[2] Blundell, C., Cornebise, J., Kavukcuoglu, K., Wierstra, D. (2015). "Weight Uncertainty in Neural Networks".

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM