Получение градиентов модели, обученной в OpenNMT-py - PullRequest
0 голосов
/ 04 июня 2019

При обучении модели с использованием OpenNMT-py в качестве вывода мы получаем dict, содержащий веса и смещения сети.Тем не менее, эти тензоры имеют require_grad = False и, следовательно, не имеют градиента.Например.с одним слоем мы могли бы иметь следующие тензоры, обозначающие вложения, а также веса и смещения в кодере и декодере.Ни один из них не имеет атрибута градиента.

encoder.embeddings.emb_luts.0.weight

decoder.embeddings.emb_luts.0.weight

encoder.rnn.weight_ih_l0

encoder.rnn.weight_hh_l0

encoder.rnn.bias_ih_l0

encoder.rnn.bias_hh_l0

decoder.rnn.layers.0.weight_ih

decoder.rnn.layers.0.weight_hh

decoder.rnn.layers.0.bias_ih

decoder.rnn.layers.0.bias_hh

Можно ли сделать OpenNMT-py для установки require_gradient =Правда с какой-то опцией я не нашел или есть какой-то другой способ получить градиент этих тензоров?

1 Ответ

0 голосов
/ 05 июня 2019

Градиенты доступны только внутри цикла обучения, где вызывается optim.step(). Если вы хотите записать градиенты (или норму градиентов или что-то еще) в TensorBoard, вам, вероятно, лучше всего получить их до вызова шага оптимизатора. Это происходит в методе _gradient_accumulation объекта Trainer.

Помните, что есть два места, где optim.step() называется. Какой из них используется, зависит от того, выполняете ли вы обновление после каждого пакета или накапливаете ли вы градиент из нескольких пакетов и выполняете ли обновление позже.

...