0

有没有办法更新 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 中获取参数索引。

4

1 回答 1

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末尾的整数。在 doc中,我们应该使用一个函数。.name()get_index
  • 另一种选择是:dy.nobackprop()防止梯度传播到图中的某个节点之外。
  • 还有一个选择是将不需要更新的参数的梯度归零(.scale_gradient(0))。

这些方法相当于在更新之前将梯度归零。MomentumSGDTrainer因此,如果优化器使用之前训练步骤的动量( ... AdamTrainer),参数仍然会更新。

于 2018-06-06T07:50:26.950 回答