Neural network Pymc3神经网络
我正试图使用pymc3从后部取样,这是一组单隐层神经网络,这样我就可以将模型转换为层次模型,就像Radford M.Neal的论文一样。我的第一个模型如下所示:Neural network Pymc3神经网络,neural-network,bayesian,hierarchical,mcmc,pymc3,Neural Network,Bayesian,Hierarchical,Mcmc,Pymc3,我正试图使用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)
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=输入精度->隐藏偏差)。选择Hyperprior的参数,使其可以是广泛的,也可以进行对数变换
#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()和无论样本数量多少,nor采样方法都不会收敛,并且生成的ANN不会插值样本点。然后我尝试将Hyperprior逐个集成到我的模型中。唯一可以集成而没有问题的是噪声精度。如果我包括其他任何一个,那么采样器将不会收敛到后验点。我尝试对所有模型变量使用一个“阶跃函数”,并对参数和超参数使用两个单独的阶跃方法。在所有情况下,对于不同数量的样本,问题仍然存在。我认为您应该添加更多细节,说明它们“工作不正常”,这是相当模糊的。我会回到这一点上,但现在,你考虑过不优化你的超优先级吗?那么它有效吗?优化超优先级尤其是缩放超优先级通常效果不佳,因为在许多情况下没有最小值。例如:想想你有几个正态分布的隐藏变量的情况es和前一个比例参数。通过使所有正态分布的隐藏变量具有相同的值并使比例参数越来越小,可以使概率任意密集。如果这对您没有意义,请告诉我。@JohnSalvatier谢谢您的评论。我更新了我的问题以反映您的观点ts!如果我不包括超参数,一切都很好。但我试图在参数和超参数上建立一个层次模型和样本。这与RM.Neal的“神经网络的贝叶斯学习”中解释的类似.我的Hyperprior的参数值似乎有问题!你能包含一些能准确复制以X和Y形式传入的数据的内容吗?我不清楚你从描述中传入的确切内容。