我正在使用自定义损失函数,以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.有什么区别吗合法和对抗性示例的测试准确性如何?
答案 0 :(得分:1)
在对抗训练步骤的前馈传递过程中,我尝试使用MNIST上的简单CNN重用掉落式蒙版。我选择了与本cleverhans tutorial中使用的网络架构相同的网络架构,并在softmax层之前增加了一个辍学层。
实线表示合法测试示例的准确性。虚线表示测试集上生成的对抗示例的准确性。
结论,如果您仅使用对抗训练作为正则化工具以提高测试准确性本身,那么重复使用辍学掩码可能就不值得。但是,对于抵御攻击的鲁棒性,似乎有所不同。
为了使上面的图可读,我省略了未经对抗训练的模型在对抗测试示例中的准确性。该值约为10%。
您可以在this gist中找到此实验的代码。借助TensorFlow的热切模式,实现存储和重用辍学掩码非常简单。