You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Several questions about gradient backpropagation and parameter update #3
Activity
csyhhu commentedon Jul 24, 2020
@CharlesTao0926 您好!感谢您的兴趣和使用。
我先尝试解决你的第一个问题:“第二次迭代过程中使用的layer.meta_weight是基于STE的,而不是基于meta-grad的。这是第1个与论文不匹配的地方。”
第二次迭代的时候,
meta_grad_dict已经算出来了,所以这段代码已经被执行:https://github.com/csyhhu/MetaQuant/blob/50694404fa010958aa24c96b4c870d5e9442e849/meta-quantize.py#L239:for layer_info in net.layer_name_list: layer_name = layer_info[0] layer_idx = layer_info[1] layer = get_layer(net, layer_idx) layer.weight.grad.data = ( layer.calibration * meta_grad_dict[layer_name][1].data )因而此时layer.weight.grad已经是meta-grad的了,所以第二次forward的时候是基于meta-grad的。
不知道我有没有理解清您的问题呢?
CharlesTao0926 commentedon Jul 24, 2020
@csyhhu: 感谢您的回复。
我理解您的意思。但是,我觉得问题似乎仍然存在。因为在执行
MetaQuant/meta-quantize.py
Line 239 in 5069440
MetaQuant/meta-quantize.py
Line 220 in 5069440
因此,第2次迭代的前向过程中实际使用的layer.meta_weight是在执行L220的过程中,由https://github.com/csyhhu/MetaQuant/blob/50694404fa010958aa24c96b4c870d5e9442e849/meta_quantized_module.py#L87 计算的,而此时的self.weight.grad还没被L239更新。
另外,虽然在https://github.com/csyhhu/MetaQuant/blob/50694404fa010958aa24c96b4c870d5e9442e849/meta_quantized_module.py#L87 使用了如下的方式更新self.meta_weight,但此处的self.calibrated_grads一加一减被抵消,实际的梯度使用的是self.weight.grad。我不太理解此处对self.calibrated_grads一加一减操作的作用,请您赐教。
self.meta_weight = self.weight -
lr * (self.calibrated_grads
+ (self.weight.grad.data - self.calibrated_grads.data).detach())
不知我的理解,是否有误。请指教,多谢!
csyhhu commentedon Jul 24, 2020
@CharlesTao0926 ,你说的是对的,应该要等到第三次iteration的时候,forward才会用上meta_grad_dict里面的信息,然而此时meta_grad_dict是由第一次iteration产生的梯度生成的,这里存在两个iteration的延迟。你的困惑应该跟 #1 这里的问题是类似的。我之后尝试换一种框架来实现,目前的问题的确难以避免。但high-level idea是一样的,都是通过梯度学习梯度。
一加一减的操作是因为要考虑到optimizer(主要是Adam)的影响以及要把calibrated_grads引入计算图。calibrated_grads是不经过optimizer改变的,但是weights的更新应该需要用上不同的optimizer. 因此我先把calibrated_grads赋值给了weight.grad,然后在https://github.com/csyhhu/MetaQuant/blob/50694404fa010958aa24c96b4c870d5e9442e849/meta-quantize.py#L244这步中更新,这样weight.grad就是用optimizer更新后的calibrated_grads, 然后再放入下一次iteration的forward. 但因为L244切断了calibrated_grads和计算图的连接,所以我在self.meta_weight的更新里用了一加一减的方式完成:1.把calibrated_grads引入计算图。2.weight的更新是来自optimizer更新后的梯度。
CharlesTao0926 commentedon Jul 25, 2020
@csyhhu: 感谢您的回复。
谢谢您的解释,我基本明白了。还有两个问题,想继续追问一下:
多谢!
csyhhu commentedon Jul 25, 2020
@CharlesTao0926 您好,
CharlesTao0926 commentedon Jul 25, 2020
@csyhhu 明白了,谢谢您的指教。