如何获得链接器更新规则中的损失值

问题描述 投票:0回答:1

我正在尝试修改链接器的类SGDRule(optimizer.UpdateRule),以制作我的原始优化器。

要实现我想要的,我不仅需要获得渐变,还需要获得损耗。

在通过反向传播生成梯度之前,必须完成产生损耗的前向路径。我需要那笔损失。

问题是我必须从类中的update_core_gpu(self,param)的代码中访问损失。

我了解到分类器对象具有损耗作为属性。但是,我不知道如何从更新规则访问对象。

作为替代方案,我考虑使用可以从代码访问的Reporter对象。我知道如何将价值传递给记者,但不知道如何让记者蒙受损失。

有人知道如何在更新规则的代码中获得当前损失吗?

optimization loss chainer
1个回答
0
投票

[如果您使用的是持有损失的模型,例如一个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.lossopt.target为您的模型),例如在优化步骤之前更新渐变。

© www.soinside.com 2019 - 2024. All rights reserved.