一 为什么读这篇
算是一个通用trick,kaggle上不少solution都有用到,从原文出发,看看为什么这个trick会有效。
二 截止阅读时这篇论文的引用次数
2019.1.29 97次。不算很多。
三 相关背景介绍
本篇中了ICLR2017,一作Gao Huang(黄高)就碉堡了,因为他也是DenseNet的一作。05年北航的本科生(GPA第一),15年清华博士毕业(读了6年。。),后来在康奈尔待了3年做博后,此刻在清华作青椒,本篇和DenseNet都是在康奈尔时的工作。
官方实现在这里:https://github.com/gaohuang/SnapshotEnsemble
黄高个人主页在这里:http://www.gaohuang.net/
四 关键词
ensembles
五 论文的主要贡献
1 提出snapshot ensemble这种简单,有效,通用的trick
六 详细解读
1 介绍
都知道相比单个网络,融合多个网络的效果要更好,不好为此也要花费更大的计算代价。本文提出的方法可以在没有额外训练成本的情况下融合多个网络。通过训练单个网络,沿着其优化路径收敛到几个局部极小值,然后保存模型参数来实现这个目标。
SGD能够避免陷入鞍点和局部极小值,尽管通常认为这样是有意义的,但是本文认为这些局部极小值也包含了有用的信息,因为它们可以提升模型效果。
众所周知,潜在的局部极小值数量随着参数的增长而呈指数增长,现代网络通常达上百万的局部极小值。因此当两个相同的架构有不同的初始化或minibatch顺序不同时而收敛到不同的结果就没有什么好惊讶的了。尽管不同的局部极小值经常有非常相似的错误率,相应的网络也倾向犯不同的错误。这种多样性能通过ensemble利用起来,即用不同的初始化训练多个网络,然后用投票或平均来融合。
尽管有明显的好处,但是ensemble没有在神经网络中流行起来可能主要原因就是训练多个网络的成本过高。
本文方法利用了神经网络的非凸性质以及SGD根据需要收敛并逃离局部极小值的能力。通过让SGD沿着优化路径收敛M次到局部最小值,而不是从头开始独立训练M个神经网络。每次模型收敛时,都会保存权重并将相应的网络添加到集合中。之后用大的学习率重新优化以避免当前的局部极小值。具体来讲,采用了周期学习率处理,按余弦函数的方式突然提高学习率然后迅速降低。因为最终的融合是在优化路径上的一系列snapshots,所以称本文方法为Snapshot Ensembling。
snapshot-fig1.png与传统ensemble相比,本文整个ensemble的训练时间与训练单个传统模型所需的时间相同。在测试时,可以评估并平均M个模型中的最后m个(因此也是最准确的)。
2 相关工作
先拿dropout出来举例子,说明其有效的一种解释是在训练期间创建了有共享权重的指数级的子网络,然后在测试时隐式的融合。接着说DropConnect,Stochastic Depth,Swapout都是一个意思。而本文的模型融合是『显式的』,也就是说模型不共享权重,此外,本文方法可以与任何这些隐式融合技术结合使用。
还有一些工作是聚焦于减少融合时的测试时间,通过迁移『知识』(Hinton提的teacher student模型)。而本文的目的是减少融合时的训练的代价,而不是测试时的代价。
本文工作与以前的工作不同之处在于本文强制模型访问多个局部极小值,并且仅在模型达到最小值时才做snapshot。
文本工作也受到了SGDR(Stochastic Gradient Descent with Warm Restarts)和CLR(Cyclical Learning Rates)的启发。他们认为周期性的扰动收敛模型的参数,可以使模型能够找到更好的局部极小值。本文在最近这些研究结果的基础上(1)在每个周期中访问的局部极小值存在显著的多样性(2)使用融合来利用这种多样性。
3 snapshot ensembling
snapshot ensembling的核心是优化过程,它会在收敛到最终值之前访问几个局部极小值。我们使用这些不同的最小值时的snapshot,之后在测试时平均它们的预测。
如果单模型满足这两个条件,则融合效果最好:
1 有较低的测试误差
2 在错误分类的一组例子中没有重叠
周期余弦退火
为了在多个局部极小值收敛,采用SGDR的周期退火机制。以非常快的速度降低学习率,鼓励模型在不到50个epoch后收敛到其第一个局部极小值。之后用一个更大的学习率接着优化,以扰动模型并跳出最小值。重复这个过程已获得多个收敛值。学习率公式如下:
其中t是迭代次数,T是总的迭代次数,f是单调递减函数。M是周期个数,每个周期始于大的学习率,退火到较小的学习率。经实验,将f设置为SGDR提出的偏移余弦函数:
Snapshot Ensembling
看这个图就够了
snapshot-fig2.png测试时Ensembling
测试时的ensemble预测就是平均最后m()个模型的softmax输出。假设x为一个测试样本,则为第i个snapshot的softmax分数,最终的ensemble可以用如下公式表示:
4 实验
用Torch7写的码。
4.1 数据集
CIFAR
分C10和C100,32x32的彩图,5w训练,1w测试。
用若干论文中的标准数据增强机制,即先给每一边补4个0像素,再随机裁剪得到32x32的图,之后用0.5的概率做水平翻转。
SVHN
The Street View House Numbers(SVNH),由Google街景采集的32x32的彩色数字图。73257的训练,26032的测试。本文从训练集中取了6000张作为验证集。
Tiny ImageNet
ImageNet的子集,200类,每类500张训练,50张验证。每张图被resize到64x64,用AlexNet的方式做数据增强。
ImageNet
用ResNet和DenseNet的数据增强方法。
4.2 训练设置
架构
看表1就够了。为了适应Tiny ImageNet,使模型第一层的步幅2,用来将图像降采样到32x32。不同的数据集用了不同的batch size。
Baselines
Snapshot Ensembles训练成本与单模型一样。因为,需要与相同训练量的baseline进行比较。首先,比较了用标准学习率调度机制的单模型。另外,比较了隐式融合方法,即在单模型上加了Dropout(0.2的丢弃率),学习率调度机制一样。
Snapshot Ensemble用周期余弦学习率,最大学习率设置为0.1和0.2。另外,训练了一个没有用周期学习率调度的Snapshot Ensemble,称之为Nocycle Snapshot Ensemble,用和单模一样的学习率调度机制。最后,比较了一个SingleCycle Ensemble,即在每一个余弦学习率初期都重新初始化网络,而不是像标准Snapshot Ensemble一样使用之前的参数。这个就相当于传统的Ensemble,但是每个网络只有1/M的训练时间,也意味着模型多样性和模型收敛之间的权衡。
训练预算
即epoch个数。不同数据集和不同网络的epoch个数都不同。
4.3 Snapshot Ensemble结果
准确率
snapshot-table1.pngNoCycle Snapshot Ensemble通常有轻微的效果,但在有些情况下甚至会更糟,这也说明了周期学习率对于ensemble是有用的。SingleCycle Ensemble也是一样的问题。
snapshot-table2.png表2上是ImageNet的效果,可以看到并不是很好,作者推测是因为在总训练预算不变的情况下,每个周期训练的epoch数过少,对于ImageNet这么大的数据集来说是不够的。
Ensemble大小
snapshot-table3.png尽管通常ensemble更多的模型有更好的效果,但本文观察到融合2到3个模型时效果提升最明显,绝大多数情况下,融合2个模型就比baseline要好了。
Restart学习率
snapshot-fig3.png在大多数情况下,具有较大重启学习速率的ensemble表现更好,可能是因为周期之间的强扰动增加了局部极小值的多样性。
不同的周期数
看表3
不同的训练预算
snapshot-fig4.png图4左图,中图的周期固定为M=6,总epoch个数从60到300。本实验说明了snapshot ensemble在预算有限的情况下表现更好。
与True Ensembles的比较
看图4右图。效果上比不过(看了这个彻底懂了,为什么要搞那么多模型,无怪乎蛙神说的,ensmble of alexnet > single resnet),不过训练时间少。不过需要注意的是,true ensemble的模型必须用不同的初始化。
4.4 融合模型的多样性
参数空间
用Goodfellow提出的线性插值模型(Qualitatively characterizing neural network optimization problems)的办法定性量化模型的多样性。
snapshot-fig5.png从上图可以看出,周期和非周期学习率调度的明显差异。
激活空间
为了更进一步探索模型的多样性,本文也计算了每对snapshot的softmax输出的相关性。
snapshot-fig6.png因为所有的snapshot都有相似的准确率(如图5所示),这些预测的差异能够被利用起来创建更有效的ensemble。
5 讨论
基本上是把介绍的部分复述了一遍。提到未来的工作,是想要探索如何结合Snapshot Ensembles和传统ensemble。
七 读后感
看了黄高的个人主页,感觉就是学霸的一生,各种paper,写都写不下。本文写的非常清晰易懂,相关工作也介绍的很到位。各种实验对比也做的也很完善,看着非常舒服,简直就是论文的典范,读完这篇已经很迫不及待的想读下DenseNet原文了(best paper真不是盖的)。另外,真的是看原文才知道,这个并不是ensemble模型权重,而是ensemble模型输出的结果,跟之前预想的不一样。最后,看了各种实验后,再一次加强了这个观点,还是得从数据出发,有可能方法在A数据集上有效,但直接往B数据集上套就不灵了。另外,这个trick的提升并不是特别的明显,对于刷比赛有用,业务上除非是离线,否则不太容易用起来。
八 补充
How to Develop a Snapshot Ensemble Deep Learning Neural Network in Python With Keras
『warmup restart』重启学习率,重用之前的权重
『cold restart』重启学习率,不重用之前的权重
网友评论