1. 程式人生 > 其它 >[論文理解] Adversarial Examples Improve Image Recognition

[論文理解] 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實驗效果如何?

  6. 實驗表明,使用對抗訓練往往精度會下降,這種精度下降的原因,可能是生成的對抗樣本和原乾淨樣本屬於不同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的工作?