Paddle 【论文复现】Momentum优化器的rescale_grad和grad_clip参数没生效

aij0ehis  于 2022-10-20  发布在  其他
关注(0)|答案(7)|浏览(208)
  • 标题:Momentum优化器的rescale_grad和grad_clip参数没生效
  • 版本、环境信息:

1)PaddlePaddle版本:2.2.0
2)CPU:i5
3)GPU:3060 cuda 11.2
4)系统环境:windows10,Python 3.6

  • 模型信息

convs2s

  • 复现信息:运行下面的代码,分别修改clip_norm和rescale_grad,比较前后的参数、梯度、梯度范数。
  • 问题描述:没有报错,我发现加和不加该参数,最后得到的参数和梯度没发生改变。他们在哪里起作用了呢?

`
import paddle
import numpy as np
import random
from paddle.fluid.dygraph.parallel import ParallelEnv
nranks = ParallelEnv().nranks
seed=1
np.random.seed(seed)
paddle.seed(seed)
random.seed(seed)
random.seed(seed)

def ClipGradByNorm(tensor, clip_norm=0.1):
''' 按tensor的l2范数缩放 '''
norm = ((tensor2).sum())(1 / 2)
c = clip_norm / max(norm, clip_norm)
tensor = tensor * c
return tensor

def calc_global_norm(tensor_groups):
l2_norm_fn = lambda tensor: ((tensor2).sum())(1 / 2)
tensor_norms = [l2_norm_fn(tensor) for tensor in tensor_groups]
global_norm = sum([norm**2 for norm in tensor_norms])**(1 / 2)
return global_norm

def ClipGradByGlobalNorm(tensor_groups, clip_norm=0.1):
''' 按所有tensor的l2范数缩放 '''
global_norm = calc_global_norm(tensor_groups)
c = clip_norm / max(global_norm, clip_norm)
tensor_groups = [tensor * c for tensor in tensor_groups]
return tensor_groups

bsz=256
epoch=10
##################### 分别修改下面两个 ######################
clip_norm=0.1
rescale_grad=1
###########################################################
model = paddle.nn.Linear(10, 10)
clip = paddle.nn.ClipGradByGlobalNorm(clip_norm=clip_norm)
optim = paddle.optimizer.Momentum(learning_rate=0.1,parameters=model.parameters(),rescale_grad=rescale_grad,grad_clip=clip)
for i in range(5):
x = paddle.randn([bsz, 10])
out = model(x)
loss = paddle.mean(out)

back prop gradients

loss.backward()

update params by gradients

optim.step()
param_groups=optim._param_groups
grad_groups=[param.grad for param in param_groups]
print('param_groups',param_groups[0][0].numpy())
print('grad_groups',grad_groups[0][0].numpy())
global_norm=calc_global_norm(grad_groups)
print('global_norm',global_norm.numpy())
'''
clip_norm=0.1
param_groups [-0.5496709 -0.4565471 0.10905335 0.42701575 0.5106469 -0.34190077 0.01443232 -0.11369913 -0.26169622 0.26478162]
grad_groups [0.01216471 0.01216471 0.01216471 0.01216471 0.01216471 0.01216471 0.01216471 0.01216471 0.01216471 0.01216471]
*global_norm [1.5874481]

clip_norm=0.2
param_groups [-0.5516438 -0.45852 0.10708045 0.42504287 0.50867397 -0.34387365 0.01245942 -0.11567203 -0.2636691 0.26280874]
grad_groups [0.01216471 0.01216471 0.01216471 0.01216471 0.01216471 0.01216471 0.01216471 0.01216471 0.01216471 0.01216471]
*global_norm [1.5874481]

'''
`

ryoqjall

ryoqjall1#

您好,我们已经收到了您的问题,会安排技术人员尽快解答您的问题,请耐心等待。请您再次检查是否提供了清晰的问题描述、复现代码、环境&版本、报错信息等。同时,您也可以通过查看 官网API文档常见问题历史IssueAI社区 来寻求解答。祝您生活愉快~

Hi! We've received your issue and please be patient to get responded. We will arrange technicians to answer your questions as soon as possible. Please make sure that you have posted enough message to demo your request. You may also check out the APIFAQGithub Issue and AI community to get the answer.Have a nice day!

falq053o

falq053o2#

您好,可以看一下python/paddle/fluid/clip.py的ClipGradByGlobalNorm实现,clip_norm参数设置不一样但最终梯度的一样有可能就是算出来的global_norm太小,小于clip_norm,导致need_clip=False;当然还可能有其它可能,欢迎继续讨论

dy1byipe

dy1byipe3#

的确,我在加深了网络、减小了clip_norm后发现确实有微小改变了,不过我用自己写道calc_global_norm算的global_norm还是很大。除此之外,rescale_grad在什么时候生效呢?

frebpwbc

frebpwbc4#

您好,rescale_grad在优化器梯度更新前生效,具体看见paddle/fluid/operators/optimizers/momentum_op.h里的实现

azpvetkf

azpvetkf5#

噢我看了 https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/optimizers/dgc_momentum_op.h

,不过就看见➗nrank的 (1.0 / nranks) * g_e;,没有看见乘rescale_grad。
我的训练代码里需要实现梯度乘c,

于是我使用了rescale_grad参数,不知道行不行

jvidinwx

jvidinwx6#

您好,在dgc_momentum里应该没有rescale_grad,只有在momentum里有rescale_grad的实现

wmtdaxz3

wmtdaxz37#

哦哦,好的,看到啦…

------------------ 原始邮件 ------------------ 发件人: "Fan***@***.***>; 发送时间: 2022年1月17日(星期一) 中午12:19 收件人:***@***.***>; 抄送:***@***.***>;***@***.***>; 主题: Re: [PaddlePaddle/Paddle] 【论文复现】Momentum优化器的rescale_grad和grad_clip参数没生效 (Issue #38943) 您好,在dgc_momentum里应该没有rescale_grad,只有在momentum里有rescale_grad的实现 — Reply to this email directly, view it on GitHub, or unsubscribe. Triage notifications on the go with GitHub Mobile for iOS or Android. You are receiving this because you authored the thread.Message ID:***@***.***>

相关问题