神经网络如何工作
思路
多层神经网络,每一层中的神经元都与前后层的神经元互相连接,不采用创造性的方式将神经元连接起来,原因有两点:
- 第一是这种一致的完全连接方式事实上可以相对容易地编码成计算机指令;
- 第二是神经网络的学习过程将会弱化这些实际上不需要的连接(也就是这些连接的权重将趋于0),因此对于解决特定任务所需最小数量的连接冗余几个连接,也无伤大雅。
方法
使用矩阵乘法来进行神经网络的计算:
- 通过神经网络向前馈送信号所需的大量运算可以表示为矩阵乘法;
- 不管神经网络的规模如何,将输入输出表达为矩阵乘法,使得我们可以更简洁的进行书写;
- 更重要的是,一些计算机编程语言理解矩阵运算,并认识潜在的计算方法的相似性。并允许计算机高速高效地进行这些计算。
计算过程
以3层神经网络为例:
输入层到隐藏层: X h i d d e n = W i n p u t − h i d d e n . I 输入层到隐藏层: X_{hidden} = W_{input-hidden} . I 输入层到隐藏层:Xhidden=Winput−hidden.I
隐藏层输出矩阵: O h i d d e n = s i g m o i d ( X h i d d e n ) 隐藏层输出矩阵: O_{hidden} =sigmoid(X_{hidden}) 隐藏层输出矩阵:Ohidden=sigmoid(Xhidden)
输出层的组合调节输入信号: X o u t p u t = W h i d d e n − o u t p u t . O h i d d e n 输出层的组合调节输入信号: X_{output} = W_{hidden-output} . O_{hidden} 输出层的组合调节输入信号:Xoutput=Whidden−output.Ohidden
输出信号: O o u t p u t = s i g m o i d ( X o u t p u t ) 输出信号: O_{output} = sigmoid(X_{output}) 输出信号:Ooutput=sigmoid(Xoutput)
下一步,将神经网络的输出值与训练样本中的输出值进行比较,计算出误差。我们需要利用这个误差值来调整神经网络本身,进而改进神经网络的输出值。
多个输出节点反向传播误差
- 将输出误差标记为 e o u t p u t e_{output} eoutput,将在输出层和隐藏层之间的链接权重标记为 w h o w_{ho} who。通过将误差值按权重的比利进行分割,我们计算出与每条链接相关的特定误差值。将与隐藏层节点相关联的这些误差标记为 e h i d d e n e_{hidden} ehidden,再次将这些误差按照输入层和隐藏层之间的链接权重 w i h w_{ih} wih进行分割。
- 但是,对于隐藏层的节点,我们没有目标值或希望的输出值。我们只有最终输出层节点的目标值,这个目标值来自于训练样本数据。
实际上,我们可以重组这两个链接的误差,形成这个节点的误差(可以理解为过程中误差),如下图所示:
e h i d d e n , 1 e_{hidden,1} ehidden,1 = 链接 w 1 , 1 w_{1,1} w1,1和链接 w 1 , 2 w_{1,2} w1,2上的分割误差之和
= e o u t p u t , 1 ∗ w 1 , 1 w 1 , 1 + w 2 , 1 e_{output,1} * \frac{w_{1,1}}{w_{1,1} + w_{2,1}} eoutput,1∗w1,1+w2,1w1,1 + e o u t p u t , 2 ∗ w 1 , 2 w 1 , 2 + w 2 , 2 e_{output,2} * \frac{w_{1,2}}{w_{1,2} + w_{2,2}} eoutput,2∗w1,2+w