clip_grad_norm
(что фактически считается устаревшим в пользу clip_grad_norm_
после более согласованного синтаксиса конечного _
при выполнении модификации на месте) обрезает норму общего градиента наконкатенация всех параметров, переданных функции, как видно из документации :
Норма вычисляется по всем градиентам вместе, как если бы они были объединены в один вектор.Градиенты модифицируются на месте.
Из вашего примера выглядит, что вместо этого вы хотите clip_grad_value_
, который имеет аналогичный синтаксис и также изменяет градиенты на месте:
clip_grad_value_(model.parameters(), clip_value)
Другой вариант - зарегистрировать обратный хук .Это принимает текущий градиент в качестве входных данных и может возвращать тензор, который будет использоваться вместо предыдущего градиента, то есть изменять его.Этот хук вызывается каждый раз после вычисления градиента, то есть нет необходимости вручную обрезать его после регистрации хука:
for p in model.parameters():
p.register_hook(lambda grad: torch.clamp(grad, -clip_value, clip_value))