4

我想使用广告自动微分包来学习 Haskell 中的神经网络权重。我发现了一些可能只是我需要的函数,但是我无法弄清楚它们期望的第一个参数是什么。一定是要优化的功能,具体是什么形式我不知道。他们有这样的签名:

gradientDescent :: (Traversable f, Fractional a, Ord a) => (forall s. Mode s => f (AD s a) -> AD s a) -> f a -> [f a]

我发现forall s.意思是一个名为存在量词的东西,仅此而已。我的问题是,我怎样才能将带有签名的成本函数cost :: [Double] -> Double(它需要权重列表)传递给这个库?

4

1 回答 1

4

因此,第一个参数是对AD单个的任何可遍历的函数AD。对于可遍历的,我们可以用列表之类的东西来代替。该函数在模式下必须是多态的。所以让我们忽略这一点,不要做一些指定模式的事情!这个功能显然是我们正在优化的东西。下一个参数是我们传入的初始值。我们现在也将其称为列表。结果是一个稳定更优化的选择列表,用于改进对我们目标的猜测。

请注意,它是所有模式AD s a的一个实例,只要是Num和。所以只需编写一个从整数列表到单个整数的多态函数,传入一个初始状态,您提供的函数将为您优化它。FractionalsaNumFractional

即不要将您的成本函数指定为双精度数,而是将其指定为任何Numand的多态Fractional,并让库处理其余部分!

您可能更愿意通过尝试其他更基本的功能(例如difffirst)来习惯这种风格。

于 2013-02-03T19:10:45.763 回答