写点什么

MegEngine 使用小技巧:使用 Optimizer 优化参数

作者:MegEngineBot
  • 2023-04-13
    北京
  • 本文字数:929 字

    阅读完需:约 3 分钟

神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻找最优参数的问题,解决这个问题的过程称为优化(optimization)。而由于参数空间复杂、参数数量庞大等原因,使得神经网络的优化问题非常难。


MegEngine 的 optimizer 模块中实现了大量的优化算法, 其中 Optimizer 是所有优化器的抽象基类,规定了必须提供的接口。 同时为用户提供了包括 SGD, Adam 在内的常见优化器实现。 这些优化器能够基于参数的梯度信息,按照算法所定义的策略对参数执行更新。


以 SGD 优化器为例,优化神经网络模型参数的基本流程如下:


from megengine.autodiff import GradManagerimport megengine.optimizer as optim model = MyModel()gm = GradManager().attach(model.parameters())optimizer = optim.SGD(model.parameters(), lr=0.01)  # lr may vary with different model for data, label in dataset:    with gm:        pred = model(data)        loss = loss_fn(pred, label)        gm.backward(loss)        optimizer.step().clear_grad()
复制代码


  • 我们需要构造一个优化器,并且传入需要被优化的参数 Parameter;

  • 在反向传播,计算出梯度后执行 step 方法,参数将基于梯度信息进行一次优化;

  • 通过执行 clear_grad 方法,清空参数的梯度。


为何需要手动清空梯度?


梯度管理器执行 backward 方法时, 会将当前计算所得到的梯度以累加的形式积累到原有梯度上,而不是直接做替换。 因此对于新一轮的梯度计算,通常需要将上一轮计算得到的梯度信息清空。 何时进行梯度清空是由人为控制的,这样可允许灵活进行梯度的累积。


Optimizer 构造函数中还可接受一个含有优化器默认参数的字典(如含有学习率、动量、权重衰减系数等等), 这些信息可以通过 state_dictload_state_dict 获取和加载。更多详细内容见:Optimizer 状态字典

附:

「MegEngine 使用小技巧」系列文章,重点输出 MegEngine 及周边工具的使用技巧,如有催更或投稿,欢迎联系我们哦~


技术交流 QQ 群:1029741705;Bot 微信:megengine-bot


更多 MegEngine 信息获取,您可以:查看文档GitHub 项目,或加入 MegEngine 用户交流 QQ 群:1029741705。欢迎参与 MegEngine 社区贡献,成为 Awesome MegEngineer,荣誉证书、定制礼品享不停。

用户头像

MegEngineBot

关注

工业级研发的开源深度学习框架-MegEngine​ 2022-10-21 加入

官网:https://www.megengine.org.cn/ MegEngine 技术交流 QQ 群:1029741705 框架使用相关交流或反馈,欢迎访问论坛:https://discuss.megengine.org.cn/ GitHub :http://github.com/MegEngine/MegEngine

评论

发布
暂无评论
MegEngine 使用小技巧:使用 Optimizer 优化参数_神经网络_MegEngineBot_InfoQ写作社区