如图所示,是代码优化以后的运行结果图,损失度从0.12变到了0.009,即0.9%的损失度。这个已经很棒了!
图 1- 58 优化后的结果
如图所示,是正常的进行梯度下降的迭代计算的损失度图,这个已经很恐怖了,损失度达到了0.000003,几乎完全接近于真实的0和1了。在代码稍微改变一个地方,就能达到这个损失度或者精确度。
图 1- 59
之前应用Adaptive Learning和Feature Normalization优化都是有效的,但即使是有效的,也没达到自己编写的代码达到的损失度这么低,0.000003这个损失度已经可以忽略不计了,实际结果是0,就差不多显示是0;实际结果是1,就差不多显示是1。
以下是采用这个代码优化技术和没有采用这个代码优化技术的比较。采用代码修改以后的Adaptive Learning的损失度结果几乎完全靠近0了。微调一下参数可能提升零点几倍或者几倍的提升,一般不可能提升一百遍或上万遍的性能提升。而我们一处代码的修改,就能进行极大的上百倍、甚至上万倍的精确度的提升。
图 1- 60
本节证明了Adaptive Learning和Feature Normalization可以优化我们的精确度,在代码中一个细小的修改,就达到了惊人的精确度,几乎完全和实际结果一样的值。这个修改跟之前的Forward Propagation、Back Propagation算法是有关的。在实现的算法过程中,有一些细节需要调整。
回顾梳理一下思路:参照TensorFlow的可视化图,Node.py构建Node节点;Weight.py构建不同的节点之间的连接;NetworkStructure.py构建了神经网络的结构,同时也对权重进行了赋值;NetworkConnection.py中使用了一个数学公式,构建了类似TensorFlow网络骨架结构;ForwardPropagation.py从左到右运行处理我们的数据,完全模拟Goolge实现Forward Propagation,将输入的数据以Feature的方式注入我们的输入层Input Layer,经过若干个神经网络层,然后达到输出层,但是输出会有误差,就像人类学习的过程,人类的学习过程是Experience、Reflection、Adjustment,即经历、反思、调整;经历是不够的,经历过以后要进行反思。就跟狮子王里面谈到的:the past can hurt. you can either run from it or learn from it,过去所受的伤害,要么不管它,这是传统的编码方式;要么就从过去的经历中进行学习,根据误差的结果进行调整,用于改进下一次的过程,就是Back Propagation。Forward Propagation是犯错的过程、Back Propagation是对错误进行反思,然后调整的过程。TensorFlow的可视化图,每运行一次Epoch,将降低损失度,提升了精确度。人工智能神经网络也是经历、反思、调整,反思是Back Propagation,每个神经元需负多大的责任,BackPropagation.py中,循环遍历所有的Training Dataset 完成一个Epoch 并进行每个节点所负责的Error的记录,但是不够的,必须对所负的责任进行变化,这种变化就是求导,调整变化是最关键的步骤。TensorFlow的可视化图可使用ReLU激活函数,激活函数不一样,求导也不一样。求导以后进行调整,调整修改的是权重。这个过程就是一阴一阳,一静一动永恒的循环过程,就像心有猛虎,细嗅蔷薇(In me the tiger sniffs the rose),猛虎在一天捕获猎物以后,反思一下发起进攻的时间、奔跑的速度、猎杀的过程,接下来怎么调整,在静默期过去以后进行更快的爆发,这也是一动一静见天机的过程。LossComputation.py进行损失度的计算;FeatureNormalization.py进行了优化。
从技术角度讲,我们已经从零起步,编写实现了自己的人工智能框架,其中有一个小细节,在代码中修改一个地方,就能进行上百倍、甚至上万倍的精确度的提升。但这跟整个人工智能框架的运行没有太大的关系。