如何在CNTK中应用自定义正则化(使用python)?

时间:2017-06-25 15:10:03

标签: python machine-learning backpropagation cntk regularized

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

特别是,我想将输入中的functino wrt的衍生物添加到损失中;

之类的东西
newLoss = loss + lambda * gradient_F(inputs)

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

如何在CNTK实现这一目标?我不知道如何访问输入的渐变,以及如何将渐变wrt取到正则化器的权重。

3 个答案:

答案 0 :(得分:1)

首先,渐变不是标量,所以优化它并没有多大意义。渐变规范可能是一个有趣的事情,可以增加你的损失。要做到这一点,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) 但你必须调整你的问题的噪音范围。

答案 1 :(得分:0)

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

答案 2 :(得分: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/博客文章