您将如何计算由神经网络 wrt NN 参数组成的损失函数的粗麻布?
例如,考虑下面的损失函数
using Flux: Chain, Dense, σ, crossentropy, params
using Zygote
model = Chain(
x -> reshape(x, :, size(x, 4)),
Dense(2, 5),
Dense(5, 1),
x -> σ.(x)
)
n_data = 5
input = randn(2, 1, 1, n_data)
target = randn(1, n_data)
loss = model -> crossentropy(model(input), target)
我可以通过两种方式获得渐变 wrt 参数……</p>
Zygote.gradient(model -> loss(model), model)
或者
grad = Zygote.gradient(() -> loss(model), params(model))
grad[params(model)[1]]
但是,我找不到一种方法来获取粗麻布的参数。(我想做类似的事情Zygote.hessian(model -> loss(model), model)
,但Zygote.hessian
不::Params
作为输入)
最近,一个jacobian
函数被添加到 master 分支(issue #910),它被理解::Params
为一个 input。
我一直在尝试组合gradient
并jacobian
获得粗麻布(因为粗麻布是函数梯度的雅可比),但无济于事。我认为问题在于这model
是一个Chain
包含通用函数的对象,reshape
并且σ.
缺少参数,但我无法超越这一点。
grad = model -> Zygote.gradient(model -> loss(model), model)
jacob = model -> Zygote.jacobian(grad, model)
jacob(model) ## does not work
编辑:作为参考,我之前在 pytorch 中创建了这个