零基础入门深度学习(二):神经网络和反向传播算法

  为了计算节点4的输出值,我们必须先得到其所有上游节点(也就是节点1、2、3)的输出值。节点1、2、3是输入层的节点,所以,他们的输出值就是输入向量本身。按照上图画出的对应关系,可以看到节点1、2、3的输出值分别是X1,X2,X3。我们要求输入向量的维度和输入层神经元个数相同,而输入向量的某个元素对应到哪个输入节点是可以自由决定的,你偏非要把赋值给节点2也是完全没有问题的,但这样除了把自己弄晕之外,并没有什么价值。

  一旦我们有了节点1、2、3的输出值,我们就可以根据式1计算节点4的输出值a4:

  上式的W4b是节点4的偏置项,图中没有画出来。而W41,W42,W43分别为节点1、2、3到节点4连接的权重,在给权重Wji编号时,我们把目标节点的编号j 放在前面,把源节点的编号放在后面。

  同样,我们可以继续计算出节点5、6、7的输出值a5,a6,a7。这样,隐藏层的4个节点的输出值就计算完成了,我们就可以接着计算输出层的节点8的输出值y1:

同理,我们还可以计算出y2的值。这样输出层所有节点的输出值计算完毕,我们就得到了在输入向量

时,神经网络的输出向量

。这里我们也看到,输出向量的维度和输出层神经元个数相同。

  神经网络的矩阵表示

  神经网络的计算如果用矩阵来表示会很方便(当然逼格也更高),我们先来看看隐藏层的矩阵表示。

  首先我们把隐藏层4个节点的计算依次排列出来:

  接着,定义网络的输入向量和隐藏层每个节点的权重向量。令

  代入到前面的一组式子,得到:

  现在,我们把上述计算的四个式子写到一个矩阵里面,每个式子作为矩阵的一行,就可以利用矩阵来表示它们的计算了。令

  带入前面的一组式子,得到:

  在式2中,是激活函数,在本例中是sigmoid函数;W是某一层的权重矩阵;x是某层的输入向量;a是某层的输出向量。式2说明神经网络的每一层的作用实际上就是先将输入向量左乘一个数组进行线性变换,得到一个新的向量,然后再对这个向量逐元素应用一个激活函数。

  每一层的算法都是一样的。比如,对于包含一个输入层,一个输出层和三个隐藏层的神经网络,我们假设其权重矩阵分别为W1,W2,W3,W4,每个隐藏层的输出分别是a1,a2,a3,神经网络的输入为x,神经网络的输入为y,如下图所示:

  则每一层的输出向量的计算可以表示为:

  这就是神经网络输出值的计算方法。

  神经网络的训练

  现在,我们需要知道一个神经网络的每个连接上的权值是如何得到的。我们可以说神经网络是一个模型,那么这些权值就是模型的参数,也就是模型要学习的东西。然而,一个神经网络的连接方式、网络的层数、每层的节点数这些参数,则不是学习出来的,而是人为事先设置的。对于这些人为设置的参数,我们称之为超参数(Hyper-Parameters)。