• [论文理解] 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的工作?

  • 相关阅读:
    oracle 的一点累积
    ZT: 网页的一些技巧
    ZT: WEB学习资料
    开源java
    倒序显示文本
    plsql使用之debug
    转 一些shell经验
    lpad rpad
    2018.8.19 2018暑假集训之maxnum
    2018.8.17 题解 2018暑假集训之编辑距离
  • 原文地址:https://www.cnblogs.com/aoru45/p/15362489.html
Copyright © 2020-2023  润新知