我正在尝试修改链接器的类SGDRule(optimizer.UpdateRule),以制作我的原始优化器。
要实现我想要的,我不仅需要获得渐变,还需要获得损耗。
在通过反向传播生成梯度之前,必须完成产生损耗的前向路径。我需要那笔损失。
问题是我必须从类中的update_core_gpu(self,param)的代码中访问损失。
我了解到分类器对象具有损耗作为属性。但是,我不知道如何从更新规则访问对象。
作为替代方案,我考虑使用可以从代码访问的Reporter对象。我知道如何将价值传递给记者,但不知道如何让记者蒙受损失。
有人知道如何在更新规则的代码中获得当前损失吗?
[如果您使用的是持有损失的模型,例如一个Classifier
,一种简单但可能不太优雅的方法是将模型传递给Optimizer
,然后在UpdateRule
中构造时将模型传递给每个Optimizer.create_update_rule
。如果您不想通过模型,则可以传递可以返回模型损失的lambda。
另一种可能更清洁的方法(如果足以满足您的情况,将是实现优化器挂钩),类似于在Chainer中实现梯度剪切的方式。参见https://github.com/chainer/chainer/blob/master/chainer/optimizer_hooks/gradient_clipping.py#L56。您可以通过opt.target.loss
(opt.target
为您的模型),例如在优化步骤之前更新渐变。