背景
之前写过浅谈神经网络基础篇,简单介绍下机器学习这块内容,用于扫盲。本文正式将神经网络,这部分是深度学习的基础。了解完可以掌握强大的机器学习的方法,也可以更好的了解深度学习。本文会从历史维度来讲讲神经网络的发展史,以便于更好的理解神经网络的由来以及为什么这样子。
神经网络
基础概念
神经网络是一种模拟人脑的神经网络以期能够实现类人工智能的机器学习技术。
如图所示是一个经典的神经网络图片。
- 左边红色是输入层,包含三个输入单元。
- 中间是隐藏层,中间有四个计算节点。
- 右边是输出层,带有两个输出单元。
输入层的输入单元个数应该是等于输入的特征个数,而输出层则是等于需要的结果标签个数,而对于中间层可以自由指定。例如:
- 特征:叫声|眼睛|体型
- 结果标签:猫|狗
另外图中重要的并不是每个节点,而是每条线。每条线代表着一定的权重,神经网络的训练算法就是让权重的值调整到最佳,以使得整个网络的预测效果最好。
下面来介绍下神经网络是怎么发展到现在这样的结构图的。
神经元
神经网络的最小单位便是神经元,早在1904年的时候生物学家就已经掌握了神经元的结构。
- 一个神经元通常具有多个树突,主要用来接受传入信息。
- 中间仅存在一条长长的轴突,轴突尾端有许多轴突末梢。
- 轴突末梢跟其他神经元的树突产生连接,从而传递信号。
1943年一名心理学家和一名数学家参考了生物神经元的结构,发表了抽象的神经元模型MP。神经元模型是一个包含输入和输出以及计算功能的模型。输入可以类比为神经元的树突,而输出可以类比为神经元的轴突,计算则可以类比为细胞核。如下图所示。
如果要用公式表示这个神经元的计算公式的话,假设:
- 输入为x(图中为x1 x2 x3)
- 权值为w(图中为w1 w2 w3)
- 非线性函数为f(x)
- 输出结果为y
那么我们就得到公式:
y=f(x1*w1+x2*w2+x3*w3)
这里MP模型里面非线性函数为sgn函数(这是个取符号函数,当输入> 0 输出1,否则 -1)。
具体的MP模型如下:
从上面的公式其实可以看的出,假如输入的特征跟输出的结果是线性关系,且你也知道各个权重的值,那么只需要把特征带入公式就可以直接得到预测的结果。这个模型虽然看着简单,但这也是神经网络的基础。当时存在的问题就是权重都是预先设置的,所以不具备学习能力,且受限于当时计算机的硬件水平(晶体管)。
感知机(单层神经网络)
1958年,一位计算科学家提出了由两层神经元组成的神经网络(当时第一个可以学习的神经网络),取名为感知机。当时由于这位计算科学家现场演示了识别简单图片的能力,当时引起了很大的反响(第一次高潮)。
感知机的模型是怎么样的呢?基于神经元的基础之上,划分了两个层次,分别是输入层和输出层,输入层只负责传入特征不做计算,而对于输出层的输出单元要根据输入层进行计算输出。(由于这里计算层只有一个,也就是输出层,所以称为单层神经网络)
从图中可以看出两个输出为z1 z2,输入为a1 a2 a3,g函数表示为sgn函数(MP模型所用的非线性函数)。 可以发现z1和z2就是线性代数方程组,输入向量为[a1,a2,a3]输出向量为[z1,z2],那么w就是个2行3列的矩阵。可以得到公式:
g(W * a) = z;
那么这个公式解决什么问题,其实感知机是个逻辑回归模型(跟线性回归不同,线性回归是做预测。逻辑回归主要做分类)。所以我们可以做简单的线性分类任务,类似于边界一样的抽象概念(二维中就是一条线,三维中就是一个面)。
当然,感知机也只能是做简单的线性分类任务,无法解决异或的问题(XOR)。如图所示,感知机没法在二维上画一条直线把X和O进行分类。所以神经网络的研究又开始凉凉。
多层感知机(两层神经网络)
多层感知机的发展带动了神经网络的推广和使用。上面说到感知机无法解决XOR的问题。但是继续对感知机多加一个计算层后,两层的神经网络就可以解决异或问题,且具备了非线性的分类效果。但是当时对于两层的神经网络计算没有一个很好的解决办法,直到1987年反向传播(BP)算法被提出,解决了两层神经网络复杂计算量的问题。
两层神经网络除了包含一个输入层,一个输出层以外,还增加了一个中间层。此时,中间层和输出层都是计算层。我们基于单层神经网络多加一层计算层可以看到下面这张图:
最终输出节点的公式则为:
当然,这里输出节点只有一个z,假如我们有多个输出节点,那么如下所示:
输入输出矩阵公式为:(这里的a(1)代表的是所有输入向量,w(1)是权重向量,以此类推)
g(W(1) * a(1)) = a(2); g(W(2) * a(2)) = z;
从上面讨论到现在,其实还少了偏置节点这个说法,但是这些节点默认是存在的,本质上偏置节点是一个含有存储功能,且存储值为1的单元。除了输出层以外,都会有这个偏置节点存在。我们假设偏置值用b来表示,那么图示如下:
新的矩阵计算公式如下:
g(W(1) * a(1) + b(1)) = a(2); g(W(2) * a(2) + b(2)) = z;
默认情况下,神经网络结果图并不会把偏置节点画出。而且到了两层神经网络以后,激活函数使用sigmoid 平滑函数来作为激活函数(也就是非线性函数)。
关于多层感知机为什么能够解决分线性分类问题
为什么面对复杂的非线性分类任务,两层神经网络效果会更好。主要原因在于中间隐藏层,从输入层到隐藏层时,数据发生了空间变换。对之前像XOR这种线性不可分的问题,进行了坐标变换,使其线性可分(简单理解可以说是特征组合生成了新的特征,生成特征抽象程度更高)。两层神经网络通过两层的线性模型模拟了数据内真实的非线性函数。
接下来讨论下关于神经网络输入层/输出层/中间层的设计。在设计一个神经网络时,输入层的节点数需要与特征的维度匹配,输出层的节点数要与目标的维度匹配。而中间层的节点数,把握在设计者的手中,节点数设置的多少,却会影响到整个模型的效果。目前业界都是通过经验来设置这个值,所以这个需要实践过程中调参数获取。
反向传播算法
反向传播算法的推出为什么带动了神经网络的推广使用,主要是因为在神经网络模型中结构复杂,每次计算训练过程中的梯度的代价很大,反向传播解决了在评估损失调节参数上的问题。
关于泛化和正则化
这个话题在基础篇中介绍过,因为模型最终上到真实场景,所以很有必要提升模型在测试集上的预测效果,那么就需要对训练数据要进行很好的泛化(神经网络会涉及到一些泛化技术),且使用一些正则化方法来评估模型复杂度。
多层感知机带来的变化
BP算法出现以及计算机硬件发展,神经网络界的异或问题被轻松解决且已经可以开始做语音识别/图像识别等领域相关的事情。虽然用了BP算法解决了梯度问题,但是神经网络的一次训练耗时太久,也因为训练优化中存在局部最优解问题影响神经网络优化,且隐藏层的调参麻烦。所以使用并不是那么方便,所以又开始凉凉,一直到多层神经网络发展。
深度学习(多层神经网络)
其实讲完多层感知机,基本神经网络的很大的内容已经在多层感知机(两层神经网络)上了。而多层神经网络是建立在两层神经网络上的一种升华。
2006年“深度信念网络”概念的提出,减少了多层神经网络的训练时间。深度信念网络有两个技术:
- “预训练”(pre-training):更加方便让神经网络中的权值找到一个接近最优解的值。
- “微调”(fine-tuning):通过最优解来对整个神经网络进行优化训练。
所以深度学习在语音图像识别上效果越发优越。基于上面多层感知机,我们继续增加多一层计算层如下图所示:
那么矩阵运算推导公式为:
g(W(1) * a(1)) = a(2); g(W(2) * a(2)) = a(3);g(W(3) * a(3)) = z;
这种计算不断增加层数,计算不断往前推进的方式称为“正向传播”。随着层数的增多,那么特征经过每一层计算后,会被抽象得更加具体。如图所示:
更抽象的特征可以理解为:随着网络的层数增加,每一层对于前一层次的抽象表示更深入。在神经网络中,每一层神经元学习到的是前一层神经元值的更抽象的表示。例如第一个隐藏层学习到的是“边缘”的特征,第二个隐藏层学习到的是由“边缘”组成的“形状”的特征,第三个隐藏层学习到的是由“形状”组成的“图案”的特征,最后的隐藏层学习到的是由“图案”组成的“目标”的特征。通过抽取更抽象的特征来对事物进行区分,从而获得更好的区分与分类能力。理论如下:
当特征抽象得越高级越具体,那么就越逼近于我们想要的结果。本质就是通过已有的数据去不断拟合复杂函数。
总结
要了解神经网络必然要对神经网络历史的发展有所了解才能够很清楚的明白神经网络是怎么一步步的去解决现实问题,以至于最后用到语音图像识别上的,而且神经网络的发展也离不开计算机算力的提高。但是这里还是强调下神经网络只是机器学习的一部分,还有些问题其实用其他方法会更加高效,神经网络比较适合图像音频这类的识别。最后神经网络真实的名字为前馈神经网络,具体神经网络划分如下:
关于使用深度学习框架要纠正的点
因为目前深度学习框架都提供了高级api,所以我们设计神经网络一般都考虑多少层以及层的节点个数。而并不是一个神经元节点一个一个去拼成一个拓扑图,这是初学者使用深度学习框架入门很容易陷进去的误区。第三篇介绍神经网络的文章,我将会找个框架,简单介绍下怎么用代码来使用神经网络做一些有趣的事情。