在对抗性训练中,应该重复使用辍学面具吗?

2024-06-16 09:33:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用自定义损失函数从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)调用期间,将第二次调用模型。这意味着,它将使用不同的dropout掩码,而不是使用model.inputs的原始前馈过程。然而,inputs_adv是用tf.gradients(cross_ent, model.input)创建的,也就是说,使用来自原始前馈过程的丢失掩码。这可能会有问题,因为允许模型使用新的退出掩码可能会减弱对抗性批次的效果。在

由于在Keras中实现dropout mask的重用会很麻烦,所以我对重用这些掩码的实际效果感兴趣。在合法的和对抗性的例子中测试的准确度有什么不同吗?在


Tags: thelabelsmodeltf对抗性entropyinputscompute
1条回答
网友
1楼 · 发布于 2024-06-16 09:33:37

我在MNIST上用一个简单的CNN在MNIST上做了一个简单的实验,在对抗性训练步骤的前向传球中,我试着重复使用掉球面具。我选择了与此cleverhans tutorial中使用的相同的网络体系结构,在softmax层之前有一个附加的释放层。在

这是结果(红色=重用dropout masks,blue=天真实现)enter image description here

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

总之,如果您只使用对抗性训练作为正则化器来提高测试的准确性,那么重复使用辍学掩码可能不值得。对于对抗性攻击的鲁棒性,它可能会产生很小的影响。但是,您需要对其他数据集、体系结构、随机种子等进行进一步的实验,以做出更自信的声明。在

为了保持上图的可读性,我省略了没有经过对抗性训练的模型的对抗性测试示例的准确性。数值在10%左右。在

你可以在this gist中找到这个实验的代码。使用TensorFlow的eager模式,实现dropout掩码的存储和重用相当简单。在

相关问题 更多 >