关键词:激活函数、多层感知器(MLP)
本文是一篇译文。
原文地址:https://ujjwalkarn.me/2016/08/09/quick-intro-neural-networks/
人工神经网络(ANN)是一种灵感来源于人脑生物神经网络处理信息的计算模型,由于在语音识别、计算机视觉和文本处理方面有许多突破性的成功,人工神经网络在机器学习研究和工业领域非常引人注目。在本篇博文中,我们将尝试了解人工神经网络中的多层感知器。
单个神经元
神经网络的基本计算单元为神经元(经常称为节点或单元)。它从其它节点或外部来源接收输入并计算输出。每个输入有一个相关权重(w),权重根据该输入相对于其它输入的重要性来确定。如下图 所示,节点对输入进行权重求和:
上面网络的输入为 X1 和 X2 ,W1 和 W2 分别为 X1 和 X2 的权重。此外,还有一个权重为 b (称为 Bias) 的输入 1 。 后面我们将讨论 Bias 的作用。
神经网络的输出 Y 通过图 1 所示的方法计算得到。函数f 是非线性的,称为激活函数。 激活函数的目的是向神经网络中引入非线性。真实生活数据是非线性的,我们需要神经网络学习这些非线性表示,因此激活函数很重要。
每个激活函数(或非线性化)的输入为单个数值,该函数将对该数值进行特性的数据操作。实际使用过程中,你可能会碰到几个激活函数:
-
sigmoid : 将输入压缩到 0 到 1 的范围:
\sigma(x)=1/(1+exp(-x))
-
tanh:将真实输入压缩到[-1,1]范围:
tanh(x)=2\sigma(2x)-1
-
ReLU: ReLU表示整流线性单元,将输入的阈值设为0(负值使用 0 代替):
f(x)=max(0,x)
下面的图片分别表示上面的激活函数。
Bias 的重要性:Bias 的主要功能在于为每个节点提供可训练的常量(除节点接收的输入之外)。更多关于神经元中 bias 的作用请参考此链接。
前馈神经网络
前馈神经网络是最早也是最简单的人工神经网络。它包括多层神经元(节点)。相邻层的节点之间有连接或边缘。所有这些连接都有权重。
图3是一个前馈神经网络的例子:
一个前馈神经网络包括三类节点:
输入节点: 输入节点将外部世界的信息传入神经网络,它们也被称为“输入层”。任何输入节点都不进行计算,它们只是将信息传入隐藏节点。
隐藏节点:隐藏节点与外部世界没有直接连接。它们进行计算并将信息从输入传到输出。隐藏节点集合构成了“隐藏层”,虽然一个前馈神经网络只有一个输入层和一个输出层,它可以有 0 到多个隐藏层。
输出节点:输出节点统称为“输出层”,负责计算和从网络向外界传输信息。
在一个前馈神经网络中,信息只在从输入经过隐藏层到输出的一个方向(前向)流动。网络中不包括循环(前馈网络的这种特性不同于循环神经网络,循环神经网络的节点之间的连接可以形成一个循环)。
下面是两个前馈神经网络的例子:
- 单层感知器:这是最简单的前馈神经网络,不包括任何隐藏层。你可以从[4]、[5]、[6]、[7]中了解更多关于单层感知器的知识。
- 多层感知器:多层感知器包含一个或多个隐藏层。由于多层感知器比单层感知器更适合今天的应用场景,我们下面仅讨论多层感知器。
多层感知器
一个多层感知器(MLP)包含一个或多个隐藏层(除了输入和输出)。一个单层感知器只能学习线性函数,多层感知器则可以学习非线性函数。
图 4 表示一个只有一个隐藏层的多层感知器。注意尽管图中只显示了三个权重(w0、w1、w2),实际所有连接都是有权重的。
输入层:输入层包括三个节点,Bias 节点的值为 1 。另外两个节点将 X1 和 X2 作为外部输入(依赖于输入数据集的数值)。正如我们前面提到的,输入层不进行计算,所以输入层结果的输出分别为 1、X1、X2,这三个值将被喂到隐藏层。
隐藏层:隐藏层也包括三个节点,其中 Bias 节点的输出为 1 ,其它两个节点的输出是输入层(1,X1,X2)和它们的权重的函数。图4 表示如何计算一个隐藏节点的输出。相似的,也可以使用同样的方法计算其它隐藏节点的输出。记住 f表示激活函数。这些输出将被喂到输出层。
输出层:输出层包含两个节点,这两个节点的输入来源于隐藏层并且进行与上图中高亮的隐藏层相似的计算。计算得到的 Y1 和 Y2 为多层感知器的计算结果。
假设特征集合 X=(x1,x2) 和一个目标 y ,一个多层感知器可以通过学习特征与目标之间的关系来进行分类或回归。
我们举一个例子来更好的了解多层感知器。假设我们有以下的学生成绩数据:
两个输入列表式学生学习的时间和期中考试成绩。最后一列的两个值 1 或 0 表示学生能够通过期末考试。例如,我们可以看到如果学生学习 35 个小时并已在期中考试得了 67分,他/她将会通过考试。
现在,我们想知道一个学习了 25 小时并且在期中考试得了70分的学生能否通过考试:
这是一个二分类问题,多层感知器可以学习已有的例子(训练数据)并计算预测新数据点的结果。下面我们来看一下多层感知器如何学习这种关系。
训练 MLP:反向传播算法
多层感知器的学习过程称为反向传播算法。我推荐阅读 hemanth kumar 在 Quora 上的回答(下面进行了引用),这个答案很好的解释了反向传播算法。
误差的反向传播,通常缩写为 BackProp ,它是人工神经网络(ANN)的训练方式之一。它是一种监督学习方法,这意味着,需要学习标记的训练数据(有一个监督者来引导学习)。
简单来说,BackProp 像是“从错误中学习”。监督者将纠正 ANN 中的错误。
一个ANN 由不同层(输入层、中间隐藏层和输出层)的节点构成。相邻层节点之间的连接都有权重。学习的目标是为这些连接设置正确的权重。对于一个输入向量,这些权重将决定输出向量。
在监督学习中,训练集已经进行了标记。这意味着,对于给定的输入,我们知道期望的输出(标记)。
BackProp 算法:
初始情况下,这些权重是随意设置的。算法将对训练集中的每一个输入激活 ANN 并观察输出。输出将与已知的期望输出进行比较,误差将被反向传入前一层。算法将根据误差校正这些权重。重复这个过程直到误差在一个阈值范围内。
一旦上述算法终止,我们有了一个“学习好的”ANN,并且认为它可以处理新的输入。这个 ANN 对几个样本(标记数据)和它的错误(误差传播)进行了学习。
现在,我们了解了反向传播如何工作,现在我们再来看一下上面的学生成绩数据集。
图 5 (改编自 Sebastian Raschka 的 excellent visual explanation of back propagation algorithm)所示的多层感知器的输入层有两个节点(除了 Bias 节点)分别接收 Hour Studied 和 Mid Term Mark 数据。它还包括一个有两个节点的隐藏层(除了 Bias 节点)。输出层也有两个节点,其中,上面的输出节点输出 Pass 的概率,下面的输出节点输出 Fail 的概率。
在分类任务中,我们通常在多层感知器的输出层使用 softmax 函数作为激活函数来确保输出为概率且和为 1 。softmax 函数输入任意实数向量将其压缩到 0 到 1 之间且和为1的向量。因此,在这种情况下:
Probability (Pass) + Probability (Fail) = 1
步骤1:正向传播
网络中的所有权重都是随机设置的。我们考虑图 5 中标记为 V 的隐藏层节点。假设输入与这个节点的连接的权重分别为 w1、w2 和 w3(如图中所示)。
网络先接受第一个训练记录作为输入(输入为 35 和 67,Pass 的概率为 1)。
- 网络的输入=[35,67]
- 期望的网络输出(target)=[1,0]
然后,节点的输出 V 可以这样计算(f是 sigmoid 之类的激活函数):
V=f(1*w1+35*w2+67*w3)
相似地,隐藏层的其它节点也都这样进行计算。隐藏层两个节点的输出为输出层两个节点的输入。这样我们就可以计算输出层两个节点的输出概率。
假设输出层两个节点的输出概率分别为 0.4 和 0.6 (由于权重是随机配置的,输出也是随机的)。我们可以看到计算得到的概率(0.4和0.6)与期望的概率(1和0)相差较多,因此,图 5中的网络成为’错误输出‘。
step 2:反向传播和权重校正
我们计算输出节点的总误差,并将这些误差代入网络使用反向传播来计算梯度。然后使用目标为减少输出层误差的优化算法(如梯度下降法)“校正”网络中的所有权重。图6为这个过程(先忽略图中的数学公式)。
假设节点的新权重为 w4、w5 和 w6 (反向传播和权重校正之后)。
如果我们再次向网络输入相同的数据,由于权重校正最小化了预测的误差,神经网络的计算结果应该更好一些。如图7所示,输出节点的误差从之前的[0.6.-0.4]降低到了[0.2,-0.2]。这意味着网络已经学习了如何对我们的第一个训练数据进行正确分类。
我们使用训练集中的所有其它训练数据重复这一过程,这时称为网络学习了这些数据。
如果现在需要预测一个学习了 25 小时并在期末考试得到70 分的学生能否通过期末考试,我们将使用正向传播并得到 Pass 和 Fail 的概率。
这里我避免了使用数学方程和对诸如“梯度下降”等概念的解释,试图使用一种直白的方法解释算法。有关 Backpropagation 算法的更多数学讨论,请参考此链接。
多层感知器的 3d 可视化
Adam Harley 创建了一个使用手写 MNIST 数据集训练的多层感知器的 3d 可视化系统。
网络的输入为 28*28 像素的手写数字图片的784 个像素值(它有与像素对应的 784 个输入),网络的第一个隐藏层有 300 个节点,第二个隐藏层有 100 个节点,输出为 10 个节点(对应 10 个数字)。
虽然这里描述的人工神经网络要比上一节讨论的人工神经网络大得多(使用更多的隐藏层和节点),正向传播和反向传播(每个节点)的计算过程是一样的。
图 8 展示了输入数值 5 时的网络。
节点中比其它节点数值大的节点将被点亮。在输入层,点亮的节点为接收到较高输入数值的节点。注意,在输出层,只有 5 对应的节点被点亮(它的概率为 1 ,高于其它九个的输出概率 0 )。这表示MLP 对输入数据进行了正确分类。我强烈建议玩玩这个可视化并观察不同层节点之间连接。
深度神经网络
结论
为了便于理解,我在本文中跳过了一些概念的重要细节。推荐学习 Stanford 的神经网络教程的 Part 1 、Part 2、Part 3 和 Case Study 来彻底了解多层感知器。
参考
- 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)