mmcv(mmdetection)源码理解:optimizer(SGD,momentum,Nesterov)

本文介绍了深度学习中优化器的重要性和配置方法,包括如何给不同层设置不同的学习率及冻结特定层。通过mmcv库的具体实例,展示了SGD、Momentum、Nesterov等常见优化算法的工作原理和实现细节。

在这里插入图片描述

深度学习中opitmizer是一个十分重要的组成部分,在一些任务中,我们需要给不同 layer 设置不同的学习率以及冻结特定层。为了更好的掌握和使用mmcv,这里留下一些笔记。我会不定期更新mmcv,mmdetection内容,有兴趣的同学可以留言。
首先介绍一些经常出现的梯度优化方法。

SGD
随机梯度下降,随机选取一批样本计算梯度,并更新一次参数。梯度更新公式如下:
在这里插入图片描述
SGD存在一些问题:在梯度平缓的维度下降非常慢,在梯度险峻的维度容易抖动,且容易陷入局部极小值或鞍点。

Momentum
Momentum在每次下降时都加上之前运动方向上的动量,在梯度缓慢的维度下降更快,在梯度险峻的维度减少抖动。
对于在梯度点处具有相同的方向的维度,其动量项增大,对于在梯度点处改变方向的维度,其动量项减小。因此,我们可以得到更快的收敛速度,同时可以减少摇摆。
在这里插入图片描述
Nesterov
Nesterov是Momentum的变种。与Momentum唯一区别就是,计算梯度的不同。Nesterov动量中,先用当前的速度 临时更新一遍参数,在用更新的临时参数计算梯度。因此,Nesterov动量可以解释为在Momentum动量方法中添加了一个校正因子。
在这里插入图片描述

看一下pytorch的源码

Optimizer 是所有优化器的父类,它主要有如下公共方法:

  • add_param_group(param_group): 添加模型可学习参数组
  • step(closure): 进行一次参数更新
  • zero_grad(): 清空上次迭代记录的梯度信息state_dict(): 返回 dict 结构的参数状态
  • load_state_dict(state_dict): 加载 dict 结构的参数状态
def _single_tensor_sgd(params: List[Tensor],
                       d_p_list: List[Tensor],
                       momentum_buffer_list: List[Optional[Tensor]],
                       *,
                       weight_decay: float,
                       momentum: float,
                       lr: float,
                       dampening: float,
                       nesterov: bool,
                       maximize: bool,
                       has_sparse_grad: bool):

    for i, param in enumerate(params):
		##d_p是参数的梯度
        d_p = d_p_list[i]
        if weight_decay != 0:
        ##weight_decay其实是用来正则化的,提高模型泛化能力
            d_p = d_p.add(param, alpha=weight_decay)
					##参数正则化
        if momentum != 0:
        ##buf=buf*momentum + d_p(1-dampening),buf用来寄存动量
            buf = momentum_buffer_list[i]

            if buf is None:
                buf = torch.clone(d_p).detach()
                momentum_buffer_list[i] = buf
            else:
                buf.mul_(momentum).add_(d_p, alpha=1 - dampening)

            if nesterov:
            ##d_p=d_p + momentun*buf,在梯度上加上动量
                d_p = d_p.add(buf, alpha=momentum)
            else:
                d_p = buf

        alpha = lr if maximize else -lr
        param.add_(d_p, alpha=alpha)

mmcv构建optimizer源码

在mmcv中,optimizer构造较为复杂,为了给不同 layer 设置不同的学习率以及冻结特定层,我们需要知道如何注册优化器,并利用DefaultOptimizerConstructor针对不同情况构造优化器

注册pytorch中的优化器

# mmcv/runner/optimier/builder.py
import inspect
import torch
from mmcv import Registry, build_from_cfg

OPTIMIZERS = Registry('optimizer') # 定义一个注册器类,用来注册pytorch中的优化器

def register_torch_optimizers():
    for module_name in dir(torch.optim)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值