mmdetection - config配置文件之schedule(learning rate)

config文件命名意义:
{model}[model setting]{backbone}{neck}[norm setting][misc][gpu x batch_per_gpu]{schedule}{dataset}
{model}:表示具体模型,如faster_rcnn、mask_rcnn等;
[model setting]:某些模型的具体设置,如htc的without_semantic、reppoints的moment等;
{backbone}:骨干网络,如r50、x101等;
{neck}:网络颈,如fpn、pafpn、nasfpn、c4等;
[norm setting]:正则化设置,如bn、gn、syncbn、gn-head/gn-neck、gn-all等;
[misc]:其他设置,如dconv、gcb、attention、albu、mstrain等;
[gpu x batch_per_gou]:使用的总 G P U {\rm GPU} GPU数以及每块 G P U {\rm GPU} GPU的采样数;
{schedule}:设置学习策略,如1x、2x、20e等;
{dataset}:指示具体的数据集,如coco、cityscapes、voc_0712、wider_face等。

# optimizer 优化参数,lr为学习率,momentum为动量因子,weight_decay为权重衰减因子
optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001)
optimizer_config = dict(grad_clip=None) #梯度均衡参数
# learning policy
lr_config = dict(
    policy='step',  # 优化策略
    warmup='linear', # 初始的学习率增加的策略,linear为线性增加
    warmup_iters=500,  # 在初始的500次迭代中学习率逐渐增加
    warmup_ratio=0.001,# 起始的学习率
    step=[8, 11])  # 在第8和11个epoch时降低学习率
runner = dict(type='EpochBasedRunner', max_epochs=12)

1、momentum
不恰当的初始权值可能使得网络的损失函数在训练过程中陷入局部最小值,达不到全局最优的状态。momentum为动量因子,当 momentum 动量越大时,其转换为势能的能量也就越大,就越有可能摆脱局部凹域的束缚,进入全局凹域。
v为动量,初始化为0,momentum为动量因子,最常见的设定值是0.9
v = momentum * v - learning_rate * dw
w = w + v
如果上次的momentum(v)与这次的负梯度方向是相同的,那这次下降的幅度就会加大,从而加速收敛。momentum算法将一段时间内的梯度向量进行了加权平均,分别计算得到梯度更新过程中 w 和 b 的大致走向,一定程度上消除了更新过程中的不确定性因素(如摆动现象),使得梯度更新朝着一个越来越明确的方向前进。
2、weight_decay
weight_decay为权重衰减系数。在损失函数中,weight decay是放在正则项(regularization)前面的一个系数,正则项一般指示模型的复杂度,所以weight decay的作用是调节模型复杂度对损失函数的影响,若weight decay很大,则复杂的模型失函数的值也就大。
3、lr学习率
理论上来说,通常学习率过小->收敛过慢,学习率过大->错过局部最优
实际上来说,可能:学习率过小->不收敛,学习率过大->不收敛
base_lr(基础学习率)、regular_lr(基础学习率衰减list)、warmup_lr(热身阶段学习率)
base_lr=0.02
regular_lr=base_lr*系数
regular_lr=[0.02,0.02 * 0.1,0.02 * 0.01]
warmup:
迭代次数增大,k趋向0,warmup_lr 从_lr * self.warmup_ratio趋向_lr
k = (1 - cur_iters / self.warmup_iters) * (1 - self.warmup_ratio)
warmup_lr = [_lr * (1 - k) for _lr in self.regular_lr]
也就是warmup_lr = lr * (self.warmup_ratio+(1 - self.warmup_ratio) * cur_iters / self.warmup_iters)
k=(1-cur_iters/500) * (1-0.001) 越来越小
warmup_lr = [_lr * (1 - k) for _lr in self.regular_lr]越来越大
学习率变化:上升——平稳——下降
实际学习率=[0.02 *0.001->0.02, 0.02 * 0.1, 0.02 * 0.01]

warmup使用场景:
1、当网络非常容易nan时候,采用warm up进行训练,可使得网络正常训练;
2、如果训练集损失很低,准确率高,但测试集损失大,准确率低,可用warm up;

你可能感兴趣的:(mmdtection,python,深度学习)