我在TensorFlow神经结构学习 (nsl)和cleverhans库中实现了我认为是相同的模型训练循环,奇怪的是,它们显示了使用与两个库(通过nsl.AdversarialRegularization和cleverhans.attacks.FastGradientMethod)进行的对抗性培训的模型并没有达到类似的性能。然而,这个问题并不是关于那些具体的结果,所以我不试图在这里复制它们。
我更普遍地好奇,nsl.AdversarialRegularization.perturb_on_batch()中的对抗性扰动与相同/类似功能(即FastGradientMethod.generate() )的cleverhans实现之间的实现差异是什么。
nsl文档并不是特别清楚,但它们似乎暗示nsl使用了古德费罗等人2014年的快速梯度符号方法,这应该是在FastGradientMethod中实现的相同方法。例如,nsl指的是古德费罗等人。论文介绍了在对抗性培训教程和一些函数文档中。这两个库都允许指定类似的参数,例如,一个epsilon来控制扰动的水平,并控制用来约束它的范数。然而,在经过对抗性训练的性能方面的差异使我相信这些库并没有使用相同的底层实现。nsl很难解析,所以我特别好奇在那里可能会发生什么。
nsl.AdversarialRegularization.perturb_on_batch() cleverhans.attacks.FastGradientMethod.generate() 和在实现上有什么不同,可以对相同的输入造成不同的扰动?在这些函数中是否存在可能导致它们性能差异的其他差异(我不感兴趣的是速度或效率,而是对于相同的模型、epsilon和范数,这两种扰动的结果可能有所不同)。
发布于 2020-04-13 17:26:07
是的,nsl.AdversarialRegularization.perturb_on_batch()和cleverhans.attacks.FastGradientMethod.generate()都在古德费罗等人2014年中实现了快速梯度符号方法。两者都提供了像epsilon和范数类型这样的参数来控制扰动。由于nsl和cleverhans都实现了FGSM,所以在仔细指定配置时,产生的扰动没有区别。然而,某些实现细节可能会被不同的处理,特别是在它们的默认配置中。例如,
cleverhans将模型预测作为生成对抗性扰动的标签,而nsl则使用真正的标签。cleverhans通常期望模型输出逻辑(因为默认的loss_fn是softmax_cross_entropy_with_logits),而nsl的模型可能输出不同的东西。在nsl的对抗性训练教程中,该模型输出概率分布。其他地方可能会有更多的差异。如果你能提供一个具体的例子,我可以仔细看一看。
在对抗性训练方面,nsl.keras.AdversarialRegularization将对抗性损失作为正则化,这意味着该模型同时对原始和对抗性的例子进行训练。cleverhans.loss.CrossEntropy还计算原始和对抗性例子的损失,但是加权方案有点不同。在nsl中,原始和对抗性示例被加权为1:multiplier,而在cleverhans中,它们被加权为(1-adv_coeff):adv_coeff。请注意,在一些文献中使用了另一种培训方法,其中模型仅针对对抗性示例进行培训。
https://stackoverflow.com/questions/61071168
复制相似问题