【问题标题】:How to do automatic differentiation on hmatrix?如何对hmatrix进行自动微分?
【发布时间】:2015-05-06 09:05:48
【问题描述】:

Sooooo ...事实证明,从 fake matriceshmatrix 的数据类型并不简单 :)

前言供参考:

{-# 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 a] -> a
preserveInfo img as φs = sumElements (errImg * errImg)
    where errImg = img - (reconstruct as φs)

以及对gradientDescent函数的调用:

gradientDescentOverAs :: forall m a. (Floating a, Ord a, Num (Vector a))
                      => Matrix a -> [Matrix a] -> [a] -> [[a]]
gradientDescentOverAs img φs as0 = gradientDescent go as0
  where go as = preserveInfo img as φs

编辑:这不是原始问题中的代码,而是尽可能地归结为。 GHC 要求对 go 子功能进行一些限制,但链接问题中提出的答案不适用于此处。

edit2,在下面引用我自己的话:

我开始相信这是不可能的。 Matrix 要求它的元素在 Element 类中。唯一的元素是DoubleFloat 和它们的Complex 形式。所有这些都不被gradientDescent接受。

所以基本上这与上面链接的问题相同,但对于 hmatrix 数据类型而不是我的手动处理的数据类型。

edit3

Edward Kmett 和 Dominic Steinitz 之间的相关电子邮件对话:https://mail.haskell.org/pipermail/haskell-cafe/2013-April/107561.html

【问题讨论】:

    标签: haskell automatic-differentiation hmatrix


    【解决方案1】:

    我发现这个系列的博客文章很有帮助: https://idontgetoutmuch.wordpress.com/2014/09/09/fun-with-extended-kalman-filters-4/ (演示了具有静态大小保证的 HMatrix 和 AD 中的 jacobian 函数)。

    HTH

    【讨论】:

    • 哦……是的……那本书在我的阅读队列中出现了好几次……尽管如此,但从来没有坚持不懈地工作。猜猜现在是时候了。
    • 昨天晚上试图完成它......现在我记得为什么我从未完成它......对于没有机器学习背景的人来说这是一些密集的东西(我应该......但仍然)。
    • 也许你可以从上面总结出最小(非)工作的例子,去掉希腊字母,给函数一些更具表现力的名字?另外,在 adEq5H 的定义中去掉 go 的签名怎么样?而且,为什么 eqsH 有两个定义?
    • 恐怕我不能接受这个答案。 Dominic 正在使用hmatrix 的(实验性)静态接口。我也想这样做,但它甚至不提供scale 函数。 ---关于你的问题:我可以再简化一下。我喜欢希腊字母。函数名称是废话,但(希腊字母和函数名称)都指的是我正在尝试实现的论文。我无法摆脱go 的签名......在链接的问题中,这是绝对必要的。还有eqsH ...哎呀...其中之一是导数。
    • 我开始相信这是不可能的。 Matrix 要求它的元素在 Element 类中。唯一的元素是DoubleFloat 和它们的Complex 形式。所有这些都不被gradientDescent接受。
    猜你喜欢
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 2021-01-29
    • 2011-08-11
    • 2015-08-22
    相关资源
    最近更新 更多