0

我已经在TensorFlow的神经结构化nsl学习(. 但是,这个问题与那些特定的结果无关,所以我不试图在这里复制它们。cleverhansnsl.AdversarialRegularizationcleverhans.attacks.FastGradientMethod

我对对抗性扰动的实现差异nsl.AdversarialRegularization.perturb_on_batch()cleverhans相同/相似功能的实现(这将是FastGradientMethod.generate().

nsl文档不是特别清楚,但它们似乎暗示nsl正在使用Goodfellow 等人的快速梯度符号方法。2014 年,这应该是在FastGradientMethod. 例如,nsl指 Goodfellow 等人。对抗性训练教程和一些函数文档中的论文。两个库都允许指定类似参数,例如epsilon控制扰动水平和控制用于约束它的规范。然而,对抗训练的性能差异让我相信这些库没有使用相同的底层实现。nsl很难解析,所以我特别好奇那里可能会发生什么。

在实现方面有什么不同,nsl.AdversarialRegularization.perturb_on_batch()哪些cleverhans.attacks.FastGradientMethod.generate()可能会导致相同输入的不同扰动?这些函数中是否还有其他差异可能导致它们的性能差异(我对速度或效率不感兴趣,但对于相同的模型、epsilon 和 norm 两种扰动的结果可能不同的方式)。

4

1 回答 1

0

是的,两者都nsl.AdversarialRegularization.perturb_on_batch()实现了Goodfellow 等人cleverhans.attacks.FastGradientMethod.generate()的快速梯度符号方法。2014 年。两者都提供像 epsilon 和 norm type 这样的参数来控制扰动。由于两者都nsl实现cleverhans了 FGSM,因此在仔细指定配置时,生成的扰动没有区别。然而,一些实现细节可能会以不同的方式处理,尤其是在它们的默认配置中。例如,

  • cleverhans默认情况下,将模型预测作为产生对抗性扰动的标签,而nsl采用真实标签。
  • cleverhans通常期望模型输出 logits(因为默认loss_fnsoftmax_cross_entropy_with_logits),而nsl's 模型可能会输出不同的东西。在nsl的对抗训练教程中,模型输出概率分布。

其他地方可能会有更多差异。如果你能提供一个具体的例子,我可以仔细看看。

关于对抗性训练,nsl.keras.AdversarialRegularization将对抗性损失作为正则化,这意味着模型在原始示例和对抗性示例上都进行了训练。cleverhans.loss.CrossEntropy还计算原始样本和对抗样本的损失,但加权方案有点不同。在nsl原始样本和对抗样本中,它们的权重为1:multiplier,而在cleverhans它们中,它们的权重为(1-adv_coeff):adv_coeff。请注意,在一些文献中部署了另一种训练方法,其中模型仅在对抗性示例上进行训练。

于 2020-04-13T17:26:07.610 回答