转载于 :
机器学习实战
[ 导读 ]
我们从鸟类那里得到启发,学会了飞翔,从牛蒡那里得到启发,发明了魔术贴,还有很多其他的发明都是被自然所启发。这么说来看看大脑的组成,并期望因此而得到启发来构建智能机器就显得很合乎逻辑了。这也是人工神经网络 ( ANN ) 思想的根本来源。不过,虽然飞机的发明受鸟类的启发,但是它并不用扇动翅膀来飞翔。同样,人工神经网络和它的生物版本也有很大差异。甚至有些研究者认为应该放弃对生物类比的使用 ( 比如,称其为"单元"而不是"神经元" ),以免我们将创造力限制在生物学上。
人工神经网络是深度学习的核心。它们用途广泛,功能强大且可扩展,使其非常适合处理大型和高度复杂的机器学习任务,例如对数十亿张图像进行分类 ( 例如Google Images ),为语音识别服务 ( 例如Apple的Siri ) 提供支持,每天向成千上万的用户推荐 ( 例如YouTube ) 观看的最佳视频,或学习在围棋游戏 ( DeepMind的AlphaGo ) 中击败世界冠军。
那么这一切都起源自哪里呢?让我来看看人工神经网络是如何发展的!下面开始我们今天介绍的核心:
从生物学到神经元
令人惊讶的是,人工神经网络已经存在很长一段时间了:它们于1943年由神经生理学家沃伦·麦卡洛克 ( Warren McCulloch ) 和数学家沃尔特·皮茨 ( Walter Pitts ) 首次提出。McCulloch和Pitts在其具有里程碑意义的论文"神经活动中固有的逻辑演算"中,提出了一种简化的计算模型,该模型计算了生物神经元如何在动物大脑中协同工作,利用命题逻辑进行复杂的计算。这是第一个人工神经网络架构。从那时起,我们看到许多其他架构被发明出来。
人工神经网络的早期成功导致人们普遍相信,我们很快将与真正的智能机器进行对话。当在1960年代我们清楚地知道不能兑现了这一承诺 ( 至少相当长一段时间 ) 后,资金流向了其他地方,人工神经网络进入了漫长的冬天。在1980年代初期,发明了新的体系结构,并开发了更好的训练技术,从而激发了人们对连接主义 ( 对神经网络的研究 ) 的兴趣。但是进展缓慢,到了1990年代,发明了其他强大的机器学习技术,例如支持向量机。这些技术似乎比人工神经网络提供了更好的结果和更坚实的理论基础,神经网络的研究再次被搁置。
我们现在目睹了对人工神经网络的另一波兴趣。这波浪潮会像以前一样消灭吗?好吧,这里有一些充分的理由使我们相信这次是不同的,人们对人工神经网络的重新有兴趣将对我们的生活产生更深远的影响:
-
现在有大量数据可用于训练神经网络,并且在非常大和复杂的问题上,人工神经网络通常优于其他机器学习技术。
-
自1990年代以来,计算能力的飞速增长使得现在有可能在合理的时间内训练大型神经网络。这部分是由于摩尔定律(集成电路中的器件数量在过去的50年中,每两年大约增加一倍),这还要归功于游戏产业,这刺激了数百万计强大的GPU卡的生产。此外,云平台已使所有人都可以使用这个功能。
-
训练算法已得到改进。公平地说,它们仅与1990年代使用的略有不同,但是这些相对较小的调整产生了巨大的积极影响。
-
在实践中,人工神经网络的一些理论局限性被证明是良性的。例如,许多人认为ANN训练算法注定要失败,因为它们可能会陷入局部最优解,但事实证明,这在实践中相当罕见 ( 而且在这种情况下,它们通常与全局最优解相当接近 )。
-
人工神经网络似乎已经进入了资金和发展的良性循环。基于人工神经网络的好产品会成为头条新闻,这吸引了越来越多的关注和资金,从而产生了越来越多的进步甚至惊人的产品。
在讨论人工神经元之前,让我们快速看一下生物神经元 ( 图1 )。它是一种看起来不寻常的细胞,主要存在于动物的大脑中。它由包含核和大多数细胞复杂成分的细胞体组成,其中许多分支延伸称为树突,再加上一个很长的延伸称为轴突。轴突的长度可能比细胞体长几倍,或者长几万倍。轴突在其末端附近分裂成许多分支,称为端粒,在这些分支的顶端是称为突触末端 ( 或简称为突触 ) 的微小结构,与其他神经元的树突或细胞体相连。
生物神经元产生短的电脉冲称为动作电位 ( AP,或只是信号 ),它们沿着轴突传播,使突触释放称为神经递质的化学信号。当神经元在几毫秒内接收到足够数量的这些神经递质时,它会激发自己的电脉冲 ( 实际上,它取决于神经递质,因为其中一些会抑制神经元的发射 )。
图1. 生物神经元
因此,单个生物神经元的行为似乎很简单,但是它们组成了数十亿个庞大的网络,每个神经元都与数千个其他神经元相连。高度复杂的计算可以通过相当简单的神经元网络来执行,就像复杂的蚁丘可以通过简单蚂蚁的共同努力而出现一样。生物神经网络 ( BNNs ) 的架构仍是活跃的研究主题,但大脑的某些部分已被绘制成图,似乎神经元通常组织成连续的层,尤其是在大脑皮层中 ( 大脑的外层 ),如图2所示。
图2. 生物神经网络 ( 人类皮层 ) 中的很多层
McCulloch和Pitts提出了一个非常简单的生物神经元模型,该模型后来被称为神经元:它具有一个或多个二进制 ( 开/关 ) 输入和一个二进制输出。当超过一定数量的输入处于激活状态时,人工神经元将激活其输出。在他们的论文中,表明即使使用这样的简化模型,也可以构建一个人工神经元网络来计算所需的任何逻辑命题。
为了了解这种网络的工作原理,让我们构建一些执行各种逻辑计算的ANN ( 图3 ),假设神经元的至少两个输入处于激活状态时,神经元就会被激活。
-
左边的第一个网络是恒等函数:如果神经元A被激活,那么神经元C也被激活 ( 因为它从神经元A接收到两个输入信号 );但是如果神经元A关闭,那么神经元C也关闭。
-
第二个网络执行逻辑AND:仅当神经元A和B都被激活 ( 单个输入信号不足以激活神经元C ) 时,神经元C才被激活。
-
第三个网络执行逻辑OR:如果神经元A或神经元B被激活 ( 或两者都激活 ),则神经元C被激活。
-
最后,如果我们假设输入连接可以抑制神经元的活动 ( 生物神经元就是这种情况 ),则第四网络计算出一个稍微复杂的逻辑命题:只有在神经元A处于活动状态和神经元B关闭时,神经元C才被激活。如果神经元A一直处于活动状态,那么你会得到逻辑非:神经元B关闭时神经元C处于活动状态,反之亦然。
你可以想象如何将这些网络组合起来以计算复杂的逻辑表达式。
感知器是最简单的ANN架构之一,由Frank Rosenblatt于1957年发明。它基于稍微不同的人工神经元 ( 见图4 ),称为阈值逻辑单元 ( TLU ),有时也称为线性阈值单元 ( LTU )。输入和输出是数字 ( 而不是二进制开/关值 ),并且每个输入连接都与权重相关联。TLU计算其输入的加权总和 ( z = w1x1 + w2x2 + … + wnxn = xTw ),然后将阶跃函数应用于该和并输出结果:hw(x) = step(z),其中z = xTw。
图4. 阈值逻辑单元:人工神经元,计算其输入的加权和,然后应用阶跃函数
感知器中最常用的阶跃函数是Heaviside阶跃函数 ( 见公式1 )。有时使用符号函数代替。
公式1. 感知器中使用的常见阶跃函数 ( 假设阈值=0 )
单个TLU可用于简单的线性二进制分类。它计算输入的线性组合,如果结果超过阈值,则输出正类。否则,它将输出负类 ( 就像逻辑回归或线性SVM分类器一样 )。例如,你可以使用单个TLU根据花瓣的长度和宽度对鸢尾花进行分类 ( 就像我们在前面的章节中所做的那样,还添加了额外的偏移特征x0=1 )。在这种情况下,训练TLU意味着找到w0,w1和w2的正确值 ( 稍后将讨论训练算法 )。
感知器仅由单层TLU 组成,每个TLU连接到所有的输入。当一层中的所有神经元都连接到上一层中的每个神经元 ( 即其输入神经元 ) 时,该层称为全连接层或密集层。感知器的输入被送到称为输入神经元的特殊直通神经元:它们输出被送入的任何输入。所有输入神经元形成输入层。此外,通常会添加一个额外的偏置特征 ( x0 = 1 ):通常使用一种称为"偏置神经元"的特殊类型的神经元来表示该特征,该神经元始终输出1。具有两个输入和三个输出的感知器如图5所示。该感知器可以将实例同时分为三个不同的二进制类,这使其成为多输出分类器。
图5. 具有两个输入神经元,一个偏置神经元和三个输出神经元的感知器的结构
借助线性代数的魔力,公式10-2使得可以同时为多个实例高效地计算出一层人工神经元的输出。
-
与往常一样,X代表输入特征的矩阵。每个实例一行,每个特征一列。
-
权重矩阵W包含除偏置神经元外的所有连接权重。在该层中,每个输入神经元一行,每个人工神经元一列。
-
偏置向量b包含偏置神经元和人工神经元之间的所有连接权重。每个人工神经元有一个偏置项。
-
函数φ称为激活函数:当人工神经元是TLU时,它是阶跃函数 ( 但我们在后面会讨论其他激活函数 )。
那么,感知器如何训练?Rosenblatt提出的感知器训练算法在很大程度上受Hebb规则启发。唐纳德·赫布 ( Donald Hebb ) 在其1949年的《行为组织》 ( Wiley ) 中提出,当一个生物神经元经常触发另一个神经元时,这两个神经元之间的联系就会增强。后来,Siegrid Lowel用有名的措辞概括了赫布的思想,即"触发的细胞,连接在一起"。也就是说,两个神经元同时触发时,它们之间的连接权重会增加。该规则后来被称为Hebb规则 ( 或Hebb学习 )。使用此规则的变体训练感知器,该变体考虑了网络进行预测时所犯的错误;感知器学习规则加强了有助于减少错误的连接。更具体地说,感知器一次被送入一个训练实例,并且针对每个实例进行预测。对于产生错误预测的每个输出神经元,它会增强来自输入的连接权重,这些权重将有助于正确的预测。该规则如公式3所示。
-
Wi,j是第i个输入神经元和第j个输出神经元之间的连接权重。
-
-
y
j是当前训练实例的第j个输出神经元的输出。
-
-
每个输出神经元的决策边界都是线性的,因此感知器无法学习复杂的模式 ( 就像逻辑回归分类器一样 )。但是,如果训练实例是线性可分的,Rosenblatt证明了该算法将收敛到一个解。这被称为感知器收敛定理。
Scikit-Learn提供了一个Perceptron类,该类实现了单个TLU网络。它可以像你期望的那样使用,例如,在iris数据集上:
import numpy as np
from sklearn.datasets import load_iris
from sklearn.linear_model import Perceptron
iris = load_iris()
X = iris.data[:, (2, 3)]
y = (iris.target == 0).astype(np.int)
per_clf = Perceptron()
per_clf.fit(X, y)
y_pred = per_clf.predict([[2, 0.5]])
你可能已经注意到,感知器学习算法非常类似于随机梯度下降。实际上,Scikit-Learn的Perceptron类等效于使用具有以下超参数的SGDClassifier:loss =" perceptron",learning_rate ="constant",eta0 = 1 ( 学习率 ) 和penalty = None ( 无正则化 )。
请注意,与逻辑回归分类器相反,感知器不输出分类概率;相反,他们基于硬阈值进行预测。这是逻辑回归胜过感知器的原因。
Marvin Minsky和Seymour Papert在1969年的专着Perceptron中,特别指出了感知器的一些严重缺陷,即它们无法解决一些琐碎的问题 ( 例如,异或 ( XOR ) 分类问题;参见图6的左侧 )。任何其他线性分类模型 ( 例如逻辑回归分类器 ) 都是如此,但是研究人员对感知器的期望更高,有些人感到失望,他们完全放弃了神经网络,转而支持更高层次的问题,例如逻辑,解决问题和搜索。
事实证明,可以通过堆叠多个感知器来消除感知器的某些局限性。所得的ANN称为多层感知器 ( MLP )。MLP可以解决XOR问题,你可以通过计算图6右侧所示的MLP的输出来验证:输入 ( 0,0 ) 或 ( 1,1 ) ,网络输出0 ,输入 ( 0,1 ) 或 ( 1,0 ) 输出1。所有连接的权重等于1,但显示权重的四个连接除外。尝试验证该网络确实解决了XOR问题!
MLP由一层 ( 直通 ) 输入层,一层或多层TLU ( 称为隐藏层 ) 和一个TLU的最后一层 ( 称为输出层 ) 组成 ( 请参见图7 )。靠近输入层的层通常称为较低层,靠近输出层的层通常称为较高层。除输出层外的每一层都包含一个偏置神经元,并完全连接到下一层。
图10-7. 具有两个输入,有四个神经元的一个隐藏层和三个输出神经元的多层感知器的结构 ( 此处显示了偏置神经元,但通常是隐含的 )
信号仅沿一个方向 ( 从输入到输出 ) 流动,因此该结构是前馈神经网络 ( FNN ) 的例子。
当一个ANN包含一个深层的隐藏层时,它称为深层神经网络 ( DNN )。深度学习领域研究DNN,更广泛地讲包含深度计算堆栈的模型。即便如此,只要涉及神经网络 ( 甚至是浅层的神经网络 ),许多人就会谈论深度学习。