神经网络(三)

在前面的章节中,我们已经介绍了什么是神经网络算法,介绍了神经网络参数优化中如何使用梯度下降法获得最优的参数配置,以及如何使用向后传播算法快速求取梯度参数以使得梯度下降算法中参数得到快速更新,并在第二章节中列举一小段python代码结合进行了讲解说明。实际上,前面介绍的都属于神经网络的基本算法和思想,在本章节中,将针对以下几个方面进行改进,阐述改进地方以及为何需要这样的改进。

  • cost function
  • softmax
  • regularization term
  • initialization of weight parameter

Sec 1:cost function
在前面的章节中的神经网络算法中,cost function有如下基本形式,

C(w,j)=12nx||y(x)a||2

但实际上,这样的cost function在优化过程中会存在一些问题,为了说明问题所在,我们假设一最简单的神经网络模型:只有一个神经元,我们期望这个模型可以完成这样的任务:当输入数据为1.0时,输出数据可以为0.0。

这里写图片描述

为了通过梯度下降法来优化参数 w 和参数b,我们需要给定一个随机的初始点位置,当然,这个初始点的位置我们最开始是并不知情的,有可能这个初始点距离实际的解距离很近,也有可能距离实际解的距离较远。那么初始的参数赋值不同会对我们的优化算法有影响吗?有什么影响?要回答这个问题,我们列举两个例子。

case 1 w=0.6,b=0.9 初始输出值为0.82,经过若干轮梯度下降优化之后的结果如下图,为0.09;曲线图表示cost function随着迭代优化过程中关于epoch的下降曲线走势。

这里写图片描述

目前看来没有什么问题,但是如果使用下一组初始参数进行优化结果却出现了令人不满意的情况。
case 2 w=2.0,b=2.0 初始输出值为0.98,cost function的变化曲线如下图。我们看到cost的下降曲线在最开始时的下降速度只发生了很小的变化,或者说在优化的最开始阶段,我们花费了较多的时间来优化却获得了较少的cost量的下降。这对于我们整体cost优化来说是不期望有的现象。

这里写图片描述

那么,造成上述现象的原因是什么呢?实际上,cost在优化参数 w,b 过程中的下降速率,是由 Cw Cb 决定的,也就是说如果cost的下降速度较慢,则说明对应的参数偏导的值也是偏小的(可以由梯度下降公式看出)。那么什么时候参数的偏导值较小?为什么初始值对偏导值有影响呢?要回答这个问题,我们就需要知道关于参数的偏导值的具体形式是怎样的。

我们还暂时使用上面的简单例子来进行说明,cost方程则为 C(w,j)=12(y(x)a)2 ,而 a=σ(z)=σ(wx+b) ,那么有,

Cw=(ay(x))aw=(ay(x))σ(z)x

Cb=(ay(x))ab=(ay(x))σ(z)

我们知道sigmoid函数越靠近右端,其函数输出会越接近于1.0,越靠近左端,其函数输出会越接近于0.0,而无论靠近哪一端,sigmoid曲线将会变得“扁平”,曲线的变化率也变得越来越小,或者说 σ(z) 的值将会变得较小。那么再回过头来看两个偏导公式,其中都包含 σ(z) 项,那么当神经元的输出值十分接近于1.0或者0.0的时候,此时的 σ(z) 值将会变得很小,促使 Cw Cb 都会变得较小,那么cost的下降率自然不会很高。这样,我们就解释了为何选择不同的参数起点,会对cost方程的下降率造成不同的影响了。这归根结底,还是在于cost 方程的定义结构造成了问题的出现,所以为了避免这样的问题存在,我们将原来的cost方程进行替换,使用cross-entropy方程度量神经网络的性能。

cross-entropy cost function
先介绍cost-entropy方程的基本形式,

C=1nxj[yjlnaLj+(1yj)ln(1aLj)]

其中, x 表示所有数据标号,j 表示输出层中第 j 个神经元。

我们先来看这个方程是否与原来的cost方程具有类似的性质:
proterty 1C>0
由于 aLj 的取值范围是在 (0,1) 之间, 1aLj 同样在 (0,1) 范围内,两个对数式的取值都为负值,所以整个cost方程的取值为正值。
proterty 2:当神经网络的输出值 aLj 与实际标签值 yj 越相近,那么cross-entropy的值越接近于0。举个例子来看,如 y=0a=0 ,那么cross-entropy的第一项为0,第二项近似为0;又如当 y=1a1 ,那么cross-entropy的第一项约为0,第二项为0。
这两条性质与我们刚开始的cost function是具有相同的性质的,也就是说cross-function具备一个cost function应该具有的基本性质。那么,相比于原来的cost function,cross-entropy方程是否可以避免原来优化下降速率慢的问题呢?

我们分别来计算cross-entropy关于两个参数的偏导的情况,其中 aLj=σ(zLj),zLj=kwLjkaL1k+bLj

CwLjk=CaLjaLjwLjk=1nx(yjσ(zLj)1yj1σ(zLj))σ(zLj)aL1k=1nx(yj(1σ(zLj))σ(zLj)(1yj))σ(zLj)(1σ(zLj)))σ(zLj)aL1k1nxyjσ(zLj)σ(zLj)(1σ(zLj))σ(zLj)aL1k

根据sigmoid函数的导数公式 σ(zLj)=σ(zLj)(1σ(zLj)) ,所以最终的公式为,

CwLjk=1nxaL1k(σ(zLj)yj)

同样,可以推导出,
CbLj=1nx(σ(zLj)yj)

这个时候,我们来分析,cost function的学习速率是由 σ(z)y 来控制的,相比于前面的偏导公式,已经不包含关于sigmoid的偏导 σ(z) 一项了(在前面已经分析过,正是这个 σ(z) 导致学习速率下降出现问题)!或者说如果初始猜测值距离实际标签值越远,那么cost function的下降速率越快!那么针对前面的两个图示例子,我们调整cost function为cross-entropy看看效果如何。

case 1 w=0.6,b=0.9
这里写图片描述

case 2 w=2.0,b=2.0
这里写图片描述

可以看到,对于第二种情况,原来的学习速率下降缓慢的问题已经不存在了!目前为止,我们已经从理论和图示上分别说明了cross-function的可取之处了!


Sec 2:softmax
在前面的神经网络中,使用sigmoid函数对神经元进行处理,使用cross-entropy方程可以有效避免学习速率下降困难的问题,这一组搭配是比较常见的。在本小节中,将介绍另外一对搭配:softmax函数和log-likelihood方程。
softmax的基本思想是对神经网络的输出层进行重新定义,对于 zLj 的计算没有差别,照样是 aLj=kwLjkaL1k+bLj ,而后我们并没有使用sigmoid函数对输出层进行处理,而是使用下面的softmax函数,

aLj=ezLjkezLk

简单分析这个公式就可以看出,所有输出层神经元的总和 kaLk=1 ,那么每一个神经元的输出则可以表示为当前神经元对应情况发生的可能性,或者说softmax层可以认为是一种概率分布表示!这一点性质在sigmoid输出函数中是不具备的,在某些特定场景中,我们可能希望使用softmax函数处理以使得网络具有这样的性质,比如深度学习网络。

如果使用softmax对神经元的值进行过滤处理,那么我们需要重新定义cost function以避免能量方程学习下降速率降低的问题,至于为何不能使用cross-entropy方程,原因也很简单,只需要重新温习下上面谈到的关于两个偏导 Cw Cb 的推导过程就可以明白,这里不再赘述。

定义log-likelihood方程,

C=lnaLy

首先来分析这个能量方程是否可以用来衡量神经网络的性能:因为 aLy 始终在范围[0,1]内,所以方程取值始终为正值;当神经网络性能较好时,或者说神经网络的预测输出与实际输出较为相近时,如前面提到的digit recognization问题,如果实际标签为7,神经网络输出值 aL7 同时接近于1(此时神经网络的预测值接近于实际值),那么log-likelihood的输出值将接近于0,如果神经网络性能不好时, aL7 输出值将较小,log-likelihood值将很大。由此分析可知,log-likelihood方程同样也可以度量神经网络性能的优劣。

那么对于能量方程学习速率下降是否存在以往的下降困难的问题呢?要回答这个问题,就需要推导查看两个偏导公式的具体形式,【这里没证明出来,希望理解的不吝指导】

CbLj=aLjyj

CwLjk=aL1k(aLjyj)

可以从两个偏导公式看出,这个公式与前面的sigmoid输出层和cross-entropy方程形式类似,下降速率与差异值 aLjyj 相关的,不会存在优化速率下降困难的问题。

【sigmoid函数 | log-likelihood方程】 与 【softmax输出层函数| cross-entropy方程】具有近似的性能,如果希望输出层输出的是数据预测的概率分布,可以使用后者。


Sec 3:regularization term
什么是正则项?为何要使用正则项?在回答这个问题之前,首先我们来了解一个现象:overfitting(过拟合)!,过拟合在机器学习领域是非常常见的,通常当模型的训练参数过多,模型对训练数据学习的过度完美,以至于学习得到的模型可以匹配至训练数据集中的每一个数据,这看似很好,但当这个训练好的模型在实际的测试数据集上进行测试时,我们往往会得到很糟糕的结果,此时就说明可能出现了过拟合现象。

过拟合通常出现于这样的情况:模型参数过多,训练集数据量过少。为了更加形象地说明过拟合现象,我们来举一个小例子。在前面的digit recognization例子中,设置网络参数:设置一层含有30个神经元的hidden layer,输入层含有784个输入神经元,输出层含有10个输出神经元;整个网络共包含23860个参数。采用1000个训练图像训练该神经网络模型, η=0.5 ,mini-batch大小为10,训练400epoch。

下图的上两个图描述的是训练数据的cost曲线和准确率曲线;下两个图描述的是测试数据的cost曲线和准确率曲线。可以发现:训练模型在训练数据中表现出非常好的性能,准确率在大约50epoch 后就可以达到100%的准确率!cost曲线也随着epoch的增加平滑降低!但是,在测试数据集中准确率却只有82%左右,而且准确率随着训练epoch的增加,动荡浮动,且其cost在大约30epoch时不减反增!这些都足以说明训练模型已经出现了过拟合现象!【实际试验中,使用50000个训练数据集并不会出现这种情况,这里没有列出。这说明增加数据量可以避免过拟合!】

这里写图片描述

正则化
我们在一些情况下很容易出现过拟合现象,这是我们不期望发生的,那么除了增加数据量之外,还有什么方法可以避免过拟合呢?答案就是使用正则化手段。

这里介绍的是L2 regularization,其实很简单,只是在原来的cost方程后再额外添加一项,并没有对原来的cost方程的定义进行修改,

C=1nxj[yjlnaLj+(1yj)ln(1aLj)]+λ2nww2

这一新添加的项称为正则项,它计算了所有的权重参数 wljk 的二次方的总和,乘以系数 λ2n ,与原始的cost方程相加得到正则化后的cost方程。

使用带有正则项的cost方程后,需要对向后传播算法的相应部分就行调整,

Cw=C0w+λnw

Cb=C0b

bbηC0b

wwηC0wηλnw=(1ηλn)wηC0w

其中 C0 表示的是没有添加正则项的cost 方程。我们可以从w的迭代优化方程看出,相比于原来的更新方程,w乘上了一个系数 1ηλn ,这使得w的值变得更小了!

先暂时不解释为何添加正则项可以避免overfitting现象的发生,我们先对这部分刚开始列举的overfitting的例子添加正则项后重新进行实验查看效果是否和我们期望的一致。
下图列举的是在10000个训练数据上测试的结果,相比于原来,在测试数据集上的准确率已经可以达到87%以上,且随着epoch的再增加,准确率会持续增长。这已经很好地缓解了原来的情况。

这里写图片描述

另外,下图展示了未使用正则项(左图)和使用正则项(右图)在训练数据集(黄色线,50000个数据集)、测试数据集(蓝色线)上的准确率曲线图比较,可以看出,使用正则项后提高了测试数据集上的准确率,同时也减少了训练数据和测试数据准确率的差别!

这里写图片描述

综上实验,正则项确实可以起到缓解overfitting的作用。那么为何添加正则项后可以改善overfitting呢?原因何在?我们考虑这样一个简单的例子,加入有若干数据(下图),我们希望猜测生成该数据集的模型是怎样的,最简单的想法是使用多项式来拟合(中间图): y=a0x9+a1x8+...+a9 ;也可以使用简单的线性模型来拟合(最右图): y=2x

这里写图片描述

可以看出,如果使用多项式来拟合,所有的数据都可以得到完美的匹配,而线性模型却存在一定的偏差,看起来线性模型要稍逊一筹;但是当我们对新的数据进行预测时,结果却大不相同。假如x值较大,此时使用多项式来预测的结果要远远大于使用线性模型进行预测的结果!其实,并无法真正的说清楚到底使用哪一种模型就是正确的,只能说使用线性模型更能适用于一般普通的情况,它允许输入数据中存在一定的误差,而对于多项式拟合,即便数据本身包含一定的随机误差,也会将其考虑在内,使得最终学的的模型具有十分的特殊性。

那么现在回答我们关于正则项的问题来,正则项的添加会使得最终学习得到的网络的权重参数要偏小,在这种情况下,即便输入数据中包含一定的随机误差,那么神经网络对这种扰动并没有很大的反应,相比之下,如果权重参数很大,那么即便较小的扰动,也会使得网络的输出造成不期望的变动。总而言之,使用正则项可以使得神经网络模型不过于复杂,可以针对训练数据中频繁出现的“pattern”进行学习,而对于很少出现的“扰动”忽视不见[好比使用线性模型对数据拟合的现象一样]。相信这么回答,可以大致说明为何使用正则项可以避免overfitting问题了。


Sec 4:initialization of weight parameter
在前面所有所有的实验中,实际上我们都使用的都是由均值为0、标准差为1的高斯分布产生的随机值来对网络参数 w,b 进行初始化,但理论上,这种随机的初始点赋值对于网络学习性能确实有一定的影响,下面我们来针对这个问题进行探讨。

假设我们现在有这样的一个神经网络模型:包含1000个输出层神经元,我们暂时只考虑从输入层到第一个隐藏层的传播情况。假设输入神经元中有500个输入值为1,而其余的500个输入值为0,那么根据公式 z=jwjxj+b ,对于隐藏层的任意神经元来说,从输入层传播而来的值中,将有500个值由于输入神经元的值为0而从公式中消失,那么最终得到的 z 值可以看做是500个采用均值为0、标准差为1的高斯分布生成的随机值相加而来,所以z本身就可以看做是由一个均值为0、标准差为 50122.4 的高斯分布产生的【若干个由独立高斯分布产生的变量值的和的方差等于产生这些随机值的高斯分布的方差的和】,其概率密度函数曲线大致是这样的,

这里写图片描述

可以看到这个高斯分布是很“扁平”的,换句话说隐藏层神经元得到的 z 值将有很大的可能性取得较大值,此时经过sigmoid函数作用后,隐藏层神经元的激活值将接近于0或1,神经元到达近“饱和”状态。此时,你可能会想到在cost方程小节,我们使用原来的cost方程很容易使得输出层神经元达到近“饱和”状态而使得网络出现学习速率下降困难的现象。这里出现了与此类似的情况,只是不单针对输出层,而是普遍出现在每一隐藏层神经元的现象!

既然我们发现了问题,那么其实提出解决方案也并不困难。假设网络的输入层含有nin个神经元,那么我们在设定随机初始参数 w 时,将高斯分布的标准差从原来的1调整为1nin。我们再来重新计算上面这个小例子中第一隐藏层神经元获得的 z 值的分布:由z=jwjxj+b,z实际上是由500个均值为0、标准差为 11000 的高斯分布产生的随机值,以及1个均值为0、标准差为1的高斯分布产生的随机值的和构成。因此z值相当于由均值为0,标准差为 500(11000)2+1=32 的高斯分布产生,其概率密度图如下,相比原来,z值基本围绕在均值0附近!

这里写图片描述

上面是从理论层面来描述这个问题,下面我们来看在实际的实验结果中是否和我们期望的一致。下图展示的是分别使用原来的和改进后的参数 w <script type="math/tex" id="MathJax-Element-20130">w</script>初始化方法的准确率对比图,从图中可以看出,无论使用哪一种参数初始化方法,在迭代的最终都可以得到近似96%的准确率,但是相比于原来的初始化方法,使用改进后的初始化方法准确率提升的速率要更快!

这里写图片描述


总结:我们在上面三个小节中,分别说明了使用cross-entropy方程,添加正则项,改进weight参数初始化方式三个角度如何来提升神经网络是优化学习速率。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值