我想使用广告自动微分包来学习 Haskell 中的神经网络权重。我发现了一些 functions 可能正好有我需要的东西,但是我不知道他们期望什么作为第一个参数。一定是要优化的函数,但不知 Prop 体是什么形式。
他们有这样的签名:

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 之类的签名(它需要权重列表)的成本函数传递给这个库?

最佳答案

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

注意 AD s a 是所有模式 NumFractionals 的实例,只要 aNumFractional 。所以只要写一个从整数列表到单个整数的多态函数,传入一个初始状态,你提供的函数就会为你优化它。

IE。不要将您的成本函数指定为 over double,而是将其指定为任何 NumFractional 的多态,让库来处理剩下的事情!

您可能更喜欢先尝试其他更基本的函数(例如 diff)来习惯这种风格。

关于Haskell 广告包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14676075/

10-14 13:33