Paddle 能否支持Momentum和L2Decay的schedule?

s2j5cfk0  于 2022-10-20  发布在  其他
关注(0)|答案(4)|浏览(181)

目前 lr 支持schedule方式, 如piecewise_decay等,是将 lr 定义为variable然后传到optimizer op的inputs中。
但是其他一些超参,如momentum, L2Decay系数等,能否做到schedule?
目前paddle静态图实现是将momentum, L2Decay.coeff作为Op的Attr,这样就不能将其定义为variable了。那有什么其他方式在静态图中实现 momentum, l2 coeff的schedule吗?
如果目前无法实现,后面会支持吗?
另外,动态图能够支持这个功能吗?

关于为何要做momentum的schedule,可以参考 fastai的官方文档 OneCycleScheduler部分,以及相关 论文

zbsbpyhn

zbsbpyhn2#

@yiicy 请问这个问题有进展吗?

nkcskrwz

nkcskrwz3#

目前静态图可以实现Op的Attr的更改,以更改adam的beta1参数举例,具体步骤:

  • 在exe.run(program)之前,使用program.global_block().ops拿到所有op并遍历
  • 如果op.type == "adam" ,使用op._set_attr('beta1', N),手动重置该参数为N
  • exe.run(program),此时beta1已被更新。
  • 以这种方式更新参数,可以做到batch级的attr更改。

但需注意的是,目前静态图无法支持在运行过程中动态更改attr参数,支持此功能影响面较大,需要研究讨论。

qrjkbowd

qrjkbowd4#

@MrChengmo 感谢回答!目前做到batch级别的调整就够用了。
这里还剩一个问题: 对于L2Decay的schedule,貌似不能简单通过op.type=='scale'来得到,因为collective op里面也用到了,如下

block.append_op(
                type='scale',
                inputs={'X': [param]},
                outputs={'Out': [param]},
                attrs={
                    'scale': 1.0 / self.nranks,
                    self.op_role_key: OpRole.Optimize
                })

所以必须要通过 op.attr('op_namescope') 里是不是含有 'regularization'来判断吧?

相关问题