Create_AI_Framework_In5Classes(Day2)版本的Node.py代码:
class Node:
…….
#获得当前Neuron的Value
def get_value(self):
return self._value
……….
Create_AI_Framework_In5Classes(Day3)版本的Node.py代码,与Create_AI_Framework_In5Classes(Day2)版本相比:
· 上段代码中第5行以后新增代码,新增set_minor_error、get_minor_error代码。
……
#设置当前Neuron对刚刚发生的Forward Propagation而导致的Loss的具体责任
def set_minor_error(self, minor_error):
self._minor_error = minor_error
#获取当前Neuron对刚刚发生的Forward而导致的Loss的具体责任
def get_minor_error(self):
return self._minor_error
(6) 然后进行循环,计算除输入层节点之外的每个节点要负的责任。循环所有的节点nodes,从后往前推,每次往前进行一个节点,但是不需要计算输入层的节点。从后往前推要获得target_index ,即node本身的index(),基于target_index获取权重的反推链。同时要计算每个神经元误差的总和,因为记录每个神经元最终负的责任。
Create_AI_Framework_In5Classes(Day3)版本的BackPropagation.py代码:
class BackPropagation:
…….
#循环遍历所有的Training Dataset 完成一个Epoch 并进行每个节点所负责的Error的记录
for i in range(len(instances)):
#使用Forward Propagation从Input Layer出发,经过Hidden Layers,最后获得Output
nodes = ForwardPropagation.applyForwardPropagation(nodes, weights, instances[i])
predicted_value = nodes[len(nodes) - 1].get_value()
#记录该次Forward Propagation最终的误差
actual_value = instances[i][num_of_features] #获得当前instance的Real Value
minor_error = predicted_value - actual_value #计算预测值和真实值之间的误差
nodes[len(nodes)-1].set_minor_error(minor_error) #把该误差值设置进Output Layer中的输出节点中
#因为输出节点已经计算完误差,所以会减掉2;
#因为Input Layer不参与计算,所以range的三个参数中的第二个参数是num_of_features
#该循环遍历是从Output Layer的前面的一个Hidden Layer开始的,或者说是从最后一个Hidden Layer开始的
for j in range(len(nodes)-2, num_of_features, -1):
target_index = nodes[j].get_index() #从最后一个Hidden Layer的最后一个Neuron开始计算,然后依次向前
sum_minor_error = 0 #存储当前Neuron应该为误差所要负的责任
#循环遍历所有的Weights以获得以target_index为出发点的所有Weights
for k in range(len(weights)):
#如果当前的Weight是以target_index所在的Neuron为出发节点,则说明该Weight需要多结果负(直接)责任
if weights[k].get_from_index() == target_index:
affecting_theta = weights[k].get_value() #获得当前Weight的Value
affected_minor_error = 1 #初始化当前Neuron对结果影响的Value
target_minor_error_index = weights[k].get_to_index() #计算当前Neuron所影响的下一个Layer中具体的Neuron的ID
for m in range(len(nodes)):
if nodes[m].get_index() == target_minor_error_index:
affected_minor_error = nodes[m].get_minor_error()
#获得当前Weight的触发Neuron对结果负责任的具体的值
updated_minor_error = affecting_theta * affected_minor_error
#把对下一个Layer中具体误差负责任的所有误差都累加到当前Neuron并保存到当前的Neuron中
sum_minor_error = sum_minor_error + updated_minor_error
#保存当前的Neuron对下一个Layer的所有的Neurons所造成的Loss影响的总和
nodes[j].set_minor_error(sum_minor_error)
BackPropagation中各神经元节点误差的计算,实现的原理机制如图所示,输出信号y同训练数据集中的预测输出结果z做对比,输出信号y与预测值z之间的误差值用d 表示,计算损失信号d反向传播所有神经元。 其中权重系数Wmn 用来计算损失信号。神经网络的神经元节点(除输入层节点)都按照此过程计算。
图 1- 39 Back Propagation误差的计算