智能计算系统第二章
第二章 神经网络基础
2.1 从机器学习到神经网络
关于“人工智能”、“机器学习”、“神经网络”、“深度学习”的包含关系:

人工智能:人制造出来的机器所表现出来的智能。是上述概念中最大的范畴。
机器学习:当前最热门的一种实现人工智能的方法。
神经网络:机器学习最热门的一种实现方法。
深度学习:当前非常先进的实现神经网络的方法。
机器学习相关概念:
- 机器学习是对能通过自动改进的计算机算法的研究。
- 机器学习是用数据或以往的经验以此提升计算机程序的能力。
- 机器学习是研究如何通过计算的手段、利用经验来改善系统自身性能的一门学科。
![典型机器学习的过程]()
符号说明
输入数据:\(x\)
真实值(实际值):\(y\)
计算值(模型输出值):\(\widehat{y}\)
模型函数:\(H(x)\)
激活函数:\(G(x)\)
损失函数:\(L(x)\)(用来评估计算值和真实值的差别)
标量:斜体小写字母a、b、c
向量:黑斜体小写字母a、b、c
矩阵:黑斜体大写字母A、B、C
线性回归
回归(regression):回归是一种用统计方法分析一个因变量和一组自变量之间关系的方法。
线性回归是回归里最简单的一种。假定自变量和因变量的关系是线性的。
单变量线性回归模型
- 线性回归可以找到一些点的集合背后的规律:一个点集可以用一条直线来拟合,这条拟合出来的直线的参数特征,就是线性回归找到的点集背后的规律。
单变量线性模型:
其中,\(w_0\)为纵截距,\(w\)为回归方程的斜率。
多变量线性回归模型
多变量线性模型:
可以写成矩阵形式:
其中:
但是,预测值和真实值之间一定会存在误差(记误差为\(\epsilon\)):
一般情况下,误差\(\epsilon\)满足\(N(0,\sigma^2)\)的正态分布。
将\(\epsilon\)替换为\(y - \widehat{y}\),再带入上式得:
利用最大似然估计分析,得到预测值与真实值之间误差尽量小的目标函数。即究竟选择什么样的\(\widehat{w}\)才能使预测值和真实值之间的误差尽可能小。
利用最大似然估计得到的损失函数如下:
后面的工作就是寻找参数\(\widehat{w}\)使得\(L(\widehat{w})\)最小。
在寻找参数的过程中有两种方法:
- 迭代法(梯度下降法):
- 初始给定一个\(\widehat{w}\), 如0向量或随机向量。
- 沿着梯度下降的方向进行迭代,使更新后的\(L(\widehat{w})\)不断变小。
\[\widehat{w} = \widehat{w} - \alpha\cfrac{\partial{L(\widehat{w})}}{\partial{\widehat{w}}} \]其中\(\alpha\)称为学习率或步长。
迭代至找到使得\(L(\widehat{w})\)最小的\(\widehat{w}\)值停止,从而得到回归模型参数。 - 最小二乘法(解析法):不适用于神经网络
人工神经网络
在生物学领域,一个生物神经元有多个树突(接受传入信息);有一条轴突,轴突尾端有许多轴突末梢(给其他多个神经元传递信息)。轴突末梢跟其他生物神经元的树突产生连接的位置叫“突触”。
人工神经元:在机器学习领域,人工神经元是一个包含输入、输出与计算功能的模型。其输入可类比为生物神经元的树突,其输出可类比为神经元的轴突,其计算可类比为细胞体。

感知机(Perceptron)模型
一种最基础的神经网络模型。
感知机模型:
对应一个超平面\(w^Tx + b = 0\),模型参数是(w, b)。感知机的目标是找到一个(w, b),将线性可分的数据集T中的所有的样本点正确地分为两类。
感知机模型里的sign()是一个激活函数。
感知机模型的训练过程:
- 寻找损失函数:
考虑一个训练数据集\(D = \{(x_1, y_1), (x_2, y_2),...,(x_m, y_m)\}\), 其中,\(x_j \in R^n, y_j \in \{+1, -1\}\)。如果存在某个超平面S:(\(w^Tx + b = 0\)), 能将正负样本分到S两侧,则说明数据集可分,那么,如何求出这个超平面S的表达式?
策略:假设误分类的点为数据集M, 使用误分类点到超平面的总距离来寻找损失函数(直观来说,总距离越小越好)
样本点\(x_j\)到超平面S的距离:
数据集中误分类的点满足条件:
去掉点\(x_j\)到超平面S的距离的绝对值符号:
所有误分类的点到超平面S的总距离为:
由此寻找到感知机的损失函数为(去掉了\(\cfrac{1}{||w||}\)是为了方便计算,而且实践证明去掉了这个对实际结果的影响不大):
- 损失函数极小化的最优化问题可使用:随机梯度下降法。
随机选取误分类点\((x_j,y_j)\)对w,b以\(\alpha\)为步长进行更新,通过迭代可以使得损失函数L(w,b)不断减小,直到为0。
由此可得:
\(w\)<-\(w + \alpha y_jx_j\)
由此可得:
\(b\)<-\(b + \alpha y_j\)
2.2 神经网络训练的基本原理
两层神经网络-多层感知机
- 将大量的神经元模型进行组合,用不同的方法进行连接并作用在不同的激活函数上,就构成了人工神经网络模型。
- 多层感知机一般指全连接的两层神经网络模型。
![多层感知机]()
输入样本x = \([x_1, x_2, x_3]\)
权值:
利用\(W^{(1)}\)这一层的激活函数\(h = G({W^{(1)}}^Tx)\)即可算出隐层h
然后h作为第二层的输入,第二层的权值为:
激活函数为:
由此计算得到输出的\(\widehat{y}\).
但在实际处理中,还会设置偏置单元\(b_1,b_2\),如下图所示:

在神经网络中,除了输出层以外,都会有一个偏置单元b,与后一层的所有节点连接。W称为权重,b为偏置,(W, b)合称为神经网络的参数。
浅层神经网络的特点:
数据量小、训练快,其局限性在于对复杂函数的表示能力有限,针对复杂分类问题泛化能力受到制约。
过去的很长时间里,一直没有做两层以上的神经网络,主要由于科学家证明了“理论上两层神经网络足以拟合任意参数”,但实际上一些复杂问题使用更深层的神经网络拟合参数可能小于两层神经网络。
深度神经网络
- 深度神经网络的成功:ABC
深度神经网络不断发展不仅依赖于自身的结构优势,也依赖于如下一些外在因素:- Algorithm:优化算法层出不穷
- Big data: 数据量不断增大
- Computing:处理器计算能力的不断提升。
- 深度神经网络
随着网络层数的增加,每一层对于前一层次的抽象表示更深入,每一层神经元学习到的是前一层神经元更抽象的表示。
通过抽取更抽象的特征来对事物进行区分,从而获得更好的区分与分类能力。
以图像识别为例,不同层可以完成不同的识别任务:
![图像识别]()
神经网络的模型训练
模型训练的目的,就是使得参数尽可能地与真实的模型逼近,模型计算值\(\widehat{y}\)与\(y\)无限接近。
让计算值接近真实值的手段就是调整各层的参数。
在计算中包括了正向传播和反向传播两种不同的计算方式。
- 正向传播(推断):是根据输入,经过权重、激活函数计算出隐层,将输入的特征向量从低级特征逐步提取为抽象特征,直到最终输出结果的过程。也就是说,正向传播是计算\(\widehat{y}\)的过程。
- 反向传播是根据正向传播的输出结果和期望值计算出损失函数,再通过链式求导,最终从网络后端逐步修改权重使输出和期望值的差距便到最小的过程。反向传播是修改参数的过程。
正向传播的具体计算方式:
输入\(x = [x_1, x_2, x_3]\)和各层的权重w对应的矩阵相乘,再加上偏移量\(b = [b_1, b_2, b_3]\)。得到的结果要代入一个激活函数(常用激活函数为sigmoid函数,\(sig(x) = \cfrac{1}{1 + e^{-x}}\))。
示例:
假定输入数据\(x_1 = 0.02\)、\(x_2 = 0.04\)、\(x_3 = 0.01\)。
固定偏置\(b_1 = 0.4\)、\(b_2 = 0.7\)
期望输出\(y_1 = 0.9\)、\(y_2 = 0.5\)
未知权重
目的是要得到\(y_1 = 0.9\)、\(y_2\) = 0.5
的期望值,需计算出合适的\(W^{(1)}\)、\(W^{(2)}\)的权重值。
解:
- 第一步:初始化权重值。可以选择全部置零,也可以选择随机生成。
- 第二步:输入到隐层计算。计算结果要带到激活函数里面。
- 第三步:隐层到输出层计算。
- 第四步,计算误差。上面的结果距离期望输出\(y_1 = 0.9,y_2 = 0.5\)还有差距,通过反向传播修改权重。给出损失函数如下:
- 第五步,通过反向传播进行反馈,调节权重值。
在上面损失函数的式子里,\(y_1\)是给定的,\(\widehat{y_1}\)是一个和参数有关系的变量,所以根据链式法则对参数求导。算出损失函数关于某个特定参数的导数值。然后将对应参数\(\omega\)修正为\(\omega = \omega - \alpha\times\cfrac{\partial L(W)}{\partial \omega}\),其中\(\alpha\)称为学习率。
2.3 神经网络的设计原则
训练完了结果就是不准,应该怎么办?
- 调整网络拓朴结构
- 选择合适的激活函数
- 选择合适的损失函数
网络的拓扑结构
神经网络的结构一般为:输入-隐层-输出层
输入:神经元个数 = 特征维数
输出层:神经元个数 = 分类类别数
隐层:
- 隐层的数量怎么选?
- 隐层神经元的个数怎么确定?
隐层的设计:
- 隐层节点的作用是提取输入特征中的隐藏规律,每个节点都赋予一定权重
- 隐层节点数太少,则网络从样本中获取信息的能力就越差,无法反映数据集的规律;隐层节点数太多,则网络的拟合能力过强,可能拟合数据集中的噪声部分,导致模型泛化能力变差。
- 理论上隐层节点数量和分类的隐含规律个数相关,但是这个规律的具体数量不好确定,所以确定隐层数量这个工作目前一般是试出来的。
激活函数
在神经元中,输入的数据通过加权求和后,还被作用了一个函数G,这个函数G就是激活函数。

激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,因此神经网络可以应用到众多的非线性模型中。
激活函数需要具备的性质:
- 可微性:当优化方法是基于梯度的时候,这个性质是必须的。
- 输出值的范围:当激活函数输出值是有限的时候,基于梯度的优化方法会更加稳定,因为特征的表示受到有限权值的影响更显著;当激活函数的输出是无线的时候,模型的训练会更加高效,不过在这种情况下,一般需要更小的学习率。
常见激活函数如下:
sigmoid函数:
几何图像:

sigmoid函数能把输入的连续实值变换为0和1之间的输出;如果是非常大的负数,则输出变成0;如果是非常大的正数,输出变成1.
sigmoid函数也有一些不足之处:非零均值的输出,导致w计算的梯度始终都是正的;计算机进行指数运算速度慢;饱和性问题(当输入的值特别大或特别小的时候,梯度会非常接近于0,导致参数的更新会非常缓慢)及梯度消失现象(梯度的大小在一个较小的范围内,且很多都小于1,这有可能在链式求导过程中出现多个小于1的数相乘,结果趋近于0的情况。)
tanh函数:
函数图像:

与sigmoid函数相比,tanh的均值是0.
在输入很大或者很小的时候,输出几乎平滑,梯度很小,不利于权重更新。
ReLU函数:
ReLU能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。
ReLU的不足(ReLU死掉):ReLU也是非零均值的函数。如果学习率很大,反向传播后的参数可能为负数,导致下一轮正向传播的输入为负数。当输入是负数的时候,ReLU是完全不被激活的,这就表明一旦输入到了负数,ReLU就会死掉;ReLU的输出范围是无限的。
后面就出现了很多ReLU函数的改进版,将负数部分的不为0,这也就部分解决了ReLU函数的一些缺点。
ELU函数:
\(\alpha\)是可调参数,控制ELU在复制区间的包和位置。
ELU的输出均值接近于0,所以收敛速度更快。
线性部分使得ELU能够缓解梯度消失,而左侧软饱能够让ELU对输入变化或噪声更鲁棒,避免神经元死掉。
损失函数
损失函数\(L = f(\widehat{y}, y),\widehat{y}\)是模型预测值,是神经网络模型参数W的函数,记作\(\widehat{y} = H_w(x)\)
从\(w\)的角度看,损失函数可以记为\(L(w) = f(H_w(x),y)\)
常用损失函数:
均方差损失函数:
均方差损失函数是神经网络优化常用的损失函数。
以一个神经元的均方差损失函数为例:
假设使用sigmoid函数作为激活函数,则\(\widehat y = \sigma(z)\), 其中z = wx + b,
所求的\(\cfrac{\partial L}{\partial w}\)和\(\cfrac{\partial L}{\partial b}\)中都含有\(\sigma ^{'}(z)\),当神经元输出接近1时,梯度将趋于0,出现梯度消失,导致神经网络反向传播时参数更新缓慢,学习效率下降。
所以sigmoid函数和均方差损失函数搭配会出现问题。如果想要使用sigmoid函数,则损失函数得考虑换一个。
交叉熵损失函数:
交叉熵损失函数能够有效克服使用sigmoid函数时,均方差损失函数出现的参数更新缓慢的问题。
交叉熵损失函数:
其中,m为训练集D中的样本的总数量,i为分类类别。
以二分类为例,交叉熵损失函数为:
以二分类为例,则使用Sigmoid激活函数时的交叉熵损失函数为:
可以推出:
sigmoid的导数被约掉,这样最后一层的梯度中就没有\(\sigma^{'}(z)\)。
神经网络中损失函数的特性:
- 同一个算法的损失函数不唯一
- 损失函数是参数(w,b)的函数
- 损失函数可以评价网络模型的好坏,损失函数越小说明模型和参数越符合训练样本(x, y).
- 损失函数是一个标量
- 选择损失函数时,挑选对参数(w, b)可微的函数(全微分存在,偏导数一定存在)
- 损失函数又称为代价函数、目标函数。
2.4 过拟合与正则化
先说两个概念,过拟合与欠拟合:
过拟合:本质原因是训练的特征少,拟合函数无法满足训练集,误差较大。
过拟合:训练的特征维数多,使得拟合的函数很完美的接近训练数据集,但泛化能力差,对新数据的预测能力不足。
对应的示意图如下:



神经网络存在的问题及解决方法:
神经网络规模不断加大,可能会导致一个致命问题:过拟合,泛化能力差。
相关定义:
- 泛化:机器学习不及要求数据在训练集上求得一个较小的误差,在测试集上也要表现好。因为模型最终是要部署到没有见过训练数据的真实场景,提升模型在测试集上的预测效果叫做泛化。
- 过拟合:指模型过度接近训练数据,模型的泛化能力不足。具体表现为在训练数据集上测试的误差很低,但在验证数据集上的误差很大。
- 神经网络的层数增加,参数也跟着增加,表示能力大幅增强,极容易出现过拟合现象。
- 参数范数惩罚、稀疏化、Bagging集成、Dropout、提前终止、数据集扩增等正则化方法可以有效抑制过拟合。
正则化思路
假如一个拟合函数为\(w_0 + w_1x + w_2x^2\),对应的图像如下图所示:

现在根据一个训练集,过拟合出来了一个这样的函数:\(w_0 + w_1x + w_2x^2 + w_3x^3 + w_4x^4\),调整这个函数的方法可以给目标函数加上一些惩罚项,及在保证目标函数中y和\(\widehat y\)之间的差距尽可能小的同时,满足过拟合的那些项的系数也尽可能地小。
若原来的损失函数为:
加入惩罚项之后可变为:
其中,\(C_1, C_2\)为常数,假设取1000
则有:
要使目标函数最小,则应有\(w_3\approx 0, w_4\approx 0\)
在损失函数中增加一个惩罚项,惩罚高阶参数,使其趋近于0.
其中,\(\theta \sum ^{k}_{j=1}w_j^2\)为正则化项/惩罚项;\(\theta\)为正则化参数,神经网络中的参数包括权重w和偏置b, 正则化过程仅对权重w进行惩罚,正则化项记为\(\Omega (w)\), 正则化后的损失函数记为:
\(L^2\)正则化:
用于避免过拟合时某些区间的导数非常大的问题(就像下图所示):

\(L^2\)正则化项:\(\Omega(w) = \cfrac{1}{2}||w||^2\)
目标函数:
\(L^2\)正则化如何避免过拟合?

因为在求梯度的时候w的值也会出现,所以w会成为损失函数的一部分,所以我们会希望损失函数尽可能的小。
通过\(L^2\)正则化后,w权重值变小,网络的复杂的降低,对数据拟合的也更好。
\(L^1\)正则化 :
目标函数:
\(L^1\)正则化添加了一项符号函数sign(w),使得当\(w_i\)为正时,更新后的\(w_i\)变小,当\(w_i\)为负时,更新后的\(w_i\)变大,因此正则化后的效果就是让\(w_i\)接近0,这样网络中的权重就会接近0,从而也就减小了网络的复杂度,防止了过拟合。
其他防止过拟合的方法
Bagging集成方法:
- Bagging训练不同的模型来共同决策测试样例的输出,不同的模型即使在同一个训练数据集上也会产生不同的误差。
- Bagging可以多次重复使用同一个模型,训练算法和目标函数进行训练。
- Bagging的数据集从原始的数据集中重复采样获取,数据集大小与原始数据集保持一致。
- 模型平均是减小泛化误差的一种可靠方法。
Dropout正则化:
- \(L^2\)和\(L^1\)正则化是通过在目标函数中增加一项惩罚项,Dropout正则化是通过在训练时暂时修改神经网络来实现的。
- Dropout正则化思路:在训练的过程中随机的“删除”一些隐层神经元,在计算时无视这些连接。
- 随机对掩码\(\mu\)进行采样,输入单元的采样概率为0.8,隐藏单元的采样概率为0.5.网络中的每个单元乘以相应的掩码后沿着网络的其余部分继续向前传播。
- 注:只有在训练的过程中才有忽略部分神经元的操作,在正向推理的过程中必须考虑全部神经元。
2.5 交叉验证
交叉验证在测试集比较少的时候尤为重要,交叉验证的方式给了每个样本作为测试集和训练集的机会,充分利用样本信息,保证了鲁棒性,防止过度拟合。
选择多种模型进行训练时,使用交叉验证能够评价各模型的鲁棒性。
最简单的验证方式:
将测试集和数据集划分为两个部分S1和S2,最后模型能训练成什么样子,很大程度上取决于数据集的划分方式。不同划分方式下,得到的MSE(Mean Squared Error)变动较大。
这种验证方式的缺点是:最终模型与参数的选取将极大程度依赖于对训练集和测试集的划分方式,只有部分数据参与了模型的训练。
Leave-one-out cross-validation验证方法:
每次取出一个数据作为测试集的唯一元素,而其他的n-1个数据都作为训练集用于训练模型和调参。最终训练出n个模型,得到n个MSE。将这n个MSE取平均得到最终的test MSE。
缺点:计算量过大,耗费时间长。
K-折交叉验证(k-fold cross validation)
这种方法是对上面Leave-one-out cross-validation验证方法的改进。
数据集S包含n个数据,将它们分成K=5份。不重复地每次取其中一份做测试集,用其他K-1份做训练集训练模型,之后计算该模型在测试集上的\(MSE_i\), 最后再将K此的\(MSE_i\)取平均得到最后的MSE。
Leave-one-out cross-validation是一种特殊的k-fold cross validation(K=n)。
优点:所有的样本都被作为了训练集和测试集,每个样本都被验证了一次,相比Leave-one-out cross-validation,计算成本降低,耗时减少。




浙公网安备 33010602011771号