对抗训练期间是否应重新使用防摔面具?

时间:2018-11-20 14:34:56

标签: python tensorflow keras neural-network conv-neural-network

我正在使用自定义损失函数,以Explaining and Harnessing Adversarial Examples中的FGSM方法实施对抗训练:

使用自定义损失函数在tf.keras中实现,它在概念上看起来像这样:

model = Sequential([
    ...
])

def loss(labels, logits):
    # Compute the cross-entropy on the legitimate examples
    cross_ent = tf.losses.softmax_cross_entropy(labels, logits)

    # Compute the adversarial examples
    gradients, = tf.gradients(cross_ent, model.input)
    inputs_adv = tf.stop_gradient(model.input + 0.3 * tf.sign(gradients))

    # Compute the cross-entropy on the adversarial examples
    logits_adv = model(inputs_adv)
    cross_ent_adv = tf.losses.softmax_cross_entropy(labels, logits_adv)

    return 0.5 * cross_ent + 0.5 * cross_ent_adv

model.compile(optimizer='adam', loss=loss)
model.fit(x_train, y_train, ...)

这对于简单的卷积神经网络非常有效。

logits_adv = model(inputs_adv)调用期间,第二次调用该模型。这意味着与使用model.inputs的原始前馈过程相比,它将使用不同的丢失掩码。但是,inputs_adv是使用tf.gradients(cross_ent, model.input)创建的,即使用原始前馈过程的滤除掩码。这可能是有问题的,因为允许模型使用新的防丢面具可能会削弱对抗批次的效果。

由于在Keras中实现重用掉落掩码很麻烦,因此我对重用掉掩码的实际效果很感兴趣。 w.r.t.有什么区别吗合法和对抗性示例的测试准确性如​​何?

1 个答案:

答案 0 :(得分:1)

在对抗训练步骤的前馈传递过程中,我尝试使用MNIST上的简单CNN重用掉落式蒙版。我选择了与本cleverhans tutorial中使用的网络架构相同的网络架构,并在softmax层之前增加了一个辍学层。

这是结果(红色=重用掉线掩码,蓝色=天真的实现)enter image description here

实线表示合法测试示例的准确性。虚线表示测试集上生成的对抗示例的准确性。

结论,如果您仅使用对抗训练作为正则化工具以提高测试准确性本身,那么重复使用辍学掩码可能就不值得。但是,对于抵御攻击的鲁棒性,似乎有所不同。

为了使上面的图可读,我省略了未经对抗训练的模型在对抗测试示例中的准确性。该值约为10%。

您可以在this gist中找到此实验的代码。借助TensorFlow的热切模式,实现存储和重用辍学掩码非常简单。