1

我正在尝试使用 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 获胜'不插入样本点。然后我尝试将超先验一一集成到我的模型中。唯一可以毫无问题地集成的是噪声精度。如果我包括其他任何一个,那么采样器将不会收敛到后验。我尝试对所有模型变量使用一个“步进函数”,并在参数和超参数上结合两个单独的步进方法。在所有情况下,并且样本数量不同,问题仍然存在。

4

0 回答 0