企业级AI技术内幕:深度学习框架开发+机器学习案例实战+Alluxio解密
上QQ阅读APP看书,第一时间看更新

6.3 使用自适应学习进行性能优化

在数据正则化成果的基础上,接下来我们使用自适应学习技术进行性能优化。自适应学习的核心在于要对收敛速度进行调整,如果收敛速度太慢,则要把收敛速度变快;如果收敛速度太快,则要把收敛速度变慢。

由于输出的数据没有文字说明,在Neuron_Network_Entry.py程序中进行plt.plot数据可视化的时候需增加相关图例说明。

运行Neuron_Network_Entry.py程序,运行结果如图6-10所示。

图6-10 正则化处理的损失度

采用自适应学习实现性能优化编码。

在Neuron_Network_Entry.py程序中修改代码如下:

第3行代码:记录神经网络最初始的权重。正则化优化和自适应学习优化的输入数据源都是正则化以后的数据,数据本身是一样的,但自适应学习优化要将初始的权重记录下来。如果不记录初始权重,进行BackPropagation.applyBackPragation时权重就会发生变化。通过copy.deepcopy(weights)方式做深度拷贝,完全拷贝初始权重的父对象及子对象,记录下神经网络最初始的权重。

第5行代码:设置adaptive_loss_log数组,因为有很多时代的运行,每隔100个时代记录一次损失度。

第6行代码:记录上一次的损失度。

第8行代码:循环遍历1000个时代。

第9行代码:在BackPropagation.applyBackPragation反向传播算法中传入初始权重。

第10行代码:计算损失度。

第12~15行代码:进行自适应学习的优化。如果这次的损失度小于上一次的损失度,说明学习率较小,则将学习率加大一点;如果这次的损失度大于上一次的损失度,则将学习率调小一点,这个调整不一定准确,调整也不一定非常有效,需在实际测试时不断调整,不断测试。

第21行代码:将损失度追加到adaptive_loss_log数组。

第23~25行代码:将自适应学习损失度结果进行可视化,并与正则化优化结果进行比较。

运行Neuron_Network_Entry.py程序,结果如下:

可视化运行结果如图6-11所示,发现自适应学习和特征归一化优化的效果相对比较明显,说明自适应学习是有效的,自适应学习优化比数据正则化的优化精确度更高,损失度更低,因此自适应学习优化是有作用的。第一步是看见它的变化,表明优化程序已经可以正常工作了。就美国硅谷见闻,这项工作可能比较枯燥,因为需要工程师们天天调整这些参数。

图6-11 正则化优化和自适应学习优化比较

本节通过编码实现了自适应学习性能优化,及使用特征归一化进行了优化,发现自适应学习和特征归一化优化都是有效的,因为优化和不优化,运行结果有明显的区别。至于精确度,这是另外一个内容,我们的代码还有待优化,现在还用不到。

图6-12是代码优化以后的运行结果,损失度从0.12降到了0.009,即0.9%,这个结果已经很棒了。

图6-12 优化后的结果

图6-13是正常进行梯度下降迭代计算的损失度图,损失度竟然达到了0.000 003,我们仅对代码进行优化就达到了这个损失度或者说精确度。

图6-13 自适应学习损失度图

之前应用自适应学习和特征归一化优化都是有效的,但即使是有效的,也没达到自己编写代码达到的损失度这么低。0.000 003这个损失度已经可以忽略不计了,如果实际结果是0,就差不多显示是0;实际结果是1,就差不多显示是1。

图6-14是代码修改以后的自适应学习损失度图。微调一下参数可能提升零点几倍或者几倍,一般不可能几百倍上万倍的提升。而我们进行一处代码的修改,就能进行上百倍甚至上万倍的精确度的提升。

图6-14 标准梯度下降与自适应学习损失度比较

本节证明了自适应学习和特征归一化可以优化人工智能框架程序的精确度,在代码中一个细小的修改,就达到了惊人的精确度,几乎和实际结果一样。这个修改跟之前的前向传播、反向传播算法是有关的。在实现算法的过程中,总有一些细节需要调整。