gpt4 book ai didi

haskell - 如何从自动微分中获得更多性能?

转载 作者:行者123 更新时间:2023-12-03 15:02:50 24 4
gpt4 key购买 nike

我很难优化依赖 ad 的程序小号 conjugateGradientDescent它的大部分工作的功能。

基本上我的代码是 old papers code 的翻译。这是用 Matlab 和 C 编写的。我没有测量它,但该代码每秒运行几次迭代。我的每次迭代大约需要几分钟......

该代码在此存储库中可用:

  • https://github.com/fhaust/aer
  • https://github.com/fhaust/aer-utils

  • 可以通过以下命令运行有问题的代码:
    $ cd aer-utils
    $ cabal sandbox init
    $ cabal sandbox add-source ../aer
    $ cabal run learngabors

    使用 GHC 分析工具,我已经确认下降实际上是大部分时间的部分:

    Flamegraph of one iteration

    (此处为互动版: 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 的唯一方法使用矩阵(参见:How to do automatic differentiation on hmatrix?)。我的猜测是,通过使用像 newtype Mat w h a = Mat (Unboxed.Vector a) 这样的矩阵类型由于拆箱和融合,将获得更好的性能。我找到了some codead未装箱矢量的实例,但到目前为止,我还无法将这些与 conjugateGradientFunction 一起使用.
  • 矩阵导数:在一封电子邮件中,我现在找不到 Edward 提到使用 Forward 会更好。矩阵类型的实例,而不是用 Forward 填充矩阵实例。我有一个模糊的想法如何实现它,但还没有弄清楚我将如何根据 ad 来实现它s 类型类。

  • 这可能是一个在 SO 上无法回答的问题,所以如果您愿意在这里帮助我,请随时在 Github 上与我联系。

    最佳答案

    对于当前 ad,您几乎遇到了最坏的情况。图书馆在这里。

    FWIW-您将无法使用现有的 ad带有“矩阵/矢量广告”的类/类型。这将是一项相当大的工程工作,请参阅 https://github.com/ekmett/ad/issues/2

    至于为什么不能开箱:conjugateGradient需要能够使用 Kahn您的功能上的模式或两级前进模式。前者阻止了它使用未装箱的向量,因为数据类型带有语法树,并且不能被拆箱。由于各种技术原因,我还没有弄清楚如何使它与标准 Reverse 等固定大小的“磁带”一起工作。模式。

    我认为这里的“正确”答案是让我们坐下来弄清楚如何正确获取矩阵/向量 AD 并将其集成到包中,但我承认我现在的时间片太薄了,无法引起人们的注意应得的。

    如果您有机会在 irc.freenode.net 上浏览#haskell-lens,我很乐意谈论这个领域的设计并提供建议。 Alex Lang 也一直致力于 ad很多,经常在那里,可能有想法。

    关于haskell - 如何从自动微分中获得更多性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30888615/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com