训练,验证,测试集
训练神经网络时,我们需要做出很多决策,比如:层数,每层的隐含单元数,学习速率,各层的激活函数等
但是,不可能
一开始就准确预测出这些超参。
从一个领域或者应用领域得来的直觉经验,通常无法
转移到其他应用领域
- 在
训练集
上执行算法 - 通过
验证集
简单交叉验证集选择最好的模型 - 在
测试集
上进行评估
训练集,验证集和测试集的比例随着数据的样本量增长是要变化的。
总体趋势是:训练集占比变大
,验证集和测试集变少
,因为验证集起选择作用,测试集起评估作用,本质上来说就是在验证一个算法的性能,只需要少量样本就可以做到了。
!!验证集和测试集要来自于同一分布
。
若没有明确需求,没有测试集也不要紧,训练后通过验证集选取适合的模型就可以了。
偏差和方差
高偏
差-欠
拟合高方
差-过
拟合
吴恩达老师的话说就是:
训练集误差较大:高偏
差-欠
拟合
验证集误差比训练集误差大的多:高方
差-过
拟合
换言之就是泛化性能和拟合性能的问题,验证集要尽量和测试集同一分布的,代表的是实际场景
的表现。
误差是训练集和真值的比较,代表的是拟合能力。
为何如此?
就要看公式了,方差与预测值期望比较,偏差与真值比较。
这地方看不懂的可以点一下标题看看这篇博文。看着公式更好理解一些。
机器学习基础
如果偏差的确很高
,甚至无法拟合数据,那么要做的就是选择一个新
的网络。
正则化
过拟合问题–高方差
可以通过正则化
和准备更多
的数据
来解决
\frac{\lambda}{2m}W^TW2mλWTW,W^TW是欧几里得范数(2范数)的平方,此方法称为L2正则化。
为什么不正则化b?
因为W通常是一个高维
参数矢量,而b只是单个数字,W已经覆盖了绝大多数
参数。解决了W导致的过拟合问题通常也就解决了整个模型的过拟合问题。
L1范式:\frac{\lambda}{m}\sum_{j=1}^{n_x}\vert{W}\vertmλ∑j=1nx∣W∣
如果使用L1正则化,W最终会是稀疏的,W向量中会有很多0。也不会减少存储模型所占用的内存。所以一般情况
人们在训练网络时,越来越倾向于使用L2
正则化
\lambdaλ是正则化参数,通常使用验证集或交叉验证集
来配置这个参数,要考虑训练集之间的权衡,把参数设置为较小值
。
lambda是一个保留字,在编程时写成lambd
如何在神经网络中实现L2正则化?
正则项为\frac{\lambda}{2m}\sum_1^L\vert{w^{[l]}\vert}^22mλ∑1L∣w[l]∣2,
L是神经网络的总层数
J(W^{[1]},W^{[2]},...,W^{[L]})=\frac{1}{m}\sum_{i=1}^mL(\hat{y}^{(i)},y^{(i)})+\frac{\lambda}{2m}\sum_1^L\vert{w^{[l]}\vert}^2J(W[1],W[2],...,W[L])=m1∑i=1mL(y^(i),y(i))+2mλ∑1L∣w[l]∣2
\vert{W^{[l]}}\vert^2_F=\sum_{i=1}^{n^{[l]}}\sum_{j=1}^{n^{[l-1]}}(w_{ij})^2∣W[l]∣F2=∑i=1n[l]∑j=1n[l−1](wij)2
i和j的上界原因:
W是一个n^{[l]}\times{n{[l-1]}}n[l]×n[l−1]的多维矩阵。
W{[l]}=(1-\frac{\alpha\lambda}{m})W^{l}-\alpha(formbackprop)W[l]=(1−mαλ)Wl−α(formbackprop)
(1-\frac{\alpha\lambda}{m})(1−mαλ)往往小于1,因此L2范式正则化也被称为权重衰减。
左图是高偏差,右图是高方差,中间是刚刚好。
如果正则化\lambdaλ设置的足够大,权重矩阵W被设置为接近于0的值,就是把多隐藏单元的权重设为0,相当于变成了一个很小的网络. (相当于一个逻辑回归单元,但是深度却很大),使这个网络从过度拟合的状态更接近左图的高偏差状态。
但是\lambdaλ会有一个中间值,于是又一个接近Just Right的中间状态。
W更接近于0,隐藏单元的影响变小了。
dropout正则化
Dropout正则化–又叫随机失活,解决过拟合问题
- 设置消除神经网络中结点的概率
- 每个结点按设计的概率进行淘汰
- 删除掉与选中被淘汰的结点进出的连线
- 对每一层的每一个结点迭代的执行上述过程
- 最后得到一个结点更少的网络
- backprop进行训练。
dropout的一种方法–反向随机失活(inverted dropout)
L=3L=3神经网络
d3代表的是第三层的dropout向量
d3 = np.random.rand(a3.shape[0],a3.shape[1])
然后看它是否小于
某数
,这个数称之为keep-prob
,表示保留某个隐藏单元的概率
a^{[3]}=a[3]=np.multiply(a3,d3)
最后,向外扩展a^{[3]}a[3]:
a3 = a3 / keep-prob
这样做的原因是为了修正被删除的那(1-keep-prob),而不去影响下一层的期望值。
在测试阶段没有必要添加尺度参数(譬如a3 = a3 / keep-prob)
dropout不依赖于任何特征,因为任何特征都是有可能被随机消除的。
不愿意将某一个输入给予过高的权重,所以传播所有权重,将产生收缩权重的平方范数效果。
与L2范式不同的是:L2对不同权重
的衰减是不同
的,它取决于激活函数倍增
的大小.
总结:dropout的功能类似于L2正则化,但更
适用于不同
的输入范围
从单个神经元入手,选择好keep-prob(不同层可变)
,
w^{[1]}w[1]:(3,7)
w^{[2]}w[2]:(7,7)
w^{[3]}w[3]:(7,3)
w^{[4]}w[4]:(3,2)
w^{[5]}w[5]:(2,1)
W^{[2]}W[2]是最大的权重矩阵,为了预防矩阵的过拟合,可以让这一层(2)的keep-prob小一些,对于其它层,过拟合程度没那么严重,可以高一些,比如keep-prob为0.7。
w^{[4]}w[4]:(3,2)
w^{[5]}w[5]:(2,1)
这两个也许不用担心它们的过拟合问题,所以keep-prob设置为1,意味着保留所有单元
最后设置好的神经网络如下:
总结:
- 对于W权重矩阵
规模较大
的,设置较小
的keep-prob,反之较大 - 除非算法过拟合,不然不用dropout方法.
- 主要在计算机视觉领域
keep-prob是可以应用于输入层的,但其值一般接近于1(经验法则)
- 更容易过拟合的设置keep-prob低一些,缺点:为了交叉验证,要搜索更多的超级参数
- 在一些层上应用dropout,在有些层不用,应用dropout的层只含有一个超参,keep-prob
dropout的一大缺点就是代价函数JJ不再被明确定义,每次迭代,都会随机移除一些结点,所以很难进行复查.
所以一般会:
- 选择关闭dropout函数,将keep-prob设置为1
- 运行代码,确保JJ单调递减
- 然后打开dropout.
其他正则化方法:
数据扩增
- 收集更多猫咪的图片
- 翻转图片
- 裁剪图片
- 识别数字还可以扭曲数字
early stopping
绘制训练误差
绘制代价函数J的优化过程
绘制验证集误差
在验证集上升的转折点提早停止迭代过程
用一组工具优化代价函数JJ,机器学习会变得简单很多.
在重点优化JJ时,只留意W,b使J小.其他不必担心.
预防过拟合还有其他任务:减少方差
early stopping的主要缺点就是不能独立的处理这两个问题.
提早停止了,JJ的值就可能不够小,同时解决梯度下降和减少方差的问题.考虑的东西就变得复杂.
early stopping的优点是,只运行一次梯度下降,你就可以找出w的较小值,中间值和较大值,而无需尝试L2正则化超参\lambdaλ的许多值
归一化输入
- 零均值化
\mu=\frac{1}{m}\sum_{i=1}^mx^{[i]}μ=m1∑i=1mx[i]
x = x - \mux=x−μ
- 归一化方差
delta^2=\frac{1}{m}\sum_{i=1}^m x^{(i)2}delta2=m1∑i=1mx(i)2
x = \frac{x}{\delta^2 }x=δ2x
用相同的\delta和\muδ和μ来归一化测试
集
因为我们希望测试集和训练集尽可能的作相同的变换。
假设x_1x1的取值范围是1-1000
x_2x2的取值范围是0-1
它们的权重矩阵会非常不同,作图会像上图一样,房屋一个狭长的碗
但归一化过后,代价函数就看起来更对称一些,犹如下右图
在作图这种情况,学习率就要很小,因为可能梯度下降需要迭代很多次。
而更对称一些就可以更快更直接一些。
总结;输入特征范围差别较大时,零均值和归一化后有利于优化。
梯度消失/梯度爆炸
假设所有层激活函数都是线性激活函数g(z)=zg(z)=z
y = W^{[l]}W^{[l-1]}W^{[l-2]}...W^{[l]}Xy=W[l]W[l−1]W[l−2]...W[l]X
假设每个权重矩阵W{[l]}=\begin{bmatrix} 1.5 & 0 \\ 0 & 1.5 \end{bmatrix}W[l]=[1.5001.5]
最后一项有不同的维度,它就是余下的权重矩阵
y=W^{[1]}\begin{bmatrix} 1.5 & 0 \\ 0 & 1.5 \end{bmatrix}^{(L-1)}xy=W[1][1.5001.5](L−1)x
L值比较大,那么\hat{y}y^也很大,因为它呈指数级增长(1.5^L1.5L)
相反,如果y=W^{[1]}\begin{bmatrix} 0.5 & 0 \\ 0 & 0.5 \end{bmatrix}^{(L-1)}xy=W[1][0.5000.5](L−1)x
那么\hat{y}y^也很大,因为它呈指数级缩小(0.5^L0.5L)
这会导致训练难度上升
神经网络的权重初始化
有四个输入特征,从w^1到w^4w1到w4,
KaTeX parse error: Unexpected character: '�' at position 1: �̲�=?_1?_1+?_2…
为了预防z值过大或过小,所以n越大,希望w_iwi越小,因为其是求和形式
所以要设置的就是:
w^{[l]}w[l]=np.random.randn(shape)*np.sqrt(\frac{1}{n^{[l-1]}}n[l−1]1),n^{[l-1]}n[l−1]是喂给第l层神经单元的数量
如果是Relu激活函数,方差设置为\sqrt{\frac{2}{n^{[l-1]}}}n[l−1]2更好
如果是tanh激活函数,为\sqrt{\frac{1}{n^{[l-1]}}}n[l−1]1
若激活函数的输入特征被零均值和标准方差化,方差是1,z也会调整到响应范围,这就没解决梯度消失和梯度爆炸问题。
梯度的数值逼近
梯度校验:确保backprop正确进行。
f(\theta)=\theta^3f(θ)=θ3
\theta=1,\varepsilon=0.01θ=1,ε=0.01
\theta+\varepsilon=1.01θ+ε=1.01
\theta-\varepsilon=0.99θ−ε=0.99
\frac{f(\theta+\varepsilon)-f(\theta-\varepsilon)}{2\varepsilon}2εf(θ+ε)−f(θ−ε)
这更接近导数值,因为同时考虑了双边小三角形
在此处,计算值为3.0001
- 把W^{[1]},b^{[1]},...,W^{[L]},b^{[L]}W[1],b[1],...,W[L],b[L]连接在一起放入\thetaθ中
- 把dW^{[1]},db^{[1]},...,dW^{[L]},db^{[L]}dW[1],db[1],...,dW[L],db[L]连接在一起放入d\thetadθ中
计算d\theta_{approx}^{[i]}=\frac{J(\theta_i+\varepsilon)-J(\theta_i-\varepsilon)}{2\varepsilon}(i=1,2,...,L)dθapprox[i]=2εJ(θi+ε)−J(θi−ε)(i=1,2,...,L),其计算值应该逼近于d\theta^{[i]}dθ[i]
计算欧几里得范数
\frac{\Vert{d\theta_{approx}-d\theta}\Vert_2}{\Vert{d\theta_{approx}}\Vert_2+\Vert{d\theta}\Vert_2}∥dθapprox∥2+∥dθ∥2∥dθapprox−dθ∥2
其计算值小于\varepsilonε就比较好
\Vert{d\theta_{approx}-d\theta}\Vert_2=\sqrt{\sum_{i=1}^L (d\theta_{approx}^i-d\theta^i)}∥dθapprox−dθ∥2=∑i=1L(dθapproxi−dθi)
梯度校验的注意事项
- 不要在训练中使用梯度校验,它只用于DEBUG.
- 如果梯度校验失败,要检查所有项,并试着找出bug
- 在执行梯度校验时,如果使用正则化,请注意正则项
- 梯度校验不能与dropout同时使用。
- 在随机初始化过程中,运行梯度校验,再训练网络