训练一次得到多个模型做集成的方法

参考论文

SNAPSHOT ENSEMBLES: TRAIN 1, GET M FOR FREE

解决的问题

多个分类器集成可以获得超过单个分类器的效果,但集成分类器就要求有多个分类器,在训练速度和测试速度方面不占优势。本文提出的方法可以提高集成学习的训练速度,通过一次训练,获得多个分类器,解决了集成学习训练速度慢的问题。
overview

解决方法

深度学习训练过程中,只有经历足够长的epoch后,test loss才会随着lr的降低而降低,这说明loss空间中存在的局部最小值点是稳定的,这些局部最小值点的模型从不同方面描述了特征空间,可以用于集成学习。本文提出的方法主要有以下两点

  • 周期性学习率策略
    和常规学习率策略不同,本文把整个训练过程平均划分成M个阶段,每个阶段内学习率lr都从一个固定初始值开始,逐步降低。每个阶段结束后都保留一个snapshot,训练结束后一共获得M个snapshot,从后面抽取m个组成集成分类器。如此在一次训练中,获得M个模型,训练速度和常规训练方法一样。
    cycle-lr

  • 利用前一阶段的结果初始化当前阶段模型
    对于简单的模型而言,这一个步骤没那么重要,没有这一步也可以得到不错的结果。对于复杂的模型,这一步十分重要,因为复杂的模型需要较多的epoch才可以收敛到稳定的局部极小值点,除非增加每个阶段的epoch(同时也增大了整个训练时间),否则很难得到较好的结果

实验分析

对比实验

exp-main-result

  • single model: 采用常规lr更新策略,比如每经过1/4训练epoch,学习速率降低一个数量级
  • NoCycle Snapshot Ensemble:不使用周期性学习率更新策略,但依然每个相同epoch抽取一个模型,最后做集成
  • SingleCycle Ensembles:采用周期性学习率更新策略,但是每个阶段模型采用随机初始化,而不是采用前一个阶段的训练结果,这种方式对于简单的模型也可以产生不错的结果,毕竟其遍历了更大的参数空间。但如果模型复杂,则该方法效果变差。

集成需要的模型数量

exp-densenet100-cifar
采用本文方法获得的最后一个阶段的模型的性能是低于常规训练方法得到模型的,但是两个snapshot集成后test loss就降低到baseline之下
exp-densenet40-ciar
一般随着集成模型数量的提升,test loss会逐步降低(不一定成立,只是一个大的趋势),但集成多个模型会降低预测速度

和标准集成学习的比较

exp-true-ensembling 和标准集成学习(采用不同初始化参数,使用常规学习率更新策略,完整训练出多个模型做集成)对比,本文的方法效果是没有标准集成学习好的,当然本文中的方法的训练速度要快很多