人工神经网络(Artificial Neural Network,ANN)是一种计算模型,其灵感来自于人类大脑中生物神经网络处理信息的方式。由于在语音识别、计算机视觉和文本处理方面取得了许多突破性的成果,人工神经网络在机器学习研究和工业领域产生了许多令人兴奋的成果。在这篇博文中,我们将尝试去理解一种叫做多层感知机(Multi Layer Perceptron)的特殊类型的人工神经网络。

单个神经元

神经网络的基本计算单元是神经元(neuron),通常称为节点(node)或单元(unit)。它接收来自其他节点或外部源的输入并计算输出。每个输入都有一个相关的权重(weight,w),它是根据其相对于其他输入的重要性分配的。节点将函数f(定义如下)应用于其输入的加权和,如下图1所示:

图1: 单个神经元

上面的网络接受数值输入X1和X2,并具有与这些输入相关的权值w1和w2。此外,还有另一个与权重b相关的输入1(称为偏差,bias)。稍后我们将学习更多关于偏差(bias)作用的细节。

神经元输出的Y值如图1所示。函数f是非线性的,称为激活函数(Activation Function)。激活函数的作用是将非线性引入神经元的输出。这很重要,因为大多数真实世界的数据是非线性的,我们希望神经元学习这些非线性的表示。

每个激活函数(或非线性)取一个数字,并对其进行一定的固定数学运算[2]。在实践中你可能会遇到以下几种激活函数:

  • Sigmoid:获取实值输入并将其压缩到0到1之间;

σ ( x ) = 1 / ( 1 + e x p ( − x ) ) σ(x) = 1 / (1 + exp(−x)) σ(x)=1/(1+exp(x))

  • tanh:获取实值输入并将其压入范围[- 1,1];

t a n h ( x ) = 2 σ ( 2 x ) − 1 tanh(x) = 2σ(2x) − 1 tanh(x)=2σ(2x)1

  • ReLU:ReLU是经过整流的线性单元。它接受实值输入并将其阈值设置为0(将负值替换为0);

f ( x ) = m a x ( 0 , x ) f(x) = max(0, x) f(x)=max(0,x)

下面的图[2]显示了上述每个激活函数。

图2:不同的激活函数

偏差的重要性:偏差的主要功能是为每个节点提供一个可训练的常量值(除了节点接收的正常输入之外)。点击这个链接,了解更多关于偏差在神经元中的作用。

前馈神经网络

前馈神经网络是最早也是最简单的一种人工神经网络。它包含多层排列的神经元(节点)。相邻层的节点之间有连接或边缘。所有这些连接都有相应的权重。

一个前馈神经网络的例子如图3所示。

图3:前馈神经网络的一个例子

前馈神经网络可以包括三种类型的节点:

  1. 输入节点:输入节点向网络提供来自外部世界的信息,统称为“输入层”。在任何输入节点中都不执行计算—它们只是将信息传递给隐藏节点;
  2. 隐藏节点:隐藏节点与外部世界没有直接联系(因此得名“隐藏节点”)。它们执行计算并将信息从输入节点传输到输出节点。隐藏节点的集合形成一个“隐藏层”。前馈网络只有一个输入层和一个输出层,但它可以有0个或多个隐藏层;
  3. 输出节点:输出节点统称为“输出层”,负责计算和将信息从网络传输到外部世界。

在前馈网络中,信息仅在一个方向上向前移动,即从输入节点到隐藏节点(如果有)再到输出节点。网络中没有回环或循环[3](前馈网络的此属性不同于循环神经网络/Recurrent Neural Networks,在循环神经网络中,节点之间的连接形成一个循环)。

两个前馈网络的例子如下:

  1. 单层感知机:这是最简单的前馈神经网络[4],不包含任何隐含层。你可以在[4][5][6][7]中学到更多关于单层感知机的知识;
  2. 多层感知机:多层感知机有一个或多个隐藏层。下面我们将只讨论多层感知机,因为它们在今天的实际应用中比单层感知机更有用。

多层感知机

多层感知机(MLP)包含一个或多个隐藏层(除了一个输入层和一个输出层)。单层感知机只能学习线性函数,多层感知机也可以学习非线性函数。

图4显示了一个单层隐藏层的多层感知机。注意,所有连接都有与之关联的权值,但是图中只显示了三个权值(w0、w1、w2)。

  • 输入层:输入层有三个节点。偏差节点的值为1。其他两个节点将X1和X2作为外部输入(它们是取决于输入数据集的数值)。如前所述,输入层不进行计算,因此输入层节点的输出分别为1、X1、X2,输入到隐藏层;
  • 隐藏层:该隐层也有三个节点,偏置节点的输出为1。隐藏层中其他两个节点的输出取决于输入层的输出(1,X1, X2)以及与连接相关的权值(边)。图4显示了其中一个隐藏节点的输出计算(高亮显示)。类似地,可以计算其他隐藏节点的输出。记住f指的是激活函数。然后将这些输出提供给输出层中的节点;
图4:含有一个隐藏层的多层感知机
  • 输出层:输出层有两个节点,它们从隐藏层获取输入并执行类似的计算,如高亮显示的隐藏节点所示。计算得到的值(Y1和Y2)作为多层感知器的输出。

给定一组特征X = (x1, x2,…)和目标y,多层感知机可以学习特征和目标之间的关系,用于分类或回归。

让我们举个例子来更好地理解多层感知机。假设我们有以下学生分数数据集:

两个输入列显示了学生已经学习的小时数和学生获得的期中成绩。最终结果列可以有两个值1或0,表示学生是否通过了最后一学期。例如,我们可以看到,如果学生学习了35个小时,在期中考试中获得了67分,他/她最终通过了期末考试。

现在,假设我们想要预测一个学习了25个小时,期中成绩为70分的学生是否能通过期末考试。

这是一个二元分类问题,多层感知机可以从给定的例子(训练数据)中学习,并对给定的新数据做出有根据的预测。下面我们将看到多层感知机是如何学习这些关系的。

训练我们的MLP:反向传播算法

多层感知机学习的过程称为反向传播算法。我建议阅读Hemanth Kumar(引用如下)的Quora答案,它清楚地解释了反向传播。

误差的反向传播,通常缩写为BackProp,是人工神经网络(ANN)训练的几种方式之一。它是一种监督式的训练方案,也就是说,它从标记的训练数据中学习(有一个监督者来指导它的学习)。

简单来说,BackProp就像“从错误中学习”。每当ANN出现错误时,主管就会进行纠正。

神经网络由不同层次的节点组成:输入层、中间隐藏层和输出层。相邻层节点之间的连接有与之相关的“权值”。学习的目的是为这些边分配正确的权重。给定一个输入向量,这些权值决定了输出向量是什么。

在监督学习中,训练集被标记。这意味着,对于某些给定的输入,我们知道期望输出(标签)。

反向传播算法

一开始,所有的边的权值都是随机分配的。对于训练数据集中的每个输入,人工神经网络都被激活并观察其输出。将此输出与我们已经知道的期望输出进行比较,并将错误“传播”回前一层。这个错误会被记录下来,相应的调整权重。重复此过程,直到输出错误低于预定的阈值。

一旦上述算法终止,我们就有了一个“学习好的”ANN,我们认为它已经准备好使用“新的”输入。该ANN是从几个示例(标记数据)和错误(错误传播)中学到的。

现在我们已经了解了反向传播的工作原理,让我们回到上面显示的学生分数数据集。

图5所示的多层感知机(改编自Sebastian Raschka对反向传播算法的出色视觉解释)在输入层(除了偏差节点)有两个节点,它们接受输入“学习时间”和“期中成绩”。它还有一个包含两个节点的隐含层(除了偏差节点)。输出层也有两个节点,上面的节点输出“通过”的概率,下面的节点输出“不通过”的概率。

在分类任务中,我们通常使用一个Softmax函数作为多层感知机输出层的激活函数,以确保输出是概率,并且它们加起来是1。Softmax函数采用任意实值分数的向量,并且将其压缩为一个介于0和1之间且相加为一的值的向量。所以在这种情况下:

P r o b a b i l i t y ( P a s s ) + P r o b a b i l i t y ( F a i l ) = 1 Probability (Pass) + Probability (Fail) = 1 Probability(Pass)+Probability(Fail)=1

步骤1:前向传播

网络中的所有权值都是随机分配的。让我们考虑下面图5中标记为V的隐藏层节点。假设从输入到该节点的连接的权重为w1、w2和w3(如图所示)。

然后网络将第一个训练示例作为输入(我们知道对于输入35和67,通过的概率是1)。

  • 网络输入= [35,67];
  • 期望网络输出(目标)= [1,0]。

则所考虑节点的输出V可计算如下(f为激活函数,如sigmoid):

V = f ( 1 ∗ w 1 + 35 ∗ w 2 + 67 ∗ w 3 ) V = f (1*w1 + 35*w2 + 67*w3) V=f(1w1+35w2+67w3)

同样的,隐藏层中其他节点的输出也可以计算出来。隐藏层中两个节点的输出作为输出层中两个节点的输入。这使我们能够计算输出层中两个节点的输出概率。

假设输出层中两个节点的输出概率分别为0.4和0.6(由于权重是随机分配的,所以输出也是随机的)。我们可以看到,计算出的概率(0.4和0.6)与期望的概率(分别为1和0)相差甚远,因此图5中的网络具有“不正确的输出”。

图5:多层感知机中的正向传播步骤

步骤2:反向传播和权值更新

我们计算了输出节点的总误差,并通过网络使用反向传播来计算梯度。然后使用梯度下降等优化方法对网络中的所有权值进行“调整”,以减少输出层的误差。如下面的图6所示(暂时忽略图中的数学方程)。

假设与考虑的节点相关的新权值是w4、w5和w6(在反向传播和调整权值之后)。

图6:多层感知机中的反向传播和权值更新步骤

如果我们现在再次向网络输入相同的示例,网络应该会比以前表现得更好,因为现在已经调整了权值以最小化预测中的错误。如图7所示,输出节点上的错误现在减少到[0.2,-0.2],而之前是[0.6,-0.4]。这意味着我们的网络已经学会正确分类我们的第一个训练实例。

图7:现在MLP网络在相同输入上的性能更好

我们对数据集中的所有其他训练示例重复这个过程。然后,我们的网络就可以学习这些例子。

如果我们现在想要预测一个学习了25个小时、期中成绩为70分的学生是否能通过期末考试,我们通过正向传播步骤,找出通过和不通过的输出概率。

我在这里避免了数学方程和对“梯度下降”等概念的解释,而是试图对算法形成一种直觉。有关反向传播算法的更多数学讨论,请参阅此链接

多层感知器的三维可视化

Adam Harley创建了一个多层感知机的三维可视化系统,这个感知机已经在手写数字的MNIST数据库上进行了训练(使用反向传播)。

该网络采用784个数字像素值作为输入,这些值来自一个28×28的手写数字图像(在输入层中有对应于像素的784个节点)。网络第一个隐藏层有300个节点,第二个隐藏层有100个节点,输出层有10个节点(对应10位数字)[15]。

虽然这里描述的网络与我们在前一节中讨论的网络相比要大得多(使用了更多的隐藏层和节点),但是在正向传播步骤和反向传播步骤中的所有计算都是以与前面讨论的相同的方式(在每个节点上)完成的。

图8显示了输入为数字“5”时的网络。

图8:将输入为'5'的网络可视化

输出值比其他节点高的节点用较亮的颜色表示。在输入层,亮节点是接收较高数值像素值作为输入的节点。注意,在输出层中,唯一的亮节点对应数字5(它的输出概率为1,高于其他9个输出概率为0的节点),这表明MLP正确地分类了输入数字。我强烈建议你尝试一下这种可视化,并观察不同层的节点之间的连接。

深度神经网络

  1. What is the difference between deep learning and usual machine learning?
  2. What is the difference between a neural network and a deep neural network?
  3. How is deep learning different from multilayer perceptron?

总结

为了便于理解,本文跳过了本文中讨论的一些概念的重要细节。我建议大家复习一下斯坦福神经网络教程的第1、2、3部分和案例学习,以彻底理解多层感知机。

参考

  1. Artificial Neuron Models
  2. Neural Networks Part 1: Setting up the Architecture (Stanford CNN Tutorial)
  3. Wikipedia article on Feed Forward Neural Network
  4. Wikipedia article on Perceptron
  5. Single-layer Neural Networks (Perceptrons)
  6. Single Layer Perceptrons
  7. Weighted Networks – The Perceptron
  8. Neural network models (supervised) (scikit learn documentation)
  9. What does the hidden layer in a neural network compute?
  10. How to choose the number of hidden layers and nodes in a feedforward neural network?
  11. Crash Introduction to Artificial Neural Networks
  12. Why the BIAS is necessary in ANN? Should we have separate BIAS for each layer?
  13. Basic Neural Network Tutorial – Theory
  14. Neural Networks Demystified (Video Series): Part 1, Welch Labs @ MLconf SF
  15. A. W. Harley, “An Interactive Node-Link Visualization of Convolutional Neural Networks,” in ISVC, pages 867-877, 2015 (link)
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐