更新 dynet 中的参数子集
updating subset of parameters in 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
interface 为此而存在,并根据给定的参数索引工作。但是在任何地方都没有记录我们如何在 dynet Python 中获取参数索引。
一个解决方案是在为参数(包括查找参数)创建表达式时使用标志 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()
)。
In the doc,我们应该使用 get_index
函数。
- 另一个选项是:
dy.nobackprop()
防止梯度传播到图中的某个节点之外。
- 另一种选择是将不需要更新的参数的梯度归零(
.scale_gradient(0)
)。
这些方法相当于在更新之前将梯度归零。因此,如果优化器使用之前训练步骤的动量(MomentumSGDTrainer
、AdamTrainer
、...),参数仍会更新。
有没有办法更新 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
interface 为此而存在,并根据给定的参数索引工作。但是在任何地方都没有记录我们如何在 dynet Python 中获取参数索引。
一个解决方案是在为参数(包括查找参数)创建表达式时使用标志 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()
)。 In the doc,我们应该使用get_index
函数。 - 另一个选项是:
dy.nobackprop()
防止梯度传播到图中的某个节点之外。 - 另一种选择是将不需要更新的参数的梯度归零(
.scale_gradient(0)
)。
这些方法相当于在更新之前将梯度归零。因此,如果优化器使用之前训练步骤的动量(MomentumSGDTrainer
、AdamTrainer
、...),参数仍会更新。