我找不到Julia Flux的gradient
函数的参考文档,只有几个教程示例。
我了解gradient
是如何用于计算函数的梯度的,例如语法
f(x, y) = x^2 + y^2
df(x, y) = gradient(f, x, y)
将基本上产生CCD_ 3。然而,稍后教程使用了以下语法,没有任何解释:
gs = gradient(() -> loss(x, y), Flux.params(W, b))
我认为有一些方法可以从数学的角度解释() -> loss(x, y)
的梯度,但我不确定这是否就是这里发生的事情。那么这个匿名函数是什么呢?为什么gradient
是这样设计的呢?请提供gradient
完整文档的链接。
首先,指向gradient
文档的链接:https://fluxml.ai/Zygote.jl/dev/#Zygote.gradient
gradient
知道返回函数中引用但未作为参数传递的变量的导数。问题中的例子就是这样。它在手册中被称为隐式。要区分的参数以Params
类型的值传递。在该示例中,Params
是由辅助函数Flux.params
创建的。当使用隐式样式时,函数将作为零参数函数传递(请参阅手册(。
关于语法本身(与gradient
一起使用无关(:
() -> loss(x, y)
是一个匿名函数(有时在函数式编程上下文中称为lambda函数(。本质上类似于一个常规函数,但可一次性使用,无需为选择名称而烦恼。
关于这些的Julia手册链接是https://docs.julialang.org/en/v1/manual/functions/#man-匿名函数
以下是更多示例:
带1个参数:map(x -> x^2 + 2x - 1, [1, 3, -1])
有两个参数:(x,y) -> 2*x + y
无参数:() -> time()