简单隐马尔可夫模型运行可能的PyMC3限制

时间:2016-09-01 01:09:08

标签: performance hidden-markov-models pymc3 stan

我正在尝试进入语言处理,从简单的HMM开始,但是建立可能需要离散参数的模型(因此Stan可能不起作用)。最终,我想处理大量语言数据,因此需要相当高的效率。 PyMC3似乎是我唯一的选择(我愿意接受建议)。

我在尝试一个简单的“隐藏”Markov模型时遇到了问题 - 这是Stan手册中的第一个HMM模型,其中'潜在'状态是观察到的数据。这个模型,w = N = 300个人工数据,在大都市的PyMC3中运行,但这需要11分钟,而Stan的2.5秒(使用NUTS)。数百倍的时间表明Metropolis采样器没有足够的可扩展性。 PyMC3中的NUTS采样器给出了“Scaling is not positive definite”错误,尽管它被提供了一个非常准确的MAP估计值。

我还尝试在PyMC3中运行N = 1000的模型。我尝试了fmin_powell和L-BFGS-B优化器。两个小时都耗尽了两个小时,并在耗尽系统上的所有可用内存(16GB内存,16GB交换)后崩溃 - 不明白为什么。 Stan不需要明确的MAP估计,并且在大约20秒内完成了N = 1000的贝叶斯分析。如果我正确阅读Stan手册,它只是以随机值开始,而不是MAP估计。

我不清楚我的问题是由于我为PyMC3提供的模型中的一些新手缺陷,PyMC3中的某些问题或限制,还是这不是那种用PyMC3解决的模型(或者也许最终贝叶斯估计)。我试图进一步对模型进行矢量化,这可能有所帮助,但似乎无法找出有效的东西,也没有我在网上看到很多提供指导。

我用来运行模型的所有代码以及使用的人工数据都可以在这里找到:https://drive.google.com/folderview?id=0B8242b1Xh6pzSWFDM2lQbDZwajg&usp=sharing

模型是:

with basic_model:
    #Model constants:
    K=3; V=9; T=300 #num unique hidden states, num unique emissions, num instances
    alpha=np.ones(K); beta=np.ones(V)
    # Priors for unknown model parameters
    theta = np.empty(K, dtype=object) #theta=transmission
    phi = np.empty(K, dtype=object) #phi=emission
    w=np.empty(T, dtype=object); z=np.empty(T-1, dtype=object); #observed emission, state
    for k in range(K):
        theta[k]=Dirichlet('theta'+str(k), alpha)
        phi[k]=Dirichlet('phi'+str(k), beta)
    #Likelihood (sampling distribution) of observationss
    for t in range(1, T):
        z[t-1]=Categorical('z'+str(t),theta[state[t-1]], shape=1,  observed=state[t])
    for t in range(T):
        w[t]=Categorical('w'+str(t),phi[state[t]], shape=1, observed=emission[t])

0 个答案:

没有答案