gpt4 book ai didi

python - 在对抗训练期间是否应该重复使用 Dropout 面具?

转载 作者:行者123 更新时间:2023-12-01 08:43:34 24 4
gpt4 key购买 nike

我正在使用 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) 创建的,即使用原始前馈传递中的 dropout mask。这可能会出现问题,因为允许模型使用新的 dropout mask 可能会削弱对抗批处理的效果。

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

最佳答案

我尝试在 MNIST 上使用简单的 CNN 进行对抗性训练步骤的前馈传递过程中重用 dropout mask。我选择了与此cleverhans tutorial中使用的相同的网络架构。在 softmax 层之前有一个额外的 dropout 层。

这是结果(红色=重用dropout mask,蓝色=简单实现): enter image description here

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

总之,如果您仅使用对抗性训练作为正则化器来提高测试准确性本身,那么重复使用 dropout mask 可能不值得。对于对抗性攻击的鲁棒性来说,它可能会产生很小的影响。但是,您需要对其他数据集、架构、随机种子等进行进一步的实验,才能做出更有信心的声明。

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

您可以在 this gist 中找到此实验的代码。通过 TensorFlow 的 eager 模式,实现 dropout mask 的存储和重用非常简单。

关于python - 在对抗训练期间是否应该重复使用 Dropout 面具?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53395329/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com