Spaces:
Running
Running
import torch | |
def add_gradient_noise( | |
model: torch.nn.Module, | |
iteration: int, | |
duration: float = 100, | |
eta: float = 1.0, | |
scale_factor: float = 0.55, | |
): | |
"""Adds noise from a standard normal distribution to the gradients. | |
The standard deviation (`sigma`) is controlled | |
by the three hyper-parameters below. | |
`sigma` goes to zero (no noise) with more iterations. | |
Args: | |
model: Model. | |
iteration: Number of iterations. | |
duration: {100, 1000}: Number of durations to control | |
the interval of the `sigma` change. | |
eta: {0.01, 0.3, 1.0}: The magnitude of `sigma`. | |
scale_factor: {0.55}: The scale of `sigma`. | |
""" | |
interval = (iteration // duration) + 1 | |
sigma = eta / interval**scale_factor | |
for param in model.parameters(): | |
if param.grad is not None: | |
_shape = param.grad.size() | |
noise = sigma * torch.randn(_shape).to(param.device) | |
param.grad += noise | |