#python #tensorflow #pytorch #gradient-descent
#python #тензорный поток #pytorch #градиентный спуск
Вопрос:
Я пытаюсь реализовать эту градиентную обрезную бумагу в tensorflow, что влечет за собой сохранение истории норм градиента.
Я предполагаю, что мне нужно сделать это с помощью tf.custom_gradient
декоратора, но как мне поддерживать текущий список истории норм градиента? Могу ли я использовать замыкание, как в версии pytorch?
Для справки, вот реализация в pytorch.
import numpy as np
import torch
from enum import Enum
def _get_grad_norm(model):
total_norm = 0
for p in model.parameters():
if p.grad is not None:
param_norm = p.grad.data.norm(2)
total_norm = param_norm.item() ** 2
total_norm = total_norm ** (1. / 2)
return total_norm
# written for pytorch ignite
# fire this on backwards pass
class BackwardsEvents(Enum):
BACKWARDS_COMPLETED = 'backwards_completed'
def add_autoclip_gradient_handler(engine, model, clip_percentile):
# Keep track of the history of gradients and select a cutoff
# to clip values to based on percentile.
grad_history = []
@engine.on(BackwardsEvents.BACKWARDS_COMPLETED)
def autoclip_gradient(engine):
obs_grad_norm = _get_grad_norm(model)
grad_history.append(obs_grad_norm)
clip_value = np.percentile(grad_history, clip_percentile)
torch.nn.utils.clip_grad_norm_(model.parameters(), clip_value)
Комментарии:
1. Я бы сказал, что гораздо более «разумно» обрабатывать это либо внутри объекта optimizer (который в любом случае отслеживает состояние), либо, если вы не хотите связываться с пользовательскими оптимизаторами, внутри вашего «глобального» пространства кода (при условии, что вы используете пользовательские циклы обучения и имеете доступ к градиентам через
GradientTape
). Отказ от ответственности: я не знаю документ, поэтому вполне может быть, что пользовательский градиент каким-то образом необходим для правильной реализации, но я бы избегал его, если это вообще возможно.