[論文理解] Adversarial Examples Improve Image Recognition
Adversarial Examples Improve Image Recognition
這篇文章提出了auxiliary BN來對生成對OOD樣本做BN,乾淨對樣本用原始的BN,相當於是兩個BN處理。
-
為什麼非要給對抗樣本單獨一個BN?這樣做有什麼好處?解決什麼問題?
-
實際提升有多少?
-
具體是怎麼實現的?
-
對半監督是否有幫助呀?
-
既然BN會hurt不同domain同時訓練的結果,用非BN的layer實驗效果如何?
-
實驗表明,使用對抗訓練往往精度會下降,這種精度下降的原因,可能是生成的對抗樣本和原乾淨樣本屬於不同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)
-
做了實驗,提升很小。、。
-
去做了一下實驗,沒有BN而是用LN等這類任務基本訓練不了。。嘗試一下transformer??嘗試一下無Normalization的工作?