神经网络的历史
神经网络起源于 Warren McCulloch 和 Walter Pitts,他们 于 1943 年首次建立的神经网络模型。他们的模型完全基于数学和算法,但由于缺乏计算资源,模型无法测试。后来,在 1958 年,Frank Rosenblatt 创建了第一个可以进行模式识别的模型,改变了现状,即感知机。感知机不仅是神经网络的基础,也是支持向量机的基础,它主要用于解决分类问题,即寻找一个超平面,将不同类别的样本分离开来。当仅考虑1个变量时,超平面退化成直线,可用一元线性模型来分割样本。
不失一般性,我们将超平面写为,并用如下的结构图来表示。
感知机可以看作是只有1个神经元的神经网络。事实上,logistic回归也可以看作是没有隐藏层,且只有1个神经元使用sigmoid函数**的神经网络。感知机可由梯度下降法来训练,而且在实际应用中效果非常好。但不幸的是,1969年,Marvin Minsky和Seymour Papert证明感知机连最简单的抑或问题都无法解决,因此其解决复杂问题的能力受到了质疑。这也直接导致了神经网络的发展陷入了低谷。
神经网络在感知机的基础上,将多个神经元堆叠在一起,并引入了**函数,完美解决了抑或问题。1986年,Geoffrey Hinton与人合著了一篇论文:learning representations by back-propagation errors正式提出了反向传播算法,解决了神经网络的参数求解问题。近年来,随着计算机硬件设备的不断进步,神经网络的训练问题得到了彻底解决。
前向传播
当输入特征时,神经网络会进行前向传播计算输出值,我们用以下记号来描述一个全连接神经网络:
全连接神经通过以下方式进行前向传播
或则
这样,全连接网络可以通过逐层的计算,得到网络最后的输出。整个网络可以看作是一个复杂的复合函数,将输入特征
作为第1层的输入
,将第
层的输出
作为整个函数的输出。
反向传播
完成前向传播后,可以得到预测值,我们希望得的预测值
和真实数据的
尽可能接近,因此,我们还需要定义一个损失函数来衡量预测值和真实值的接近程度。定义损失函数
例如,使用神经网络来解决分类问题时,通常会使用均方误损失函数
为了使损失减小,需要利用梯度下降法更新每一层的权重矩阵和偏置
。由于神经网络是一个复杂的复合函数,因此在求解权重矩阵的梯度
和偏置的梯度
时会利用链式法则,最后根据梯度下降的更新公式
完成一轮反向传播。
实践中,我们并不需要手动推导权重矩阵和偏置的梯度,因为目前的自动微分编程技术已经非常成熟,我们只需要给出前向传播的计算过程,计算机便会自动计算出所有变量的梯度。
此外,原始的梯度下降法已经不是主流的训练方法了,神经网络的训练方法大致经历了梯度下降,随机梯度下降,Momentum,RMSProp和Adam。但这些新出现的算法本质上只是原始梯度下降法的改进,它们依然依赖于梯度的求解。虽然也有许多遗传算法和进化算法被用于神经网络的训练,但依然无法取代梯度下降法。
**函数
**函数的作用主要是用于对数据做非线性变换,它可能使得原本线性不可分的数据变为线性可分。目前全连接网络中常用的**函数是Relu。早些时候,全连接网络更多的会使用Sigmoid(Logistic)、Tanh这类**函数,而现在它们更多出现在一些特殊结构的神经网络中。
当然,可选择的**函数远远不止这些,我们可以尝试一些新的**函数,但它们必须满足一些性质,例如有界、易于求导、单调、处理简单等。下面列出了一些常用的**函数。
从几何的角度认识神经网络
我们从几何的角度直观的理解一下神经网络为何如此强大,它是如何解决复杂问题的。一个经典的2层神经网络结构如下图所示。
以二分类问题为例,假设输入有2个特征,它可以用二维向量来表示。隐藏层是一个3维向量,输出是1个标量,1代表正类,0代表负类。正向传播的计算过程如下。
输入:
隐藏层输入:
隐藏层输出:
预测输出:
输入为二维向量,在隐藏层通过线性变换得到
。几何上,我们可以理解为输入
从二维空间变换到三维空间。**函数的作用,在于对隐藏层做非线性变换,使得原来线性不可分的数据变为线性可分。
我们生成了200个原始数据,如下图所示。
这些数据显然不是线性可分的,我们进一步对原始数据做线性变换,使得二维数据变换成三维数据,得到隐藏层,可视化后如下所示。
可见,变换到三维空间后的数据依然不是线性可分的,我们进一步对隐藏层做非线性变换,即引入**函数,将它作用到向量的每一个维度得到
,这里
。做了非线性变换后,空间会发生扭曲,可视化结果如下。
此时,数据已经是线性可分的了,我们可以用一个超平面来将不同类别的数据分开。当然,最后也可以像logistic回归一样使用sigmoid函数,将输出压缩到(0,1)区间得到
。
总结一下,神经网络从几何角度来看,实际上是在对数据做连续的空间变换和非线性变换。隐藏层中神经元的个数决定了转换后数据的维度,非线性变换使得变换后的空间发生扭曲,数据可能变得线性可分。只有一层隐藏层的神经网络意味着只做了一次空间变换和非线性变换,变换后的数据可能依然不是线性可分的,此时我们可以引入更多的隐藏层,不断地做空间变换和非线性变换,最终使得不同类别的数据可以被分开来。
从函数的角度认识神经网络
神经网络的数学基础来自于逼近理论。在数学分析中,我们知道维尔斯特拉斯逼近理论可以保证在闭区间内的连续函数可以由多相似函数来一致逼近,例如我们常用的泰勒展开式。后来,斯通将这一逼近理论进一步推广,得到了斯通—魏尔斯特拉斯定理。简而言之,这一定理是说任何连续的函数都可以用更简单的函数来一致逼近。在深度学习领域,斯通—魏尔斯特拉斯定理的特殊情形就是通用近似定理。
通用近似定理:令φ(·)是一个非常数、有界、单调递增的连续函数,是一个
维的单位超立方体
,
是定义在
上的连续函数集合。对于任何一个函数
,存在一个整数
,和一组实数
以及实数向量
,
,以至于我们可以定义函数
作为函数的近似实现,即
其中ε>0是一个很小的正数。
上述定理中,φ(·)可以看作是隐藏层的**函数,它需要是非常数、有界、单调递增的连续函数,例如sigmoid就是满足要求的。换言之,即使是只有1层隐藏层,使用sigmoid作为**函数的神经网络,它也可以逼近任何一个函数。本质上,线性模型、Logistic回归、决策树、SVM等传统统计学习模型都是在学习一个函数来拟合数据,这些函数自然也可以用神经网络来近似,传统统计模型能做的,神经网络也能做,这也正是神经网络的强大之处。