最近在阅读复旦的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 条评论