zoukankan      html  css  js  c++  java
  • [论文理解] 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的工作?

  • 相关阅读:
    vue 仿IOS 滚轮选择器
    一道题目学ES6 API,合并对象id相同的两个数组对象
    Express中间件原理详解
    webpack原理与实战
    LS522 体积小低电压低成本的13.56MHz非接触式读写卡芯片,集成了在13.56MHz下所有类型的被动非接触式通信方式和协议,支持ISO14443A/B的多层应用( PIN对PIN MFRC522 )
    SP213EEA-L/TR +5V高性能RS232收发器
    多速率SDI集成接收器 SDI解码芯片 GS2971A-IBE3
    低电容3.3V TVS管 R CLAMP3304N.TCT
    高ESD耐压/TVS二极管 UCLAMP2804L.TCT
    高性能正电压稳压管SC4215HSETRT
  • 原文地址:https://www.cnblogs.com/aoru45/p/15362489.html
Copyright © 2011-2022 走看看