5.4 随机和完全的比较
在之前的小节中(参见5.2节),我们已经知道完全梯度下降法的算法逻辑是对所有数据条都计算其代价函数的梯度值,然后利用此梯度值的平均值来更新神经网络的权重。
我们在之前谈随机梯度下降法的时候,并没有说对于这个算法的优化问题。实际的原因是:随机梯度下降就如同随意从一个地方向山谷滚石头,每次选择的地方不一样,每次滚石头也不会记得上一次滚的结果。这样的算法是独立性很强的,它意味着数据条之间必须有一个所谓的独立同分布的约束条件。也就是说,有主导这些石头滚动的外势能存在,而且每条数据都和别的数据互相独立,没有关联。概率论里的准确表达是每条数据都必须满足相同的分布并且彼此互相独立。互相独立的字面意思是数据条之间本质上是互相没有关系的。
对于独立同分布的数据集,随机梯度下降法无法有更好的算法效率上的优化。但是可以对数据集进行随机抽样,然后用抽样的数据集进行学习,可以得到与完全数据集的随机抽样一样的权重结果。
随机梯度下降法对于数据质量的要求相当高,所以虽然随机梯度下降法可以抽样降低计算复杂度,但实际上应用的范围不大。它是梯度下降法里的质量检测算法。对于已经用别的算法学习过的数据,它有质量检测的意义。如果单独用随机梯度下降来学习,会有陷入局部最优解的风险,这里的局部最优解和一般的理解不同。实际上,更明确的表达是,随机梯度下降法得到的权重,在很多情况下(研究系统中存在隐藏的对称性,而这往往是一般情况,否则特征就不能叫做特征了。),得到的最优解在多个局域最优解处振荡,结果并不统一。如果最终对多个解进行平均取值,得到的有很大可能并不是最优解,甚至可能是比较差的解。。所以一般也需要对这个算法进行改进,加入退火算法以改善性能。
另一种应用场景是边缘计算的人工智能。在这种情形下,计算机的内存和运算能力都十分有限。但对于处理单条数据量的随机梯度下降来说,恰好适合这样的场景。它只需要很小的内存和极为有限的算力。
完全梯度下降法恰恰是另一个极端,它大量运用矩阵运算,而且基本不需要退火算法的辅助。本节我们要讲的就是完全梯度下降法。
由于完全梯度下降法在权重更新时选用的是所有梯度的平均值,而非自身所在位置的梯度。这其实是非常科学的一种方案。还是用山谷来对比,山谷上面各个点的梯度不一样,在特征比较多的情形下,甚至有些点的梯度方向上和别的也不一样。在这种情形下,误差函数对应的谷底就很难用随机梯度下降来找到,除非数据满足独立同分布。但是用完全梯度下降就可以很快找到,因为虽然我们不知道每一个点的下降方向是否严格指向谷底,但多点同时取均值,就可以找到这个谷底所在的方位。这是一种定位机制。如同瀑布一样,山上很多条流水可能向各个方向流动,但汇集成瀑布之后,它们就一同向山谷进发。所以完全梯度下降法蕴含的思想就如同瀑布一样,以后我们就称之为瀑布下降法。遇到任何小阻碍也不会影响算法往极值点去。这是非常大的优势,这意味着完全梯度下降法会无视特例中的局部最优解,而直接找到全局最优解。但是它的劣势是当数据量很大时,对于计算机的内存大小以及运算速度要求很高。
那么瀑布下降法有没有劣势呢?其实也是有的!它把高处的(即误差大的)数据的下降趋缓,把低处(误差小的)的数据下降变快,甚至可能会造成低处在全局最优点附近振荡,而且更不能让人接受的是这种振荡是无阻尼的,所以会让算法相应的误差到一定程度就无法下降。对于这样的情形,就会造成大量的算力浪费。对此,比较合理的处理方法是做紫外和红外截断,分段求均值。然后用相应的梯度更新相应的数据。但这样需要对数据先排序再更新。而排序算法本身是耗费算力的,所以在数据量很大时,需要权衡引入排序是否能使得算法更有效率。最合理的算法是使用筛选法来让小误差直接通过到下一轮,不更新其权重。这就避免了最让人讨厌的误差振荡行为。我们将会在后面章节的算法优化部分来讨论这种处理方法。