Как сделать градиентное отсечение в pytorch? - PullRequest
0 голосов
/ 15 февраля 2019

Как правильно выполнить ограничение градиента в pytorch?

У меня есть проблема с градиентами, и мне нужно запрограммировать способ ее решения.

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

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))
0 голосов
/ 10 мая 2019

Более полный пример

optimizer.zero_grad()        
loss, hidden = model(data, hidden, targets)
loss.backward()

torch.nn.utils.clip_grad_norm_(model.parameters(), args.clip)
optimizer.step()

Источник: https://github.com/pytorch/pytorch/issues/309

0 голосов
/ 15 февраля 2019

Прочитав обсуждение на форуме дало следующее:

clipping_value = 1#arbitrary number of your choosing
torch.nn.utils.clip_grad_norm(model.parameters(), clipping_value)

Я уверен, что в этом есть большая глубина, чем только этот фрагмент кода.

...