改善深层神经网络

时间:2021-11-22 10:12:49

训练、验证、测试集

神经网络有多少层
每层含有多少隐藏单元
学习率
激活函数

实际上 应用型机器学习是一个高度迭代的过程
一开始我们需要设定好配置信息,并运行代码,得到这些配置信息运行的结果。根据输出结果重新完善自己的想法,改变策略。或者为了找到跟好的神经网络不断迭代更新自己的方案。

因而,循环该过程的效率是决定项目进展速度的重要因素

一般把数据分为,训练集,简单交叉验证集或者验证集和测试集
这里介绍下三种数据集:
假设建立一个BP神经网络,对于隐含层的节点数目,我们并没有很好的方法去确定。此时,一般将节点数设定为某一具体的值,通过训练集训练出相应的参数后,再由交叉验证集去检测该模型的误差;然后再改变节点数,重复上述过程,直到交叉验证误差最小。此时的节点数可以认为是最优节点数,即该节点数(这个参数)是通过交叉验证集得到的。而测试集是在确定了所有参数之后,根据测试误差来评判这个学习模型的。所以,验证集主要主要是用于模型的调参。

当数据规模较小的时候,小数据集的时候比如10000下,一般按照70%训练集,30%测试集;60%训练集,20%验证集20%测试集。
当在大数据时代时,验证集合测试集占数据总量的比例会趋向于变得更小,因为验证集的目的就是验证不同的算法,检验那种算法更有效。比如2个甚至10个不同的算法并迅速判断出哪种算法更有效。我们可能不需要拿出20%的数据作为验证集。,比如100万条数据,我们只需要1万条数据就能找出其中表现最好的1-2种算法。
这样的话即训练集98%,验证集1%,测试集1%。

经验法则:
构建模型的时候保证,验证集和测试集的数据来自同一分布。

偏差、方差

沿用识别猫的分类模型,这里有一张猫(y=1)一张狗的(y=0)
改善深层神经网络
假定训练集的错误率是1%
验证集的错误率为11%
这里可以看出训练集可能出现了过度拟合。某种程度上,验证集并没有充分利用交叉验证集的作用。这种情况我们称之为“高方差”。

假定训练集的错误率是15%
验证集的错误率为16%
这里可以看出训练集可能出现了欠拟合。这种情况我们称之为“高偏差”。然而它对于验证集产生的结果却是合理的,因为它甚至不能甚至拟合训练集。

假定训练集的错误率是15%
验证集的错误率为30%
这种情况成为高偏差高方差

总结:
至少对于训练数据讲,通过训练集的误差,我们可以判断数据拟合情况,可以判断是否有偏差问题,然后查看错误率有多高。当完成训练后,开始验证集验证时,从训练集到验证集这个过程中,我们可以判断方差是否过高。以上分析的前提都是假设基本误差很小,训练集和验证及数据来自相同分布。

机器学习基础

评估训练模型偏差—->high选择新网络构建更大的模型,花费更多时间训练算法或者尝试更先进的优化算法
当模型的偏差降下去,直到至少可以拟合训练集。
评估训练模型方差——>high最好的方法时采用更多的数据去训练,通常会采用正则化来减小方差
直到找到一个低偏差,低方差的框架。

通常会根据训练验证集来检验模型偏差方差问题。

正则化

L2正则化介绍
用神经网络举例:

J(w[i],b[i],.....,w[L],b[L])=1mi=1mL(y^(i),y(i))+λ2ml=1L||w(L)||2
||w(L)||2=i=1n[L1]j=1n[L](w[L]ij)2
其中L为神经网络的层数
n[L] 为L层的节点数
反向传播迭代w,其中backpop为未加正则项的结果,加上正则项dw为:
dw[L]=backpop+λmw[L]
w[L]=w[L]αdw[L]
w[L]=1αλmwLαbackpop
1αλmwL 可以看到 w[L] 乘小于1的数会减小,因此L2范数正则化也被称为权重衰减。

为什么正则化可以预防过拟合

J(w[i],b[i],.....,w[L],b[L])=1mi=1mL(y^(i),y(i))+λ2ml=1L||w(L)||2
由这个公式直观上去看可以看出,当 λ 取值为特别大的时候,要向成本函数降低到最小,需要 w[L]0
举个例子,假如一个神经网络模型为过拟合状态,然后我们给它设定一个大的 λ 值这时候会使得原有的神经网络大大简化,如图:
改善深层神经网络
有点类似于逻辑回归,但这些别x掉的节点并没有消失,只是影响变小了。神经网络变得简单了。这样的话会使得过拟合的神经网络更接近于欠拟合状态。这样看来中间会有一个 λ 会使得模型最优。

总结一下就是:如果 λ 增大那么 w[L] 减小, z[L] 减小,这个激活函数在这个范围内,会相对成线性,比如tanh函数,这样就不会出现过拟合。

Dropout正则化

这个正则化是在每个神经网络层中,随机失活某个节点
举个例子:
这里我们拿第三层的网络节点来举例,首先介绍以下要用到的参数,keep-prob设置失活因子; a3 是经过第三层后的输出值,下面一起看下dropout
keep-prob=0.8
d3=np.random.rand(a3.shape[0],a3.shape[1])<keep-prob
a3=np.multply(a3,d3)
a3/=keep-prob

z4=w4a3+b4
由于 a3 中有20%的元素被归零,为了不影响 z4 的期望值,我们需要用 w4a3/0.8 ,这样它将会修正或弥补我们所需要的那20%,a3的期望值不会变。
问题1:那么为什么要/o.8保证期望值保持不变呢?
因为每个样本在训练的时候,被随机消失的节点都是不同的那么成本函数公式中的/m的时候,如果不保证期望值不变的话,那么最后除样本的个数会很麻烦。
问题2:为什么drop-out可以防止过拟合?
拿一个单层的神经元来讲,它不能依赖于输入的特性,因为所有输入的特性都有几率被删除,所以它只会给给个输入分配小一点的权重。由上面的正则化L2同理,都是通过缩减权重。并完成一些预防过拟合的外层正则化。

归一化

训练神经网络,其中一个加速训练的方法就是归一化输入。
归一化输入有两个步骤,零均值化归一化方差,这里用代码说明一下:

from sklearn import datasets
import numpy as np
x1=np.array([[2,1,3,2,4,3,2],[50,65,70,90,100,89,77]])
print('元数据:')
print(x1)
a=np.sum(x1,axis = 1,keepdims = True)/7
print('平均数:')
print(a)
b=x1-a
print('零均值化:')
print(b)
fangcha=np.sum(b**2,axis = 1,keepdims = True)/7
print('方差:')
print(fangcha)
print('归一化方差后:') 
fangchac=b/fangcha
print(fangchac)

输出结果为:

from sklearn import datasets

import numpy as np

x1=np.array([[2,1,3,2,4,3,2],[50,65,70,90,100,89,77]])

print('元数据:')

print(x1)

a=np.sum(x1,axis = 1,keepdims = True)/7

print('平均数:')

print(a)

b=x1-a

print('零均值化:')

print(b)

fangcha=np.sum(b**2,axis = 1,keepdims = True)/7

print('方差:')

print(fangcha)

print('归一化方差后:') 

fangchac=b/fangcha

print(fangchac)

​

元数据:
[[ 2 1 3 2 4 3 2] [ 50 65 70 90 100 89 77]]
平均数:
[[ 2.42857143] [ 77.28571429]]
零均值化:
[[ -0.42857143 -1.42857143 0.57142857 -0.42857143 1.57142857 0.57142857 -0.42857143] [-27.28571429 -12.28571429 -7.28571429 12.71428571 22.71428571 11.71428571 -0.28571429]]
方差:
[[ 0.81632653] [ 251.91836735]]
归一化方差后:
[[ -5.25000000e-01 -1.75000000e+00 7.00000000e-01 -5.25000000e-01 1.92500000e+00 7.00000000e-01 -5.25000000e-01] [ -1.08311730e-01 -4.87686325e-02 -2.89209332e-02 5.04698639e-02 9.01652625e-02 4.65003240e-02 -1.13415424e-03]]

归一化输入特征的原因

数据归一化后,最优解的寻优过程明显会变平缓,更容易正确收敛到最优解:
比如有两个变量x1,x2,共同影响结果值y,然而x1介于0到1之间,x2介于900到1000之间,用单层感知器单个样本为例,激活函数采用线性。w=[w11,w12]
那么 a=z=wx 那么代价函数J为
J=12ay2
da=ay
dw=xda
假如x为[[1],[900]],假如da=[1]那么 dw=[1,900] ,这样看来,其实w11随着反向传播变化很小w12则变化相当大。这样造成J像很像一个狭长的碗,原因就是J变化一点,而w11变动范围小,而e12变动范围特别大,所以图像会扁。
如果在此时运行梯度下降法,需要一个小的学习率,并可能需要多次迭代过程,延切线方向走,直到找到最小值。而进行归一化处理后,使得J图像更加圆,运行梯度下降法的时候,不论从哪个位置开始,梯度下降法,可以直接找到最小值。

梯度消失与梯度爆炸

超参数调试正则化以及优化

单层神经元举例;
有四个特征输入x1,x2,x3,x4
z=w1x1+w2x2+....+wnxn
由上式可以看出为了使z不过大,n越多我们越希望w越小
最合理的方法就是设置wi=1/n就是设置某层权重矩阵 w[L]=np.random.randn(shape)1n[L1]
对于relu函数一般
w[L]=np.random.randn(shape)2n[L1]
对于tanch函数
w[L]=np.random.randn(shape)1n[L1]

梯度的数值逼近

利用双边误差 fθ+ϵf(θϵ)2ϵ 逼近梯度

梯度检验

假设你的网络中含有 w[1]...w[L]b[1]...b[L] ,为了执行梯度检验,首要的是把所有参数转换成一个巨大的向量数据。需要先把w矩阵转化成向量,转成后做链接运算得到一个巨型向量 θ

2.优化算法

2.1Mini-batch梯度下降法

梯度下降算法又成为batch梯度下降法。
向量化能让你有效的对所有m个例子进行计算,允许你处理整个训练集。所以我们要把样本组建成一个大的矩阵。假设一个样本有m个,如果m很大的话,处理速度仍然缓慢。比如说m=500万,在进行梯度下降法的时候你必须处理整个训练集,然后才能进行下一步的梯度下降。
看下面这个例子:
X=[x1x2......xm] (n>=m)
Y=[y1,y2.......ym] (1,m)
把训练集分割为小一点的子训练集,这些子集被取名为mini-batch,假设每一个子集中只有1000个样本。那么 x1...x1000 构成了第一个字训练集叫做 x{1} 一共有5000个mini-batch。同样把y也分为5000个分别为 y1....y5000 ,所以Mini-batch的数量t组成了 x{t} y{t}
mini-batch算法每次同时处理里的是单个的mini-batch x{t},yt 而不是同时处理全部的x和y的训练集。
mini算法原理:

for t=1...5000:
    forward prop on $x^{\{t\}}
        z^{[1]}=w^{[1]}x+b^{[1]}
        A^{[1]}=g^{1}(z^{[1]})
        .....
        A^{[L]}=g^{L}(z^{[L]})
     cos(j)j^{[t]}=对1000个样本也就是mini-         batch求代价函数
     backprop
     使用x^{t},y^{t},然后更新加权值
     w^{[L]}=w^{[L]}-dw
     对b做相同的处理

理解mini算法

改善深层神经网络
左边图为正常的梯度下降法
右边图为mini-batch梯度下降法
出现波动的原因是因为取得有的mini-batch比较好算,直接下降,但是因为是多个变量共同影响梯度,所以有的mini-batch 可能陷入局部最优。
那么如何选择mini-batch的大小呢?
如果数据量不是很大的话,直接用梯度下降法就可以直接处理数据集,不是很大(2000以内);如果数据集特别大的时候,一般mini-batch大小为64到512(考虑的电脑内存设置如果mini-batch的大小为2的几次方速度更快)

指数加权平均

我理解的指数加权平均就是计算数据的一种趋势。
下面是一个伦敦的气温
改善深层神经网络
计算该温度的趋势也就是温度的局部平均值或者移动平均值
首先使
v0=0 每天需要用0.9的加权数之前的数值,加上当日温度的0.1
v0=0
v1=0.9v0+0.1θ1
v2=0.9v1+0.1θ2

大体公式就是某天的v等于前一天v值的0.9,加上当日温度的0.1,用红线画出来如图
改善深层神经网络
得到了移动平均值每日温度的指数加权平均值
之前我们使用的数为0.9.现在我们把它成 β
vt=βvt1+(1β)θt
在计算时可以把 vt 看成是大概 11β 天的温度
β 是0.9时,你可以认为这是十天的平均值温度。画出图来就是上面的那个图的红色部分。
β=0.98 时,表示平均了最近50天的温度。画出图像会发现图像平坦了一些原因在于多平均了几天的温度。所以这个图像波动更小更加平坦,缺点在于图像右移。因为当 β 值很大时,我们对于近日的温度加权值会变小,所以当温度改变的时候,指数加权平均值适应的更慢一点。

v100=0.9v99+0.1θ100
v99=0.9v98+0.1θ99
v98=0.9v97+0.1θ98
将v_{100}展开得到
v100=0.1θ100+0.10.9θ99+0.10.92θ98+0.10.93θ97+...
可以看到计算第100天的温度的时候包含了前100天的温度,而系数之和约等于1称之为偏差修正,因为有偏差修正,才是指数加权平均数。
那么到底需要平均多少天的温度?
实际上 0.9101/e
而大体上说如果有 β1β1/e
画出系数的图像100的时候为0.1,也就是就是当处于第90天的时候,图像下降到峰值的1/3
改善深层神经网络
本质是在1/e之前它是一个下降幅度很快的函数
得出结论我们平均大约 1/1β) 天的温度
而加权平均与传统的计算平均数来讲在计算机中占用的内存极少,只占用一个v每天进行不断更新就可以。虽然准确度不如传统的计算平均快。

指数加权平均的偏差修正

改善深层神经网络
β=0.98 我们画出图像得到的不是绿色图像而是紫色
因为一开始我们 v0=0 假设第一天温度为40度那么 v0=0v1=8 得到的值会小很多,所以第一天的温度估测不准。而 v2=0.0196θ1+0.02θ2
得到 v2 远远小于v1,v2数据,所以v2不能很好估计出这一年前两天的温度。
解决这个为题可以不用 vt 而是求出 vt 后用 vt=vt/(1βt) t就是当天的天数,这样可以把紫色线修正成绿色线。

动量梯度下降法

动量梯度下降法Momentum就是在迭代过程中
移动平均dw
Vdw=βVdw+(1β)dw
Vdb=βVdb+(1β)db
W=WαVdw
b=bαvdb
1、理解的话可以将动量看成平均数,当下降速度很快且方向不变的时候,动量平均使得它下降速度变得更快,当反向的时候,会发现动量平均后使得原先的下降幅度变小。
2、如果一开始学习率设定的很大的时候,使用动量平均能更好的约束原先很大的下降幅度,大大减小迭代次数。
并且让 β=0.9 效果不错
特点:前后梯度方向一致时,能够加速学习
前后梯度方向不一致时,能够抑制震荡

RMSprop(不太明白)

原理:在梯度下降的过程中
Sdw=βSdw+(1β)dw2
S
Sdb=βSdb+(1β)db2
w=wαdwSdw
b=bαdbSdb

自适应神经网络