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的工作?

  • 相关阅读:
    面试2
    面试总结
    谈谈扫码支付的实现流程
    从产品分类、模块功能和业务流程,了解支付产品服务的设计
    【提现】的业务流程
    APP测试点归纳
    安全测试的思路
    一 大型网站架构演化(大型网站技术架构原理)
    Tomcat服务器原理详解
    Tomcat目录结构详解
  • 原文地址:https://www.cnblogs.com/aoru45/p/15362489.html
Copyright © 2011-2022 走看看