0

我正在尝试定义一个非常复杂的多元、连续、自定义/任意分布函数,并使用 NUTS 从中采样。当我这样做时,我收到以下错误:

ERROR (theano.gof.opt): SeqOptimizer apply <theano.scan_module.scan_opt.PushOutNonSeqScan object at 0x000000000AC0E390>

ERROR:theano.gof.opt:SeqOptimizer apply <theano.scan_module.scan_opt.PushOutNonSeqScan object at 0x000000000AC0E390>

ERROR (theano.gof.opt): Traceback:
ERROR:theano.gof.opt:Traceback:

ERROR (theano.gof.opt): Traceback (most recent call last):
  File "C:\Anaconda\envs\py3conda\lib\site-packages\theano\gof\opt.py", line 196, in apply
    sub_prof = optimizer.optimize(fgraph)
  File "C:\Anaconda\envs\py3conda\lib\site-packages\theano\gof\opt.py", line 82, in optimize
    ret = self.apply(fgraph, *args, **kwargs)
  File "C:\Anaconda\envs\py3conda\lib\site-packages\theano\scan_module\scan_opt.py", line 216, in apply
    self.process_node(fgraph, node)
  File "C:\Anaconda\envs\py3conda\lib\site-packages\theano\scan_module\scan_opt.py", line 282, in process_node
    **dict(return_list=True))[0].owner
  File "C:\Anaconda\envs\py3conda\lib\site-packages\theano\gof\op.py", line 507, 
in __call__
    node = self.make_node(*inputs, **kwargs)
  File "C:\Anaconda\envs\py3conda\lib\site-packages\theano\tensor\basic.py", line 1252, in make_node
    raise TypeError("MaxAndArgmax needs a constant axis")

TypeError: MaxAndArgmax needs a constant axis

我已经确保自定义 logp 函数的输出是一个 theano 变量标量,并且在我的自定义分布声明之外,我能够成功编译一个返回 logp 的 theano 函数,然后还有关于多元输入的梯度. 我的自定义分发功能不使用扫描操作,这似乎在生成上述错误中起作用。我还收到关于扫描操作的推断形状警告(我可以在此处跟进该错误消息)。

从我所做的研究来看,在我看来问题可能来自 NUTS 计算粗麻布,但我不确定。我对 pymc3 和 theano 没有经验,所以这里的任何见解都将不胜感激。

谢谢!

亚历克斯

更新:

我现在相当有信心 hessian 导致了这个错误,所以这更像是一个 theano 问题而不是 pymc3 问题。我能够通过theano.gradient.hessian()完全评估 pymc3 之外的函数来测试这一点,并且我收到了与上面完全相同的错误。此外,与此问题类似,我tensor.min()在评估导致上述错误的似然函数时使用了 a。但是,我用 sum() 替换了 min() 以进行仔细检查,而 theano 仍然无法编译我的函数,但没有抛出错误(只是被阻塞)......但仅在 gpu 上。仍然保留“假” sum() 操作,粗麻布在我的 cpu 上成功评估。无论如何,我认为我的似然函数在连续性和凸性方面也存在问题,所以不会沿着这条路走。

4

0 回答 0