【问题标题】:updating subset of parameters in dynet更新 dynet 中的参数子集
【发布时间】:2018-11-15 03:02:27
【问题描述】:

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

【问题讨论】:

    标签: neural-network nlp dynet


    【解决方案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())。 In the doc,我们应该使用get_index 函数。
    • 另一个选项是:dy.nobackprop(),它可以防止梯度传播到图中的某个节点之外。
    • 还有一个选项是将不需要更新的参数的梯度归零 (.scale_gradient(0))。

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

    【讨论】:

    • 嗯...发生了一些奇怪的事情:如果您更改步骤的顺序,首先是 step(False),然后是 step(True),它会出错...
    • 似乎在第一次调用dy.renew_cg()之前使用.expr(update=False)会返回None。我在循环开始时将调用移至dy.renew_cg() 以解决此问题。我不确定这是否是一个错误......我认为第一个 CG 是自动初始化的。
    • 我意识到确实如此,所以删除了评论 :) - 在 initial_state 中,您可以设置 update=True/False。见dynet.readthedocs.io/en/latest/…
    猜你喜欢
    • 2018-10-31
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多