您知道如何将自定义正则化函数应用于CNTK吗?
特别是,我想将输入中的functino wrt的衍生物添加到损失中;
之类的东西newLoss = loss + lambda * gradient_F(inputs)
其中F是模型学习的函数,输入是模型的输入。
如何在CNTK实现这一目标?我不知道如何访问输入的渐变,以及如何将渐变wrt取到正则化器的权重。
答案 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