本文为雷锋网字幕组编译的技术博客 A Simple Guide to the Versions of the Inception Network,原标题,作者为 Bharath Raj。

翻译 | 龙翔 整理 | 孔令双

原文链接:

https://towardsdatascience.com/stochastic-weight-averaging-a-new-way-to-get-state-of-the-art-results-in-deep-learning-c639ccf36a

雷锋网 AI 研习社:在这篇文章中,我将讨论最近两篇有趣的论文。它们提供了一种简单的方式,通过使用一种巧妙的集成方法提升神经网络的性能。

  1. Garipov 等人提出的 “Loss Surfaces, Mode Connectivity, and Fast Ensembling of DNNs”

  2. Izmailov 等人提出的 “Averaging Weights Leads to Wider Optima and Better Generalization”

若希望更容易理解这篇博客,可以先阅读这一篇论文:

  1. Vitaly Bushaev 提出的 “Improving the way we work with learning rate”

传统的神经网络集成方法

传统的集成方法通常是结合几种不同的模型,并使他们对相同的输入进行预测,然后使用某种平均方法得到集合的最终预测。 它可以是简单的投票法,平均法。或者甚至可以使用另一个模型,根据集成模型的输入学习并预测正确的值或标签。岭回归是一种特殊的集成方法,被许多在 Kaggle 竞赛获奖的机器学习从业人员所使用。

机器学习的预测结果离散值(随机加权平均在深度学习中获得最优结果的新方法)(1)

网络快照集成法是在每次学习率周期结束时保存模型,然后在预测过程中同时使用保存下来的模型。

当集成方法应用在深度学习中时,可以通过组合多个神经网络的预测,从而得到一个最终的预测结果。通常情况下,集成不同结构的神经网络是一个很好的方法,因为不同的模型可能在不同的训练样本上犯错,因此集成模型将会得到更大的好处。

机器学习的预测结果离散值(随机加权平均在深度学习中获得最优结果的新方法)(2)

网络快照集成法使用基于退火策略的循环学习率策略。

但是,你也可以集成相同结构的神经网络模型,也会得到很棒的结果。在网络快照集成法论文中,作者基于这种方法使用了一个非常酷的技巧。作者在训练相同网络时使用权重快照,在训练结束后用这些结构相同但权重不同的模型创建一个集成模型。这种方法使测试集效果提升,而且这也是一种非常简单的方法,因为你只需要训练一次模型,将每一时刻的权重保存下来就可以了。

想要了解更多的细节,你可以参考这个博客。如果你还没有使用循环学习率策略,那么你一定要了解它。因为这是当前最先进而且最简单的训练技巧了,计算量不大,也几乎不需要额外成本就可以提供很大的收益。

上面的例子都是基于模型的集成方法,因为它们是通过结合多个模型的预测从而产生最终的预测结果。

但在这篇博客即将讨论的论文中,作者提出了一种新的基于权重的集成方法。这种方法通过结合相同网络结构不同训练阶段的权重获得集成模型,然后进行预测。这种方法有两个优点:

当结合权重时,我们最后仍然是得到一个模型,这提升了预测的速度

实验结果表明,这种方法打败了当前最先进的网络快照集成法

来看看它是怎么实现的吧。但首先我们需要了解一些关于损失平面和泛化问题的重要结论。

权重空间中的解决方案

第一个重要的观点是:一个训练好的网络是多维权重空间中的一个点。对于一个给定的网络结构,每一种不同的权重组合将得到不同的模型。因为所有模型结构都有无限多种权重组合,所以将有无限多种组合方法。训练神经网络的目标是找到一个特别的解决方案(权重空间中的点),从而使训练集和测试集上的损失函数的值达到很小。

训练过程中,通过改变权重,训练算法改变网络的结构,并在权重空间中不断搜索。随机梯度下降法在损失平面上传播,损失平面的高低由损失函数的值决定。

局部与全局最优解

可视化与理解多维权重空间的几何特点是非常困难的。同时,这也是非常重要的,因为在训练时,随机梯度下降法的本质是在多维空间的损失平面上传播,并努力找到一个好的解决方案--损失平面上的一个损失函数值很低的"点”。众所周知,这些平面有许多局部最优解,但并不是所有局部最优解都是优秀的解决方案。

Hinton: “为了处理14维空间中的超平面, 可视化3维空间并大声对自己说“14”。 每个人都这样做。“

机器学习的预测结果离散值(随机加权平均在深度学习中获得最优结果的新方法)(3)

局部和全局最优解。在训练和测试过程中,平滑的最低值会产生相似的损失。然而,训练和测试过程中产生的局部损失,有非常大的差异。换句话说,全局最小值比局部最小值更通用。

判断解决方案好坏的一个标准就是该方案解的平滑性。 这一思想在于训练数据和测试数据会产生类似的但并不完全一样的损失面。你可以想象一下,一个测试表面相对于训练表面移动一点。对于一个局部解,在测试过程中,因为这一点移动,一个给出低损失值的点会给出一个高损失值。这意味着这个”局部“解决方案没有产生最优值——训练损失小,而测试损失大。另一方面,对于一个”全局“平滑解决方案,这一点移动会导致训练和测试损失的差值很小。

我之所以解释局部和全局解决方案的不同,是因为这篇博客聚焦的新方法提供非常好的全局解决方案。

快照集成

最初,随机梯度下降(SGD,Stochastic Gradient Descent) 会在权重空间产生大的跃变。随后,当学习率由于余弦退火算法越来越小时, SGD 会收敛到某个局部解,该算法会对模型拍个”快照“,即将这个局部解加入到集合中。接着,学习率再次被重置成高值,SGD在收敛到某个不同的局部解之前,再次产生一个大的跃变。

快照集成方法的循环长度是20到40个 epoch(使用训练集的全部数据对模型进行一次完整的训练,称为一个epoch)。长学习率循环的思想在于能够在权重空间找到足够多不同的模型。如果模型相似度太高,集合中各网络的预测就会太接近,而体现不出集成带来的好处。

快照集成确实效果很好,提高了模型的性能,但是快速几何集成更有效。

快速几何集成 (FGE)

快速几何集成与快照集成类似,但有一些与快照集成不同的特征。FGE使用线性分段循环学习率策略代替余弦。其次,FGE的循环长度更短——每个循环只有2到4个epoch。最初的直觉认为,短循环是错误的,因为每次循环结束时产生的模型都非常相似,差别不大,所以集成这些模型不能带来益处。然而,正如作者发现的,由于在足够多的不同模型间,存在低损失的连接通路,沿着那些通路,采用短循环是可行的,而且在这一过程中,会产生差异足够大的模型,集成这些模型会产生很好的结果。因此,与快照集成相比,FGE提高了模型的性能,每次循环经过更少的epoch就能找到差异足够大的模型(这使训练速度更快)。

机器学习的预测结果离散值(随机加权平均在深度学习中获得最优结果的新方法)(4)

左边:传统观点认为好的局部最小值被高损失区域分隔开。如果我们观察连接局部最小值的直线,会发现这是正确的。中间和右边:然而,在局部最小值之间存在通路,这些通路上的损失值始终很低。FGE沿着这些通路拍快照,并利用这些快照构建一个集合。

为了从快照集成或者FGE中获益,需要存储多种模型并得出这些模型的预测,然后对这些预测求平均,作为最终的预测。因此,集合的附加性能需要消耗更多的计算。所以没有免费的午餐。或许是有的?这是一篇关于随机加权平均的新论文所获得的成果。

随机加权平均(SWA,Stochastic Weight Averaging)

随机加权平均和快速几何集成非常近似,除了计算损失的部分。 SWA 可以应用于任何架构和数据集,而且都能产生较好的结果。这篇论文给出了参考建议,SWA可以得到更大范围的最小值,上文已经讨论过这一点的好处。SWA不是经典意义上的集成。在训练结束的时候,会产生一个模型,这个模型的性能优于快照集成,接近FGE。

机器学习的预测结果离散值(随机加权平均在深度学习中获得最优结果的新方法)(5)

左边:W1,W2和W3 代表了3个独立的训练网络,Wswa是它们的平均。 中间:与SGD相比,Wswa 在测试集上产生了更优越的性能。右边:注意即使Wswa在训练集上的性能更差,它在测试集上的效果仍然更好。

SWA的灵感来自于实际观察,每次学习率循环结束时产生的局部最小值趋向于在损失面的边缘区域累积,这些边缘区域上的损失值较小(上面左图中,显示低损失的红色区域上的点W1,W2和W3)。通过对几个这样的点取平均,很有可能得到一个甚至更低损失的、全局化的通用解(上面左图上的Wswa)。

这儿展示了 SWA 是如何工作的。不需要集成很多模型,只需要两个模型。

第一个模型存储模型权重的平均值(公式中的 w_swa )。这就是训练结束后的最终模型,用于预测。

第二个模型(公式中的w)变换权重空间,利用循环学习率策略找到最优权重空间。

机器学习的预测结果离散值(随机加权平均在深度学习中获得最优结果的新方法)(6)

随机加权平均权重更新公式

每次学习率循环结束的时候,第二个模型的当前权重会被用于更新正在运行的平均模型的权重,即对已有的平均权重和第二个模型产生的新权重进行加权平均(左图中的公式)。采用这个方法,训练时,只需要训练一个模型,存储两个模型。而预测时,只需要一个当前的平均模型进行预测。用这个模型做预测,比前面提到的方法,速度快得多。之前的方法是用集合中的多个模型做预测,然后对多个预测结果求平均。实现

该论文的作者提供了他们自己的实现,这个实现是用PyTorch完成的。

当然,著名的fast.ai库也实现了SWA。每个人应该都在使用这个库。如果你还没有看到这个课程,请点击此链接。

感谢您的阅读!

雷锋网字幕组编译。

,