在本文中,数据科学研究人员 Max Pechyonkin 讨论了最近两篇有趣的论文,它们提供了一种简单的方法,通过用一种巧妙的集成方式来提高任何给定神经网络的性能。这两篇论文是:Garipov 等人的《DNNs 的损失表面、模式连接和快速集成》和 Izmailov 等人的《平均权值带来更宽的极值和更好的泛化性》。
当然了,如果能先看看 Vitaly Bushaev 的《改善我们的处理学习率的方式》,接下来的阅读将会更轻松。雷锋网 AI 科技评论全文编译如下。
一般我们说的「集成」(ensemble),就是组合若干不同的模型,让它们基于相同的输入做出预测,接着通过某种平均化方法决定集成模型的最终预测。这个决定过程可能是通过简单的投票或取均值,也可能是通过另一个模型,该模型基于集成模型的结果,学习预测正确值或标签。岭回归是一种可以组合若干个不同预测的结果的方法,Kaggle 上卫星数据识别热带雨林竞赛的冠军就使用过这一方法。
集成应用于深度学习时,组合若干网络的预测以得到一个最终的预测。通常,使用好几个不同架构的神经网络比较好,因为不同架构的网络一般会在不同的训练样本上犯错,因而集成的收益会更大。
当然,你也可以集成同一架构的模型,也许效果会出乎意料的好。就好比这篇快照集成的论文,作者在训练同一个网络的过程中保存了不同的权值快照,然后在训练之后创建了同一架构、不同权值的集成网络。这么做可以提升测试的表现,同时也超省钱——因为你只需要训练一个模型、训练一次就好,只要记得随时保存权值就行。
你可以仔细阅读下文章开头提到的那篇 Vitaly Bushaev 的关于学习率的文章。如果你到目前为止还没有尝试过周期性学习率,那你真该去试试,它正在成为当前效果最好的、也最标准的做法,它简单易上手,计算量很轻,可以说非常事半功倍了。
上文列举的所有例子都是模型空间内的集成。组合若干模型,接着使用这些模型的预测以得到最终的预测结果。
而本文我想给大家介绍的论文中,作者提出了一种全新的权值空间内的集成。该方法通过组合同一网络在训练的不同阶段的权值得到一个集成,接着使用组合的权值做出预测。这种方法有两个好处:
组合权重后,我们最终仍然得到一个模型,这有利于加速预测。
事实证明,这种方法胜过当前最先进的快照集成。
在了解这一方法是如何工作之前,我们首先需要理解损失平面(loss surface)和泛化的解(generalizable solution)。
第一个不得不提到的是,经过训练的网络是高维权值空间中的一个点。对给定的架构而言,每个不同的网络权值组合都代表了一个不同的模型。任何给定架构都有无穷的权重组合,因而有无穷多的解。训练神经网络的目标是找到一个特定的解(权值空间中的点),使得训练数据集和测试数据集上的损失函数的值都比较低。
在训练期间,训练算法通过改变权值来改变网络并在权值空间中漫游。梯度下降算法在一个损失平面上漫游,该平面的海拔为损失函数的值。
坦白的讲,可视化并理解高维权值空间的几何特性非常困难,但我们又不得不去了解它。因为随机梯度下降的本质是,在训练时穿过这一高维空间中的损失平面,试图找到一个良好的解——损失平面上的一个损失值较低的「点」。不过后来我们发现,这一平面有很多局部极值。但这些局部极值并不都有一样好的性质。
Geoffery Hinton:「为了处理一个 14 维空间中的超平面,可视化了一个 3 维空间,并对自己大声说『十四』。每个人都是这样做的。」(出处:coursera 课程)
平坦度可以用来衡量一个解的优劣。其中的原理是,训练数据集和测试数据集会产生相似但不尽相同的损失平面。你可以将其想象为测试平面相对训练平面而言平移了一点。对窄的解来说,一个在测试的时候损失较低的点可能因为这一平移产生变为损失较高的点。这意味着窄的(尖锐的)解的泛化性不好——训练损失低,测试损失高。另一方面,对于宽的(平坦的)解而言,这一平移造成的训练损失和测试损失间的差异较小。
我解释了两种解决方案之间的区别,是因为这篇论文的提出的方法、也是我这篇文章重点介绍的方法,就能带来讨人喜欢的、宽的(平坦的)解。
最初,SGD 会在权值空间中跳出一大步。接着,由于余弦退火,学习率会逐渐降低,SGD 将逐渐收敛于某个局部解,算法将保存一个模型的「快照」,把它加入集成模型。接着学习率重置为高值,SGD 再次迈一大步,找到另一个局部极值,以此类推。
快照集成的周期长度为 20 到 40 个 epoch。较长的学习率周期是为了在权值空间中找到足够具有差异化的模型,以发挥集成的优势。如果模型太相似,那么集成模型中不同网络的预测将会过于接近,以至于集成并不会带来多大益处了。
快照集成表现优异,提升了模型的表现,但快速几何集成效果更好。
《DNNs 的损失表面、模式连接和快速集成》中提出的快速几何集成 FGE 和快照集成非常像,但是也有一些独特的特点。它们的不同主要有两点。第一,快速几何集成使用线性分段周期学习率规划,而不是余弦变化。第二,FGE 的周期长度要短得多——2 到 4 个 epoch。乍一看大家肯定直觉上觉得这么短的周期是不对的,因为每个周期结束的时候的得到的模型互相之间离得太近了,这样得到的集成模型没有什么优势。然而作者们发现,在足够不同的模型之间,存在着损失较低的连通路径。我们有机会沿着这些路径用较小的步长行进,同时这些模型也能够有足够大的差异,足够发挥集成的优势。因此,相比快照集成, FGE 表现更好,搜寻模型的步长更小(这也使其训练更快)。
要从快照集成或 FGE 中受益,需要存储多个模型,接着让每个模型做出预测,之后加以平均以得到最终预测。因此,我们为集成的额外表现支付了更高的算力代价。所以天下没有免费的午餐。真的没有吗?这就是随机加权平均的用武之地了。
随机权值平均只需快速集合集成的一小部分算力,就可以接近其表现。SWA 可以用在任意架构和数据集上,都会有不错的表现。根据论文中的实验,SWA 可以得到我之前提到过的更宽的极小值。在经典认知下,SWA 不算集成,因为在训练的最终阶段你只得到一个模型,但它的表现超过了快照集成,接近 FGE。
SWA 的直觉来自以下由经验得到的观察:每个学习率周期得到的局部极小值倾向于堆积在损失平面的低损失值区域的边缘(上图左侧的图形中,褐色区域误差较低,点W1、W2、3分别表示3个独立训练的网络,位于褐色区域的边缘)。对这些点取平均值,可能得到一个宽阔的泛化解,其损失更低(上图左侧图形中的 WSWA)。
下面是 SWA 的工作原理。它只保存两个模型,而不是许多模型的集成:
第一个模型保存模型权值的平均值(WSWA)。在训练结束后,它将是用于预测的最终模型。
第二个模型(W)将穿过权值空间,基于周期性学习率规划探索权重空间。
在每个学习率周期的末尾,第二个模型的当前权重将用来更新第一个模型的权重(公式如上)。因此,在训练阶段,只需训练一个模型,并在内存中储存两个模型。预测时只需要平均模型,基于其进行预测将比之前描述的集成快很多,因为在那种集成中,你需要使用多个模型进行预测,最后再进行平均。
论文的作者自己提供了一份 PyTorch 的实现 https://github.com/timgaripov/swa。
此外,基于 fast.ai 库的 SWA 可见 https://github.com/fastai/fastai/pull/276/commits。墙裂安利这个库!
via towardsdatascience.com,雷锋网 AI 科技评论编译