神经网络与深度学习笔记——代价函数,规范化,过拟合

神经网络与深度学习笔记系列一共有五个专题,分别是
第一章使用神经网络识别手写数字——梯度下降算法是什么。主要介绍了神经网络的基础例如感知器激活函数等概念,最主要介绍了梯度下降算法。
第二章反向传播算法如何工作——反向传播算法原理。主要介绍了反向传播算法的工作原理。

第三章改变神经网络的学习方法——代价函数,规范化,过拟合。主要介绍了不同的代价函数,以及规范化等对传统代价函数的改造。

第四章深度神经网络为何难以训练——梯度消失和爆炸。主要介绍了梯度消失问题和梯度爆炸问题。

第三章改进神经网络的学习方法

3.1交叉熵代价函数

        类似于人类试错过程,我们希望神经网络在预测的最终结果和我们想要的结果差距越大时,神经网络对权重和偏置的改变也越大,当慢慢接近真实结果时,改变变小。但是事实上神经网络的学习却是非常缓慢的,原因是我们采用的sigmoid函数两端变得非常平,代价函数对权重和偏置的偏导数变得很小,所以导致了学习缓慢。我们可以通过使用交叉熵代价函数在替换二次代价函数,改善这个问题。

3.1.1交叉熵代价函数的引入

首先给出交叉熵代价函数的公式:

a表示神经元的输出,求和是对所有的输入x进行求和。

        首先解释为什么可以把交叉熵函数看做是网络的代价函数。原因有两个,第一,交叉熵函数是正值。因为a的取值是0到1。第二,如果神经元的输出a与标签y接近,代价函数的值趋于0。①当a趋于1,y=1时,第二项为0,第一项趋于0。②当a趋于0,y=0时,第一项为0,第二项趋于0。

        而且,交叉熵函数避免了学习缓慢的问题,让我们利用代价函数对权重和偏置求偏导数:

因为\sigma'(z)=\sigma(z)(1-\sigma(z))所以上式化简为:

通过上式,我们可以看到,代价函数对权重的偏导数取决于\sigma(z)-y的值,也就是说,网络输出的结果与实际结果相差越大,网络学习得越快,网络输出的结果与实际结果相差的越小,网络学习得越慢。

同样的方法可以求出代价函数对偏置的偏导数:

以上是一个神经元的交叉熵函数,对于输出层所有的所有神经元,假设y=y_1,y_2,y_3........是神经元的目标输出值,a_1^L,a_2^L,a_3^L是网络的预测输出值,则代价函数的表达式为:

先对一个输入所有的神经元进行求和,再对所有的输入进行求和。

3.1.2交叉熵代价函数是怎么想到的?直观的理解又是什么?

我们发现,导致学习速率下降的原因是因为在对权重和偏置的偏导数中存在\sigma'(z)项,我们首先会想到设计一个代价函数,使得在最终的偏导数中没有\sigma'(z)项,那么对一个训练样本,偏导数为:

然后我们根据数学直觉进行推导:

对a进行积分得:

然后再对所有的输入样本进行求和,就可以得到我们说所讲的交叉熵代价函数。

那么交叉熵代价函数的直觉理解又是什么呢?

一种来自信息论领域的理解就是,交叉熵函数是一种“不确定性”的度量。

3.1.3柔性最大值(softmax)

首先给出softmax的定义式:

因为指数函数的值正的,所以神经元的激活值都是正的,而且,所有的激活值相加的结果等于1。任何神经元的激活值a_j^L与本层所有的z_k^L都有关。

所以,使用softmax作为激活函数的层,可以看作网络预测的一个概率分布。

对于偏导数\partial {a_j^L}/\partial z_k^L,对于j=k时,其值为正,对于j\not =k时,其值为负。这表明,当增加z_k^L会提高对应的激活值a_j^L的值并降低其他激活值。

利用softmax函数作为激活函数时,我们定义一个对数似然函数作为代价函数:

计算偏导数为:

可以看到,当误差(a-y)越大时,偏导数越大,说明学习越快,能够解决学习缓慢的问题。

3.2过拟合和规范化

过拟合(overfitting)是指网络在训练集上表现的良好,但是在测试集上表现得一般甚至很差,可能会发生的情况有,训练集的cost一直在下降,但是测试集上的cost一开始下降后来停在一个很高的值上,上下波动,甚至cost越来越大,或者在训练集上准确率非常高甚至达到百分之百,但是在测试集上准确率与训练集准确率相差很大甚至准确率很低。产生过拟合的原因是,网络利用超大规模的参数,记住了训练数据集的特征,利用“记忆”,所以在训练集上表现良好,实际上并没有学习到事物的一般的特征,导致泛化能力下降,在测试集上表现很差。最好的降低过拟合的办法之一是增加训练数据的量。

3.2.1规范化

除了增加训练样本来降低过拟合以外,使用规范化也可以有效的降低过拟合。规范化也被叫做权重衰减(weight decay)或者L2规范化。这种方法的原理就是在之前的代价函数上增加一项网络中所有的权重的累加平方和取平均。

C0表示原始的代价函数,我们以交叉熵代价函数为例:

直观上看,规范化的的效果是更倾向于权重值小的网络模型,或者说,是根据\lambda的取值来在小的权重值和小的代价之间的折中,\lambda越小,网络越倾向于最小化原始代价函数,\lambda越大,网络倾向于小的权重。

3.2.2对于规范化可以减轻过拟合的直观理解

小的权重在某种程度上,意味着更低的复杂性,也就对数据给出了一种更简单却更强大的解释。更小的权重意味着网络的行为不会因为我们随便改变了一个输入的大小而改变太大,将它看做是单个的证据不会对网络输出影响太多。规范化的网络学习去对整个训练集中经常出现的证据进行反应。简言之,规范化网络受限于根据训练数据中常见的模式来构造相对简单的模型,而能够抵抗训练数据中的噪声的特性影响。

3.2.3规范化的其他技术

本节主要介绍现存的除了L2规范化以外的三种降低神经网络过拟合的方法技术:L1规范化、弃权和人为增加训练数据。

L_1规范化形式为:

L_1规范化更倾向于聚集网络的权重在相对少量的高重要度连接上,而其他权重就会被趋势向0接近。

弃权(dropout):dropout的主要思想是,在训练网络是,保持输入层和输出层的神经元不变,每一次训练选用一小批数据进行,并且在训练前随机的“删掉”隐藏层一半的神经元,(删掉是指不参与本次训练过程,但是有可能参与后续的训练过程。)然后在用另一小批数据进行训练,重新随机“删掉”隐藏层的一半神经元。启发式地看,当我们“删掉”一半的神经元时,就好像在训练不同的网络,训练的最终结果好就好比我们同时训练了好几个网络模型,最终的结果由这几个网络模型的平均效果决定。

人为扩展训练数据:我们知道增加训练样本的数量可以降低网络的过拟合,实验获得大量数据往往比较困难,我们可以通过人为的方式对已有的数据进行扩展,例如对于MINST数据,我们可以把数字旋转一个小的角度,数字没有变,但是图片的像素却发生了变化,这对神经网络而言就是新的训练数据。我们一般是通过应用反映真实世界变化的操作来扩展训练数据。

3.3权重初始化

        之前我们用的权重和偏置初始化的方法是将其归一化为均值为0,标准差诶1的高斯分布。但是这种初始化的方法很容易让隐藏层的神经元饱和,在使用了sigmoid激活函数时,导致\delta'(z)的值很小,学习缓慢。虽然我们使用了交叉熵代价函数,但是交叉熵代价函数只针对输出层神经元有用,解决这个的方法是用另一种方法初始化权重和偏置。我们使用均值为0标准差为1/\sqrt{n_{in}}的高斯分布初始化权重,其中,n_{in}表示输入神经元的个数。我们仍然使用均值为0标准差为1的高斯分布来初始化偏置。(偏置的初始值并不会对学习速度产生太大的影响)后面我们会看到,用这种新的初始化权重的方法,不仅对学习速度有所提升,而且有时候在最终性能上也有很大的提升。

3.4神经网络超参数的选择

        我们已经知道了,神经网络有学习率\eta,规范化参数\lambda,小批量数据的大小minibatch_size等超参数。本节主要讲解一些选择超参数的策略和技术。

学习率\eta:选择学习率的大小,首先要找到学习率的一个阈值,方法是先将学习率设置一个比较大的值,你会发现代价函数一开始就会震荡,然后将学习率减少10倍,直至一个学习率使得代价函数曲线一开始是下降的而不是震荡的。较为高级的策略是在训练的前期先选用一个比较大的学习率,在代价函数持续几个回合不下降的情况下,就将原始的学习率缩小10倍,依次进行一直到代价函数下降到一定程度或者学习率达到之前的1/1000或者1/10000这个倍数需要自己设置,不同情况可能不同。

规范化参数\lambda:建议先将规范化参数设为0调整好学习率之后,再用调整好的学习率去设置规范化参数。规范化参数从1开始,根据验证集上的性能按照10倍增加或减小,设置好规范化参数以后,再利用设置好的规范化参数去调整新的学习率。

这里要提到的一点是,现在已经出现了自动调整超参数的技术,叫做网络搜索(grid search),可以系统的对超参数的空间进行搜索。

3.5其他技术

3.5.1随机梯度下降的改进

我们前面已经看到了梯度下降法在神经网络学习过程汇总的作用,下面我们主要介绍两种在随机梯度下降算法的基础上进行改进的更新权重和偏置的算法,分别是Hessian 和 momentum 技术。

Hessian 技术:我们已知代价函数C是多个权重和偏置的函数,这里忽略偏置只看权重,假设w=w_1,w_2,w_3......,所以C=C(w)。这里我们借助泰勒展开公式,代价函数在点w处可以被近似为:

可以将 上式重新写为:

\nabla C表示梯度向量,H就表示Hessian矩阵,其中的第jk项为\partial^2C/\partial w_j \partial w_k,我们只取前两项对上式进行近似:

选择对上式进行最小化。我们期望从点w移动到点来减小代价函数的值。于是我们就找到了一种优化代价函数的方法:选择开始的点w,然后更行w到新点,其中矩阵H和梯度都是在点w处算出来的,然后再继续更新w。我们通过重复的使用改变量来改变w,\eta表示学习速率。

在理论和实践上都表明Hessian优化比随机梯度下降算法收敛速度快。但是Hessian技术在实践上很难应用原因是Hessian矩阵非常大。

基于 momentum 的梯度下降:直觉上看,Hessian技术的优点在于它不仅考虑了梯度,而且还考虑了梯度的变化信息(因为H矩阵里面包含有二阶导数)。基于momentum 的梯度下降的算法也是受此启发。它的主要思想是,引入了一个中间变量v,我们称之为速度,在改变w的时候,通过梯度先改变v,然后通过v再改变w,类似于力先改变速度,然后速度改变位置一样的道理。

\mu叫做momentum coefficient(动量系数)。

3.5.2其他的激活函数

tanh函数:使用tanh激活函数的神经元输出为

tanh函数的定义式为:

tanh函数和sigmoid函数之间存在着这样的关系:

tanh函数的函数曲线为:

修正线性单元(rectified linear neuron):ReLU,激活函数采用ReLU的神经元的输出为:

ReLU的函数表达式为:

函数图像为:

使用sigmoid函数的一个缺陷是,同一层的神经元的权重同时增加或减小,使用tanh或ReLU函数可以避免这个问题。

发布了23 篇原创文章 · 获赞 6 · 访问量 1332

猜你喜欢

转载自blog.csdn.net/weixin_42194139/article/details/105004882