目录

Exponential moving average (EMA) 是一个非常有用的trick, 起到加速训练的作用. 近来发现, 该技巧还可以用于提高网络鲁棒性(约1% ~ 2%). EMA的流程很简单, \(f(\cdot;\theta)\)是我们用于训练的网络, 则在每次迭代结束后进行:

\[\theta' = \alpha \cdot \theta' + (1 - \alpha) \cdot \theta,
\]

其中\(\theta'\)是\(f'(\cdot; \theta')\)网络的参数, \(f', f\)的网络初始化是一致的, 另外\(f'\)的网络参数的更新仅仅通过上式.

一般情况下, 对抗训练用\(f(\cdot; \theta)\)来生成对抗样本, 即

\[x_{adv} := \arg \max_{\|x'-x\|\le \epsilon} \mathcal{L}(f(x'),y),
\]

来获得, 而我想的能不能

\[x_{adv} := \arg \max_{\|x'-x\|\le \epsilon} \mathcal{L}(f'(x'),y).
\]

背后的直觉是, \(f'\)相较于\(f\)更为平稳, 则由其产生的对抗样本的分布更加稳定, 则\(f\)拟合起来会不会更加容易?

我在一个8层的网络上进行测试, 结果不如人意:

设置

model cifar
dataset CIFAR-10
attack PGD
epsilon 8/255
stepsize 2/255
steps 10
loss cross entropy
optimizer sgd
momentum 0.9
beta1 0.9
beta2 0.999
weight_decay 2e-4
leaning_rate 0.1
learning_policy AT
epochs 200
batch_size 128
transform default
seed 1
alpha 0.999

结果

Accuracy Robustness
EMA*
EMA
EMA + GroupNorm

上图中, EMA是原本的逻辑, 可见其的确能加速训练(Shadow表示\(f'\)), 虽然最后的结果是降了点, 这主要是参数没调好, 毕竟对抗训练很容易过拟合. 但是我们的直接却完全不起作用, 这让我非常困惑, 因为, 我料想的最差的结果, 也应当是鲁棒性不怎样, 不能精度和鲁棒性都很差, 因为虽然是通过\(f'\)生成的对抗样本, 这些对抗样本依旧是满足$|x_{adv} - x|_{\infty} \le 8 /255 $ 的,所以应该是没问题的.

于是我又尝试让\(\alpha\)由\(0\)慢慢增加到\(0.999\), 但是结果依然不容乐观. 我料想是batch normalization的问题, 于是换了group normlization:

虽然结果似乎表明我们的直觉完全是错误的, 但是还是体会到了 normalization 的重要性, BN很难应对不同分布.

最新文章

  1. react自学笔记总结不间断更新
  2. Delegate、Predicate、Action和Func
  3. ASM FailGroup验证
  4. 17.linux下root用户与普通用户
  5. iOS 代理协议
  6. Windows Directory ACL Security Check By ACL Baseline
  7. 信頼済みサイト对window.open窗体大小影响原因之一
  8. ios开发解决遍历删除数组对象报错
  9. [Angular2 Router] Understand the Angular 2 Base href Requirement
  10. NodeJS服务器:一行代码 = 一个的HTTP服务器
  11. 获取资源ID
  12. cocos2dx系列笔记(2)- windows环境配置后续之 Android环境配置
  13. 【转】 NSString什么时候用copy,什么时候用strong
  14. 设计模式C++实现(1)——工厂模式
  15. 《Linux内核分析》 week6作业-Linux内核fork()系统调用的创建过程
  16. 用Stack实现对多线程的管理范例
  17. Session分布式共享 = Session + Redis + Nginx
  18. AO之Addins开发[杂谈1] Toolbar中添加一条分割线
  19. Linux下批量修改后缀名
  20. java学习之—队列

热门文章

  1. 系列好文 | Kubernetes 弃用 Docker,我们该何去何从?
  2. adjust, administer
  3. 【Go语言学习笔记】包
  4. 零基础学习java------day18------properties集合,多线程(线程和进程,多线程的实现,线程中的方法,线程的声明周期,线程安全问题,wait/notify.notifyAll,死锁,线程池),
  5. android:textAppearance解析
  6. Actuator监控器
  7. pipeline groovy
  8. Python matplotlib绘图设置坐标轴的标题
  9. Windows下安装xampp的PHP扩展(redis为例)
  10. Pytorch入门下 —— 其他