在深度学习的优化过程中,$\theta_t$ 是 t 时刻的模型权重 weight, $\upsilon_t$ 是 t 时刻的影子权重。在梯度下降的过程中,会一直维护着这个影子权重,但是这个影子权重不会参与训练。基本的假设是模型权重在最后 n 步内,会在实际的最优点处抖动,所以我们去最后 n 步的平均,能使模型更加的鲁棒。
defregister(self): for name, param in self.model.named_parameters(): if param.requires_grad: self.shadow[name] = param.data.clone()
defupdate(self): for name, param in self.model.named_parameters(): if param.requires_grad: assert name in self.shadow new_average = (1.0 - self.decay) * param.data + self.decay * self.shadow[name] self.shadow[name] = new_average.clone()
defapply_shadow(self): for name, param in self.model.named_parameters(): if param.requires_grad: assert name in self.shadow self.backup[name] = param.data param.data = self.shadow[name]
defrestore(self): for name, param in self.model.named_parameters(): if param.requires_grad: assert name in self.backup param.data = self.backup[name] self.backup = {}