多层神经网络权重研究(一)

刀剑神域

友情链接

结合numpy及mnist库的简单神经网络演练

前言

近期学习了关于神经网络权重相关的优化算法,其中包括权重初始化以及解决过拟合问题的相关方法,本篇着重讲解权重初始化部分,并大致介绍模型过拟合的思考方向,下一篇则会通过介绍通过正则化Batch Norm来解决过拟合问题的做法。为了研究的比较透彻,还额外参考了比较多其他大佬的博客,大概了解了其优化思路,希望能够对看到这篇博客的人有所帮助。

正文

权重初始化

原因分析

权重初始化是整个神经网络起步的重要问题,能够构建一个好的初始化权重对于梯度下降更新权重将非常有益。假如你将神经网络的权重全部设为0,那么在隐藏层计算X*W+b时,你会发现所有隐藏层的值完全一致,因此所有隐藏层反向传播的梯度也完全一致,这样做就会出现非常典型的权重对称问题,出现权重对称,那么神经网络的一层与多层隐藏层就没有任何区别,显然这不是我们希望看到的。
因此我们需要选择一个合理的初始化权重方法,一般情况下,有两种权重初始化方式:
(1)高斯分布随机化
(2)均匀分布随机化
这两种方式的共同特点就是分布的方差是固定的,因为我们并不想前一层方差很大,而后一层方差又很小,这样不利于反向传播更新权重。
平常用的最多的还是高斯分布,因为其是基于随机化的分布,更有利于防止权重对称

方差选择

如果选用了高斯分布,那么选取一个合适的方差显然就尤为重要。
那么我们如何来确定该方差对神经网络的效果好坏呢?
这里要从激活函数说起。激活函数大致有以下常见的类型:

  1. sigmoid函数
  2. Relu函数
  3. tanh函数
sigmoid函数

sigmoid函数图像应该大家都不陌生:
sigmoid
很明显可以看出sigmoid的导数两边小,中间大,当函数值非常接近0或1时,其梯度更新几乎为0,也就是说,当反向传播过程中,如果激活值非常接近于0或1,那么权重几乎不会更新。因此我们一定要极力避免这种现象。
这时就需要调整方差来让大部分数据的激活值集中在0.5附近,那么我们来举一个例子,我们依然使用mnist数据,来绘制σ=1与σ=0.01的激活值分布图
在这里插入图片描述

在这里插入图片描述
显然此时标准差为0.01的数据大部分集中在0.5附近,此时权重的更新将非常快速。

tanh函数

tanh函数即反正切函数,其形状与sigmoid几乎一致:
在这里插入图片描述
只不过值域变为了[-1,1],显然此时的激活值分布相比于sigmoid来说从原来μ=0.5变为μ=0,如果采用标准差σ=0.01,其激活值分布如下:
在这里插入图片描述
但是同时我们会观察到一个现象,激活值的方差在不断变小,这不是一个好消息,因为如果方差逐渐减小,说明更多的点集中在中间位置,而tanh或者sigmoid中间位置是梯度最大的位置,这样梯度会随着层数的增加而不断增大,从而使得反向传播后w的方差也随着发生改变。

Xarier优化算法

由此我们需要引入优化方法:Xarier来解决各层之间方差不一致的问题
进一步来说,如果各层的激活函数一样,且权重初始化分布一致,那么就有如下公式:
在这里插入图片描述
其中l代表第几层隐藏层,nl代表第l层的神经元数量。如果不让前项
n ( l − 1 ) v a r [ w i l ] n^{(l-1)}var[w^l_i] n(l1)var[wil]为1,那么var[al]一定会增大,所以我们需要让
n ( l − 1 ) v a r [ w i l ] = 1 n^{(l-1)}var[w^l_i]=1 n(l1)var[wil]=1从而得到
v a r [ w i l ] = 1 n ( l − 1 ) var[w^l_i]=\frac{1}{n^{(l-1)}} var[wil]=n(l1)1
如果再考虑到反向传播造成的影响,则将公式转变为(对Glorot条件取均值)
v a r [ w i l ] = 2 n ( l − 1 ) + n ( l ) var[w^l_i]=\frac{2}{n^{(l-1)}+n^{(l)}} var[wil]=n(l1)+n(l)2
详细公式推导请参考:深度学习之参数初始化——Xavier初始化
我们再来看一下激活值分布:
在这里插入图片描述
显然此时数据分布基本一致。

Relu函数

Relu函数是分段函数,基本函数图像如下:
在这里插入图片描述
如果我们继续使用σ=1/√n,显然我们可以知道,函数值中有大概一半的函数将会被置为0,即高斯分布只会保留一半,如下:
在这里插入图片描述
显然方差在不断变化,说明xvarier算法也失效了,这时,我们引入新的算法He kaimng,这种算法推导不再展开,可以参考这篇博客He算法,最终推导完毕只是将标准差变为:
σ = 2 n σ=\sqrt{\frac{2}{n}} σ=n2
如此简单,但是效果却让人惊叹
在这里插入图片描述
显然这些权重初始化方法实现都非常简单,这里不再赘述。

过拟合问题

综合概述

参考:机器学习中常见的过拟合解决方法
过拟合是神经网络训练中非常容易遇到的问题,其出现的频率会远大于欠拟合。机器学习过拟合问题多数是由于模型过于复杂,迭代次数过多而数据却过少导致经验误差过大,而泛化误差却过小的现象。
过拟合我们我们可以从多种角度进行考虑解决方法,如增加训练数据、降低模型的复杂度、增强数据的泛化程度

解决方法
剪枝操作

由于决策树是非常容易发生过拟合的模型,剪枝处理主要有预剪枝和后剪枝这两种,常见的是两种方法一起使用。预剪枝通过在训练过程中控制树深、叶子节点数、叶子节点中样本的个数等来控制树的复杂度。后剪枝则是在训练好树模型之后,采用交叉验证的方式进行剪枝以找到最优的树模型。

正则化(regularization)

正则化处理则一般有L1,L2范数正则化,方式即是在损失函数后添加一项额外正则项。
L1正则化则是采用各层权重w的累加绝对值,公式如下:

在这里插入图片描述
在这里插入图片描述
其中m为一次训练的样本个数,而λ为正则化的超参数,L2正则化也是如此。
那么可知,当进行反向传播时,梯度下降的公式会出现变化:
w 1 = w 1 − l r ⋅ λ 2 m s i g n ( w 1 ) − l r α J α w 1 w_1 = w_1-\frac{lr·λ}{2m}sign(w_1)-lr\frac{αJ}{αw_1} w1=w12mlrλsign(w1)lrαw1αJ
lr为学习率
显然,当w1<0时sign(w_1)为负,此时相当于加上一项常数,w1>0同理。
其作用显然是使得w衰减。加入L1正则项之后,数据集中那些对模型贡献不大的特征所对应的参数w可以为0,因此L1正则项得出的参数是稀疏的
L2正则化则是采用各层权重w的平方和累加,公式如下:

在这里插入图片描述
在反向传播过程中,显然会多出一个一次项,如下所示:
w 1 = ( 1 − l r ⋅ λ m ) w 1 − l r α J α w 1 w_1 = (1-\frac{lr·λ}{m})w_1-lr\frac{αJ}{αw_1} w1=(1mlrλ)w1lrαw1αJ添加链接描述
显然也是一种权重衰减的方法,但是L2正则化不会获得稀疏解,只会将对模型贡献不大的特征所对应的参数置于无限小的值,以此来忽略该特征对模型的影响。

Batch Normalization

参考:
Batchnorm原理详解
深入理解Batch Normalization批标准化

Batch Normalization(批标准化)是一种有效解决过拟合的方法,其理论是近几年才由google小组提出来的,是为了解决Internal Covariate Shift问题,其主要描述的是:训练深度网络的时候经常发生训练困难的问题,因为,每一次参数迭代更新后,上一层网络的输出数据经过这一层网络计算后,数据的分布会发生变化,为下一层网络的学习带来困难(神经网络本来就是要学习数据的分布,要是分布一直在变,学习就很难了)。
当然除此之外还有Covariate Shift问题,而这个问题只是针对输入层而言,即训练数据与测试数据分布不一致的问题。
在之前我们都是一直在回避这些问题,通过减小学习率、使用正态分布初始化参数、对数据进行白化处理等方式,然而是治标不治本。
因此Batch Norm算法就出现了,当然这种方式存在有一定局限性,后边会进行说明。
思想就是:对于每个隐层神经元,把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题。
但是这样显然会出现一个问题:如果都通过BN,那么不就跟把非线性函数替换成线性函数效果相同了?这样使用多层神经网络岂不就重新退化成了单层线性网络?
所以BN为了保证非线性的获得,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作**(y=scale*x+shift)**,每个神经元增加了两个参数scale和shift参数,这两个参数是通过训练学习到的,意思是通过scale和shift把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于非线性函数的值从正中心周围的线性区往非线性区动了动。

所以Batch Norm一共就做了两件事:
(1)归一化当前层的输入值
(2)使用y=scale*x+shift再对归一化后的数据进行挪动,让其存在一定的非线性特征。
公式如下:
μ B = 1 m ∑ i = 1 m x i μ_B=\frac{1}{m}\sum_{i=1}^{m}x_i μB=m1i=1mxi
σ B 2 = 1 m ∑ i = 1 m ( x i − μ B ) 2 σ_B^2=\frac{1}{m}\sum_{i=1}^{m}(x_i-μ_B)^2 σB2=m1i=1m(xiμB)2
x i = x i − μ B σ B 2 + ε x_i=\frac{x_i-μ_B}{\sqrt{σ_B^2+ε}} xi=σB2+ε xiμB
y i = γ x i + β y_i = γx_i+β yi=γxi+β
这样yi就变成了当前层的新输入数据。

相关过拟合方法深入以及实现则请期待我的下一篇博客。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值