第二门课 改善深层神经网络:超参数调试、正则化以及优化(Improving Deep Neural Networks:Hyperparameter tuning,Regularization and Optimization)
1.1训练,验证,测试集(Train / Dev / Test sets)
训练数据通常划分为:
- 训练集(training set):尝试不同的模型框架训练数据,
- 验证集(development set):通过验证集或简单交叉验证集选择最好的算法模型
- 测试集(test set):正确评估分类器的性能,对最终选定的神经网络系统做无偏估计
在机器学习发展的小数据量时代,一般60%训练集,20%验证集,20%测试集。大数据时代,验证集和测试集占数据总量的比例会趋于更小,一般小于数据总量的20%或10%。根据经验,建议确保验证集和测试集的数据来自同一分布。如果没有测试集也可以,一般训练集被称为测试集。在训练集上训练,尝试不同的模型框架,在验证集上评估这些模型,然后迭代并选出适用的模型。因为验证集中已经涵盖测试集数据,其不再提供无偏性能评估。
1.2偏差,方差(Bias / Variance)
高偏差(high bias):数据欠拟合(underfitting)
高方差(high variance):数据过度拟合(overfitting)
适度拟合(just right)

| \ | high variance | high bias | high bias&high variance | low bias&low variance |
|---|---|---|---|---|
| Train set error | 1% | 15% | 15% | 0.5% |
| Dev set error | 11% | 16% | 30% | 1% |
1.3机器学习基础(Basic Recipe for Machine Learning)

- 高偏差和高方差是两种不同的情况,通常会用训练验证集来诊断算法是否存在偏差或方差问题,然后根据结果选择尝试部分方法。若算法存在高偏差问题增加训练数据也没用。
- 现在我们有工具可以做到在减少偏差或方差的同时,不对另一方产生过多不良影响。
1.4正则化(Regularization)
正则化可以避免过度拟合并减少神经网络的误差
www和bbb是逻辑回归的两个参数,w∈Rnxw\in \mathbb{R}^{n_x}w∈Rnx是多维度参数矢量,b∈Rb\in \mathbb{R}b∈R是一个实数,我们想要的是求成本函数的最小值,正则化表达式如下:
J(w,b)=1m∑i=1mL(y^(i),y(i))+λ2m∥w∥22J(w,b)=\frac{1}{m}\sum^{m}_{i=1}L(\hat y^{(i)},y^{(i)})+\frac{\lambda}{2m}\left\| w\right\|^{2}_2J(w,b)=m1i=1∑mL(y^(i),y(i))+2mλ∥w∥22
L2 regularization:∥w∥22=∑j=1nxwj2=wTwL_2\space regularization:\left\| w\right\|^{2}_2=\sum^{n_x}_{j=1}w^{2}_j=w^TwL2 regularization:∥w∥22=j=1∑nxwj2=wTw
此方法利用了欧几里得范数(2范数),称为L2L2L2正则化。此处只正则化www而不正则化bbb,因为www通常是高维参数矢量,已经可以表达高偏差问题,加了参数bbb并没有什么影响。λ\lambdaλ也是一个超参数 。
L1 regularization:λ2m∑j=1nx∣wj∣=λ2m∥w∥1L_1\space regularization:\frac{\lambda}{2m}\sum^{n_x}_{j=1}|w_j|=\frac{\lambda}{2m}\left\| w\right\|_1L1 regularization:2mλj=1∑nx∣wj∣=2mλ∥w∥1
L1L1L1正则化www最终是稀疏的,即www向量中有很多0,实际上这样也并没有降低太多的存储内存,一般在训练网络时选择L2L2L2正则化。
J(w[1],b[1],...,w[L],b[L])=1m∑i=1mL(y^(i),y(i))+λ2m∑l=1L∥w[l]∥F2J(w^{[1]},b^{[1]},...,w^{[L]},b^{[L]})=\frac{1}{m}\sum^m_{i=1}L(\hat y^{(i)},y^{(i)})+\frac{\lambda}{2m}\sum^L_{l=1}\left\| w^{[l]}\right\|^{2}_FJ(w[1],b[1],...,w[L],b[L])=m1i=1∑mL(y^(i),y(i))+2mλl=1∑L∥∥∥w[l]∥∥∥F2
∥w[l]∥F2=∑i=1nl−1∑j=1nl(wijl)2\left\| w^{[l]}\right\|^{2}_F=\sum^{n^{l-1}}_{i=1}\sum^{n^{l}}_{j=1}(w^{l}_{ij})^2∥∥∥w[l]∥∥∥F2=i=1∑nl−1j=1∑nl(wijl)2
∥w[l]∥F2\left\| w^{[l]}\right\|^{2}_F∥∥w[l]∥∥F2矩阵范数被称作“弗罗贝尼乌斯范数”,用下标FFF标注,代表矩阵中所有元素的平方求和,其中W:(n[l−1],n[l])W:(n^{[l-1]},n^{[l]})W:(n[l−1],n[l]),lll为神经网络层数。
∂J∂w[l]=dw[l]=(from backprop)+λmw[l]\frac{\partial J}{\partial w^{[l]}}=dw^{[l]}=(from\space backprop)+\frac{\lambda}{m}w^{[l]}∂w[l]∂J=dw[l]=(from backprop)+mλw[l]
w[l]:=w(l)−αdw[l]=w(l)−α[(from backprop)+λmw[l]]=w[l]−αλmw[l]−α(from backprop)w^{[l]}:=w^{(l)}-\alpha dw^{[l]}=w^{(l)}-\alpha [(from\space backprop)+\frac{\lambda}{m}w^{[l]}]=w^{[l]}-\frac{\alpha \lambda}{m}w^{[l]}-\alpha(from\space backprop)w[l]:=w(l)−αdw[l]=w(l)−α[(from backprop)+mλw[l]]=w[l]−mαλw[l]−α(from backprop)
矩阵WWW前面的系数为(1−αλm)<1(1-\alpha \frac{\lambda}{m})<1(1−αmλ)<1,因此L2L2L2正则化有时被称为“权重衰减”。
1.5为什么正则化有利于预防过拟合?(Why regularzation reduces overfitting?)
如果正则化λ\lambdaλ设置得足够大,权重矩阵WWW就设置为接近0,此时大量的隐藏单元的影响就变得很小,神经网络变得更简单,这样更不容易发生过拟合。
对于tanhtanhtanh函数,如果λ\lambdaλ很大,w[l]w^{[l]}w[l]很小,zzz也会很小,g(z)g(z)g(z)大致呈线性,若每层都是线性的,整个神经网络就是线性网络,即使网络很深,也不适用于非常复杂的决策,即不会发生过拟合。
1.6dropout正则化(Dropout Regularization)
dropout(随机失活)正则化会遍历网络的每一层,并设置消除网络中节点的概率。
最常用的方法实施dropout,即Inverted dropout(反向随机失活),定义向量ddd,d[3]d^{[3]}d[3]表示一个三层的dropout向量:
d3=np.random.rand(a3.shape[0],a3.shape[1])
判断d3d3d3是否小于keep-prob,keep-prob是一个具体的数字,表示保留某个隐藏单元的概率。若keep−prob=0.8keep-prob=0.8keep−prob=0.8,表示消除任意一个隐藏单元的概率是0.2,d[3]d^{[3]}d[3]是一个矩阵,每个样本和每个隐藏单元,d[3]d^{[3]}d[3]中对应值为1的概率为0.8,对应为0的概率为0.2。
从第三层中获取激活函数a[3]a^{[3]}a[3]:
a3=np.multiply(a3,d3) 或者a3 *= d3
最后向外扩展a[3]a^{[3]}a[3],以便不影响后面的期望值。
a3 /= keep-prob
1.7理解dropout(Understanding Dropout)
实施dropout的结果使它会压缩权重,并完成一些预防过拟合的外层正则化,L2L2L2对不同权重的衰减是不同的,它取决于激活函数倍增的大小。
dropout一大缺点就是代价函数不再被明确定义,每次迭代都会随机移除一些节点。首先通常会关闭dropout函数,将keep-prob的值设为1,运行代码,确保J函数单调递减。然后打开dropout函数,希望在dropout过程中,代码并未引入bug。
1.8其他正则化方法(Other regularization methods)
- 数据扩增:翻转、旋转、扭曲图片以增大数据集

- early stopping:在迭代过程和训练过程中www的值会变得越来越大,通过early stopping在中间点停止迭代过程得到一个www值中等大小的弗罗贝尼乌斯范数。

early stopping的主要缺点是不能独立地处理这两个问题,因为提早停止梯度下降,也就停止优化代价函数JJJ,所以代价函数JJJ的值可能不够小,同时又希望不出现过拟合,你没有采取不同的方式来解决这两个问题,而是用一种方法同时解决两个问题。如果不用early stopping,另一种方法就是L2L2L2正则化,训练神经网络的时间就可能很长,导致超参数搜索空间更容易分解,也更容易搜索,但是缺点在于必须尝试很多正则化参数λ\lambdaλ的值,这也导致搜索大量λ\lambdaλ值的计算代价太高。
1.9归一化输入(Normalizing inputs)
归一化输入可以加速训练,归一化需要两个步骤:
- 零均值化:μ=1m∑i=1mx(i)\mu=\frac{1}{m}\sum^m_{i=1}x^{(i)}μ=m1∑i=1mx(i)是一个向量,xxx等于每个训练数据xxx减去μ\muμ,即移动训练集直到完成零均值化。
- 归一化方差:σ2=1m∑i=1m(x(i))2\sigma^2=\frac{1}{m}\sum^m_{i=1}(x^{(i)})^2σ2=m1∑i=1m(x(i))2,所有数据除以向量σ2\sigma^2σ2使各特征方差差不多。

不论是训练数据还是测试数据都是通过相同μ\muμ和σ2\sigma^2σ2定义的相同数据转换,其中μ\muμ和σ2\sigma^2σ2是由训练集数据计算得来的。
归一化输入的原因:

1.10梯度消失/梯度爆炸(Vanishing / Exploding gradients)
训练神经网络时,深度神经网络通常会面临梯度消失或梯度爆炸的问题,就是导数或坡度有时会变得非常大或非常小,加大了训练难度。
1.11神经网络的权重初始化(Weight initialization for Deep Networks)
在一定程度上降低梯度消失/梯度爆炸的不利影响可以设置某层权重矩阵为:
w[l]=np.random.rand(shape)∗np.sqrt(1n[l−1])w^{[l]}=np.random.rand(shape)*np.sqrt(\frac{1}{n^{[l-1]}})w[l]=np.random.rand(shape)∗np.sqrt(n[l−1]1)
1.12梯度的数值逼近(Nemerical approximation of gradients)
在执行梯度检验时使用双边误差f′(θ)=f(θ+ϵ)−f(θ+ϵ)2ϵf'(\theta)=\frac{f(\theta+\epsilon)-f(\theta+\epsilon)}{2\epsilon}f′(θ)=2ϵf(θ+ϵ)−f(θ+ϵ),其逼近误差可以写成O(ϵ2)O(\epsilon^2)O(ϵ2),而不是单边误差f′(θ)=f(θ+ϵ)−f(θ)ϵf'(\theta)=\frac{f(\theta+\epsilon)-f(\theta)}{\epsilon}f′(θ)=ϵf(θ+ϵ)−f(θ),其逼近误差可以写为O(ϵ)O(\epsilon)O(ϵ),其中ϵ\epsilonϵ为一个很小的数。
1.13梯度检验(Gradient checking)
实施梯度检验的过程,英语简称“grad check。
Take W[1],b[1],...,W[L],b[L]W^{[1]},b^{[1]},...,W^{[L]},b^{[L]}W[1],b[1],...,W[L],b[L] and reshape into a big vector θ\thetaθ,即J(W[1],b[1],...,W[L],b[L])=J(θ)=J(θ1,θ2,θ3,...)J(W^{[1]},b^{[1]},...,W^{[L]},b^{[L]})=J(\theta)=J(\theta _1,\theta _2,\theta _3,...)J(W[1],b[1],...,W[L],b[L])=J(θ)=J(θ1,θ2,θ3,...)
Take dW[1],db[1],...,dW[L],db[L]dW^{[1]},db^{[1]},...,dW^{[L]},db^{[L]}dW[1],db[1],...,dW[L],db[L] and reshape into a big vector dθd\thetadθ
循环执行,对每一个iii也就是每个θ\thetaθ组成元素计算dθapprox[i]d\theta_{approx}[i]dθapprox[i]的值,使用双边误差:
dθapprox[i]=J(θ1,θ2,...θ1+ϵ,...)−J(θ1,θ2,...θ1−ϵ,...)2ϵd\theta_{approx}[i]=\frac{J(\theta _1,\theta _2,...\theta_1+\epsilon,...)-J(\theta _1,\theta _2,...\theta_1-\epsilon,...)}{2\epsilon}dθapprox[i]=2ϵJ(θ1,θ2,...θ1+ϵ,...)−J(θ1,θ2,...θ1−ϵ,...)
只对θi\theta_iθi增加ϵ\epsilonϵ,θ\thetaθ其他项不变,对另一边减去ϵ\epsilonϵ,θ\thetaθ其他项不变。dθapprox[i]d\theta_{approx}[i]dθapprox[i]应该接近dθ[i]=∂J∂θid\theta[i]=\frac{\partial J}{\partial \theta_i}dθ[i]=∂θi∂J,dθ[i]d\theta[i]dθ[i]是代价函数的偏导数,需要对iii的每个值都执行这个运算,最后得到逼近值dθapproxd\theta_{approx}dθapprox,取ϵ=10−7\epsilon=10^{-7}ϵ=10−7时,求出∥dθapprox−dθ∥2∥dθapprox∥2+∥dθ∥2\frac{\left \|d\theta_{approx}-d\theta\right \|_2}{\left \|d\theta_{approx}\right \|_2+\left \|d\theta\right \|_2}∥dθapprox∥2+∥dθ∥2∥dθapprox−dθ∥2的值,若其在10−710^{-7}10−7范围内,则结果正确,若在10−510^{-5}10−5范围内,可能存在bug。
1.14梯度检验应用的注意事项(Gradient Checking Implementation Notes)

错题笔记
dropout只用在训练集上,目的是在每层添加噪声,降低对权重的依赖,从而防止过拟合。但是测试的时候目的是真实反映当前模型的优化程度,当然不能用dropout,否则会影响评估

1102

被折叠的 条评论
为什么被折叠?



