传统深度模型的uncertainty----Monte Carlo dropout

前言

贝叶斯的一系列方法让我们在对数据建模的时候可以评估模型的认知不确定性,即:我们可以获得一种模型对自己的预测值有多大把握的评价指标,这种评价在许多方法中通常以方差的形式出现。本文介绍2016年在模型uncertainty方面比较有影响力的一篇文章,文章的附录中有大量的推导,考虑到其中有些公式的变换涉及到额外的文献,对一些推导细节不做深入讨论,只大概了解其过程和思想,重点看如何搭建模型,以及如何体现uncertainty。
文章:Dropout as a Bayesian Approximation: Representing Model Uncertainty in Deep Learning
附录:Dropout as a Bayesian Approximation: Appendix

背景

Dropout

设有一个只有一层隐藏层的神经网络,隐藏层的神经元数量为 K K K,由第一层连接隐藏层的网络权重为 W 1 W_1 W1,大小为 Q × K Q\times K Q×K,由隐藏层连接输出的权重为 W 2 W_2 W2,大小为 K × D K\times D K×D,隐藏层的偏置向量为 b b b,大小为 K K K

如果在隐藏层和输出层之前添加dropout应该如何用数学表示?
z 1 , z 2 \bm{z_1},\bm{z_2} z1,z2分别为 Q Q Q K K K维的二进制向量,向量中的每个元素只能取 0 0 0 1 1 1,dropout就相当于每个元素服从伯努利分布,即:
z 1 , q ∼ Bernouli ( p 1 ) f o r q = 1 , . . . , Q z 2 , k ∼ Bernouli ( p 2 ) f o r k = 1 , . . . , K z_{1,q}\sim \text{Bernouli} (p_1) \quad for \quad q=1,...,Q \\ z_{2,k}\sim \text{Bernouli} (p_2) \quad for \quad k=1,...,K z1,qBernouli(p1)forq=1,...,Qz2,kBernouli(p2)fork=1,...,K
其中 p 1 , p 2 p_1,p_2 p1,p2就是每层神经元激活的概率。将 z \bm{z} z表示成对角矩阵 diag ( z ) \text{diag}(z) diag(z),网络的输出可以表示为:
y ^ = σ ( x ( z 1 W 1 ) + b ) ( z 2 W 2 ) \hat y=\sigma(x(z_1W_1)+b)(z_2W_2) y^=σ(x(z1W1)+b)(z2W2)
其中 σ \sigma σ为激活函数。网络的损失函数表示为(只考虑回归问题):
L d r o p o u t = 1 2 N ∑ n = 1 N ∣ ∣ y n − y ^ n ∣ ∣ 2 2 + λ 1 ∣ ∣ W 1 ∣ ∣ 2 2 + λ 2 ∣ ∣ W 2 ∣ ∣ 2 2 + λ 3 ∣ ∣ b ∣ ∣ 2 2 \mathcal{L}_{dropout}=\frac{1}{2N}\sum_{n=1}^N||y_n-\hat y_n||_2^2+\lambda_1||W_1||_2^2+\lambda_2||W_2||_2^2+\lambda_3||b||_2^2 Ldropout=2N1n=1Nyny^n22+λ1W122+λ2W222+λ3b22
记住dropout所对应的损失函数的表示形式,因为文章的中心意思就是在说变分推断+高斯过程也可以得到相同表示形式的损失函数。

高斯过程

详见高斯过程回归----MC dropout前导篇

变分推断

详见贝叶斯神经网络----从贝叶斯准则到变分推断

如何使用dropout近似贝叶斯

高斯过程

高斯过程是贝叶斯的一种表现形式,现定义一个高斯过程的协方差函数为:
K ( x , y ) = ∫ p ( w ) p ( b ) σ ( w T x + b ) σ ( w T y + b ) d w d b K(x,y)=\int p(w)p(b) \sigma(w^Tx+b)\sigma(w^Ty+b) \text{d}w\text{d}b K(x,y)=p(w)p(b)σ(wTx+b)σ(wTy+b)dwdb
使用Monte Carlo近似上式:
K ^ ( x , y ) = 1 K ∑ i = 1 K σ ( w k T x + b k ) σ ( w k T y + b k ) \hat K(x,y)=\frac{1}{K}\sum_{i=1}^K \sigma(w_k^Tx+b_k)\sigma(w_k^Ty+b_k) K^(x,y)=K1i=1Kσ(wkTx+bk)σ(wkTy+bk)
式中 p ( w ) p(\bm{w}) p(w) p ( b ) p(\bm{b}) p(b)均服从标准的多元高斯分布,即每一元服从均值为 0 0 0,方差为 1 1 1的高斯分布。Monte Carlo采样的次数 K K K与隐藏神经元的数量相同,所以此时的 W 1 W_1 W1是一个 Q × K Q\times K Q×K的矩阵。

从高斯过程来看,输入到输出的关系如何表示?
F ∣ X , W 1 , b ∼ N ( 0 , K ^ ( X , X ) ) Y ∣ F ∼ N ( F , τ − 1 I N ) F|X,W_1,b \sim N(0,\hat K(X,X)) \\ Y|F \sim N(F, \tau^{-1}I_N) FX,W1,bN(0,K^(X,X))YFN(F,τ1IN)
这样看来好像只有 W 1 W_1 W1,网络隐藏层去哪了?先接着向下计算,先将 F F F视为一个隐变量,通过对上式积分可以得到由输入预测输出的条件概率:
p ( Y ∣ X ) = ∫ p ( Y ∣ F ) p ( F ∣ W 1 , b , X ) p ( W 1 ) p ( b ) d W 1 d b d F p(Y|X)=\int p(Y|F)p(F|W_1,b,X)p(W_1)p(b)\text{d}W_1\text{d}b\text{d}F p(YX)=p(YF)p(FW1,b,X)p(W1)p(b)dW1dbdF
令:
ϕ ( x , W 1 , b ) = 1 K σ ( W 1 T x + b ) Φ = [ ϕ ( x n , W 1 , b ) ] n = 1 N K ^ ( X , X ) = Φ Φ T \phi(x,W_1,b)=\sqrt{\frac{1}{K}}\sigma(W_1^Tx+b) \\ \Phi=[\phi(x_n,W_1,b)]_{n=1}^N \quad \hat K(X,X)=\Phi\Phi^T ϕ(x,W1,b)=K1 σ(W1Tx+b)Φ=[ϕ(xn,W1,b)]n=1NK^(X,X)=ΦΦT
此时条件概率 p ( Y ∣ X ) p(Y|X) p(YX)改写为(高斯分布的性质):
p ( Y ∣ X ) = ∫ N ( Y ; 0 , Φ Φ T + τ − 1 I N ) p ( W 1 ) p ( b ) d W 1 d b d F p(Y|X)=\int N(Y;0,\Phi\Phi^T+\tau^{-1}I_N)p(W_1)p(b)\text{d}W_1\text{d}b\text{d}F p(YX)=N(Y;0,ΦΦT+τ1IN)p(W1)p(b)dW1dbdF
上式的分号表示条件概率,即已知后面的分布,计算 Y Y Y对应的概率值。因为 Y Y Y的每个元素 y d y_d yd代表一个样本的输出,是一个 D D D维的向量,所以每个 y d y_d yd是一个多元高斯分布,整个 Y Y Y是一个高斯过程。现引入辅助随机变量 w d ∼ N ( 0 , I K ) w_d\sim N(0, I_K) wdN(0,IK),则有(不要管为什么可以这样改写,作者引入了其他的参考文献):
N ( y d ; 0 , Φ Φ T + τ − 1 I N ) = ∫ N ( y d ; Φ w d , τ − 1 I N ) N ( w d ; 0 , I K ) d w d N(y_d;0,\Phi\Phi^T+\tau_{-1}I_N)=\int N(y_d;\Phi w_d,\tau^{-1}I_N)N(w_d;0,I_K)\text{d}w_d N(yd;0,ΦΦT+τ1IN)=N(yd;Φwd,τ1IN)N(wd;0,IK)dwd
看起来好像是把其中的一个 Φ \Phi Φ换成了另一种高斯分布的参数,这也是前面的Monte Carlo要采样 K K K次的原因:为了与隐藏层的神经元数量保持一致,接下来,令 W 2 = [ w d ] d = 1 D W_2=[w_d]_{d=1}^D W2=[wd]d=1D,为 K × D K\times D K×D的矩阵,条件概率可以改写为:
p ( Y ∣ X ) = ∫ p ( Y ∣ X , W 1 , W 2 , b ) p ( W 1 ) p ( W 2 ) p ( b ) d W 1 d W 2 d b p(Y|X)=\int p(Y|X,W_1,W_2,b)p(W_1)p(W_2)p(b)\text{d}W_1\text{d}W_2\text{d}b p(YX)=p(YX,W1,W2,b)p(W1)p(W2)p(b)dW1dW2db
这个公式可以认为是神经网络预测的表达式,但它实际上是通过高斯过程实现的,直接计算高斯分布会牵涉到对于 N × N N\times N N×N矩阵的逆运算,复杂度很高,所以文章使用变分推断的方式来近似求解。

变分推断

定义一个变分分布:
q ( W 1 , W 2 , b ) : = q ( W 1 ) q ( W 2 ) q ( b ) q(W_1,W_2,b):=q(W_1)q(W_2)q(b) q(W1,W2,b):=q(W1)q(W2)q(b)
: = := :=表示用右边的表达式来表达左边。定义 q ( W 1 ) q(W_1) q(W1) q ( W 2 ) q(W_2) q(W2)均为高斯混合分布 q ( b ) q(b) q(b)为一元高斯分布,则有:
q ( W 1 ) = ∏ q = 1 Q q ( w q ) q ( w q ) = p 1 N ( m q , σ 2 I K ) + ( 1 − p 1 ) N ( 0 , σ 2 I K ) q ( W 2 ) = ∏ k = 1 K q ( w k ) q ( w k ) = p 2 N ( m k , σ 2 I D ) + ( 1 − p 1 ) N ( 0 , σ 2 I D ) q ( b ) = N ( m , σ 2 I K ) q(W_1)=\prod_{q=1}^Qq(w_q)\\q(w_q)=p_1N(m_q,\sigma^2I_K)+(1-p_1)N(0,\sigma^2I_K) \\ q(W_2)=\prod_{k=1}^Kq(w_k)\\q(w_k)=p_2N(m_k,\sigma^2I_D)+(1-p_1)N(0,\sigma^2I_D) \\ q(b)=N(m,\sigma^2I_K) q(W1)=q=1Qq(wq)q(wq)=p1N(mq,σ2IK)+(1p1)N(0,σ2IK)q(W2)=k=1Kq(wk)q(wk)=p2N(mk,σ2ID)+(1p1)N(0,σ2ID)q(b)=N(m,σ2IK)
M 1 = [ m q ] q = 1 Q , M 2 = [ m k ] k = 1 K M_1=[m_q]_{q=1}^Q,M_2=[m_k]_{k=1}^K M1=[mq]q=1Q,M2=[mk]k=1K,则原来关于 W 1 , W 2 , b W_1,W_2,b W1,W2,b的优化变成了对 M 1 , M 2 , m M_1,M_2,m M1,M2,m的求解,这里的 q ( W 1 , W 2 , b ) q(W_1,W_2,b) q(W1,W2,b)是一种条件分布,它是对后验分布 p ( W 1 , W 2 , b ∣ X , Y ) p(W_1,W_2,b|X,Y) p(W1,W2,bX,Y)的近似。
我们看 q ( w q ) q(w_q) q(wq) q ( w k ) q(w_k) q(wk)的表示是由两个高斯分布组成,这很像伯努利的表示形式,即有 p p p的概率选 m q m_q mq,有 1 − p 1-p 1p的概率为0,不同的地方在于 w q w_q wq从分布中采样,而不是一个确定值。作者用这种分布来近似后验分布也是为了说明dropout的意义,需要注意的是,我们可以选择任意的分布形式来近似待求解的后验分布,这种混合高斯的形式只是一种可用形式而已,作者选它正好解释dropout为什么可以在传统的NN模型中引入不确定性,是因为用这种混合高斯来近似后验分布得到的损失函数与在传统的NN模型中添加dropout得到的损失函数一致。

回归问题的ELBO计算

在贝叶斯推断中,通过优化Evidence Lower Bound(ELBO)来求解后验分布:
L G P − V I : = ∫ p ( W 1 , W 2 , b ) log ⁡ p ( Y ∣ X , W 1 , W 2 , b ) − K L ( q ( W 1 , W 2 , b ) ∣ ∣ p ( W 1 , W 2 , b ∣ X , Y ) ) d W 1 d W 2 d b \mathcal{L}_{GP-VI}:=\int p(W_1,W_2,b)\log p(Y|X,W_1,W_2,b)-KL(q(W_1,W_2,b)||p(W_1,W_2,b|X,Y))\text{d}W_1\text{d}W_2\text{d}b LGPVI:=p(W1,W2,b)logp(YX,W1,W2,b)KL(q(W1,W2,b)p(W1,W2,bX,Y))dW1dW2db
根据高斯分布的表达式 log ⁡ p ( Y ∣ X , W 1 , W 2 , b ) \log p(Y|X,W_1,W_2,b) logp(YX,W1,W2,b)可以写为:
log ⁡ p ( Y ∣ X , W 1 , W 2 , b ) = ∑ d = 1 D log ⁡ N ( y d ; Φ w d , τ − 1 I N ) = − N D 2 log ⁡ ( 2 π ) + N D 2 log ⁡ ( τ ) − ∑ d = 1 D τ 2 ∣ ∣ y d − Φ w d ∣ ∣ 2 2 \log p(Y|X,W_1,W_2,b)=\sum_{d=1}^D\log N(y_d;\Phi w_d,\tau^{-1}I_N)\\=-\frac{ND}{2}\log(2\pi)+\frac{ND}{2}\log (\tau)-\sum_{d=1}^D\frac{\tau}{2}||y_d-\Phi w_d||_2^2 logp(YX,W1,W2,b)=d=1DlogN(yd;Φwd,τ1IN)=2NDlog(2π)+2NDlog(τ)d=1D2τydΦwd22
需要注意的一点,这里的 y d y_d yd是相互独立的,此时 y d y_d yd服从一个高斯分布,因为 Y Y Y是一个 N × D N\times D N×D的矩阵,如果按照单个样本来看,即 y n y_n yn之间不条件独立,但是从另一个方向来看,即预测值的不同元之间是条件独立的,也就是说 y d y_d yd是条件独立的。令 Y ^ = Φ W 2 \hat Y=\Phi W_2 Y^=ΦW2,有
∑ d = 1 D τ 2 ∣ ∣ y d − y ^ d ∣ ∣ 2 2 = ∑ n = 1 N τ 2 ∣ ∣ y n − y ^ n ∣ ∣ 2 2 \sum_{d=1}^D\frac{\tau}{2}||y_d-\hat y_d||_2^2=\sum_{n=1}^N \frac{\tau}{2}||y_n-\hat y_n||_2^2 d=1D2τydy^d22=n=1N2τyny^n22
此时 y ^ n = ϕ ( x n , W 1 , b ) W 2 = 1 K σ ( x n W 1 + b ) W 2 \hat y_n=\phi(x_n,W_1,b)W_2=\sqrt{\frac{1}{K}}\sigma(x_nW_1 + b)W_2 y^n=ϕ(xn,W1,b)W2=K1 σ(xnW1+b)W2,有
log ⁡ p ( Y ∣ X , W 1 , W 2 , b ) = ∑ n = 1 N log ⁡ N ( y n ; ϕ ( x n , W 1 , b ) W 2 , τ − 1 I D ) = ∑ n = 1 N log ⁡ p ( y n ∣ x n , W 1 , W 2 , b ) \log p(Y|X,W_1,W_2,b)=\sum_{n=1}^N\log N(y_n;\phi(x_n,W_1,b)W_2,\tau^{-1}I_D) \\=\sum_{n=1}^N\log p(y_n|x_n,W_1,W_2,b) logp(YX,W1,W2,b)=n=1NlogN(yn;ϕ(xn,W1,b)W2,τ1ID)=n=1Nlogp(ynxn,W1,W2,b)
此时的ELBO可以写为:
∑ n = 1 N ∫ p ( W 1 , W 2 , b ) log ⁡ p ( y n ∣ x n , W 1 , W 2 , b ) − K L ( q ( W 1 , W 2 , b ) ∣ ∣ p ( W 1 , W 2 , b ∣ X , Y ) ) d W 1 d W 2 d b \sum_{n=1}^N\int p(W_1,W_2,b)\log p(y_n|x_n,W_1,W_2,b)-KL(q(W_1,W_2,b)||p(W_1,W_2,b|X,Y))\text{d}W_1\text{d}W_2\text{d}b n=1Np(W1,W2,b)logp(ynxn,W1,W2,b)KL(q(W1,W2,b)p(W1,W2,bX,Y))dW1dW2db

q ( ϵ 1 ) = N ( 0 , I Q × K ) , q ( z 1 , q ) = Bernouli ( p 1 ) f o r q = 1 , . . . , Q q ( ϵ 2 ) = N ( 0 , I K × D ) , q ( z 1 , k ) = Bernouli ( p 2 ) f o r k = 1 , . . . , K q ( ϵ ) = N ( 0 , I K ) q(\epsilon_1)=N(0,I_{Q\times K}),q(z_{1,q})=\text{Bernouli}(p_1) \quad for \quad q=1,...,Q\\ q(\epsilon_2)=N(0,I_{K\times D}),q(z_{1,k})=\text{Bernouli}(p_2) \quad for \quad k=1,...,K \\ q(\epsilon)=N(0,I_K) q(ϵ1)=N(0,IQ×K),q(z1,q)=Bernouli(p1)forq=1,...,Qq(ϵ2)=N(0,IK×D),q(z1,k)=Bernouli(p2)fork=1,...,Kq(ϵ)=N(0,IK)
这里的 ϵ \epsilon ϵ是为了与 σ \sigma σ相乘时能够得到输出的矩阵大小符合 W W W的大小。根据原来变分近似的写法,参数可以分别重新写为:
W 1 = z 1 ( M 1 + σ ϵ 1 ) + ( 1 − z 1 ) σ ϵ 1 W 2 = z 2 ( M 2 + σ ϵ 2 ) + ( 1 − z 2 ) σ ϵ 2 b = m + σ ϵ W_1=z_1(M_1+\sigma \epsilon_1)+(1-z_1)\sigma \epsilon_1 \\ W_2=z_2(M_2+\sigma \epsilon_2)+(1-z_2)\sigma \epsilon_2 \\ b=m+\sigma \epsilon W1=z1(M1+σϵ1)+(1z1)σϵ1W2=z2(M2+σϵ2)+(1z2)σϵ2b=m+σϵ
则有:
∑ n = 1 N ∫ p ( W 1 , W 2 , b ) log ⁡ p ( y n ∣ x n , W 1 , W 2 , b ) d W 1 d W 2 d b = ∑ n = 1 N ∫ p ( z 1 , ϵ 1 , z 2 , ϵ 2 , ϵ ) log ⁡ p ( y n ∣ x n , W 1 ( z 1 , ϵ 1 ) , W 2 ( z 2 , ϵ 2 ) , b ( ϵ ) ) \sum_{n=1}^N\int p(W_1,W_2,b)\log p(y_n|x_n,W_1,W_2,b)\text{d}W_1\text{d}W_2\text{d}b\\ =\sum_{n=1}^N\int p(z_1,\epsilon_1,z_2,\epsilon_2,\epsilon)\log p(y_n|x_n,W_1(z_1,\epsilon_1),W_2(z_2,\epsilon_2),b(\epsilon)) n=1Np(W1,W2,b)logp(ynxn,W1,W2,b)dW1dW2db=n=1Np(z1,ϵ1,z2,ϵ2,ϵ)logp(ynxn,W1(z1,ϵ1),W2(z2,ϵ2),b(ϵ))
使用Monte Carlo对上式近似可得:
∑ n = 1 N ∫ p ( W 1 , W 2 , b ) log ⁡ p ( y n ∣ x n , W 1 , W 2 , b ) d W 1 d W 2 d b ≈ ∑ n = 1 N log ⁡ p ( y n ∣ x n , W ^ 1 n , W ^ 2 n , b ^ n ) \sum_{n=1}^N\int p(W_1,W_2,b)\log p(y_n|x_n,W_1,W_2,b)\text{d}W_1\text{d}W_2\text{d}b \\ \approx\sum_{n=1}^N\log p(y_n|x_n,\hat W_1^n,\hat W_2^n,\hat b^n) n=1Np(W1,W2,b)logp(ynxn,W1,W2,b)dW1dW2dbn=1Nlogp(ynxn,W^1n,W^2n,b^n)
又有对KL散度的近似(具有足够大的维数且均值随机分布的混合高斯函数的熵趋向于高斯函数体积之和,原文是这样讲的,我也不知道为什么):
K L ( q ( W 1 ) ∣ ∣ p ( W 1 ) ) ≈ Q K ( σ 2 − log ⁡ ( σ 2 ) − 1 ) + p 1 2 ∑ q = 1 Q m q T m q + C K L ( q ( W 2 ) ∣ ∣ p ( W 2 ) ) ≈ Q K ( σ 2 − log ⁡ ( σ 2 ) − 1 ) + p 2 2 ∑ k = 1 K m k T m k + C K L ( q ( b ) ∣ ∣ p ( b ) ) = 1 2 ( m T m + K ( σ 2 − log ⁡ ( σ 2 ) − 1 ) ) + C KL(q(W_1)||p(W_1)) \approx QK(\sigma^2-\log(\sigma^2)-1)+\frac{p_1}{2}\sum_{q=1}^Qm_q^Tm_q+C \\ KL(q(W_2)||p(W_2)) \approx QK(\sigma^2-\log(\sigma^2)-1)+\frac{p_2}{2}\sum_{k=1}^Km_k^Tm_k+C \\ KL(q(b)||p(b))=\frac{1}{2}(m^Tm+K(\sigma^2-\log(\sigma^2)-1))+C KL(q(W1)p(W1))QK(σ2log(σ2)1)+2p1q=1QmqTmq+CKL(q(W2)p(W2))QK(σ2log(σ2)1)+2p2k=1KmkTmk+CKL(q(b)p(b))=21(mTm+K(σ2log(σ2)1))+C
我们将原来的ELBO拆分成了近似的形式,忽略常数项,可以得到待优化的目标函数为:
L G P − M C ∝ − 1 2 N ∑ n = 1 N ∣ ∣ y n − y ^ n ∣ ∣ 2 2 − p 1 2 τ N ∣ ∣ M 1 ∣ ∣ 2 2 − p 2 2 τ N ∣ ∣ M 2 ∣ ∣ 2 2 − 1 2 τ N ∣ ∣ m ∣ ∣ 2 2 \mathcal{L}_{GP-MC} \varpropto -\frac{1}{2N}\sum_{n=1}^N||y_n-\hat y_n||_2^2-\frac{p_1}{2\tau N}||M_1||_2^2-\frac{p_2}{2\tau N}||M_2||_2^2-\frac{1}{2\tau N}||m||_2^2 LGPMC2N1n=1Nyny^n222τNp1M1222τNp2M2222τN1m22
写了这么多,推导过程其实还有很多细节,并且还有分类问题没有写,但是思想已经概括了:高斯过程+变分推断可以得到与NN+dropout相同的损失函数,而因为高斯过程本身就实现了对模型不确定性的评估,所以传统NN在添加dropout也可以引入不确定性。直观来看,在传统的神经网络中添加dropout之后,由于每个输入和每次前向传播dropout选择激活哪个神经元都是随机的,即使是相同的输入样本,得到的输出也有可能不一样,多次输入同一个样本,输出围绕均值上下浮动的程度就可以看成是模型的一种不确定性

编程实现

import numpy as np
import matplotlib.pyplot as plt
import tensorflow._api.v2.compat.v1 as tf
tf.disable_v2_behavior()

class VariationalDense:
    def __init__(self, n_in, n_out, model_prob, lam):
        self.model_prob = model_prob
        self.lam = lam
        self.bern = tf.compat.v1.distributions.Bernoulli(probs=self.model_prob, dtype=tf.float32)
        self.model_M = tf.Variable(tf.random.truncated_normal([n_in, n_out], stddev=0.01))
        self.model_m = tf.Variable(tf.zeros([n_out]))
        self.model_W = tf.matmul(
            tf.diag(self.bern.sample((n_in, ))), self.model_M
        )

    def __call__(self, X, activation=tf.identity):
        output = activation(tf.matmul(X, self.model_W) + self.model_m)
        if self.model_M.shape[1] == 1:
            output = tf.squeeze(output)

        return output

    @property
    def regularization(self):
        return self.lam * (
                self.model_prob * tf.reduce_sum(tf.square(self.model_W)) + tf.reduce_sum(tf.square(self.model_m)))


n_samples = 100
X = np.random.normal(size=(n_samples, 1))
y = np.random.normal(np.cos(5. * X) / (np.abs(X) + 1.), 0.1).ravel() # np.ravel()函数将多维数组转化为一维数组
X_pred = np.atleast_2d(np.linspace(-3., 3, num=100)).T  # 将数组转化为至少两维
X = np.hstack((X, X**2, X**3)) # 将两个数组按水平方向合起来
X_pred = np.hstack((X_pred, X_pred**2, X_pred**3))

# create the tensorflow model
n_feats = X.shape[1]
n_hidden = 100
model_prob = 0.9
model_lam = 1e-2
model_X = tf.placeholder(tf.float32, [None, n_feats])
model_y = tf.placeholder(tf.float32, [None])
model_L_1 = VariationalDense(n_feats, n_hidden, model_prob, model_lam)
model_L_2 = VariationalDense(n_hidden, n_hidden, model_prob, model_lam)
model_L_3 = VariationalDense(n_hidden, 1, model_prob, model_lam)
model_out_1 = model_L_1(model_X, tf.nn.relu)
model_out_2 = model_L_2(model_out_1, tf.nn.relu)
model_pred = model_L_3(model_out_2)
model_sse = tf.reduce_sum(tf.square(model_pred - model_y))
model_mse = model_sse / n_samples
model_loss = (model_sse + model_L_1.regularization + model_L_2.regularization + model_L_3.regularization)

train_step = tf.train.AdamOptimizer(1e-3).minimize(model_loss)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(1000):
        sess.run(train_step, {model_X: X, model_y:y})
        if i % 100 == 0:
            mse = sess.run(model_mse, {model_X: X, model_y:y})
            print("Iteration {}. Mean squared error: {:.4f}.".format(i, mse))

    # sample from the posterior
    n_post = 1000
    Y_post = np.zeros((n_post, X_pred.shape[0]))
    for i in range(1000):
        Y_post[i] = sess.run(model_pred, {model_X: X_pred})


if __name__ == '__main__':
    plt.figure(figsize=(9, 7))
    for i in range(n_post):
        plt.plot(X_pred[:, 1], Y_post[i], "b-", alpha=1./200)
    plt.plot(X[:, 1], y, "r.")
    plt.grid()
    plt.show()

传统深度模型的uncertainty----Monte Carlo dropout_第1张图片
从实验结果图来看,对于已经训练的样本点,蓝色的实线部分都很密集,说明这部分方差小,模型对这些数据的预测比较有把握,而在预测两边这些未知数据时,蓝色实线明显呈现发散趋势,方差大,反应模型对这部分数据预测的不确定性。
模型的不确定性计算在风险评估,医疗诊断方面是很有意义的,毕竟并不是什么事情都不需要考虑代价,如果没有多大把握且代价很大,就会造成很严重的后果,这个时候评估模型对于预测的不确定程度就变得很重要。

你可能感兴趣的:(深度学习,机器学习,概率论)