贝叶斯神经网络

Posted kai-nutshell

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贝叶斯神经网络相关的知识,希望对你有一定的参考价值。

概述

贝叶斯神经网络是一类神经网络模型,模型的参数不是固定的值,而是分布,如$(图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$的形式如下:

egin{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)} ] onumber 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)问题,实践中会采用$ ho$代替$sigma$,并用softplus函数计算$sigma$:

egin{equation} sigma = log{(1+exp{( ho)})} onumber end{equation}

用$mu$和$sigma^2$,或者说用$mu$和$ ho$代替$w$,这种方法被称为重参数法(reparameterization trick)。这样,我们就可以采用stochastic的方法,优化我们的目标函数$ELBO$:

egin{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) onumber end{align}

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

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

采用stochastic的方法,我们可以处理大规模的数据,因为$M$是批数据的数据量,它可以是较小的值,甚至是1。但是,我们可以发现,普通的神经网络模型的参数是$w$,而现在变成了$mu$和$ ho$,参数的规模为原来的两倍。

 

参数先验

我们可以用$( ef{2})$的方法计算参数的先验,但这样计算出来的先验是基于训练集的。除了$( ef{2})$,还有其他方法设定可以先验,例如论文$[2]$中采用的混合尺度先验:

egin{equation} p(w) = prod_i {pi N(w_i|0, sigma_1^2) + (1-pi)N(w_i|0, sigma_2^2)} onumber 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)等先验。

 

优化过程

 我们采用随机优化的方法来优化$( ef{1})$$ELBO$。假设每次只处理一条数据,并且取负的$ELBO$,从而将目标转换为最小化目标函数,那么$( ef{1})$可以这样表示:

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

其中变分分布$q(w|D)$可以替换为$q(w|mu, ho)$。此时,优化参数$mu$和$ ho$,可以采用随机梯度下降法(Stochastic Gradient Descent,SGD):

egin{align} &mu^{t+1} = mu^{t} - lambda Delta mu onumber \\ & ho^{t+1} = ho^{t} - lambda Delta ho onumber \\ &Delta mu = frac{partial L}{partial w} + frac{partial L}{partial mu} onumber \\ & Delta ho = frac{partial L}{partial w}frac{varepsilon}{1+ exp{- ho}} + frac{partial L}{partial ho} onumber end{align}

可以发现,$frac{partial L}{partial w}$就是普通的神经网络的梯度。

 

局部重参数技巧

前面说到,对模型参数进行重参数化处理,会使模型参数的规模增大,而采用局部重参数化的方法,可以降低模型的计算量。局部重参数化,是将对参数的重参数化处理,替换为对激活函数的输出的重参数处理。这种方法假设激活函数的输出服从下面的高斯分布:

egin{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}) onumber 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$是激活函数。所以:

egin{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} } onumber end{equation}

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

局部重参数化有一个缺点,就是它只能用于没有参数共享的神经网络,例如全连接网络(fully-connected neural network)。但是收局部重参数技巧的启发,有一种通用的方法可以用各种模型,它就是variational dropout(这里就不细讲了,以后有时间在补充吧)。

 

预测

贝叶斯神经网络将神经网络嵌套到贝叶斯框架中。在贝叶斯推断(Bayesian inference)中,预测$y$值采用:

egin{align} p(hat{y}|hat{x}) &= E_{p(w|x,y}[p(hat{y}|hat{x},w)] onumber \\ &= 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, ho)$。另外,后验又可以看作是以$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".

 

以上是关于贝叶斯神经网络的主要内容,如果未能解决你的问题,请参考以下文章

从贝叶斯方法谈到贝叶斯网络

第七章 贝叶斯网络

概率图模型 ——贝叶斯网络

从朴素贝叶斯分类器到贝叶斯网络(下)

有关贝叶斯概率和贝叶斯网络和贝叶斯因果网络的自习笔记

有关贝叶斯概率和贝叶斯网络和贝叶斯因果网络的自习笔记