权重衰减/权重衰退——weight

目录

  • 权重衰减/权重衰退——weight_decay
    • 一、什么是权重衰减/权重衰退——weight_decay?
    • 二、weight decay 的作用
    • 三、设置weight decay的值为多少?

      权重衰减/权重衰退——weight_decay

      import torch.optim as optim
      from torch.optim.lr_scheduler import CosineAnnealingLR
       opt = optim.Adam(parameters, lr=args.lr, weight_decay=1e-4)
       
       # CosineAnnealingLR 余弦退火调整学习率
       lr_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(opt, T_max=args.epochs,
                     eta_min=0, last_epoch=-1)
      
      1. weight_decay = 1e-4
      2. weight_decay = 1e-6

      一、什么是权重衰减/权重衰退——weight_decay?

      weight_decay(权重衰退):

      • L2正则化
      • 主要作用是:解决过拟合,在损失函数中加入L2正则化项

        weight _decay本质上是一个 L2正则化系数

        L = E i n + λ ∑ j w j 2 L=E_{i n}+\lambda \sum_j w_j^2 L=Ein​+λj∑​wj2​

        可以理解为:

        • 加上这个 L2正则化,会限制模型的权重都会趋近于0
        • 理解就是当 w 趋近 0 时, w平方和 会小, 模型损失也会变小
        • 而weight_decay的大小就是公式中的λ,可以理解为λ越大,优化器就越限制权重变得趋近 0

          权重衰减( Weight Decay)

          • 一种有效的正则化方法 [Hanson et al.,1989]
          • 在每次参数更新时,引入一个衰减系数

            θ t ← ( 1 − β ) θ t − 1 − α g t \theta_t \leftarrow(1-\beta) \theta_{t-1}-\alpha g_t θt​←(1−β)θt−1​−αgt​

            其中:

          • gt 为第t步更新时的梯度
          • α为学习率
          • β为权重减系数
          • 一般取值比较小,比如0.0005

            在标准的随机梯度下降中,权重衰减正则化和正则化的效果相同

          • 因此,权重衰减在一些深度学习框架中通过 L2 正则化来实现
          • 但是,在较为复杂的优化方法( 比如Adam ) 中,权重衰减正则化和正则化并不等价 [Loshchilov et al, 2017b]

             


            二、weight decay 的作用

            使用 weight decay 可以:

            • 防止过拟合
            • 保持权重在一个较小在的值,避免梯度爆炸。
              • 因为在原本的 loss 函数上加上了权重值的 L2 范数,在每次迭代时,模不仅会去优化/最小化 loss,还会使模型权重最小化。
              • 让权重值保持尽可能小,有利于控制权重值的变化幅度(如果梯度很大,说明模型本身在变化很大,去过拟合样本),从而避免梯度爆炸。

                 


                三、设置weight decay的值为多少?

                weight_decay即权重衰退。

                • 为了防止过拟合,在原本损失函数的基础上,加上L2正则化
                  • 而weight_decay就是这个正则化的lambda参数
                  • 一般设置为1e-8,所以调参的时候调整是否使用权重衰退即可

                    在深度学习模型中,一般将衰减系数设置为 0.0001 到 0.001 之 间的值

                    • 这是一个比较常用的范围
                    • 经验值也表明,这个范围是最佳的

                      论文里是验证了1e-4比较好

                      • 当你不确定模型复杂度和数据集大小的时候,最保守就是从1e-4周围开始尝试

                        在看其他量化训练的一些代码、论文等,不经意间注意到有人建议要关注weight decay值的设置

                        • 建议设置为1e-4, 不要设置为1e-5这么小
                        • 当然,这个值最好还是在当下的训练任务上调一调。

                          因为weight-decay 可以使参数尽可能地小,尽可能地紧凑

                          • 那这样权重的数值就不太可能出现若干个极端数值(偏离权重均值过大或过小)导致数值区间过大
                          • 这样求得的 scale=(b-a)/255 会偏大,导致的结果就是大量数值较为接近的浮点数被量化到同一个数,严重损失了精度