文章指出一种基于 boosting(提升)原理,逐层训练深度残差神经网络的方法,并对性能及泛化能力给出了理论上的证明。
1. 背景
1.1 Boosting
Boosting[1] 是一种训练 Ensemble 模型的经典方法,其中一种具体实现 GBDT 更是广泛应用在各类问题上。介绍boost的文章很多,这里不再赘述。简单而言,boosting 方法是通过特定的准则,逐个训练一系列弱分类,这些弱分类加权构成一个强分类器(图1)。
图1 Boosting 方法原理图【src】
1.2 残差网络
残差网络[2]目前是图像分类等任务上最好的模型,也被应用到语音识别等领域。其中核心是 skip connect 或者说 shortcut(图2)。这种结构使梯度更易容向后传导,因此,使训练更深的网络变得可行。
图2. 残差网络基本block[2]
在之前的博文中,我们知道,一些学者将残差网络视一种特殊的 Ensemble 模型[3,4]。论文作者之一是Robert Schapire(刚注意到已经加入微软研究院),AdaBoost的提出者(和 Yoav Freund一起)。Ensemble 的观点基本算是主流观点(之一)了。
2. 训练方法
2.1 框架
图3. BoostResNet 框架
- 残差网络
-
hypothesis module
ot(x)=softmax(WTt⋅gt(x))∈RC
其中C 为分类任务的类别数。
即这是一个线性分类器(Logistic Regression)。 weak module classifier
其中
-
将残差网络显示表示为 ensemble
令残差网络的最后输出为F(x) ,并接合上述定义,显然有:F(x)=oT(x)=1αTαT⋅o(x)=1αT∑t=0T(αt⋅ot(x)−αt−1⋅ot−1(x))=1αT∑t=0Tht(x)
这里用到了裂项求和的技巧(telescoping sum),因此作者称提出的算法为 telescoping sum boosting.
我们只需要逐级(residual block)训练残差网络,效果上便等同于训练了一系列弱分类的 enemble。其中,除了训练残差网络的权值外,还要训练一些辅助的参数——各层的
2.2 Telescoping Sum Boosting(裂项求和提升)
文章正文以二分类问题为例展开,我们更关心多分类问题,相关算法在附录部分。文章给出的伪代码说明相当清楚,直接复制如下:
其中,
需要特别说明的是,
与算法3中类似,
显然 Algorithm 4 给的最小化问题可以用 SGD 优化,也可以数值的方法求解([1] 4.3 节)。
3. 理论
理论分部没有详细看。大体上,作者证明了 BoostResNet 保留了 boost 算法是优点:1)误差随网络深度(即弱分类器数量)指数减小;2)抗过拟合性,模型复杂度承网络深度线性增长。详细可参见论文。
4. 讨论
BoostResNet 最大的特点是逐层训练,这样有一系列好处:
- 减少内存占用(Memory Efficient),使得训练大型的深层网络成为可能。(目前我们也只能在 CIFAR 上训练千层的残差网络,过过干瘾)
- 减少计算量(Computationally Efficient),每一级都只训练一个浅层模型。
- 因为只需要训练浅层模型,在优化方法上可以有更多的选择(非 SGD 方法)。
- 另外,网络层数可以依据训练情况动态的确定。
一些疑问
- 文章应该和逐层训练的残差网络(固定或不固定前面各层的权值)进行比较多,而不是仅仅比较所谓的 e2eResNet(端到端残差网络)。
- 作者这 1.1 节最后也提到,训练框架不限于 ResNet,甚至不限于神经网络。不知道用来训练普通深度模型效果会怎样,必争 layer-wise pretraining 现在已经显得有点过时了。
References
- Schapire & Freund. Boosting: Foundations and Algorithms. MIT.
- He et al. Deep Residual Learning for Image Recognition.
- Veit et al. Residual Networks Behave Like Ensembles of Relatively Shallow Networks.
- Xie et al. Aggregated Residual Transformations for Deep Neural Networks.