[翻译]神经网络简介
人工神经网络(ANN)是一种计算模型,受人脑中生物神经网络处理信息方式的启发。由于人工神经网络在语音识别、计算机视觉和文本处理等领域取得了许多突破性的成果,所以吸引了机器学习研究和工业界的极大兴趣。在这篇博客文章中,我们将尝试开发一种特殊的人工神经网络,称为多层感知器。
单个神经元
神经网络的基本计算单位是神经元,通常称为节点或单元。它从其他一些节点或外部源接收输入并计算输出。每个输入都有一个关联的权重(w),该权重根据对比当前的输入与其他输入的重要性来分配。节点通过函数f(定义如下),得到所有输入的加权和:
上述网络将数值型的X1,X2,以及他们对应的w1,w2作为输入。另外,还有另一个输入(1),它与权重b(称为偏置的)是一个组合。我们稍后会了解更多关于偏置的作用。
神经元的输出Y,其计算如图1所示。函数f是非线性的,称为激活函数。激活函数的目的是将非线性引入神经元的输出。这一点很重要,因为现实中很多数据都是非线性的,我们希望各神经元也能学到这些非线性的表示。每一个激活函数(或非线性函数)取一个数字并对其执行某个固定的数学运算,在实际中可能会遇到以下几种激活功能:
-
Sigmoid: 接受实值输入并将其压缩到0到1之间(takes a real-valued input and squashes it to range between 0 and 1)
σ(x) = 1 / (1 + exp(−x))
-
tanh: 接受实值输入并将其压缩到[-1,1]的范围(takes a real-valued input and squashes it to the range [-1, 1])
tanh(x) = 2σ(2x) − 1
-
ReLU: ReLU代表整流线性单元。它接受实值输入并将其阈值设为零(将负值替换为零)(ReLU stands for Rectified Linear Unit. It takes a real-valued input and thresholds it at zero (replaces negative values with zero))
f(x) = max(0, x)
下图显示了上述各激活函数。
偏置的重要性:偏置的主要作用是为每个节点提供可训练的常量值(除节点的常规输入外)。偏置在神经元中的作用请参阅此处。The main function of Bias is to provide every node with a trainable constant value (in addition to the normal inputs that the node receives). See this link to learn more about the role of bias in a neuron.
前馈神经网络
前馈神经网络是第一个也是最简单的人工神经网络。它包含多层排列的多个神经元(节点)。相邻层的节点之间有连接或边。所有这些连接都有与其相关联的权重。
前馈神经网络的示例如图3所示。
前馈神经网络可以由三种类型的节点组成:
- 输入节点 – 输入节点从外部向网络提供信息,并统称为“输入层”。在任何输入节点中都不执行计算——它们只是将信息传递给隐藏的节点。
- 隐藏节点 – 隐藏节点与外部没有直接连接(因此称为“隐藏”)。它们执行计算并将信息从输入节点传输到输出节点。隐藏节点的集合形成一个“隐藏层”。虽然前馈网络只有一个输入层和一个输出层,但它可以有零个或多个隐藏层。
- 输出节点 – 输出节点统称为“输出层”,负责计算并将信息从网络传输到外部。
在一个前馈网络中,信息从输入节点、隐藏节点(如果有的话)和输出节点仅向一个方(向前)移动。在网络中没有循环( There are no cycles or loops )(前馈网络的这一特性不同于节点之间的连接形成循环的递归神经网络)。
前馈网络的两个例子:
-
单层感知器 – 这是最简单的前馈神经网络,不包含任何隐藏层。你可以通过这些内容(维基百科、单层神经网络(感知器)、单层感知器、加权网络-感知器)了解有关单层感知器的更多信息。
-
多层感知器 – 多层感知器有一个或多个隐藏层。我们下面只讨论多层感知器,因为它们比单层感知器在今天的实际应用中更有用。
多层感知器
多层感知器(MLP)包含一个或多个隐藏层(除了一个输入层和一个输出层)。单层感知器只能学习线性函数,多层感知器也可以学习非线性函数。
图4显示了具有单个隐藏层的多层感知器。请注意,所有连接都有与其关联的权重,但图中仅显示三个权重(w0、w1、w2)。
输入层: 输入层有三个节点。偏置节点的值为1。其他两个节点将X1和X2作为外部输入(这是取决于输入数据集的数值)。如上所述,在输入层中不执行计算,因此来自输入层中节点的输出分别为1、X1和X2,它们被传递到隐藏层中。
隐藏层: 隐藏层也有三个节点,偏置节点的输出为1。隐藏层中其他两个节点的输出取决于输入层(1、X1、X2)的输出以及与连接(边)相关联的权重。图4显示了一个隐藏节点输出的计算(突出显示)。类似地,可以计算来自其他隐藏节点的输出。其中,f是指激活函数。然后,这些输出被传递到输出层中的节点。
输出层:输出层有两个节点,这两个节点从隐藏层接收输入并执行类似的计算,如突出显示的隐藏节点所示。作为这些计算结果的计算值(Y1和Y2)充当多层感知器的输出。
给定一组特征X=(x1,x2,…)和一个目标y,多层感知器可以学习特征和目标之间的关系,用于分类或回归。
让我们以一个例子来更好地理解多层感知器。假设我们有以下学生成绩数据集:
这两个输入列显示了学生学习的小时数和学生获得的期中成绩。“最终结果”列可以有两个值1或0,指示学生是否在期末考试中通过。例如,我们可以看到,如果学生学习了35个小时,在期中取得了67分,他/她最终通过了期末考试。
现在,假设我们想预测一个学习25小时,期中成绩70分的学生是否能通过期末考试。
这是一个二分类问题,多层感知器可以从给定的例子(训练数据)中学习,并在给定一个新的数据点时进行通知预测。下面我们将看到多层感知器如何学习这种关系。
训练MLP:反向传播算法
多层感知器学习的过程称为反向传播算法。我建议你读一下Hemanth Kumar (quoted below)的Quora(引述如下),它清楚地解释了反向传播。
误差的反向传播,通常简称为反向传播,是训练人工神经网络(ANN)的几种方法之一。它是一个有监督的训练方法,也就是说,它从有标签的训练数据中学习(有一个监督者,来指导它的学习)。
简而言之,反向传播就像“从错误中学习”。当ANN出错时,监测器会对其进行修正。
神经网络由不同层次的节点组成:输入层、中间隐藏层和输出层。相邻层节点之间的连接具有与其关联的“权重”。学习的目的是为这些边分配正确的权重。给定一个输入向量,这些权重决定了输出向量是什么。
在监督学习中,训练集是有标记的。这意味着,对于某些给定的输入,我们知道期望/预期的输出(标签)。
反向传播算法:
最初,所有的边权重都是随机分配的。对于训练数据集中的每一个输入,ANN被激活并观察其输出。将此输出与我们已知的所需输出进行比较,并将错误“传播”回上一层。注意到该误差,并相应地“调整”权重。重复该过程,直到输出误差低于预定阈值。一旦上述算法终止,我们就有了一个“学习之后的”ANN,我们认为它已经准备好处理“新”输入。这个ANN就是从一些例子(有标记的数据)和它们的错误(误差传播)中学习到的。
现在我们已经了解了反向传播的工作原理,让我们回到上面的学生成绩数据集。
如图5所示的多层感知器(改编自Sebastian Raschka对反向传播算法的优秀的视觉解释)在输入层中有两个节点(除了偏置节点),这两个节点接受输入的“学习时间”和“中期标记”。它还有一个带有两个节点的隐藏层(除了偏置节点)。输出层也有两个节点——上方的节点输出“通过”的概率,下方的节点输出“失败”的概率。
在分类任务中,我们通常在多层感知器的输出层使用一个Softmax函数作为激活函数,以确保输出是概率的,并且它们相加为1。Softmax函数接受一个任意实值得分向量,并将其压缩为一个介于零和一之和的值向量。所以,本例中,
概率(通过)+概率(失败)=1
第一步:正向传播
网络中的所有权重都是随机分配的。以图5隐藏层中标记为V的节点为例,假设从输入到该节点的连接的权重为w1、w2和w3(如图所示)。
然后,网络将第一个训练示例作为输入(对于输入35和67,通过的概率为1)。
- 向网络中输入 = [35, 67]
- 期望网络的输出(目标) = [1, 0]
然后,从节点V的输出可以计算如下(f是激活函数,例如sigmoid):
V = f (1*w1 + 35*w2 + 67*w3)
类似地,计算来自隐藏层中其他节点的输出。隐藏层中两个节点的输出,充当输出层中两个节点的输入。这使得我们能够计算输出层中两个节点的输出概率。
假设输出层中两个节点的输出概率分别为0.4和0.6(因为权重是随机分配的,所以输出也是随机的)。我们可以看到,计算出的概率(0.4和0.6)与期望的概率(分别为1和0)相去甚远,因此图5中的网络被称为“错误输出”。
步骤2:反向传播和权重更新
我们计算输出节点的总误差,并使用反向传播来计算梯度,将这些误差传播回网络。然后采用梯度下降等优化方法对网络中的所有权值进行调整,以减小输出层的误差。如下图6所示(暂时忽略图中的数学方程式)。
假设与该节点相关联的新权重是w4、w5和w6(在反向传播和调整权重之后)。
如果我们现在再次将同一个例子输入到网络中,网络的性能应该会比以前更好,因为现在已经调整了权重以最小化预测中的错误。如图7所示,与之前的误差[0.6,-0.4]相比,输出节点的误差现在减少到了[0.2,-0.2]。这意味着我们的网络已经学会正确分类我们的第一个训练示例。
我们用数据集中的所有其他训练示例重复此过程。然后,我们的网络也就学会了这些例子。
如果我们现在想预测一个学习25小时,期中成绩为70分的学生是否能通过最后一个学期,我们就要通过前向传播步骤,找到通过和失败的输出概率。
在这里,我避免了数学方程和对“梯度下降”等概念的解释,而是试图为算法发展一种直觉。有关反向传播算法的数学讨论,请参阅此处。
多层感知器的3D可视化
Adam Harley创建了一个多层感知器的3D可视化(3d visualization),该感知器已在MNIST手写数字数据库上进行了训练(使用反向传播)。该网络将784(28x 28)个像素值作为手写数字的图像的输入(在输入层中有784个节点对应于像素)。网络在第一隐藏层有300个节点,在第二隐藏层有100个节点,在输出层有10个节点(对应10位数字)。
尽管这里描述的网络比我们在前一节中讨论的网络要大得多(使用更多的隐藏层和节点),但是前向传播步骤和后向传播步骤中的所有计算都是以与前面讨论的相同的方式(在每个节点上)完成的。
图8显示了输入为数字“5”时的网络。
输出值比其他节点高的节点用较亮的颜色表示。在输入层中,明亮的节点是那些接收较高数值像素值作为输入的节点。注意,在输出层中,唯一亮的节点对应于数字5(它的输出概率为1,高于其他9个输出概率为0的节点)。这表示MLP已正确地对输入数字进行了分类。在此建议您用这种可视化并观察不同层节点之间的连接。
深层神经网络
- What is the difference between deep learning and usual machine learning?
- What is the difference between a neural network and a deep neural network?
- How is deep learning different from multilayer perceptron?
结论
为了便于理解,我跳过了一些概念的重要细节。我建议通过第1部分,第2部分,第3部分和斯坦福大学神经网络教程中的研究案例,彻底了解多层感知器。
注:本文中使用的所有图像和动画的版权都归下面参考文献中对应作者所有。
References
- Artificial Neuron Models
- Neural Networks Part 1: Setting up the Architecture (Stanford CNN Tutorial)
- Wikipedia article on Feed Forward Neural Network
- Wikipedia article on Perceptron
- Single-layer Neural Networks (Perceptrons)
- Single Layer Perceptrons
- Weighted Networks – The Perceptron
- Neural network models (supervised) (scikit learn documentation)
- What does the hidden layer in a neural network compute?
- How to choose the number of hidden layers and nodes in a feedforward neural network?
- Crash Introduction to Artificial Neural Networks
- Why the BIAS is necessary in ANN? Should we have separate BIAS for each layer?
- Basic Neural Network Tutorial – Theory
- Neural Networks Demystified (Video Series): Part 1, Welch Labs @ MLconf SF
- A. W. Harley, “An Interactive Node-Link Visualization of Convolutional Neural Networks,” in ISVC, pages 867-877, 2015 (link)