我正在努力优化一个依赖于ads conjugateGradientDescent函数的程序来完成大部分工作.
基本上我的代码是用Matlab和C编写的旧论文代码的翻译.我没有测量它,但是代码每秒运行几次迭代.我的每次迭代大约为几分钟......
代码在此存储库中可用:
可以通过以下命令运行相关代码:
$ cd aer-utils
$ cabal sandbox init
$ cabal sandbox add-source ../aer
$ cabal run learngabors
Run Code Online (Sandbox Code Playgroud)
使用GHC分析设施我已经确认下降实际上是大部分时间都在使用的部分:

(此处为交互式版本:https://dl.dropboxusercontent.com/u/2359191/learngabors.svg)
-s 告诉我生产力很低:
Productivity 33.6% of total user, 33.6% of total elapsed
Run Code Online (Sandbox Code Playgroud)
根据我收集的内容,有两件事可能会带来更高的性能:
拆箱:目前我使用自定义矩阵实现(in src/Data/SimpleMat.hs).这是我可以ad使用矩阵的唯一方法(参见:如何在hmatrix上自动区分?).我的猜测是,通过使用矩阵类型,newtype Mat w h a = Mat (Unboxed.Vector a)由于拆箱和融合将获得更好的性能.我找到了一些代码,其中包含未ad装箱的矢量实例,但到目前为止我还没有能够使用这些代码conjugateGradientFunction.
矩阵导数:在目前我无法找到的电子邮件中,爱德华提到最好使用Forward矩阵类型的实例而不是填充Forward实例的矩阵.我对如何实现这一点有一个微弱的想法,但还没有弄清楚我是如何根据ads类类实现它的.
这可能是一个太宽泛而无法回答的问题,所以如果你愿意帮助我,请随时与我联系Github.
Sooooo ......因为事实证明从伪矩阵到hmatrix数据类型变得非常重要:)
序言部分供参考:
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ParallelListComp #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
import Numeric.LinearAlgebra.HMatrix
import Numeric.AD
reconstruct :: (Container Vector a, Num (Vector a))
=> [a] -> [Matrix a] -> Matrix a
reconstruct as ?s = sum [ a `scale` ? | a <- as | ? <- ?s ]
preserveInfo :: (Container Vector a, Num (Vector a))
=> Matrix a -> [a] -> [Matrix …Run Code Online (Sandbox Code Playgroud)