再次启动TensorFlow团队提供的可视化TensorFlow网络的观测平台,我们的实现跟TensorFlow的内容是一样的,在TensorFlow的控制台增加隐藏层及神经元,第一层隐藏层有8个神经元,第二层隐藏层有4个神经元,第三层隐藏层有2个神经元。在Neuron_Network_Entry.py中的instances中只有前面2列是 Features,第3列是结果。这里在TensorFlow的控制台中输入的是X1,X2,输出也是一个结果。在不训练的情况下,TensorFlow直接从左侧运行1次到右侧,训练损失度和测试损失度在50%左右(Test loss 0.505,Training loss 0.503)。
图
如图所示,在TensorFlow的控制台,选择Sigmoid激活函数运行,运行的时候发现这个场景不太适合使用Sigmoid函数,训练损失度和测试损失度持续在50%左右。改用ReLu激活函数,ReLu函数的收敛速度非常快,训练损失度和测试损失度误差越来越小,运行的时候一个Epoch就是把所有的输入数据运行一遍,如果运行了Epoch 101次,相当于把所有的数据重复运行了101次。一个数据集运行一次,假设数据源有1亿条数据,就相当于所有的记录运行1次,运行1次就叫一个数据集运行一个Epoch。我们这里只有4条记录,把4条记录完整的运行1次,也就是1个Epoch。
然后不断循环的运行,循环运行包含2个层面,一个层面是运行多少次Epoch,训练损失度和测试损失度不断进行收敛,当训练损失度(Training loss)为0的时候,测试损失度(Test loss)也几乎接近于0; 一个层面是循环次数越多,它的误差就越小,这里面的核心就是BackPropagation。在上一节中我们通过Forward propagation运行得到结果,而Back Propagation通过将计算结果和实际的值进行比较,例如,我们这里运行的结果中第一个Prediction:0.43422777315602007,但instances中实际真实的值是0,预测值显然和真实结果有误差。
为了形象化表达预测的结果,我们这里修改一下Neuron_Network_Entry.py的代码。
Create_AI_Framework_In5Classes(Day3)版本的Neuron_Network_Entry.py,与Create_AI_Framework_In5Classes(Day2)版本相比:
· 上段代码中第8行调整print打印的内容,新增instance实际值的展示。instance的索引从0开始,instance的第0列、第1列是 2个Features , num_of_features是2,instance[num_of_features]取索引2的列,即instance的最后一列。
重新运行Neuron_Network_Entry.py,从输入层到3个隐藏层,再到输出层运行一次计算过程,第一次运行得到的Prediction结果如下,这个过程就是Forward propagation。
这个预测值行为和实际值显然有误差, Prediction:0.39764689190792835是跑了一个
从输入层到3个隐藏层,再到输出层的计算过程,第一次运行得到的结果,而实际值是0;同样的,第2个预测值是Prediction: 0.3988289922228743 ,而实际值是1;第3个预测值是Prediction:0.396656767344808 ,而实际值1;第4个预测值是Prediction: 0.39821648631895074 ,而实际值是0。这个就是Forward propagation。
人工智能AI系统的学习过程和人类的学习过程一样,你要么从过去的经验中学到一些东西,然后改进,要么就是视而不见。我们传统的编程方式是过去有误差,但代码编写以后,
对里面的行为没有改进,所以传统编程方式不如神经网络AI系统。AI系统的强大在于对预测的结果和实际的值的误差反推过去的步骤,沿着从后往前的链条不断往前反推,反推前面的哪些步骤对结果负的责任是什么,前面哪些因素导致了最后这个结果。这个过程跟人类反思过去事情经历的过程是一样的,反思过去哪些因素导致了这个结果,并修正它,并期待下一次做同样事情的时候能够改进。这就是所谓的Back Propagation。