[论文理解] Adversarial Examples Improve Image Recognition

Adversarial Examples Improve Image Recognition

这篇文章提出了auxiliary BN来对生成对OOD样本做BN,干净对样本用原始的BN,相当于是两个BN处理。

  1. 为什么非要给对抗样本单独一个BN?这样做有什么好处?解决什么问题?
  2. 实际提升有多少?
  3. 具体是怎么实现的?
  4. 对半监督是否有帮助呀?
  5. 既然BN会hurt不同domain同时训练的结果,用非BN的layer实验效果如何?
  1. 实验表明,使用对抗训练往往精度会下降,这种精度下降的原因,可能是生成的对抗样本和原干净样本属于不同domain,也即分布差异过大,而简单使用同一套BN很难transfer,那如何证明这一套猜想呢?作者先训练adv样本,然后再在干净数据上finetune,最终得到的模型精度要更高,通过finetune的方法(一般迁移学习用finetune的方式实现源域到目标域的迁移,即源域是adv样本域,迁移到干净样本域实现泛化。)证明其猜想。但这样但方式并不能实现端到端的训练,一个简单的问题是,最初的adv样本怎么来的?肯定得先训练好一个神经网络,然后得到adv样本,然后再以adv样本作为样本训练,然后finetune到干净样本。这样相当于是在交替训练,如果adv样本和干净样本分布差异非常大,bn是很难学习到两者都能遵守到分布到。因此,一种解决方案是,对干净样本用一种BN,对adv样本单独用另一种BN,在训练干净样本时更新普通BN,训练adv样本时更新adv BN,这样adv样本的分布不会影响普通BN,但其他卷基层等由于adv BN把adv样本scale到和使用普通BN的相同效果的分布下去,继而使得其他层得以训练,所以提升的是其他层的能力。

普通adv训练掉点,aux bn涨点。

class AuxBN(nn.Module):
    def __init__(self, channels):
        super().__init__()
        self.bn1 = nn.BatchNorm2d(channels)
        self.bn2 = nn.BatchNorm2d(channels)
    def forward(self,x, aux = False):
        if aux:
            rerurn self.bn2(x)
        else:
            return self.bn1(x)
  1. 做了实验,提升很小。、。

  2. 去做了一下实验,没有BN而是用LN等这类任务基本训练不了。。尝试一下transformer??尝试一下无Normalization的工作?

posted @ 2021-10-02 19:31  aoru45  阅读(226)  评论(0编辑  收藏  举报