在上一篇文章 神经网络学习2【分类器+升华至神经元 搭建神经网络】中由浅入深的理解了从分类器开始如何理解神经网络的内部计算。
接下来我们借用数学工具去逐步推导其计算公式,并同时建立出Python代码框架。
1.神经网络计算流程公式推导
1.1两层神经网络计算
尝试使用只有两层、每层两个神经元的较小的神经网络,来演示神经网络如何工作:

两个输入值分别为1.0和0.5,每个节点使用激活函数。使用一些随机权重:

第一层仅作输入层,不需要使用激活函数。
第二层中需要做一些计算,以及使用激活函数,当然,在这个简单的网络里,它也做输出层。计算好后就输出。鉴于它处在这张网里,它会得到的是组合的输入。

与上张图对照,a、b、c即为输入x,权重w。
我们观察到有两个指入的箭头在层2的第一个节点,故在计算其输入的时候,其总和输入值x =(1.0 * 0.9)+(0.5 * 0.3)= 1.05。
计算该节点的输出。答案为y = 1 /(1 + 0.3499)= 1/ 1.3499。因此,y = 0.7408。
权重是神经网络进行学习的内容,这些权重持续进行优化,得到越来越好的结果。
同理,层2的第二个节点的总和输入值x =(1.0 * 0.2)+(0.5 * 0.8)= 0.6。
使用S激活函数y = 1/(1 + 0.5488) = 1/1.5488计算节点输出,得到y = 0.6457。
至此,对于节点的组合输入我们可以总结出一个较为一般的公式:
x = ( 第一个节点的输出 * 链接权重 ) + (第二个节点的输出 * 链接权重 )

1.2 引入矩阵乘法计算多层神经网络
如果说我们使用3层甚至更多层的神经网络,那么哪怕是使用计算机,这样步骤多的计算也看起来非常的繁琐。但是如果再仔细观察,是否会发现如果我们把它写成不同的形式,这样的计算有点熟悉的感觉?
运用矩阵的点乘:

第一个矩阵包含两层节点之间的权重。第二个矩阵包含第一层输入层的信号。通过两个矩阵相乘,我们得到的答案是输入到第二层节点组合调节后的信号。

这不就是我们刚才进行过的计算?却只需要一个式子就可以轻松表达出来。如果说现在它的方便之处感觉还不太明显的话,动手试着搭建一个类似的三层神经网络,它的便利之处就可以大大体现出来了!
X = W •I
W 是权重矩阵,I 是输入矩阵,X 是组合调节后的信号。
更便利的是,如果使用矩阵乘法来帮助我们计算,在程序中,我们只需要用import命令告诉Python,去借助numpy模块进行计算。numpy模块包含了例如数组这样有用的工具以及使用这些工具的进行计算的能力。
最后再使用激活函数即可,并不需要矩阵乘法。
我们所需做的,是对矩阵X 的每个单独元素应用S函数y = 1 /(1 + e^(-x ))。
激活函数只是简单地应用阈值,使反应变得更像是在生物神经元中观察到的行为。因此,来自第二层的最终输出是:O = sigmoid ( X )
1.通过神经网络向前馈送信号所需的大量运算可以表示为矩阵乘法。
2.不管神经网络的规模多大,将输入输出表达为矩阵乘法,使得我们可以更简洁地进行书写。
1.3 使用矩阵乘法的三层神经网络示例
具有3层、每层具有3个节点的神经网络示例:

第一层为输入层,最后一层为输出层,中间层我们称之为隐藏层。
输入矩阵I 为:

接下来是中间的隐藏层。需要计算出输入到中间层每个节点的组合(调节)信号。隐藏层输入的链接权重矩阵:

本文深入介绍了神经网络的计算流程,从两层神经网络的计算开始,逐步推导出矩阵乘法在多层神经网络中的应用。通过Python类和对象,建立了神经网络的初始化、训练和查询函数框架。在初始化函数中,利用numpy生成随机权重矩阵,并定义Sigmoid激活函数。查询函数则实现了输入信号的前向传播计算,包括隐藏层和输出层的激活。文章强调了矩阵乘法在简化大规模神经网络计算中的重要性,并为后续的误差反向传播和权重更新奠定了基础。
最低0.47元/天 解锁文章
3198

被折叠的 条评论
为什么被折叠?



