私は単純な HMM から始めて、離散パラメーターを必要とする可能性のあるモデルに構築する言語処理に取り組もうとしています (そのため、Stan は機能しない可能性があります)。最終的には、大量の言語データを処理したいので、かなりの効率が必要です。PyMC3 はおそらく私の唯一のオプションのようです (提案を受け付けています)。
単純な「隠れた」マルコフモデルを試してみると、問題が発生しました。これは、「潜在的な」状態が観測されたデータであるスタンマニュアルの最初の HMM モデルです。N=300 の人工データを使用したモデルは、Metropolis を使用して PyMC3 で実行されますが、Stan の 2.5 秒 (NUTS を使用) と比較して 11 分かかります。何百倍も長いということは、Metropolis サンプラーが適切に拡張できないことを示唆しています。PyMC3 の NUTS サンプラーは、非常に正確な MAP 推定値が供給されているにもかかわらず、「スケーリングは正定値ではありません」というエラーを出します。
また、PyMC3 で N=1000 のモデルを実行してみました。fmin_powell オプティマイザーと L-BFGS-B オプティマイザーの両方を試しました。どちらも 2 時間実行され、システムで使用可能なすべてのメモリ (16GB RAM、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])