我很难优化一个依赖ad
sconjugateGradientDescent
函数完成大部分工作的程序。
基本上我的代码是用 Matlab 和 C 编写的旧论文代码的翻译。我没有测量它,但该代码每秒运行几次迭代。我的每次迭代大约需要几分钟...
该代码在此存储库中可用:
可以通过以下命令运行有问题的代码:
$ cd aer-utils
$ cabal sandbox init
$ cabal sandbox add-source ../aer
$ cabal run learngabors
使用 GHC 分析工具,我已经确认下降实际上是花费大部分时间的部分:
(此处的交互式版本:https ://dl.dropboxusercontent.com/u/2359191/learngabors.svg )
-s
告诉我生产力很低:
Productivity 33.6% of total user, 33.6% of total elapsed
从我收集的信息来看,有两件事可能会导致更高的性能:
拆箱:目前我使用自定义矩阵实现(在 中
src/Data/SimpleMat.hs
)。这是我可以ad
使用矩阵的唯一方法(请参阅:如何在 hmatrix 上进行自动微分?)。newtype Mat w h a = Mat (Unboxed.Vector a)
我的猜测是,由于拆箱和融合,使用类似矩阵类型会获得更好的性能。我发现了一些包含未装箱向量实例的代码,ad
但到目前为止,我还无法将这些与conjugateGradientFunction
.矩阵导数:在一封电子邮件中,我现在找不到 Edward 提到使用
Forward
矩阵类型的实例而不是用Forward
实例填充矩阵会更好。我对如何实现这一点有一个模糊的想法,但还没有弄清楚我将如何根据ad
s 类型类来实现它。
这可能是一个在 SO 上无法回答的问题,所以如果您愿意在这里帮助我,请随时在 Github 上与我联系。