神经网络与Pymc3

时间:2015-05-06 02:03:08

标签: 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)        
        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()和采样方法都不收敛,并且所得到的ANN不会插入样本点。然后我尝试将hyperpriors逐个集成到我的模型中。唯一可以无问题地集成的是噪声精度。如果我包括其他任何一个,则采样器不会收敛到后部。我尝试使用一个步骤功能'对于所有模型变量以及两个单独的步骤方法相对于参数和超行程的组合。在所有情况下,样本数量不同,问题仍然存在。

0 个答案:

没有答案
相关问题