1

你知道如何将自定义正则化函数应用于 CNTK 吗?

特别是,我想将函数对输入的导数添加到损失中;就像是

newLoss = loss + lambda * gradient_F(inputs)

其中 F 是模型学习的函数,输入是模型的输入。

如何在 CNTK 中实现这一点?我不知道如何访问输入的梯度,以及如何将梯度 wrt 用于正则化器的权重。

4

3 回答 3

2

首先,梯度不是一个标量,所以优化它没有多大意义。梯度范数可能会增加你的损失。为此,CNTK 必须采用梯度范数的梯度,在撰写本文时(2017 年 7 月)尚不支持该梯度。然而,这是我们希望在接下来的几个月中添加的一项重要功能。

更新:一种解决方法是做这样的事情, noisy_inputs = x + C.random.normal_like(x, scale=0.01) noisy_model = model.clone('share', {x: noisy_inputs}) auxiliary_loss = C.squared_error(model, noisy_model) 但你必须为你的问题调整噪音的规模。

于 2017-07-18T18:01:36.017 回答
0

这是执行此操作的代码:

    def cross_entropy_with_softmax_plus_regularization(model, labels, l2_regularization_weight):
        w_norm = C.Constant(0);
        for p in (model.parameters):
            w_norm = C.plus(w_norm, 0.5*C.reduce_sum(C.square(p)))

        return C.reduce_log_sum_exp(model.output) - 

C.reduce_log_sum_exp(C.times_transpose(labels, model.output)) + l2_regularization_weight*w_norm

和我的 http://www.telesens.co/2017/09/29/spiral_cntk/ 博客文章

于 2017-09-29T20:36:00.307 回答
0

CNTK 学习者只接受数字作为正则化器 (L1/L2) 值。如果您真的想添加自定义正则化器,您可以轻松实现自己的 Learner。您将可以访问所需的渐变。您将在此处找到有关如何实现您自己的 Learner 的几个示例。

于 2017-07-12T03:10:55.357 回答