1.3.3 浅层网络
神经网络由多个网络组成,这些网络通过不同的层进行连接。相比之下,感知机只有一个神经元,由一个输入层和一个输出层组成。在神经网络中,在输入层和输出层之间存在额外的层,称为隐藏层,如图1.8所示。
图1.8中的示例表示一个神经网络,它有一个包含8个神经元的隐藏层。输入层有10维,而输出层有4维(4个神经元)。只要你的系统在训练过程中能够处理,这个中间的隐藏层可以包含尽可能多的神经元,但通常最好将神经元数量控制在合理的范围之内。
图1.8 浅层神经网络示例
如果这是你第一次使用神经网络,建议你的隐藏层大小(即神经元的数量)大于或等于输入层大小,并且小于或等于输出层大小。然而,尽管这是给初学者的良好建议,但这并不是一个绝对的科学事实,因为目前在神经网络中寻找神经元的最佳数量还是一门艺术,而不是一门科学,通常需要通过大量的实验来确定。
神经网络通常可以解决没有网络的算法解决不了的、更加困难的问题。例如,有一个单个的神经单元,如感知机。它必须依靠直觉,而且必须容易设定。神经网络可以解决线性可分及其之外的问题。对于线性可分问题,可以使用感知机模型和神经网络。然而,对于更加复杂和非线性可分的问题,虽然感知机不能提供高质量的解决方案,但是神经网络可以。
例如,如果我们考虑具有两个类别的样本数据集,把这些数据放在一起,感知机将无法找到一个分类的解决方案,还需要使用一些其他的策略来阻止进入死循环。或者,我们可以切换到神经网络,训练神经网络找到可能找到的最好的解决方案。图1.9展示了在一个线性不可分的两类数据集上训练含100个神经元的隐藏层的神经网络的例子。
这个神经网络的隐藏层有100个神经元。这是通过实验做出的选择,你将在后面的章节中学习构建这些网络模型实例的策略。然而,在我们进一步讨论之前,需要进一步解释两个新术语,即线性不可分数据和非线性模型,它们的定义分别如下:
·线性不可分数据是指不能使用直线实现类别划分的一组数据。
·非线性模型或非线性解是指分类问题的最佳解不是直线的自然而常见的模型。例如,它可以是某条曲线,由某个次数大于1的多项式描述,如图1.9所示的神经网络模型。
图1.9 线性不可分数据以及使用隐藏层具有100个神经元的神经网络处理结果
非线性模型是整本书中都会用到的概念,因为非线性模型是现实世界中最可能遇到的模型。在某种程度上,模型之所以是非线性的,正是因为问题是线性不可分的。为了找到非线性可分问题的解,神经网络模型进行了以下数学运算。
1.输入–隐藏层
在神经网络中,输入向量x通过每个神经元的权重向量w连接到一定数量的神经元,可以将多个权重向量组成一个权重矩阵W。矩阵W的列数与层所含有的神经元数量相同,行数与x含有的特征(或维度)数量相同。因此,隐藏层的输出可以由如下向量进行表示:
其中b是偏置向量,其元素对应一个神经单元,h的大小与隐藏单元的数量成正比。例如图1.8中有8个神经元,图1.9中有100个神经元。然而,激活函数z(·)不一定是sign(·)函数,事实上,它通常不是sign(·)函数。相反,大多数人使用的激活函数都是可微且易于微分的函数。
可微的激活函数是具有可以用传统数值方法进行计算或者定义明确的导数的函数。与之相反的是没有明确定义的导数的函数,即函数的导数不存在或者难以计算。
2.隐藏–隐藏层
神经网络可以有不止一个隐藏层,本书会讨论很多这样的例子。在这种情况下,矩阵W可以表示为一个三维矩阵,该矩阵具有与网络相同的三维元素和隐藏层数。对于第i层,为方便起见,将该矩阵称为。
因此,第i隐藏层的输出如下所示:
对于,其中k是总层数,由第一层(参见上一小节)给出的方程计算,直接使用x,不需要去到最后一层计算,计算过程如下一小节所述。
3.隐藏–输出层
整个神经网络的输出是最后一层的输出:
在这里,最后一个激活函数通常不同于隐藏层的激活函数。最后一层(输出)中的激活函数通常取决于要解决问题的类型。例如,如果想解决回归问题,将会使用线性函数;要解决分类问题,则使用S型激活函数,我们稍后再讨论这些内容。显然,感知机算法将不再适用于神经网络的训练。
虽然学习算法仍然必须根据神经网络所犯的错误调整模型参数,但参数的调整幅度不能与错误分类数或预测误差直接成正比。原因在于只是最后一层的神经元负责做出预测,但它们依赖于之前一层的计算结果,而之前一层的计算结果又可能依赖于更之前一层的计算结果。当对W和b的取值做出调整时,关于每个神经元的参数调整必须有所不同。
有一种方法是在神经网络上使用梯度下降技术。梯度下降技术有很多种,我们将在后面的章节中讨论其中最流行的技术。梯度下降算法的一般原理是,如果对一个函数求导,其值为零,那么你就已经找到了对其求导的一组参数的最大值(或最小值)。对于标量,我们将它们称为导数,但对于向量或矩阵(W, b),称之为梯度。
我们可以将上述函数称为损失函数。
损失函数通常是可微的,因此可以用梯度下降算法计算其梯度。
可以将损失函数定义为:
这种损失称为均方误差(MSE),可以用该损失函数来衡量目标输出y与输出层中预测输出元素的平方有多大的差异,并取其平均值。因为这个损失是可微的,而且很容易计算,所以它是一个很好的损失函数。
这种神经网络引入了大量的可能性,但是它主要依赖于一种基于反向传播的梯度下降技术来进行网络训练(Hecht-Nielsen,R.,1992)。我们先不在这里解释反向传播的原理(将在后面的章节介绍),而是着重称赞它改变了ML的世界。梯度下降法已经有些年没有取得多大的进展了,这是因为它在实用方面受到了一些制约,消除这些制约的解决方案为深度学习的产生和发展铺平了道路。