(23)BackPropagation.py的实现
BackPropagation.py的实现。
Back Propagation是神经网络最精髓的部分。我们自研盘古框架的BackPropagation的思维和TensorFlow和PyTorch的思维是一样的。这里从零起步编写BackPropagation.py代码。
BackPropagation.py的实现思路:
第一步: 从误差的结果出发,从最右侧到最左侧(不包含输入层Input Layer)遍历整个神经元网络Neuron Network构成的链条Chain;
第二步:在遍历的时候计算每个神经元Neuron对误差结果应该负的责任;
第三步:进行Derivative求导计算;
第四步:通过梯度下降算法Gradient Desendent来调整权重Weights的值以减少预测的误差。
具体实现步骤:
- 因为要应用ForwardPropagation,首先将service.ForwardPropagation导入。
- num_of_features记录输入的Features的个数,这里instance有4条记录,len(instances[0])可获取第一条记录的长度,由于instance的最后一列是Real Result真实结果值,因此计算len(instances[0]) - 1 为输入的Features的个数。
- 接下来循环遍历所有的Training Dataset ,完成一个Epoch 并进行每个节点所负责的Error误差的记录。
(1) ForwardPropagation.applyForwardPropagation(nodes, weights, instances[i])初始化Nodes状态。
Create_AI_Framework_In5Classes(Day2)版本的ForwardPropagation.py代码:
import math
Create_AI_Framework_In5Classes(Day3)版本的ForwardPropagation.py代码,与Create_AI_Framework_In5Classes(Day2)版本相比:
· 上段代码中第4行以后新增代码,新增返回神经元节点信息。
return nodes
在Create_AI_Framework_In5Classes(Day3)版本的BackPropagation.py代码中应用一次ForwardPropagation.applyForwardPropagation方法,获取神经元节点集。
…….
ForwardPropagation.applyForwardPropagation这段代码实现的原理机制如图所示,假设神经元网络有4层,输入层(2个输入节点)、隐藏层有2层(第1层隐藏层有3个神经元节点,第2层隐藏层有2个神经元节点),输出层1层。
图 1- 36神经元网络
每个神经元由两个单元组成。一个是权重和输入信号,另一个是非线性单元激活函数。信号e是激活信号,y = f(e) 是非线性单元的输出,即是神经元的输出。
图 1- 37激活函数示意图
为了训练神经网络,我们需要训练数据。训练数据由输入信号(x1 、x2 )和期望输出结果z组成。网络的训练过程是一个迭代处理的过程。训练数据集用来在每次迭代过程中更新神经元的权重。每次学习过程从训练数据的输入信号开始,我们可以得出每一层的输出。如图所示信号在神经网络中的传输路线。W(Xm)n 表示神经元Xm 在第n层输入的连接权重,Yn 表示神经元n的输出;Wmn 代表输出神经元m和输入神经元n的连接权
重。
图 1- 38 ForwardPropagation.applyForwardPropagation 传播示意图
类似的,我们的盘古自研框架applyForwardPropagation也是同样的Forward Propagation过程,instances每一行记录有2个特征值,输入instances数据,从输入层Input Layer开始,经过若干层的隐藏层HiddenLayers(例如hidden_layers = [8,4,2]),最后得出输出层Output Layer的值。
(1) 最后一个节点的值是预测值,我们通过predicted_value = nodes[len(nodes) - 1].get_value()获取预测值。
(2) actual_value = instances[i][num_of_features]获得当前instance的Real Value实际值。
(3) 计算误差minor_error = predicted_value - actual_value:计算预测值和真实值之间的误差。
(4) 然后设置输出节点nodes[len(nodes)-1].set_minor_error(minor_error)的误差值。因为误差要不断更新的,所以我们在Node.py要设置这个方法。