相关疑难解决方法(0)

如何通过自动差异化获得更多性能?

我正在努力优化一个依赖于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.

haskell automatic-differentiation hmatrix

16
推荐指数
1
解决办法
481
查看次数

如何在hmatrix上自动区分?

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)

haskell automatic-differentiation hmatrix

5
推荐指数
1
解决办法
297
查看次数