我正在尝试使用 pymc3 从后部采样,一组单隐藏层神经网络,以便我可以将模型转换为分层模型,与 Radford M.Neal 的论文中相同。我的第一个模型如下所示:
def sample(nHiddenUnts,X,Y):
nFeatures = X.shape[1]
with pm.Model() as model:
#priors
bho = pm.Normal('hiddenOutBias',mu=0,sd=100)
who = pm.Normal('hiddenOutWeights',mu=0,sd=100,shape= (nHiddenUnts,1) )
bih = pm.Normal('inputBias',mu=0,sd=100 ,shape=nHiddenUnts)
wih= pm.Normal('inputWeights',mu=0,sd=100,shape=(nFeatures,nHiddenUnts))
netOut=T.dot( T.nnet.sigmoid( T.dot( X , wih ) + bih ) , who )+bho
#likelihood
likelihood = pm.Normal('likelihood',mu=netOut,sd=0.001,observed=Y)
start = pm.find_MAP()
step = pm.Metropolis()
trace = pm.sample(100000, step, start, progressbar=True)
return trace
在第二个模型中添加了超先验,即噪声精度、输入到隐藏和隐藏到输出的权重和偏差(例如 bihTau = 输入精度->隐藏偏差)。选择超先验的参数,以便它们可以是广泛的并且也可以进行对数转换。
#Gamma Hyperpriors
bhoTau, log_bhoTau = model.TransformedVar('bhoTau',
pm.Gamma.dist(alpha=1,beta=1e-2,testval=1e-4),
pm.logtransform)
WhoTau, log_WhoTau = model.TransformedVar('WhoTau',
pm.Gamma.dist(alpha=1,beta=1e-2,testval=1e-4),
pm.logtransform)
bihTau, log_bihTau = model.TransformedVar('bihTau',
pm.Gamma.dist(alpha=1,beta=1e-2,testval=1e-4),
pm.logtransform)
wihTau, log_wihTau = model.TransformedVar('wihTau',
pm.Gamma.dist(alpha=1,beta=1e-2,testval=1e-4),
pm.logtransform)
noiseTau, log_noiseTau = model.TransformedVar('noiseTau',
pm.Gamma.dist(alpha=1,beta=1e-2,testval=1e+4),
pm.logtransform)
#priors
bho = pm.Normal('hiddenOutBias',mu=0,tau=bhoTau)
who = pm.Normal('hiddenOutWeights',mu=0,tau=WhoTau,shape=(nHiddenUnts,1) )
bih = pm.Normal('inputBias',mu=0,tau=bihTau ,shape=nHiddenUnts)
wih= pm.Normal('inputWeights',mu=0,tau=wihTau ,shape= (nFeatures,nHiddenUnts))
.
.
.
start = pm.find_MAP()
step = pm.NUTS(scaling=start)
其中 bho,who,bin 和 win 是隐藏到输出和输入到隐藏层的偏差和权重。
为了检查我的模型,从以下形式的一维玩具函数中抽取了 3 到 5 个样本点 [0,1)
def g(x):
return np.prod( x+np.sin(2*np.pi*x),axis=1)
第一个模型(恒定超参数)工作正常!但是当我从超参数+参数的后部进行采样时,例如将第一个(上面)列表中的先验替换为第二个列表中的先验,无论样本数量如何,find_MAP() 和采样方法都不会收敛,结果 ANNs 获胜'不插入样本点。然后我尝试将超先验一一集成到我的模型中。唯一可以毫无问题地集成的是噪声精度。如果我包括其他任何一个,那么采样器将不会收敛到后验。我尝试对所有模型变量使用一个“步进函数”,并在参数和超参数上结合两个单独的步进方法。在所有情况下,并且样本数量不同,问题仍然存在。