背景知识
神经网络是一种人工智能模型,主要受生物神经系统启发,重现了大脑中神经元之间相互连接的方式。
神经网络已应用到很多领域,如图像识别、自然语言处理和语音识别等。
生物神经元
生物神经元,是生物神经系统的工作单位,也人工神经网络的灵感来源。1904年生物学家就已经知晓了神经元的组成结构。
神经元是脑组织的基本单元,是神经系统结构与功能的单位。据统计,人类人脑大约包含有1.4*1014个神经元,每个神经元与人约103-105个其他神经元相连接,构成一个极为庞大而复杂的网络,即生物神经网络。
生物神经元的结构:主要由细胞体、树突、轴突和突触四部分组成。神经元负责接收信号、处理信号、传递信号。
- 树突:接收其它神经元的信号,一个神经元通常具有多个树突。
- 细胞体:包含细胞核、细胞质和细胞膜等。
- 轴突:信号传输通道一个神经元只有一条轴突。
- 突触:轴突末梢,相当于输入输出的接口,轴突尾端有许多轴突末梢,与其他神经元的树突进行连接通信。
信号传递:神经元之间通过电化学信号进行通信。神经元接到到的信号达到一定阈值时,传递给下一个神经元。每个神经元随着所接收到的所有信号的综合结果作适应变化。
人工神经元
将生物神经元的概念转化为数学模型,即人工神经元。
人工神经元是神经网络的基本构建块,负责接收输入数据、处理数据、输出数据。
树突对应输入、轴突对应输出、细胞体对应计算存储。(存储指神经元会暂存计算结果,并传递到下一层)
“神经元”在组成的网络中又称为“单元”(unit),或“节点”(node)。
神经元模型
1943年,心理学家McCulloch和数学家Pitts参考了生物神经元的结构,发表了抽象的神经元模型MP,其权重的值预先设置,不可变。
1949年,心理学家Hebb提出了Hebb学习率,认为人脑神经细胞的突触(也就是连接)上的强度上可以变化的。于是计算科学家们开始考虑让每个输入关联一个权重,相当于生物神经元的记忆。用调整权值的方法表示信号强弱,即输入对神经元的影响程度,来让机器学习。
神经元模型:
示例图说明:
- 有向箭头表示的是值的加权传递。
- z是在输入和权值的线性加权和叠加了一个函数g的值。在最初的MP模型里,函数g是符号函数sgn函数,也就是阶跃函数(当输入大于0时,输出1,表示神经元兴奋,否则输出0,表示神经元抑制)。用这个阶跃函数 g g g模拟神经元接到到的信号是否达到阈值,但是阶跃函数具有不连续等缺点,所以经常用其他激活函数代替。
- 一般将线性加权函数(sum函数)与激活函数(sgn函数)合并到一个圆圈里,代表神经元的内部计算。一个神经元可以引出多个代表输出的有向箭头,但值都是一样的。
- 神经元模型理解:样本数据集有四个属性,其中三个已知属性 ( a 1 , a 2 , a 3 ) (a_1,a_2,a_3) (a1,a2,a3),称为特征,一个未知属性 z z z,称为为目标。假设特征与目标之间确实是线性关系,并且已得得知各关系权值 w 1 , w 2 , w 3 w_1,w_2,w_3 w1,w2,w3。那么,我们就可以通过神经元模型预测样本的目标。
神经网络
尽管神经元模型与Hebb学习律都已诞生,但限于当时的计算机能力,直到接近10年后,第一个真正意义的神经网络才诞生。
1958年,弗兰克·罗森布拉特(Frank Rosenblatt)提出了由两层神经元组成的神经网络——“感知器”(Perceptron)(有的文献翻译成“感知机”)
扩展MP模型为感知器:在原来MP模型的“输入”位置添加神经元节点,标志其为“输入层”。其余不变,于是我们就有了下图:从本图开始,我们将权值 w 1 , w 2 , w 3 w_1, w_2, w_3 w1,w2,w3写到“连接线”的中间。
感知器只能线性划分数据。
详细介绍查看:感知器的那些事
- 输入层:指原始数据的输入,如图像像素或文本单词;
- 隐藏层:包含多个层次的神经元,负责从输入中学习特征并生成有用的表示;
- 输出层:可以输出分类标签、数值或其他任务先骨干的结果。
有些文献将需要计算的层次称之为“计算层”,并把拥有一个计算层的网络称之为“单层神经网络”。
有些文献会按照网络拥有的层数来命名,例如把“感知器”称为两层神经网络。但在本文里,我们根据计算层的数量来命名。
如果预测的目标不再是一个值,而是一个向量,例如 [ 1 , 3 ] [1,3] [1,3],那么可以在输出层再增加一个“输出单元”。
输出的计算公式是线性代数方程组,因此可以用矩阵乘法表达这两个公式。
- 输入的变量是 a = [ a 1 , a 2 , a 3 ] T \mathbf{a}=[a_1,a_2,a_3]^T a=[a1,a2,a3]T(代表由 a 1 , a 2 , a 3 a_1,a_2,a_3 a1,a2,a3组成的列向量).
- 方程的右边是 z = [ z 1 , z 2 ] T \mathbf{z}=[z_1,z_2]^T z=[z1,z2]T。
- 系数则是矩阵 W \mathbf{W} W(2行3列的矩阵,行数=目标数,列数=输入节点数)。 W = ( W 11 W 12 W 13 W 21 W 22 W 23 ) \mathbf{W}= \left( \begin{array}{cccc} W_{11} & W_{12} & W_{13}\\ W_{21} & W_{22} & W_{23}\\ \end{array} \right) W=(W11W21W12W22W13W23)
- 输出公式可以改写成(注意 W W W在前面: g ( W ∗ a ) = z ; g(\mathbf{W*a} ) =\mathbf{z}; g(W∗a)=z;
这个公式就是神经网络中从前一层计算后一层的矩阵运算。
函数 g g g统称为激活函数。激活函数就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。常见的激活函数包括:Sigmoid、ReLU 和TanH。
激活函数active function和转移函数transfer function是同一个含义,不同叫法,都是叠加的非线性函数。
详细介绍请查看:常用的激活函数
扩展单层神经网络:新增一个计算层,形成双层神经网络。节点增加,权值矩阵增加,用上标来区分不同层次之间的变量,即用上标表示列(层),用下标表示行(每层第几个节点)。
单层神经网络使用的激活函数是sgn函数。两层神经网络时,常用sigmoid函数,而多层神经网络ReLU函数预测性能更好。
假设我们的预测目标是一个向量,那么与前面类似,只需要在“输出层”再增加节点即可。
使用矩阵运算来表达整个计算公式的话如下:
g ( W ( 1 ) ∗ a ( 1 ) ) = a ( 2 ) ; g ( W ( 2 ) ∗ a ( 2 ) ) = z ; g(\mathbf{W^{(1)}*a^{(1)}} ) =\mathbf{a^{(2)}}; \\ g(\mathbf{W^{(2)}*a^{(2)}} ) =\mathbf{z}; g(W(1)∗a(1))=a(2);g(W(2)∗a(2))=z;
使用矩阵运算来表达不会受到节点数增多的影响,即无论有多少节点参与运算,乘法两端都只有一个变量。因此神经网络常用矩阵运算来描述。
神经网络中需要默认添加偏置节点(bias unit),其只含有存储功能,且存储值永远为1。
在神经网络的每个层次中,除了输出层以外,都会含有一个偏置单元。
偏置单元与前一层没有连接,与后一层的所有节点都有连接。
- 形式上:偏置可以视为控制每个神经元的阈值.
- 功能上:偏置可以加速神经网络拟合。
有些神经网络的结构图中会把偏置节点明显画出来,有些不会。
一般情况下,我们都不会明确画出偏置节点。
在考虑了偏置以后的一个神经网络的矩阵运算如下:
g ( W ( 1 ) ∗ a ( 1 ) + b ( 1 ) ) = a ( 2 ) ; g ( W ( 2 ) ∗ a ( 2 ) + b ( 2 ) ) = z ; g(\mathbf{W^{(1)}*a^{(1)}+b^{(1)}} ) =\mathbf{a^{(2)}}; \\ g(\mathbf{W^{(2)}*a^{(2)}+b^{(2)}} ) =\mathbf{z}; g(W(1)∗a(1)+b(1))=a(2);g(W(2)∗a(2)+b(2))=z;
备注:
1.神经网络结构图的拓扑与箭头代表预测过程中数据的流向,与训练时数据流有一定区别。
2. 神经网络结构图中的关键不是节点,而是连接线,每个连接线对应一个不同的权重,即权值,这是需要训练得到的。
3. 神经网络的本质就是通过参数与激活函数来拟合特征与目标之间的真实函数关系。初学者可能认为画神经网络的结构图是为了在程序中实现这些圆圈与线,但在一个神经网络的程序中,既没有“线”这个对象,也没有“单元”这个对象。实现一个神经网络最需要的是线性代数库。
4. 不一致的说法:权重weight和参数parameter,神经网络界一般将训练得到的参数称之为权重,而不像其他机器学习方法就称之为参数。目前,一般将非偏置节点连接上的值称之为权重,而偏置节点上的值称之为偏置,两者统一起来称之为参数。
设计神经网络主要考虑:输入层的节点数(需与特征维度相匹配)、输出层的节点数(与目标的维度相匹配)、中间层的节点数(根据预测结果做调整)。
训练神经网络
在训练中,神经网络通过与真实数据进行比较来调整权重,以输出更准确的结果。
用训练样本集训练时的预测值为 y p y_p yp,而实际值为 y y y,定义一个损失值 l o s s = ( y p − y ) 2 loss = (y_p - y)^2 loss=(yp−y)2,将之前的矩阵公式带入到 y p y_p yp中(因为 z = y p z=y_p z=yp),得到关于参数的函数,即损失函数。预测值和实际值一致时,损失值为0。
损失函数:损失函数用于度量预测和实际值之间的差异。训练的目标即为最小化损失函数。
损失函数loss function,还有两个说法分别是残差函数error function,以及代价函数cost function。loss function是目前深度学习里用的较多的一种说法。这三者都是同一个意思,都是优化问题所需要求解的方程。
详细介绍查看:常用的损失函数
接下来的问题就是求:如何优化参数,能够让损失函数的值最小。这时就需要反向传播算法。
反向传播算法(BP, back propagation):训练神经网络的核心算法。通过计算误差并反向传播,已更新每个神经元的权重和偏差,从而减少预测偏差。
优化问题只是训练中的一个部分。机器学习问题之所以称为学习问题,而不是优化问题,就是因为它不仅要求数据在训练集上求得一个较小的误差,在测试集上也要表现好。因为模型最终是要部署到没有见过训练数据的真实场景。
提升模型在测试集上的预测效果的主题叫做泛化(generalization),相关方法被称作正则化(regularization)。神经网络中常用的泛化技术有权重衰减等。
多层神经网络
2006年,Geoffery Hinton在《Science》首次提出了“深度信念网络”的概念。“深度信念网络”有一个“预训练”(pre-training)的过程,可以方便地让神经网络中的权值找到一个接近最优解的值,之后再使用“微调”(fine-tuning)技术来对整个网络进行优化训练。这两个技术大幅减少了训练多层神经网络的时间。
Hinton给多层神经网络相关的学习方法赋予了一个新名词–“深度学习”。
在两层神经网络的输出层后面,继续添加层次。原来的输出层变成中间层,新加的层次成为新的输出层。
输出向量z的推导公式为: g ( W ( 1 ) ∗ a ( 1 ) ) = a ( 2 ) g ( W ( 2 ) ∗ a ( 2 ) ) = a ( 3 ) g ( W ( 3 ) ∗ a ( 3 ) ) = z g(W^{(1)}*a^{(1)})=a^{(2)}\\ g(W^{(2)}*a^{(2)})=a^{(3)}\\ g(W^{(3)}*a^{(3)})=z g(W(1)∗a(1))=a(2)g(W(2)∗a(2))=a(3)g(W(3)∗a(3))=z
多层网络中,一层一层地向前计算,这个过程叫“正向传播”。
隐藏层的层数和每一层的节点数量可以根据需求调整。
从图中可以看出,随着层数增加,其非线性分界拟合能力不断增强。(图中的分界线并不代表真实训练出的效果,更多的是示意效果。)
在多层神经网络中,训练的重心仍然是优化和泛化。
优化:利用梯度下降算法和反向传播算法对神经网络进行优化。目前主要研究在于开发新的算法,或对这两个算法进行不断的优化,例如,增加了一种带动量因子(momentum)的梯度下降算法。
泛化:利用正则化技术提升神经网络的泛化能力。目前,Dropout技术,以及数据扩容(Data-Augmentation)技术是目前使用的最多的正则化技术。(神经网络的层数增加,参数增加,表示能力大幅度增强,很容易出现过拟合现象,因此需要正则化技术)
神经网络类别
我们可以把结构图看作是一个有向图。对于前馈神经网络中,这个有向图是没有回路的。而对于反馈神经网络中,结构图的有向图是有回路的。反馈神经网络也是一类重要的神经网络。