我想使用广告自动微分包来学习 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
是所有模式 Num
的 Fractional
和 s
的实例,只要 a
是 Num
和 Fractional
。所以只要写一个从整数列表到单个整数的多态函数,传入一个初始状态,你提供的函数就会为你优化它。
IE。不要将您的成本函数指定为 over double,而是将其指定为任何 Num
和 Fractional
的多态,让库来处理剩下的事情!
您可能更喜欢先尝试其他更基本的函数(例如 diff
)来习惯这种风格。
关于Haskell 广告包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14676075/