5.2 编码实现损失度并进行测试
首先讲解人工智能神经网络损失度的计算方法。
损失度的计算方法一:把每个实例的预测值减去实际值然后进行累加,累加完毕后除以所有的实例的个数。
方法一的优点:容易理解,是最简单的损失度计算方法。
方法一的缺点:假设实例集第1个实例[0,0]预测结果的误差是0.3,第2个实例[0,1]预测结果的误差是–0.5,第3个实例[1,0]预测结果的误差是0.2,第4个实例[1,1]预测结果的误差是0,整个实例集的总误差是0.3 +(–0.5)+ 0.2 + 0=0,而0表示没误差,但实际上预测结果肯定有误差。因此,方法一不具有实用价值,也没有一个人工智能框架采用这种算法。
损失度的计算方法二:把每个实例的预测值减去实际值并求绝对值,然后将绝对值进行累加,再除以实例的个数。方法一的缺点是不同的误差计算结果可能相互影响,例如0.3+(–0.5)+ 0.2 + 0将总误差变成0了。预测值和实际值之间的误差没有所谓的正负之分。为了避免方法一的弊端,计算距离最简单的方法就是计算绝对值。
方法二的优点:真实反馈出预测值和实际值的差异。
方法二的缺点:收敛过程可能很慢。
损失度的计算方法三:把每个实例的预测值减去实际值并求平方,然后将平方值进行累加,再除以实例的个数。
方法二的绝对值已能真实反映出预测值和实际值的误差,为什么还要进行平方计算?因为平方计算能将误差放大,大的变得更大,小的变得更小。例如,如果两个误差值分别为0.1、10,将二者的误差分别求平方,得到的误差值为0.01、100,误差放大了1万倍。误差放大的好处是收敛速度更快。如果不能夸大反馈误差,那么系统每次计算的误差会很小,进行梯度计算的时候,改变量也很小,收敛的速度就很慢。不过夸大误差,理论上也可能过犹不及,步子跨得太大了,也可能犯错,这也是以后延伸出其他误差算法的原因。
方法三的缺点:当数据量很大的时候,会导致很大的计算量;有些计算是不必要的,这和梯度下降有关,如预测值和实际值的误差在0.0001之内,就不需要再进行计算,而有些误差很大,就很有必要计算。
损失度的计算方法四:采用样本方差的方式,该方法适合数据量比较大的情况。
方法四的优点:当数据量较大时,样本方差估计值接近于所估计的总体参数,趋近于实际分布。
方法四的缺点:数据量较小时,样本方差估计会出现偏差。
本节我们采用方法三,使用平方误差计算,因为实例集只有4条数据,没必要使用样本方差来计算。首先在service目录中创建LossComputation.py文件,在文件中创建一个类LossComputation。然后在类LossComputation中定义compute_loss方法计算损失度,compute_loss的第1个参数是所有的实例集;第2个参数是所有的节点,第3个参数是所有的权重。通过循环遍历所有的实例,计算预测值和实际值的误差平方和,然后除以实例的个数,得到损失度。
chapter5_Create_AI_Framework的LossComputation.py代码如下:
接下来在chapter4_Create_AI_Framework入口程序Neuron_Network_Entry.py的基础上修改代码,新增计算误差的代码。运行10 000个时代,每100个时代打印一次误差,并且通过可视化图显示损失度。
chapter5_Create_AI_Framework的Neuron_Network_Entry.py代码如下:
我们看一下如何使用matplotlib.pyplot库绘制图形。
导入Python绘图工具库matplotlib.pyplot,在Spyder集成开发环境中按Ctrl+I键查看plt的帮助信息。
在pyplot帮助信息中提供的可视化示例代码如下:
其中x是0~5间隔为0.1的数组[0,0.1,0.2,…,4.9],y是sin(x)经过正弦计算后的值,绘制的图形如图5-5所示。
接下来绘制盘古人工智能框架损失度可视化图。
图5-5 pyplot示意图
Neuron_Network_Entry.py的代码如下: