我正在尝试进入语言处理,从简单的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])