Обновление подмножества параметров в dynet
Есть ли способ обновить подмножество параметров в dynet? Например, в следующем примере игрушки первое обновление h1
, затем h2
:
model = ParameterCollection()
h1 = model.add_parameters((hidden_units, dims))
h2 = model.add_parameters((hidden_units, dims))
...
for x in trainset:
...
loss.scalar_value()
loss.backward()
trainer.update(h1)
renew_cg()
for x in trainset:
...
loss.scalar_value()
loss.backward()
trainer.update(h2)
renew_cg()
я знаю это update_subset
интерфейс для этого существует и работает на основе заданных параметров индексов. Но тогда нигде не задокументировано, как мы можем получить индексы параметров в dynet Python.
1 ответ
Решение
Решение состоит в том, чтобы использовать флаг update = False
при создании выражений для параметров (включая параметры поиска):
import dynet as dy
import numpy as np
model = dy.Model()
pW = model.add_parameters((2, 4))
pb = model.add_parameters(2)
trainer = dy.SimpleSGDTrainer(model)
def step(update_b):
dy.renew_cg()
x = dy.inputTensor(np.ones(4))
W = pW.expr()
# update b?
b = pb.expr(update = update_b)
loss = dy.pickneglogsoftmax(W * x + b, 0)
loss.backward()
trainer.update()
# dy.renew_cg()
print(pb.as_array())
print(pW.as_array())
step(True)
print(pb.as_array()) # b updated
print(pW.as_array())
step(False)
print(pb.as_array()) # b not updated
print(pW.as_array())
- За
update_subset
Я бы предположил, что индексы представляют собой целые числа с суффиксами в конце имен параметров (.name()
). В документе мы должны использоватьget_index
функция. - Другой вариант:
dy.nobackprop()
что предотвращает распространение градиента за пределы определенного узла на графике. - И еще один вариант - обнулить градиент параметра, который не нужно обновлять (
.scale_gradient(0)
).
Эти методы эквивалентны обнулению градиента перед обновлением. Таким образом, параметр все равно будет обновляться, если оптимизатор использует свой импульс от предыдущих шагов обучения (MomentumSGDTrainer
, AdamTrainer
...)