最近在阅读复旦的moss的源码时,发现了一个没见过的操作,他们在学习率衰减时,认为的跳过了一些参数。

    no_decay = ["bias", "LayerNorm.weight"]
    optimizer_grouped_parameters = [
        {
            "params": [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)],
            "weight_decay": args.weight_decay,
        },
        {
            "params": [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)],
            "weight_decay": 0.0,
        },
    ]

查了下原因,主要原因是因为:

1.在神经网络的前向传播中,bias的作用比权重小得多,对于大多数情况下,不对bias进行学习率衰减并不会对模型的效果产生太大的影响

2.在Transformer模型中,LayerNorm通常被用作层间归一化,用于在每一层之间稳定模型的梯度。由于其特殊的特性,LayerNorm的学习率衰减会影响梯度的方差,进而导致梯度消失或爆炸现象。因此,通常不对LayerNorm的weight进行学习率衰减,以确保梯度的稳定和模型的收敛性。


因此,bias 和 LayerNorm.weight 的目的是调整网络的平移和缩放,而不是参与到损失函数的计算中。如果对它们设置权重衰减,就可能影响到网络的平移和缩放,从而影响模型的性能。


0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注