量化百科

【深度学习之美13】多层网络是如何解决“异或”问题的?

由ypyu创建,最终由ypyu 被浏览 7 用户

“too young,too simple的感知机

现在我们都知道,深度学习是一个包括很多隐含层的复杂网络结构。感知机之所以当年搞不定“非线性可分”问题,也是因为相比于深度学习这个“老江湖”,是因为它“too young,too simple(太年轻,太简单)”。当时,“感知机”刚刚诞生不久,如初生之婴儿,你也很难期望这么一个襁褓之娃复杂起来。

如前文所述,想解决“异或”问题,就需要让网络复杂起来。这是因为,复杂的网络,表征能力就比较强[1]。按照这个思路,可以在输入层和输出层之间,添加一层神经元,将其称之为隐含层(hidden layer,亦有文献简称为“隐藏层”、“隐层”,后文不再区分这三个称谓)。这样一来,隐含层和输出层中的神经元都拥有激活函数。假设各个神经元的阈值均为0.5,权值如图8-1所示,就实现了“异或”功能(在后续的章节中,我们会给出多层感知机解决“异或”问题的Python实战案例)。

图8-1 可解决“异或”问题的两层感知机

解决异或问题的方案

下面我们来详述这个实现流程。假设在如图8-1-(a)所示的神经元(即实心圆),其激活函数依然是阶跃函数(即sgn函数),它的输出规则非常简单:当 ![x \ge 0]时,

$f(x)$

输出为1,否则输出0。

那么,对于和相同(假设均为1)时,神经元对隐层节点1和2的权重分别为_w_1=1和_w_2=-1,神经元对隐层节点1和2的权重分别为_w_3=-1和_w_4=1。于是,对于在隐层的神经元1来说,其输出可以表述为:

$\begin{array}{l} {f_1} = {\mathop{\rm sgn}} ({x_1}{w_1} + {x_2}{w_2} - \theta ) \ {\rm{ }} = {\mathop{\rm sgn}} (1 \times 1 + 1 \times ( - 1) - 0.5) \ {\rm{ }} = {\mathop{\rm sgn}} ( - 0.5) \ {\rm{ }} = 0 \ \end{array}$

类似地,对于在隐层的神经元2有:

$\begin{array}{l} {f_2} = {\mathop{\rm sgn}} ({x_1}{w_3} + {x_2}{w_4} - \theta ) \ {\rm{ }} = {\mathop{\rm sgn}} (1 \times ( - 1) + 1 \times 1 - 0.5) \ {\rm{ }} = {\mathop{\rm sgn}} ( - 0.5) \ {\rm{ }} = 0 \ \end{array}$

然后,对于输出层的输出神经元3而言,这时_f_1和_f_2是它的输入,于是有:

$\begin{array}{l} y = {f_3} = {\mathop{\rm sgn}} ({f_1}{w_5} + {f_2}{w_6} - \theta ) \ {\rm{ }} = {\mathop{\rm sgn}} (0 \times 1 + 0 \times (1) - 0.5) \ {\rm{ }} = {\mathop{\rm sgn}} ( - 0.5) \ {\rm{ }} = 0 \ \end{array}$

也就是说,_x_1和_x_2同为1时,输出为0,满足了“异或”的功能。读者朋友也可以尝试推导一下,_x_1和_x_2同为0时的情况,这个简单的两层感知机输出为0,也就是说满足“异或”的功能。

那么对于_x_1和_x_2不相同(假设_x_1=1时,_x_2=0)时,对于在隐含层的神经元1有:

$\begin{array}{l} {f_1} = {\mathop{\rm sgn}} ({x_1}{w_1} + {x_2}{w_2} - \theta ) \ {\rm{ }} = {\mathop{\rm sgn}} (1 \times 1 + 0 \times ( - 1) - 0.5) \ {\rm{ }} = {\mathop{\rm sgn}} (0.5) \ {\rm{ }} = 1 \ \end{array}$

类似地,对于在隐含层的神经元2有:

$\begin{array}{l} {f_2} = {\mathop{\rm sgn}} ({x_1}{w_3} + {x_2}{w_4} - \theta ) \ {\rm{ }} = {\mathop{\rm sgn}} (1 \times ( - 1) + 0 \times 1 - 0.5) \ {\rm{ }} = {\mathop{\rm sgn}} ( - 1.5) \ {\rm{ }} = 0 \ \end{array} $

然后,对于输出层的神经元3而言,_f_1和_f_2是它的输入,于是有:

$\begin{array}{l} y = {f_3} = {\mathop{\rm sgn}} ({f_1}{w_5} + {f_2}{w_6} - \theta ) \ {\rm{ }} = {\mathop{\rm sgn}} (1 \times 1 + 0 \times 0 - 0.5) \ {\rm{ }} = {\mathop{\rm sgn}} (0.5) \ {\rm{ }} = 1 \ \end{array}$

不失一般性,由于_x_1和_x_2的地位是可以互换的。也就是说,当_x_1和_x_2取值不同时,感知机输出为1。因此,从上面分析可知,如图8-1所示的两层感知机,可以实现“异或”功能。在这里,网络中的权值和阈值是我们事先给定的,而实际上,它们是需要神经网络自己通过反复地“试错”学习而来,而且能够完成“异或”功能的网络权重也不是唯一的。在后续的章节中,我们会讲到后向传播(也叫反向传播)算法(BP),然后给与相应的实战演示。

“冤死”的罗森布拉特

下面,让我们再简单回顾一下神经网络的发展历史。1958年,弗兰克·罗森布拉特(Frank Rosenblatt)提出“感知机”(Perceptron)的概念。

1965年,A. G.伊瓦赫年科(Alexey Grigorevich Ivakhnenko)就提出了多层人工神经网络的设想。回想一下,1971 年 7 月 11 日,罗森布拉特在自己的生日那天,离奇溺水身亡。有人猜测,罗是被明斯基“怼”死的。而如果有人提前注意到几年前伊瓦赫年科的工作,用多层感知机就能解决异或问题,就不会让明斯基如此发飙,而让罗如此难堪。罗之死,多少有点冤啊。

而这种基于多层神经网络的机器学习模型,后来被人们称为“深度学习”。简单来说,所谓深度学习,就是包括很多隐含层的神经网络学习。

这里的“深”即意味着“层深”(’Deep’ means many hidden layers),“网络深深深几许”呢?至少要大于3吧,多则不限,可以成百甚至上千。

所以,你看到了吧,如果追根溯源的话,伊瓦赫年科才是“深度学习”之父,而不是现在的“深度学习”大牛杰弗里•辛顿(Geoffrey Hinton),但鉴于辛顿的杰出贡献——是他让“深度学习”重见天日、大放异彩。因此,称呼辛顿为“深度学习教父(Godfather of deep learning)”,似乎也更为合适。

更需要我们玩味的是,在多层神经网络概念提出4年之后的1969年,明斯基才写出来他的那本“毒苹果”之作《感知机》。也就是说,多层神经网络在提出之后,并没有受到应有的重视。

直到1975年(此时,距离伊瓦赫年科提出多层神经网络概念已达10年之久了),感知机的“异或难题”才被理论界彻底解决。由此,见微知著可以看到,科学技术的发展,从来都不是线性地一蹴而就,而是呈现螺旋上升的!

我们现在学习这个“异或”解决方案,可能仅需要数分钟,但也真是“书上一分钟,书后十年功”!


\

标签

深度学习深度学习算法