虽然深度学习已经被用于各种不同的应用上,但是由于缺乏能够完整解释其成功背后的基础理论,所以经常面对着各种质疑。就在最近,Test-of-time 奖项的获得者在 Neural Information Processing (NIPS) 会议上将深度学习比作为炼金术。
虽然用于解释深度学习为何有如此强的泛化能力的泛化理论(Generalization Theory)仍是一个开放性的问题,但是在本文中,我们将会对近期试图解释这个问题的理论和经验(empirical)上所取得的进步展开讨论。
一个“明显的悖论”是尽管深度学习有容量大(large capacity)、数值不稳定性(numerical instability)、尖锐极小值 (sharp minima) 和缺乏鲁棒性(又称为健壮性,robustness)等特点,但是仍在实践中仍然有强的泛化能力。
最近的“Understanding deep learning requires rethinking generalization”文章表明深度神经网络(CNN)有足够的容量来记忆 Imagenet 和 CIFAR10 中带有随机标签的数据集。虽然目前还不清楚,为什么他们在真实数据上找到了泛化的解决方案。
另一个关于深层架构的问题是数值的不稳定性。在基于导数的学习算法中,数值不稳定性问题通常被称为爆炸问题(exploding)或者梯度消失问题(vanishing gradient)。额外的困难是源于背后的 forward model 的不稳定性。这就是说,在原始特征上做一些小的扰动时,一些神经网络的输出可能是不稳定的。 在机器学习中,它被称为缺乏鲁棒性(non-robustness)。图 1 为对抗性攻击(adversarial attack)的一个例子。
(图 1 的图片来源:Attacking Machine Learning with Adversarial Examples)
有几项研究关于深度学习的泛化理论是建立在随机梯度下降法(Stochastic Gradient Descent,简写为 SGD)找到损失函数(loss function)的极小值(minima)的平滑度(flatness)上。但是,最近有研究表明“Sharp Minima Generalize For Deep Nets”。更确切地来说,平滑的极小值(flat minima)可以通过重新参数化变成尖锐的极小值(sharp minima),但是并不改变其泛化属性。因此,泛化性并不能仅仅通过参数空间的鲁棒性来解释。
泛化理论的目标是解释和证明为什么以及怎样提高训练集的准确性可以提高测试集的准确性。这两个精度之间的差异称为泛化误差或“泛化能力下降(generalization gap)”。更严格的泛化能力下降可以定义为,当用给定学习算法 A 中的函数用来处理数据集时,得到的不可计算预期风险和可计算经验风险之间的差异值:
本质上,如果我们将泛化能力下降界定为一个较小的值就能保证深度学习算法在实际应用中有很好的泛化能力。基于模型的复杂性、稳定性和鲁棒性等,确实存在多个关于泛化能力下降的理论界限(theoretical bounds)。
模型复杂度的两个度量分别是 Rademacher 复杂度和 Vapnik-Chervonenkis(VC)维度。 但是,基于 Radamacher complexity 的深度学习函数的已知界限(bounds)随着 DNN 的深度呈指数级的增长。这与实际观察相悖,在实际观察中更深的神经网络反而更适合于训练数据且会产生更小的经验误差。同样地,基于 VC 维度的泛化能力下降界限在可训练参数的数量上呈线性增长,但是也与在深度学习中实际观测情况相悖。换句话说,这两个界限都太保守了。
K Kawaguchi,LP Kaelbling 和 Y Bengio 最近提出了一个更为有用的方法。不同于其他人,他们承认深度学习模型通常是使用训练—验证范式进行训练的这一事实。他们通过验证错误而非训练错误来限制不可计算的期望风险。基于这些观点,他们回答了为什么深度学习在实际应用中的泛化能力很好:“我们的模型具有很好的泛化能力,是因为我们可以通过带有验证错误的模型搜索来获得一个好的模型”。并且证明以下的界限,对于任意,下式至少有 的概率成立。
值的强调的是,是我们选择最终模型的决策过程中使用验证数集的次数,是验证数集的大小。这个界限就帮助解释了为什么深度学习有良好的泛化能力,尽管可能存在不稳定性、缺乏鲁棒性和有尖锐的极小值等问题。到这里,还有一个尚未解决的问题是为什么我们能够找到导致低验证错误的体系结构和参数。通常,架构是受到了现实世界观察的启发,而好的参数是通过 SGD 来找到的,这些我们将在下面讨论。
SGD 是现代深度学习的一个内在组成部分,而且显然是深度学习泛化能力背后的主要原因之一。所以我们接下来将会讨论 SGD 的泛化属性。
在最近“Data-Dependent Stability of Stochastic Gradient Descent”一文中,作者证明了在一些有额外损失的条件下,SGD 是一种平均而言稳定的算法。这些条件在常用的损失函数中被满足,例如有 sigmoid 激活函数的神经网络中的逻辑(logistic)/softmax loss。在这种情况下,稳定性就意味着 SGD 对训练集中小扰动的敏感度。他们也进一步证明了 SGD 在诸如深度神经网络等非凸函数中存在数据依赖的平均界限的泛化能力下降:
其中是训练集的大小,是训练步数,表示初始点曲率如何影响稳定性。这就引出了至少两个结论。首先,围绕初始点(initialization point)的目标函数的曲率具有决定性的影响。从更为平缓有较低风险区域的一个点开始,应该会产生更高的稳定性,即更快的泛化。在实践中选择初始化参数时,这会是一个很好的预筛选策略。其次,考虑到全面通过,即,我们将界限简化为。也就有了更大的训练集,而更小的泛化能力降低。
有趣的是,有一些研究调查了学习曲线的问题。其中大部分表现为幂律泛化误差(power-law generalization error),在其指数或时,标度为。 这一结论与前面讨论过的论文一致。但是要提到是百度的大规模研究,该研究能够凭经验观察(empirically observe)这个幂律(见图 2)。然而,实际应用中的指数β在 -0.07 到 -0.35 之间。理论上仍然需要进一步的解释。
(图 2 资料来源: Deep Learning Scaling Is Predictable, Empirically)
此外,还有理论和实证证据表明批量大小(batch size)对 SGD 泛化能力的影响。直观地说就是小批量训练会在梯度上引入噪音,这种噪音会使 SGD 远离尖锐极小值,从而增强泛化能力。谷歌最近的一篇文章显示,最佳批量大小与学习率(learning rate)和训练集大小成正比。或者换句话说,“不要衰减学习率,而要增加批量的大小”。对于有动量(momentum)的 SGD,可以推导出类似的缩放规则,其中动量为,是最佳批量,是动量。 换而言之,所有的结论都可以用以下的公式来总结:
其中是学习率,是训练集大小,是动量,是批量大小。
在过去的几年里,大家对深度学习矛盾效应背后的基础理论的兴趣日益增长。虽然现在还有一些开放的研究问题有待解决,但是现代的深度学习并不是炼金术。在这篇文章中,我们就深度学习的泛化能力方面讨论了一下这个问题,从而得出了一些实际的结论:
在较小曲线较为平滑和较安全的区域选择初始化参数。曲率可以通过 Hessian-vector multiplication method 来高效地估计。
改变动量的时候要重新调整批量大小。
不要衰减学习率,而要增加批量大小。
如果您觉得有趣,请不要忘记拍手和分享文章。您也可以通过 Linkedin 和 Twitter 与作者联系。
原文链接:
https://medium.com/mlreview/modern-theory-of-deep-learning-why-does-it-works-so-well-9ee1f7fb2808