1.9 使用矩阵乘法的三层神经网络示例
我们还没有演示过使用矩阵进行计算得到经由神经网络馈送的信号,我们也没有演示过多于2层的神经网络示例。在这个示例中,我们需要观察如何处理中间层的输出以作为最后第三层的输入,因此这个示例一定非常有趣。
下图显示了具有3层、每层具有3个节点的神经网络示例。为了保证图的清晰,我们并没有标上所有的权重。
此处,我们要向大家介绍一些常用的术语。正如我们所知道的,第一层为输入层,最后一层为输出层,中间层我们称之为隐藏层。虽然隐藏层听起来很神秘、很黑暗,但是很遗憾,我们这样称呼中间层,其理由并不神秘。中间层的输出不需要很明显地表示为输出,因此我们称之为“隐藏”层。当然,这个解释有点牵强,然而,我们对这个名称没有更好的解释了。
让我们演示一下图中所描述的示例网络。我们观察到了3个输入是0.9、0.1和0.8。因此,输入矩阵I 为:
这很简单。这是输入层所做的所有事情,就是表示输入,因此我们已经完成了第一层输入层。
接下来是中间的隐藏层。在这里,我们需要计算出输入到中间层每个节点的组合(调节)信号。请记住,中间隐藏层的每个节点都与输入层的每个节点相连,因此每个节点都得到输入信号的部分信息。我们不想再像先前那样做大量的计算,我们希望尝试这种矩阵的方法。
正如我们刚才看到的,输入到中间层的组合调节信号为X = W •I ,其中I 为输入信号矩阵,W 为权重矩阵。这个神经网络的I 、W 是什么样的呢?图中显示了这个神经网络的一些权重,但是并没有显示所有的权重。下图显示了所有的权重,同样,这些数字是随机列举的。在这个示例中,权重没有什么特殊的含义。
你可以看到,第一个输入节点和中间隐藏层第一个节点之间的权重为w 1,1 = 0.9,正如上图中的神经网络所示。同样,你可以看到输入的第二节点和隐藏层的第二节点之间的链接的权重为w 2,2 = 0.8。图中并没有显示输入层的第三个节点和隐藏层的第一个节点之间的链接,我们随机编了一个权重w 3,1 = 0.4。
但是等等,为什么这个W 的下标我们写的是“input_hidden”呢?这是因为W input_hidden 是输入层和隐藏层之间的权重。我们需要另一个权重矩阵来表示隐藏层和输出层之间的链接,这个矩阵我们称之为W hidden_output 。
下图显示的是第二个矩阵W hidden_output ,如先前一样,矩阵中填写了权重。举个例子,同样你可以看到,隐藏层第三个节点和输出层第三个节点之间链接的权重为w 3,3 = 0.9。
太棒了,我们已经得到了排列整齐的权重矩阵。
让我们一起继续算出输入到隐藏层的组合调节输入值。我们应该给这个输入值一个名称,考虑到这个组合输入是到中间层,而不是最终层,因此,我们将它称为X hidden 。
X hidden = W input_hidden • I
此处我们不打算进行完整的矩阵乘法运算,因为那正是矩阵的用武之地。我们希望使用计算机进行费力的数字运算。计算出的答案如下图所示。
我使用计算机进行了这个工作,在本书的第2章,我们将一同学习如何使用Python编程语言进行这项工作。现在,我们不希望由于计算机软件而分心,因此我们暂时不进行这个工作。
我们已经拥有了输入到中间隐藏层的组合调节输入值,它们为1.16、0.42和0.62。我们使用矩阵这个工具来完成这种复杂的工作,这是值得我们自豪的一个成就。
让我们可视化这些输入到第二层隐藏层的组合调节输入。
虽然到目前为止,一切都还顺利,但是,我们还有更多的工作要做。我们对这些节点应用了S激活函数,使得节点对信号的反应更像自然界中节点的反应,你应该记得这一点吧!因此,现在,我们进行这个操作:
O hidden = sigmoid( X hidden )
在X hidden 层中的元素上应用S函数,生成中间隐藏层输出矩阵。
让我们检查第一个元素,确定一下过程。S函数为y = 1 /(1 + e -x ),因此,当x = 1.16时,e -1.16 是0.3135。这意味着y = 1 /(1 + 0.3135)= 0.761。
你会看到,S函数的值域在0和1之间,所有的值都处在这个区间。如果你回头看看逻辑函数的图形,也可以直观地看到这一点。
唷!让我们再次暂停,看看我们已经完成的事情。当信号通过中间层时,我们对这些信号进行了计算,也就是说我们计算出了中间层的输出值。这个过程是非常清晰的,也就是应用激活函数到中间层的组合输入信号上。让我们使用这个新信息,更新下图。
如果这只是一个两层的神经网络,那么这些就是第二层的输出值,我们现在就可以停止计算了。但是,由于还有第三层,我们不能在此处停止计算。
我们如何处理通过第三层的信号呢?我们可以采用与处理第二层信号相同的方式进行处理,这没有任何实质的区别。我们仍然可以得到第三层的输入信号,就像我们得到第二层的输入信号一样。我们依然使用激活函数,使得节点的反应与我们在自然界中所见到的一样。因此,需要记住的事情是,不管有多少层神经网络,我们都“一视同仁”,即组合输入信号,应用链接权重调节这些输入信号,应用激活函数,生成这些层的输出信号。我们不在乎是在计算第3层、第53层或是第103层的信号,使用的方法如出一辙。
因此,让我们扬帆起航,与我们以前所做的一样,继续计算最终层的组合调节输入X = W •I 。
这一层的输入信号是第二层的输出信号,也就是我们刚刚解出的O hidden 。所使用的权重就是第二层和第三层之间的链接权重W hidden_output ,而不是第一层和第二层之间的链接权重。因此,我们得到:
X output = W hidden_output • O hidden
因此,使用同样的方式计算出这个矩阵,这样我们得到了最后一层输出层的组合调节输出信号。
现在,更新示意图,展示我们的进展,从初始输入信号开始,前馈信号,并得到了最终层的组合输入信号。
剩下的工作就是应用S激活函数,这是很容易的一件事情。
成功就是这么的容易!我们得到了神经网络的最终输出信号。让我们也将其显示在图上。
因此,这个三层示例神经网络的最终输出信号为0.726、0.708和0.778。
我们成功追踪了神经网络中的信号,从信号进入神经网络,通过神经网络的各层,并得到了最终输出层的输出信号。
现在,我们应该做些什么呢?
下一步,将神经网络的输出值与训练样本中的输出值进行比较,计算出误差。我们需要使用这个误差值来调整神经网络本身,进而改进神经网络的输出值。
这可能是最难以理解的事情,因此,随着我们继续学习本书,我们将会如春风细雨般详细阐述这个思想。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论