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