深度学习笔记(7) 实践层面(二)
1. 正则化
深度学习可能存在过拟合问题——高方差,在确定模型之后有两个解决方法
- 正则化
- 准备更多的数据
但可能无法时时刻刻准备足够多的训练数据或者获取更多数据的成本很高
但正则化通常有助于避免过拟合或减少网络误差
用逻辑回归来实现这些设想,求成本函数J的最小值,参数包含一些训练数据和不同数据中个体预测的损失
w和b是逻辑回归的两个参数,w是一个多维度参数矢量,b是一个实数
在逻辑回归函数中加入正则化,只需添加参数λ,也就是正则化参数
λ/2m 乘以w范数的平方,w 欧几里德范数 的平方等于wj(j 值从1到nx)平方的和,也可表示为wTw
因为用了欧几里德法线,被称为向量参数w的L2范数,此方法称为L2正则化
w几乎涵盖所有参数,如果加了参数b,其实也没太大影响,因为b只是众多参数中的一个,所以通常省略不计
在Python中,λ是一个保留字段,编写代码时,删掉a,写成 lambd,以免与Python中的保留字段冲突
神经网络含有一个成本函数,该函数包含W([1]),b([1])到W([l]),b([l])所有参数,字母L是神经网络所含的层数
正则项为:
这个矩阵范数 |W[l] |2(即平方范数),被定义为矩阵中所有元素的平方求和
在权重更新时:
w = w − a d w w=w-adw
w=w−adw
d w dw
dw来自backprop中J对W的偏导数,可以看到
正则化参数λ系数小于1,因此L2范数正则化也被称为“权重衰减”
直观上理解就是
如果正则化λ设置得足够大,权重矩阵W被设置为接近于0的值
直观理解就是把多隐藏单元的权重设为0,于是基本上消除了这些隐藏单元的许多影响
这个被大大简化了的神经网络会变成一个很小的网络,小到如同一个逻辑回归单元
可是深度却很大,会使这个网络从过度拟合的状态更接近高偏差状态
但是λ会存在一个中间值,于是会有一个接近“Just Right”的中间状态
直观上λ增加到足够大,W会接近于0
实际上是不会发生这种情况的,尝试消除或至少减少许多隐藏单元的影响
最终这个网络会变得更简单
这个神经网络越来越接近逻辑回归,直觉上认为大量隐藏单元被完全消除了
其实不然,实际上是该神经网络的所有隐藏单元依然存在,但是它们的影响变得更小了
神经网络变得更简单了,貌似这样更不容易发生过拟合
若正则化参数λ很大,激活函数的参数w会相对较小,因为代价函数中的参数变大了,
所以相对来说,z也会很小,这个激活函数,也就是曲线函数tanh会相对呈线性
这个线性函数非常简单,并不是一个极复杂的高度非线性函数,不会发生过拟合
如果每层都是线性的,那么整个网络就是一个线性网络
即使是一个非常深的深层网络,因具有线性激活函数的特征,最终只能计算线性函数
因此,它不适用于非常复杂的决策,以及过度拟合数据集的非线性决策边界
2. dropout 正则化
除了L2正则化,还有一个非常实用的正则化方法——“Dropout(随机失活)
dropout会遍历网络的每一层,并设置消除神经网络中节点的概率,假设网络中的每一层,每个节点都以抛硬币的方式设置概率,每个节点得以保留和消除的概率都是0.5,设置完节点概率,会消除一些节点,然后删除掉从该节点进出的连线,最后得到一个节点更少,规模更小的网络再进行训练
最常用实施dropout的方法:inverted dropout(反向随机失活)
以一个三层网络为例,要定义向量d,d[3] 表示一个三层的dropout向量:
d3 = np.random.rand(a3.shape[0],a3.shape[1])
看它是否小于某数,称之为 keep-prob,keep-prob是一个具体数字
本例中它是0.8,它表示保留某个隐藏单元的概率
此处 keep-prob = 0.8,则消除任意一个隐藏单元的概率是0.2
此时的a[3] 等于原来的的a[3] 乘以d[3] ,a3 = np.multiply(a3,d3)
这里是元素相乘,也可写为 a3 * = d3
用python实现该算法的话,d[3] 则是一个布尔型数组,值为 true 和 false
假设第三隐藏层上有50个单元或50个神经元,在一维上a[3] 是50
通过因子分解将它拆分成50×m维的,保留和删除它们的概率分别为80%和20%
则最后被删除或归零的单元平均有10
而z[4] ,z[4] = w[4] a[3] +b[4] ,预期是a[3] 减少20%,也就是说a[3] 中有20%的元素被归
为了不影响z[4] 的期望值,向外扩展a[3]
需要用a[3] /0.8,或者除以 keep-prop 参数,它将会修正或弥补所需的那20%,a[3] 的期望值不会变
反向随机失活(inverted dropout)方法通过除以 keep-prop ,确保 a[3] 的期望值不变
不能依靠任何特征,因为特征都有可能被随机清除,或者说该单元的输入也都可能被随机清除。不愿意把所有赌注都放在一个节点上,不愿意给任何一个输入加上太多权重,因此该单元将通过这种方式积极地传播开,并为单元的输入增加一点权重,通过传播所有权重, dropout 将产生收缩权重的平方范数的效果,降低每个特征的关联性,增强泛化性
keep-prop 设置为1,那么就不存在 dropout ,因为会保留所有节点。不同层的 keep-prop 也可以变化,对于有可能出现过拟合,且含有诸多参数的层,可以把 keep-prop 设置成比较小的值,以便应用更强大的 dropout
dropout 一大缺点:代价函数J不再被明确定义,每次迭代都会随机移除一些节点,很难进行复查梯度下降的性能
3. 其他正则化方法
-
数据扩增
假设正在拟合猫咪图片分类器,如果想通过扩增训练数据来解决过拟合
但扩增数据代价高,而且有时候无法扩增数据
但可以通过随意翻转和随意裁剪图片来增加训练集
这么做基本没有花费,除了一些对抗性代价
以这种方式扩增算法数据,进而正则化数据集,减少过拟合较廉价
对于光学字符识别,还可以通过添加数字,随意旋转或扭曲数字来扩增数据,把这些数字添加到训练集
为了方便说明,对字符做了强变形处理,所以数字4看起来是波形的,其实不用对数字4做这么夸张的扭曲 -
early stopping
当还未在神经网络上运行太多迭代过程的时候,参数w接近0
因为随机初始化w值时,它的值可能都是较小的随机值
所以在长期训练神经网络之前w依然很小,在迭代过程和训练过程中w的值会变得越来越大
比如在这儿,神经网络中参数w的值已经非常大了
所以early stopping要做就是在中间点停止迭代过程
优点:只运行一次梯度下降,可以找出w的较小值,中间值和较大值,而无需尝试L2正则化超级参数λ的很多值
主要缺点:不能独立地处理这两个问题,因为提早停止梯度下降,也就是停止了优化代价函数J
因为现在不再尝试降低代价函数J,所以代价函数J的值可能不够小
同时又希望不出现过拟合,没有采取不同的方式来解决这两个问题,而是用一种方法同时解决两个问题
参考:
相关推荐:
深度学习笔记(6) 实践层面(一)
深度学习笔记(5) 深层神经网络
深度学习笔记(4) 浅层神经网络
深度学习笔记(3) 向量化逻辑回归
深度学习笔记(2) 神经网络基础
谢谢!