
2.2.3 多层神经网络
感知器是最简单的神经网络,也就是只有一个神经单元的单层神经网络,但是实际上,神经网络可以是较多层的复杂结构。
图2-21神经网络是一个经典的神经网络,包含三个层次的神经网络。最前面的是输入层,最后面的是输出层,中间的叫隐藏层(也叫中间层)。输入层(Input Layer),接受大量非线性输入消息。输入的消息称为输入向量。输出层(Output Layer),消息在神经元链接中传输、分析、权衡,形成输出结果。隐藏层(Hidden Layer),是输入层和输出层之间,众多神经元和链接组成的层面。隐藏层可以有一层或多层,是具体进行分析的层。神经网络层之间的结果传递,会用到上一节我们学习到的激活函数。

图2-21 神经网络
通过之前的介绍,我们可以了解到,单个神经元接收一些输入,然后进行输出。简而言之,可以理解为如果我们认为输出有效,则认为这个神经元被“激活”。多层神经网络的工作原理也就是将单个感知器的工作原理进行拓展,一次输入后,有n个隐藏层的神经单元进行输出,最后达到输出层。
既然单层神经网络可以工作,为什么我们还需要多层神经网络呢?让我们仍然举一个实际的例子,对多层神经网络的工作原理进行讲解。在这个例子中,我们换一个主角:小红。小红看电影时,更加关注的是电影故事的类型。根据小红之前看电影的经历整理出表格,见表2-3。
表2-3 数据表

表格的前三列分别表示电影是否为剧情片、科幻片、喜剧片,最后一列表示小红是否去观看了电影。那么当决策源为[0,1,0]类型,也就是单纯的科幻片类型时,小红是否会去看电影呢?让我们将决策源拆开对比一下。
从表2-4可以看出,电影是否是剧情片对小红的决策几乎没有影响,而电影如果是科幻类型或喜剧类型,对是否观看电影则有决定性的影响。这呈现出异或的关系。异或是一个逻辑上的运算符,当两个条件都为真,或者都为假的时候,计算结果为假。只有当条件是一真一假的时候,计算结果才为真。在这个例子中的表现就是,当电影类型是科幻片,或者喜剧片的时候,小红就会去看电影。当电影类型既不是科幻片,也不是喜剧片的时候,小红可能不去看电影。并且,当前电影类型是科幻喜剧片的时候,小红则不喜欢这种组合,也不会去看电影。所以,按人脑根据之前决策的分析,如果电影类型是单纯的科幻片,小红应该有较大的概率会去看电影。接下来,试试神经网络能否得出同样的结论。如果按之前的单神经元单层神经网络设计,则构建的神经网络为(见图2-22单层神经网络)。
表2-4 决策源


图2-22 单层神经网络
仍然按照之前的计算方法,经过训练可以得到,w1≈0,w2≈0,w3≈0,也就是三个权重值都接近0。如果将预测的决策设为[0,1,0],也就是单纯的科幻片时,代入神经网络中,经过激活函数后,得到的概率是50%,这让人很难判断小红到底去不去看电影,并且,代入之前已知决策结果数据为[1,1,0],也就是如果是科幻剧情片,小红去看电影的概率,神经网络得出的计算结果仍然是50%。这说明单个神经元的单层神经网络,也就是感知器无法解决有异或条件的问题。
这也是人工智能领域的泰斗Minsky(见图2-23)对使用神经网络持有批判态度的原因。Minsky在1969年出版了一本叫Perceptron的书,里面用详细的数学证明了感知器的弱点,尤其是感知器对XOR(异或)这样的简单分类任务都无法解决的弱点。Minsky认为,如果将计算层增加到两层,计算量过大,而且没有有效的学习算法。所以,当时他认为研究更深层的网络是没有价值的,这直接导致了人工智能研究的一次寒冬。

图2-23 Minsky
Minsky当时受限于计算机性能的问题,认为两层神经网络计算量太大没有使用价值,但实际上,目前的计算机已经可以比较容易地进行两层神经网络的计算,利用GPU集群加速,深度学习的神经网络已经达到几十层,神经元个数可以达到百万个。
如图2-24所示,这是以小红看电影为例子搭建的多层神经网络。相比单层单感知器的神经网络,这个多层神经网络有两层5个感知器。其中,隐藏层有4个感知器,接受输入层的输入数据,经过和单层神经网络类似的训练方式后,将结果输出到输出层。输出层再进行一次运算得到最终的结果。当然,多层神经网络隐藏层的层数和每一层的神经元个数,是可以根据问题具体调整的,并不是一个确切的规定。

图2-24 多层神经网络
单个感知器无法处理异或问题的最大原因就是,计算公式z=a1*W1+a2*W2+a3*3是一个线性关系公式,是无法体现异或的运算结果的。同时,也只有W1,W2,W3三个权重可以调整,那么上图的多层神经网络有多少个权重值呢?答案参见表2-5。
表2-5 多层权重值

从表2-5可以看到,从输入层到隐藏层4个神经元,每个神经元都有3条线,一共有3×4=12个权重值,而隐藏层到输出层,有4条线,也代表有4个权重值。所以,这个简单的多层神经网络一共有16个权重值可以调整,比起之前的简单神经网络多了5倍以上。隐藏层的4个神经元,每个神经元接受3个输入的决策数据源,一共得到4个输出,这4个输出数据再和隐藏层到输出的4条线上的权重值进行计算,得到最终的输出。
多层神经网络有两个重要的过程:
① 将输入层的结果经过神经网络传递,得到输出层的结果;
② 用输出层的结果计算误差,反向通过神经网络传递,调整权重。
这两个过程有许多的方法可以实现。例如,最为广泛使用的BP(Back Propagation)神经网络,其原理是通过数学上微分的方法来对神经网络中的误差进行传播的。这里先略过繁复的数学证明,先通过实际计算来体会BP神经网络的工作原理。
第一步,数据集获取。
和只有一个神经元的神经网络一样,多层神经网络首先需要将数据抽象为容易计算的矩阵,见图2-25。

图2-25 数据集获取
第二步,权重初始化。
尽管本节所讲的案例中多层神经网络的权重值有15个,但在训练前,仍然是先通过随机的方式对所有权重进行初始化的。
第三步,前向传播(FP)。
多层神经网络的前向传播是单个神经元的拓展,每个神经元依然通过
Output=Sigmoid(a1×W1+a2×W 2+a3×W 3)
公式计算出Z,然后经过Sigmoid函数得到输出(output),见图2-26。

图2-26 多层神经网络的前向传播
而多个神经元也代表着权重如前表2-5所示,不再是W1,W2,W3,而是分为两组。将输入层简写为L0,隐藏层简写为L1,输出层简写为L2。那么权重值矩阵w01,表示L0三个神经元与L1四个神经元之间的12条线,即一个3×4共12个值的矩阵。而w12,则表示L1四个神经元与L2一个神经元之间的4条线,即一个4×1共4个值的矩阵。神经网络的最终计算目的,就是计算出合适的W01与W02,来预测小红的下一步行动。
如图2-27向前传输的计算所示,前向传播的过程简述如下:决策源L0点乘权重值矩阵W01,得到在隐藏层L1的输出,一个4×4的矩阵(4×4的原因是输入的决策源是一次输入4次的),接着使用L1点乘权重值矩阵W12,得到当前权重值下的预测结果,即输出层L2的结果,一个4×1的矩阵,代表对之前4次决策源的预测结果,接下来,就可以使用预测结果矩阵与实际决策矩阵对比来获得误差了。

图2-27 向前传输的计算
第四步,反向传播(BP)。
有了误差后,就需要将误差反向传播,修正W01与W02的权重值,以期望获得接近实际决策的预测结果。这个过程与单层单神经元比起来,要复杂得多,这里将分开讲解。
如图2-28计算隐藏神经元所示,与单个神经元的神经网络类似,首先还是通过预测结果与实际决策的差值,计算出误差矩阵,得到调整方向,再通过预测结果矩阵求导,得到调整步伐大小,两者相乘,得到W12_detal,也就是整体隐藏层输出需要调整的大小,再通过与隐藏层输出矩阵相乘,得到每个隐藏层神经单元需要调整的幅度,并最终作用在W12权重值的调整上。

图2-28 计算隐藏神经元
接下来,对输入层到隐藏层的W01权重值进行调整,在隐藏层到输出层W12的权重值调整过程中,采用了预测结果与实际决策之间的误差作为参数调整的依据。在对W12的调整中,会采用之前计算得到的W12_detal点乘W12T得到的值作为W01的误差值。这里的取值方式正是BP神经网络的精华所在,其原理是微分与梯度下降。在不涉及具体数学原理的基础上进行理解就是,W12_detal是前一层神经网络权重需要调整的幅度,而W12是前一层神经网络当前权重,这两个矩阵相乘,可以反映W12希望调整的值。而这个值越大,说明隐藏层的输出需要调整的空间越大,也就是误差越大。反之亦然,这个值就是下一层神经网络反向传播给当前层的误差。具体过程如图2-29所示。

图2-29 调整权重值
求得W01误差值后,和前一层类似,可以计算得到权重值需要调整的具体数值,并作用在权重值矩阵上,完成当前层的权重值调整,这就是一个两层bp神经网络一次误差反向的过程,见图2-30。

图2-30 反向传播
第五步,多次训练。
一次训练调整的W01与W02权重值矩阵,还无法满足预测的需求,所以需要反复使用决策源作为训练集进行神经网络的训练。多次训练结束后,我们再来观察一下多层神经网络,对于小红面临决策[0,1,0],也就是单纯的科幻片时,神经网络给出的答案是95%,也就是小红非常有可能去观看这部电影。我们具体来看下,这个决策过程中,神经网络是如何进行判断的。
从图2-31可以看到,在输入决策源[0,1,0]下,隐藏层L1中的神经元值各不相同,如果将大于0.5阈值的神经元称为被激活,那么这个例子中隐藏层就有两个神经元被激活了,再根据W12的值,得到小红会去看电影的结论。

图2-31 多次训练
再举一个小红之前遇到过的决策[1,1,1],也就是科幻喜剧剧情片。按人脑的分析,科幻与喜剧元素同时出现时,小红不会去看电影,将数据输入神经网络。
如图2-32所示,这次神经网络只有一个神经元被激活,输出结果为0.06,也就是小红只有6%的概率会去看电影,这种情况可以认为小红不会去看电影,和小红的实际决策类似。因此,可以看到,当加入隐藏层的4个神经元后,多层神经网络的表现能力大大增强。

图2-32 多次训练