本文受启发于 SWA,但是文章的主要内容基本都是个人理解。
梯度下降法
设深度学习网络的参数为
只不过,深度学习网络构建的数学方程式过于复杂,我们几乎不可能得到数学解析解,因此只能采用间接的方法求解,一个常用的求解方法便是梯度下降法:
从公式
如果训练过程跳过了所有局部最小点,得到了全局最小点,是否就得到完美性能的模型了呢?
通常,我们能够收集来训练深度学习网络的数据集
公式
不过,即使是数据增强也不能让
干扰深度学习模型泛化性能的两大因素
总结一下前文就是,在使用梯度下降法训练深度学习网络模型的过程中,会受到两大因素的干扰,阻碍我们得到泛化性能优秀的模型:
- 损失函数的局部最小因素;
- 训练数据集只是实际问题涉及数据的子集因素。
第 1 个因素可以通过各种手段尽量避免(比如 SGD 优化策略,设计各种带动量的优化器);(blog.popkx.com原创,未经许可抄袭可耻。)第 2 个因素却是致命的:找到损失函数
损失函数曲线
从公式
粗略来看,若是将损失函数在各个样本上的损失值连接起来,可以得到一条损失曲线:
这里要注意横轴表示的是数据分布,按照我们的分析,损失曲线在
一般来说,用于测试训练完毕的深度学习模型的测试数据集
通常,损失函数值越小,表明深度学习网络模型的预测越准确,所以就上图而言,可以断定在测试集
这样的发现给了我们启发:若深度学习网络模型在训练阶段的损失函数曲线是一个非常“尖锐”的曲线,那么它的总体泛化性通常较差,反之,若是损失函数曲线比较“平坦”,那么它的总体泛化性能一般较好。
看来,要优化因素 2 带来的泛化性能干扰,也不是全无头绪。
稍稍再思考一下,尖锐的损失曲线一般什么时候产生呢?(blog.popkx.com原创,未经许可抄袭可耻。)我觉得使用梯度下降法迭代更新减小
实例分析
上一小节中的“损失曲线”图非常简单,只是便于直观理解的示意图。读者应该明白,现实问题涉及的数据分布一般非常复杂,数据分布
-损失值
曲线图通常不是变化缓和的光滑曲线,不过我们得到的启发却是通用的。
在实践中,我训练了一个检测人脸信息的深度学习网络模型。上图是我遇到的一个问题,请看人脸预测框右侧倒数第 2 个数字,它表示人脸颊被遮挡的概率。虽然左右两张图片的内容非常相似(直觉上认为它们的数据分布接近),但是我训练的深度学习网络模型对二者的预测结果却有较大差异。
通过上一小节的讨论,我们可以推测出现这种情况的原因:我训练的深度学习网络模型的损失函数曲线在谷底不够平坦,上面两张图的数据分布恰好处于损失曲线的拐点附近,右图位于谷底,而左图则在损失值较大的位置。可以参考下示意图:
获取更平坦的“谷底”
通过前面的分析,我们知道要优化因素 2 带来的泛化性能干扰,获取具有更加平坦“谷底”的损失函数曲线是一个可行方案。
但是从数学上来看,获取具有更加平坦“谷底”的损失曲线是一件非常不容易的事,我们甚至连衡量深度学习网络模型损失曲线是否“平坦”的标准都没有,方法就更不用提了。(blog.popkx.com原创,未经许可抄袭可耻。)不过,从简化后的示意图来看,倒是有一些启发性的思路。
鉴于深度学习网络通常构建的是比较复杂的数学运算,而我们训练一般使用随机梯度下降法,所以,即使是同一个网络结构,使用不同的随机初始化,不同的训练过程,最终得到的损失曲线也是可能有差异的(总体相似)。
如上示意图所示,网络 1 和网络 2 的网络结构相同,训练过程不同——也即参数不同,因此二者的损失曲线总体相似,但是有差异,若是我们叠加二者的损失曲线,则可以得到谷底更加平坦的曲线。更进一步的,随着参与叠加的网络数目的增加,最终得到的损失曲线谷底也会随之变得愈发平坦。这个启发性的思路与直觉相符:多个网络参与预测的结果趋于更加稳定。
三个臭皮匠,顶个诸葛亮。
时间效率
叠加多个深度学习网络模型的输出,以获得更加平坦的损失曲线,进而得到更优异的泛化性能是可行的。但是有一个问题:随着参与叠加网络数目的增加,整体网络模型的推理消耗(时间、内存等)也在成倍增加,这对于一些资源紧张,或者注重时间效率的任务来说难以接受。
有没有办法加速呢?自然是有的,只不过要损耗一些网络模型参数的动态范围。令
输入邮箱或者手机号码,付款后可永久阅读隐藏的内容,请勿未经本站许可,擅自分享付费内容。
如果您已购买本页内容,输入购买时的手机号码或者邮箱,点击支付,即可查看内容。
电子商品,一经购买,不支持退款,特殊原因,请联系客服。 付费可读
进一步训练网络
深度学习网络模型即将收敛时,减小优化器的学习率是一个普遍使用的技巧,这有助于模型稳定收敛。(blog.popkx.com原创,未经许可抄袭可耻。)但是,减小学习率的同时,优化器陷入局部最小点的可能性就增加了,按照前文的讨论,这将导致得到“尖锐”损失曲线的可能性增加,影响模型的泛化性能。
上图是我遇到的一个实践问题,我训练的人脸信息检测深度学习网络模型对这张图的检测效果始终不好——图中的人眼部明显被遮挡了,但是模型预测的遮挡概率值几乎为零。最关键的是,无论我如何继续训练,损失函数值如何降低,模型对该图的眼部遮挡预测始终无响应。
当然了,模型对于其他大多数样本的预测都是准确的。推测原因,应该是优化器陷入局部最优点了,因此我们得到了“尖锐”的损失曲线,上图位于损失曲线的高位。所以只有优化器跳出局部最优点,模型对该图预测才可能准确。但是,即使优化器跳出了当前的局部最优点,我们也不能保证它不陷入另一个局部最优点——对另外一些图预测不准确。
所以,只使用单个模型进一步提升泛化性能的难度很大,因此考虑使用前文讨论的“叠加平均法”,我们优先考虑使用
按照前文的讨论,若期望“叠加平均法”能够得到更优异的泛化性能,需要参与叠加平均的网络模型有差异,而陷入局部最优的优化器带来“差异”的能力有限,所以要使用“叠加平均法”,首先需要跳出局部最优点。
跳出局部最优点的一个直接可行手段是加大学习率,但是这会导致模型振荡,难以稳定收敛到理想值。(blog.popkx.com原创,未经许可抄袭可耻。)所以,使用大学习率训练网络模型跳出局部最小点后,仍然需要继续使用较小的学习率让网络模型稳定收敛。根据公式
其中
总结一下,在深度学习网络模型收敛后,我们仍然可以进一步提升其泛化性能:
- 为损失函数添加
L2 正则项和||\bar w - w_i||^2 正则项; - 使用较大学习率训练模型若干次;
- 使用较小学习率训练模型多干次;
- 得到网络参数
w_i 。
得到若干个
步骤2、3中的“较大”学习率需要多大,“较小”学习率需要多小,“若干次”是多少次呢?目前这个内容正在申请专利,后续再公开讨论吧。
优化效果
以我训练的深度学习网络模型为例,在模型收敛后,继续使用前面讨论的方法继续训练,其在测试集上的表现如下图所示:
上图中的横轴是参与计算
单个模型收敛时,综合准确率基本维持在 0.975 左右。使用本文讨论的方法继续训练模型,当参与计算
我们使用最终得到的
可见,