在对抗训练中,批次归一化应该如何表现?

时间:2018-11-18 11:18:38

标签: neural-network conv-neural-network batch-normalization

我正在使用自定义损失函数,以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)调用期间的行为。这涉及两个子问题:

1。应该使用哪些统计数据进行归一化?

在这里,我看到三个选项:

  1. 使用一批对抗性示例的均值和方差。这样,激活就可以归一化为标准正态分布,就像在训练期间一样。
  2. 使用合法示例批次的均值和方差。在推论过程中,我们将无法访问一批对抗性例子的统计数据。因此,即使必须使用合法事例的统计数据,我们也应使该模型对对抗性事例具有鲁棒性。
  3. 使用人口统计数据,因为这些统计数据将在推断过程中使用。

2。应该更新人口统计信息吗?

两个选项,我认为都可以证明其合理性:

  1. 是-如果我们希望在推理期间进行对抗性攻击。然后,对抗示例应与合法示例一样被视为我们数据集的一部分。因此,应该将它们包括在总体统计中,以便在推断过程中适当地标准化对抗示例。
  2. 否-如果我们仅使用对抗训练进行正则化。然后,我们在推理过程中将不会看到一个对抗性示例,因此不应将其包括在总体统计中。

0 个答案:

没有答案