[ 导读 ] 我们从鸟类那里得到启发,学会了飞翔,从牛蒡那里得到启发,发明了魔术贴,还有很多其他的发明都是被自然所启发。这么说来看看大脑的组成,并期望因此而得到启发来构建智能机器就显得很合乎逻辑了。这也是人工神经网络 ( ANN ) 思想的根本来源。不过,虽然飞机的发明受鸟类的启发,但是它并不用扇动翅膀来飞翔。同样,人工神经网络和它的生物版本也有很大差异。甚至有些研究者认为应该放弃对生物类比的使用 ( 比如,称其为"单元"而不是"神经元" ),以免我们将创造力限制在生物学上。
人工神经网络是深度学习的核心。它们用途广泛,功能强大且可扩展,使其非常适合处理大型和高度复杂的机器学习任务,例如对数十亿张图像进行分类 ( 例如Google Images ),为语音识别服务 ( 例如Apple的Siri ) 提供支持,每天向成千上万的用户推荐 ( 例如YouTube ) 观看的最佳视频,或学习在围棋游戏 ( DeepMind的AlphaGo ) 中击败世界冠军。
那么这一切都起源自哪里呢?让我来看看人工神经网络是如何发展的!下面开始我们今天介绍的核心:
从生物学到神经元
令人惊讶的是,人工神经网络已经存在很长一段时间了:它们于1943年由神经生理学家沃伦·麦卡洛克 ( Warren McCulloch ) 和数学家沃尔特·皮茨 ( Walter Pitts ) 首次提出。McCulloch和Pitts在其具有里程碑意义的论文"神经活动中固有的逻辑演算"中,提出了一种简化的计算模型,该模型计算了生物神经元如何在动物大脑中协同工作,利用命题逻辑进行复杂的计算。这是第一个人工神经网络架构。从那时起,我们看到许多其他架构被发明出来。
人工神经网络的早期成功导致人们普遍相信,我们很快将与真正的智能机器进行对话。当在1960年代我们清楚地知道不能兑现了这一承诺 ( 至少相当长一段时间 ) 后,资金流向了其他地方,人工神经网络进入了漫长的冬天。在1980年代初期,发明了新的体系结构,并开发了更好的训练技术,从而激发了人们对连接主义 ( 对神经网络的研究 ) 的兴趣。但是进展缓慢,到了1990年代,发明了其他强大的机器学习技术,例如支持向量机。这些技术似乎比人工神经网络提供了更好的结果和更坚实的理论基础,神经网络的研究再次被搁置。
我们现在目睹了对人工神经网络的另一波兴趣。这波浪潮会像以前一样消灭吗?好吧,这里有一些充分的理由使我们相信这次是不同的,人们对人工神经网络的重新有兴趣将对我们的生活产生更深远的影响:
现在有大量数据可用于训练神经网络,并且在非常大和复杂的问题上,人工神经网络通常优于其他机器学习技术。
自1990年代以来,计算能力的飞速增长使得现在有可能在合理的时间内训练大型神经网络。这部分是由于摩尔定律(集成电路中的器件数量在过去的50年中,每两年大约增加一倍),这还要归功于游戏产业,这刺激了数百万计强大的GPU卡的生产。此外,云平台已使所有人都可以使用这个功能。
训练算法已得到改进。公平地说,它们仅与1990年代使用的略有不同,但是这些相对较小的调整产生了巨大的积极影响。
在实践中,人工神经网络的一些理论局限性被证明是良性的。例如,许多人认为ANN训练算法注定要失败,因为它们可能会陷入局部最优解,但事实证明,这在实践中相当罕见 ( 而且在这种情况下,它们通常与全局最优解相当接近 )。
人工神经网络似乎已经进入了资金和发展的良性循环。基于人工神经网络的好产品会成为头条新闻,这吸引了越来越多的关注和资金,从而产生了越来越多的进步甚至惊人的产品。
01、生物神经元
在讨论人工神经元之前,让我们快速看一下生物神经元 ( 图1 )。它是一种看起来不寻常的细胞,主要存在于动物的大脑中。它由包含核和大多数细胞复杂成分的细胞体组成,其中许多分支延伸称为树突,再加上一个很长的延伸称为轴突。轴突的长度可能比细胞体长几倍,或者长几万倍。轴突在其末端附近分裂成许多分支,称为端粒,在这些分支的顶端是称为突触末端 ( 或简称为突触 ) 的微小结构,与其他神经元的树突或细胞体相连。
生物神经元产生短的电脉冲称为动作电位 ( AP,或只是信号 ),它们沿着轴突传播,使突触释放称为神经递质的化学信号。当神经元在几毫秒内接收到足够数量的这些神经递质时,它会激发自己的电脉冲 ( 实际上,它取决于神经递质,因为其中一些会抑制神经元的发射 )。
图1. 生物神经元
因此,单个生物神经元的行为似乎很简单,但是它们组成了数十亿个庞大的网络,每个神经元都与数千个其他神经元相连。高度复杂的计算可以通过相当简单的神经元网络来执行,就像复杂的蚁丘可以通过简单蚂蚁的共同努力而出现一样。生物神经网络 ( BNNs ) 的架构仍是活跃的研究主题,但大脑的某些部分已被绘制成图,似乎神经元通常组织成连续的层,尤其是在大脑皮层中 ( 大脑的外层 ),如图2所示。
图2. 生物神经网络 ( 人类皮层 ) 中的很多层
02、神经元的逻辑计算
McCulloch和Pitts提出了一个非常简单的生物神经元模型,该模型后来被称为神经元:它具有一个或多个二进制 ( 开/关 ) 输入和一个二进制输出。当超过一定数量的输入处于激活状态时,人工神经元将激活其输出。在他们的论文中,表明即使使用这样的简化模型,也可以构建一个人工神经元网络来计算所需的任何逻辑命题。
为了了解这种网络的工作原理,让我们构建一些执行各种逻辑计算的ANN ( 图3 ),假设神经元的至少两个输入处于激活状态时,神经元就会被激活。
图3. ANNs 执行简单的逻辑运算
让我们看看这些网络的作用:
左边的第一个网络是恒等函数:如果神经元A被激活,那么神经元C也被激活 ( 因为它从神经元A接收到两个输入信号 );但是如果神经元A关闭,那么神经元C也关闭。
第二个网络执行逻辑AND:仅当神经元A和B都被激活 ( 单个输入信号不足以激活神经元C ) 时,神经元C才被激活。
第三个网络执行逻辑OR:如果神经元A或神经元B被激活 ( 或两者都激活 ),则神经元C被激活。
最后,如果我们假设输入连接可以抑制神经元的活动 ( 生物神经元就是这种情况 ),则第四网络计算出一个稍微复杂的逻辑命题:只有在神经元A处于活动状态和神经元B关闭时,神经元C才被激活。如果神经元A一直处于活动状态,那么你会得到逻辑非:神经元B关闭时神经元C处于活动状态,反之亦然。
你可以想象如何将这些网络组合起来以计算复杂的逻辑表达式。
03、感知器
感知器是最简单的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使得可以同时为多个实例高效地计算出一层人工神经元的输出。
公式2 计算全连接层的输出
在此等式中:
与往常一样,X代表输入特征的矩阵。每个实例一行,每个特征一列。
权重矩阵W包含除偏置神经元外的所有连接权重。在该层中,每个输入神经元一行,每个人工神经元一列。
偏置向量b包含偏置神经元和人工神经元之间的所有连接权重。每个人工神经元有一个偏置项。
函数φ称为激活函数:当人工神经元是TLU时,它是阶跃函数 ( 但我们在后面会讨论其他激活函数 )。
那么,感知器如何训练?Rosenblatt提出的感知器训练算法在很大程度上受Hebb规则启发。唐纳德·赫布 ( Donald Hebb ) 在其1949年的《行为组织》 ( Wiley ) 中提出,当一个生物神经元经常触发另一个神经元时,这两个神经元之间的联系就会增强。后来,Siegrid Lowel用有名的措辞概括了赫布的思想,即"触发的细胞,连接在一起"。也就是说,两个神经元同时触发时,它们之间的连接权重会增加。该规则后来被称为Hebb规则 ( 或Hebb学习 )。使用此规则的变体训练感知器,该变体考虑了网络进行预测时所犯的错误;感知器学习规则加强了有助于减少错误的连接。更具体地说,感知器一次被送入一个训练实例,并且针对每个实例进行预测。对于产生错误预测的每个输出神经元,它会增强来自输入的连接权重,这些权重将有助于正确的预测。该规则如公式3所示。
公式3. 感知器学习规则 ( 权重更新 )
在此等式中:
Wi,j是第i个输入神经元和第j个输出神经元之间的连接权重。
xi是当前训练实例的第i个输入值。
y^j是当前训练实例的第j个输出神经元的输出。
yj是当前训练实例的第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)] # petal length, petal width
y = (iris.target == 0).astype(np.int) # Iris setosa?
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问题!
图6. XOR分类问题和解决该问题的MLP
04、多层感知器和反向传播
MLP由一层 ( 直通 ) 输入层,一层或多层TLU ( 称为隐藏层 ) 和一个TLU的最后一层 ( 称为输出层 ) 组成 ( 请参见图7 )。靠近输入层的层通常称为较低层,靠近输出层的层通常称为较高层。除输出层外的每一层都包含一个偏置神经元,并完全连接到下一层。
图10-7. 具有两个输入,有四个神经元的一个隐藏层和三个输出神经元的多层感知器的结构 ( 此处显示了偏置神经元,但通常是隐含的 )
信号仅沿一个方向 ( 从输入到输出 ) 流动,因此该结构是前馈神经网络 ( FNN ) 的例子。
当一个ANN包含一个深层的隐藏层时,它称为深层神经网络 ( DNN )。深度学习领域研究DNN,更广泛地讲包含深度计算堆栈的模型。即便如此,只要涉及神经网络 ( 甚至是浅层的神经网络 ),许多人就会谈论深度学习。
多年来,研究人员一直在努力寻找一种训练MLP的方法,但没有成功。但在1986年,大卫·鲁梅尔哈特 ( David Rumelhart ),杰弗里·欣顿 ( Geoffrey Hinton ) 和罗纳德·威廉姆斯 ( Ronald Williams ) 出版了开创性的论文介绍了反向传播训练算法,该算法至今仍在使用。简而言之,它是使用有效的技术自动计算梯度下降:在仅两次通过网络的过程中 ( 一次前向,一次反向 ),反向传播算法能够针对每个模型参数计算网络误差的梯度。换句话说,它可以找出应如何调整每个连接权重和每个偏置项以减少误差。一旦获得了这些梯度,它便会执行常规的梯度下降步骤,然后重复整个过程,直到网络收敛到有解。
自动计算梯度称为自动微分,或者audodiff 。有各种autodiff技术,各有优缺点。反向传播使用的一种称为反向模式。它快速而精确,并且非常适用于微分函数具有多个变量
( 例如,连接权重 ) 和少量输出 ( 例如,一个损失 ) 的情况。
让我们更详细地介绍一下该算法:
它一次处理一个小批量 ( 例如,每次包含32个实例 ),并且多次遍历整个训练集。每次遍历都称为一个轮次。
每个小批量都传递到网络的输入层,然后将其送到第一个隐藏层。然后该算法将计算该层中所有神经元的输出 ( 对于小批量中的每个实例 )。结果传递到下一层,计算其输出并传递到下一层,以此类推,直到获得最后一层的输出,即输出层。这就是前向通路:就像进行预测一样,只是保留了所有中间结果,因为反向遍历需要它们。
接下来,该算法测量网络的输出误差 ( 该算法使用一种损失函数,该函数将网络的期望输出与实际输出进行比较,并返回一些误差测量值 )。
然后,它计算每个输出连接对错误的贡献程度。通过应用链式法则 ( 可能是微积分中最基本的规则 ) 来进行分析,从而使此步骤变得快速而精确。
然后,算法再次使用链式法则来测量这些错误贡献中有多少是来自下面层中每个连接的错误贡献,算法一直进行,到达输入层为止。如前所述,这种反向传递通过在网络中向后传播误差梯度,从而有效地测量了网络中所有连接权重上的误差梯度 ( 因此称为算法 )。
最终,该算法执行梯度下降步骤,使用刚刚计算出的误差梯度来调整网络中的所有连接权重。
该算法非常重要,值得再次总结:对于每个训练实例,反向传播算法首先进行预测 ( 正向传递 ) 并测量误差,然后反向经过每个层以测量来自每个连接的误差贡献 ( 反向传递 ),最后调整连接权重以减少错误 ( 梯度下降步骤 )。
随机初始化所有隐藏层的连接权重很重要,否则训练将失败。例如,如果将所有权重和偏置初始化为零,则给定层中的所有神经元将完全相同,因此反向传播将以完全相同的方式影响它们,因此它们将保持相同。换句话说,尽管每层有数百个神经元,但是你的模型会像每层只有一个神经元一样工作:不会太聪明。相反,如果你随机初始化权重,则会破坏对称性,并允许反向传播来训练各种各样的神经元。
为了使该算法正常工作,作者对MLP的体系结构进行了重要更改:他们将阶跃函数替换为逻辑函数 ( sigmoid ),σ(z) = 1 / (1 + exp(–z))。这一点很重要,因为阶跃函数仅包含平坦段,因此没有梯度可使用 ( 梯度下降不能在平面上移动 ),而逻辑函数在各处均具有定义明确的非零导数,从而使梯度下降在每一步都可以有所进展。实际上,反向传播算法可以与许多其他激活函数 ( 不仅是逻辑函数 ) 一起很好地工作。这是另外两个受欢迎的选择:
双曲正切函数:tanh(z) = 2σ(2z) – 1
与逻辑函数一样,该激活函数为S形,连续且可微,但其输出值范围为-1至1 ( 而不是逻辑函数的从0到1 )。在训练开始时,该范围倾向于使每一层的输出或多或少地以0为中心,这通常有助于加快收敛速度。
线性整流单位函数:ReLU(z) = max(0, z)
ReLU函数是连续的,但不幸的是,在z = 0时,该函数不可微分 ( 斜率会突然变化,这可能使梯度下降反弹 ),并且其导数为0 如果z<0。但是,实际上它运行良好并且具有计算快速的优点,因此它已成为默认值< span="">。最重要的是,它没有最大输出值这一事实有助于减少"梯度下降"期间的某些问题。
这些流行的激活函数及其派生函数如图8所示。可是等等!为什么我们首先需要激活函数?好吧,如果你连接多个线性变换,那么你得到的只是一个线性变换。例如,如果f(x) = 2x + 3且g(x) = 5x – 1,则连接这两个线性函数可以得到另一个线性函数:f(g(x))= 2 ( 5x – 1 ) + 3 = 10x +1。因此,如果层之间没有非线性,那么即使是很深的层堆叠也等同于单个层,因此你无法解决非常复杂的问题。相反,具有非线性激活的足够大的DNN理论上可以近似任何连续函数。
图8. 激活函数及其派生
好!你知道神经网络来自何处,其结构是什么以及如何计算其输出。你还了解了反向传播算法。
但是,你到底可以使用它们做什么呢?我们将在下次分享~
——以上内容摘自《机器学习实战:基于Scikit-Learn、Keras和TensorFlow(原书第2版)》一书,经出版方授权发布,参考资料请见原书。
点点为数据派THU的粉丝们争取了5本赠书福利!欢迎小伙伴儿在下方留言区说出想要获得赠书的理由,我们将为点赞数最高(截止到2020年10月24日中午12点)的5位读者免费送上此书~小编会联系你们哦!
《机器学习实战:基于Scikit-Learn、Keras和TensorFlow(原书第2版)》
国外AI"四大名著"之一!AI霸榜书重磅更新!"美亚"AI+神经网络+CV三大畅销榜首图书,基于TensorFlow 2和新版Scikit-Learn全面升级,内容增加近一倍!前谷歌工程师撰写,Keras之父和TensorFlow移动端负责人鼎力推荐,从实践出发,手把手教你从零开始搭建起一个神经网络。
编辑:于腾凯