如何在Flux中正确定义自定义STE梯度?

时间:2019-02-12 11:13:12

标签: machine-learning julia gradient flux gradient-descent

我正在尝试使用Flux编写自定义STE渐变。激活基本上只是sign()函数,并且其梯度是传入的梯度,前提是其绝对值<= 1,然后以其他方式取消。我目前拥有的执行方式似乎无法正常工作

binarize(x) = x>=0 ? true : false

binarize(x::Flux.Tracker.TrackedReal) = Flux.Tracker.track(binarize, x)

@grad function binarize(x)
    return binarize.(Flux.Tracker.data(x)), Δ -> (abs(x) <= 1 ? x : 0, )
      0), )
end

对于一个随机的5x1矩阵,我得到:

>> a= param(randn(5))
>> Tracked 5-element Array{Float64,1}:
 -0.3605564089879154
 -0.7853512499733902
  0.8102988051980005
 -0.9715952052917924
 -1.276343849200165
>> c= binarize.(a)
>> 5-element BitArray{1}:
 false
 false
 true
 false
 false
>> Tracker.back!(c, [1,1,1,1,1])
>> a.grad
5-element Array{Float64,1}:
0.0
0.0
0.0
0.0
0.0

我希望a的梯度类似于a,除了最后一个元素为0。

我在做什么错了?

0 个答案:

没有答案