一、误差逆传播算法
1、神经网络
神经网络是由具有适应性的简单单元组成的广泛并行互联的网络。其实,神经网络是一个很大的学科领域,对于数学家和自动控制专家对其有不同的看法。对于我们一般来讲神经网络看作算法,对于西瓜书而言仅仅讨论神经网络与机器学习的交集,即"神经网络学习"亦称"连接主义"学习。
2、误差逆传播算法(BP算法)
BP算法不仅可用于多层前馈神经网络。它是一种监督学习算法,用于根据输入数据和对应的目标输出数据,调整神经网络的权重,使得网络能够对输入数据做出正确的预测。
BP算法的基本思想是通过计算网络输出与真实目标之间的误差,并将误差反向传播到网络中的每个神经元,以便调整各层之间的连接权重,从而降低误差,提高网络的预测能力。该算法主要分为两个阶段:前向传播和反向传播。
给定训练集。也就是输入 维特征向量、 维实值向量。便于理解,看下图:
输出层第 个神经元的阈值用 表示,隐层第 个神经元的阈值用 表示。输入层第 个神经元与隐藏层第 个神经元之间的连接权,隐藏层第 个神经元与输出层第 个神经元之间的连接权。记隐层第 个神经元接收到的输入为,输出层第 个神经元接收的输入为,其中 为隐层第 个神经元的输出。
PS1-1:为什么设置 β 呢?引入 β 是为了让整体处理的更方便,其等于所有的输入的加和,称为"静输入"。是为了后面描述的更加方便。
对于训练例,假定网络的实际输出为。考虑例3-1给出的图,可知:
k,代表的是第 k 个样例上;j,代表的是对第 j 个神经元进行处理。若是在回归问题上,最重要考虑的就是均方误差,即在上:
即,考虑实际输出和真是输出之间的差别,前面有个为的是平方求导后将2抵消。这里其实在前面的笔记里说了很多次了。需要通过学习确定的参数数目:
PS1-2:看上图,输入层和隐层直接的权重参数有 d×q 个,隐层与输出层直接的权重参数有 l×q 个,隐层又有 q 个阈值,输出层有 l 个阈值。所有一共是 (d+l+1)q+l。
在训练过程中根据一些数据来敲定上述的参数。BP是一共迭代的学习算法,在迭代的每一轮中采用广义感知机学习规则对参数进行更新估计。说白了,就是从感知机推广到多层感知机。通常我们把多层前馈网络用BP算法训练的时候称为多层感知机。任意参数v的更新使用下面的准则:
PS1-3:这个式子很好理解,就是上一次是v,学习就是对这个v进行调整,加上一个调整量∆v。
所以我们的重点就是要知道这个∆v。那∆v是怎么改变的呢?一定是因为有误差!如果要是没有误差,一次过。那我们就啥都不用改了。正是因为有误差,所以我们要有一个调整量∆v进行修正。
在第三章就说过了,有误差怎么改?求导,倒数为0,求极值。所以BP算法采用梯度下降法(在之前的笔记中讲过,这里不赘述)策略,以目标的负梯度方向对参数进行调整。以学习参数为例,对误差,给定学习率 η ,有:
我们回看PS3-1中的图,这里的 w 要和 发生联系,但是我们发现 w 和 不是直接联系的, 由 决定的,由 β 决定,β 是由 w 决定。所以是 先影响到 ,再影响到 ,然后才影响到 ,有:
PS1-4:其实就是偏导的链式法则罢了。
进行推导一下:
PS1-5:这里的是sigmoid函数,他有一个很好的性质。就是
其实很简单,自己推一下。将前两项项拼起来,得:
于是,可求得 的更新公式为:。看上面给出的神经网络的图是隐层神经元的输入信号,是处理得到的一项。
类似这种推导过程,可以把其他的参数全推导出来:
其中是隐层的阈值调整量,是输出层与隐层之间的权重调整量,是输出层的阈值调整量。上述式子中的:
的推导过程同自行推导练习。以上的学习率η∈(0,1),该学习率控制算法每一轮迭代的更新步长,太小收敛速度慢,太大就震荡。但是学习率还是有可能引发震荡现象的,所以要有办法让其停止,设置其在几轮内停止,这里引入"轮次":
①将训练样本每一个都走一遍称为一轮;
②将每一个样本给到模型中并调整一次,有多少样本就调几次就有几轮;
③每轮之间计算误差下降的情况,在第二章提起过,第一轮误差为0.8,第二轮误差为0.7,那就继续下去。若第一轮误差为0.8,第二轮误差为0.9,那就停止。
以上三种方法都可以使其停下来。如何理解这个 η ,画一个几何图作为理解:
所以,其实一开始调整步长可以比较大。可以设置成动态学习率,如:η、、。
显然,从数学的理论推导,也轻易能看懂BP算法的工作流程了:
始终注意,BP算法的目标是最小化训练集D上的累计误差:
"标准BP算法" 每次仅针对一个训练样例更新连接权和阈值(其实,上面讲述的都是针对一个样例更新连接权和阈值),"累计误差逆传播"推导出基于累计误差最小化的更新规则。
PS1-6:"标准BP算法" 与"累计BP算法"的区别类似随机梯度下降与标准梯度下降的区别。
3、BP网络的过拟合
有两种策略可以用来缓解BP网络的过拟合:
"早停": 将数据分为训练集和验证集,训练集用来计算梯度、更新连接权和阈值,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练,同时返回具有最小验证集误差的连接权和阈值;
"正则化":其基本思想是在误差目标函数中增加一个用于描述网络复杂度的部分,例如连接权与阈值的平方和
其中表示连接权和阈值,λ ∈ ( 0 , 1 )用于对经验误差与网络复杂度这两项进行折中,常通过交叉验证法来估计。增加连接权与阈值平方和后,训练过程将会偏好较小的连接权和阈值,以减少过拟合 。
PS1-7:正则化是什么?
具体是在模型的损失函数中添加一个额外的惩罚项,通过对模型参数进行约束,限制模型的复杂度,防止模型对训练数据过拟合,使模型在未知的训练数据上也能有较好的泛化性能。
目的:在模型训练过程中,让模型在拟合训练数据和保持简单性之间找到一个平衡,避免模型过于复杂而过度拟合训练数据中的噪声和细节,从而提高模型对新数据的适应性和预测准确性。
常见的正则化方法有:L1正则化、L2正则化、Dropout正则化(也称丢弃法)
过拟合就不说了,之前的笔记里说的很清楚了。
先讲L1、L2正则化,L1、L2正则化就是在损失函数里加正则化项:
注意这里的正则化项前面的 λ 不是正则化项的一部分,而是正则化项在损失函数中的权重。另外L1、L2正则化项都要 ≤ θ(不包含 λ系数 )
①为什么加入正则化项可解决过拟合问题?
我们要使损失函数尽可能的小,加入正则化项后,还要使参数w尽可能的小。即,降低参数w的大小范围——>降低了模型复杂度——>解决过拟合。
②为什么加入正则化项时只限制参数w而不限制b?
因为b只是一个偏移量,只是对拟合的曲线进行平移,并不会改变曲线形状。解决过拟合问题只是想让曲线更为平滑。
③比较L1正则化和L2正则化
L1正则化能起到稀疏化的作用,可以用于特征选择,举个例子:
看上去可能比较费解,红色的等高线是loss函数的等高线。蓝色阴影部分,分别是对w的限制区域。我们要找的是损失最小的点,而且保证w在被限制的区域内。为什么L1可以被稀疏化,交点在(0,1)点,此时w2=0就稀疏了。但是L2正则化显然切点不是坐标轴上。
这里可能还有同学不明白,解释一下稀疏化吧!稀疏化是指通过某种方法使数据或模型中的大部分元素变为零或接近零,从而得到一个具有稀疏结构表示的过程。这样回看以后,w2=0,也就是说w2对应的特征被排除了,所以稀疏了。也就是减少特征数来避免过拟合!L2就是减少w的范围,来消除过拟合。推导到高维也是一样的。
再来看看Dropout正则化(不想打这么多字,所以下文称为"丢弃法"),依然举个例子:
设置一个概率P=0.5。使隐层的各个节点都有50%的概率保留和删除。使用了丢弃法的神经网络中未被连接的神经元节点都是被丢弃的节点。也就是说使用丢弃法后,会得到一个更为精简的神经网络。
①为什么丢弃法可以解决过拟合问题?
直观看是从一个复杂的模型变为一个精简的模型。网络模型的参数也变少了,模型复杂程度由两个方面,一个是参数的数目,另一个是参数的大小范围。因此,我们可以采用减少参数的数目,来降低模型的复杂度,因此就能解决过拟合。
另外,在原来的神经网络中,我们的输出值是由前层神经元之和决定的,但是在使用丢弃法以后,在每一层结点都有50%的概率被保留或者删除,因此每一个结点都不一定能保证留在网络中。这么看来输出的神经元就不能过度的依赖任意一个输入神经元,也就是说不可能给任何一个神经元赋一个过大的权重。因此权重参数w也变小,其大小范围变小了呢,相当于起了一个L2正则化的作用。也就解决了过拟合问题。