第二门课 改善深层神经网络:超参数调试、正则化以及优化(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)
正则化可以避免过度拟合并减少神经网络的误差
w
w
w和
b
b
b是逻辑回归的两个参数,
w
∈
R
n
x
w\in \mathbb{R}^{n_x}
w∈Rnx是多维度参数矢量,
b
∈
R
b\in \mathbb{R}
b∈R是一个实数,我们想要的是求成本函数的最小值,正则化表达式如下:
J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) + λ 2 m ∥ w ∥ 2 2 J(w,b)=\frac{1}{m}\sum^{m}_{i=1}L(\hat y^{(i)},y^{(i)})+\frac{\lambda}{2m}\left\| w\right\|^{2}_2 J(w,b)=m1i=1∑mL(y^(i),y(i))+2mλ∥w∥22
L 2 r e g u l a r i z a t i o n : ∥ w ∥ 2 2 = ∑ j = 1 n x w j 2 = w T w L_2\space regularization:\left\| w\right\|^{2}_2=\sum^{n_x}_{j=1}w^{2}_j=w^Tw L2 regularization:∥w∥22=j=1∑nxwj2=wTw
此方法利用了欧几里得范数(2范数),称为 L 2 L2 L2正则化。此处只正则化 w w w而不正则化 b b b,因为 w w w通常是高维参数矢量,已经可以表达高偏差问题,加了参数 b b b并没有什么影响。 λ \lambda λ也是一个超参数 。
L 1 r e g u l a r i z a t i o n : λ 2 m ∑ j = 1 n x ∣ w j ∣ = λ 2 m ∥ w ∥ 1 L_1\space regularization:\frac{\lambda}{2m}\sum^{n_x}_{j=1}|w_j|=\frac{\lambda}{2m}\left\| w\right\|_1 L1 regularization:2mλj=1∑nx∣wj∣=2mλ∥w∥1
L 1 L1 L1正则化 w w w最终是稀疏的,即 w w w向量中有很多0,实际上这样也并没有降低太多的存储内存,一般在训练网络时选择 L 2 L2 L2正则化。
J ( w [ 1 ] , b [ 1 ] , . . . , w [ L ] , b [ L ] ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) + λ 2 m ∑ l = 1 L ∥ w [ l ] ∥ F 2 J(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}_F J(w[1],b[1],...,w[L],b[L])=m1i=1∑mL(y^(i),y(i))+2mλl=1∑L∥∥∥w[l]∥∥∥F2
∥ w [ l ] ∥ F 2 = ∑ i = 1 n l − 1 ∑ j = 1 n l ( w i j l ) 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 ] ∥ F 2 \left\| w^{[l]}\right\|^{2}_F ∥∥w[l]∥∥F2矩阵范数被称作“弗罗贝尼乌斯范数”,用下标 F F F标注,代表矩阵中所有元素的平方求和,其中 W : ( n [ l − 1 ] , n [ l ] ) W:(n^{[l-1]},n^{[l]}) W:(n[l−1],n[l]), l l l为神经网络层数。
∂ J ∂ w [ l ] = d w [ l ] = ( f r o m b a c k p r o p ) + λ m w [ 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 ) − α d w [ l ] = w ( l ) − α [ ( f r o m b a c k p r o p ) + λ m w [ l ] ] = w [ l ] − α λ m w [ l ] − α ( f r o m b a c k p r o p ) 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)
矩阵 W W W前面的系数为 ( 1 − α λ m ) < 1 (1-\alpha \frac{\lambda}{m})<1 (1−αmλ)<1,因此 L 2 L2 L2正则化有时被称为“权重衰减”。
1.5为什么正则化有利于预防过拟合?(Why regularzation reduces overfitting?)
如果正则化 λ \lambda λ设置得足够大,权重矩阵 W W W就设置为接近0,此时大量的隐藏单元的影响就变得很小,神经网络变得更简单,这样更不容易发生过拟合。
对于 t a n h tanh tanh函数,如果 λ \lambda λ很大, w [ l ] w^{[l]} w[l]很小, z z z也会很小, g ( z ) g(z) g(z)大致呈线性,若每层都是线性的,整个神经网络就是线性网络,即使网络很深,也不适用于非常复杂的决策,即不会发生过拟合。
1.6dropout正则化(Dropout Regularization)
dropout(随机失活)正则化会遍历网络的每一层,并设置消除网络中节点的概率。
最常用的方法实施dropout,即Inverted dropout(反向随机失活),定义向量 d d d, d [ 3 ] d^{[3]} d[3]表示一个三层的dropout向量:
d3=np.random.rand(a3.shape[0],a3.shape[1])
判断 d 3 d3 d3是否小于keep-prob,keep-prob是一个具体的数字,表示保留某个隐藏单元的概率。若 k e e p − p r o b = 0.8 keep-prob=0.8 keep−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的结果使它会压缩权重,并完成一些预防过拟合的外层正则化, L 2 L2 L2对不同权重的衰减是不同的,它取决于激活函数倍增的大小。
dropout一大缺点就是代价函数不再被明确定义,每次迭代都会随机移除一些节点。首先通常会关闭dropout函数,将keep-prob的值设为1,运行代码,确保J函数单调递减。然后打开dropout函数,希望在dropout过程中,代码并未引入bug。
1.8其他正则化方法(Other regularization methods)
- 数据扩增:翻转、旋转、扭曲图片以增大数据集
- early stopping:在迭代过程和训练过程中
w
w
w的值会变得越来越大,通过early stopping在中间点停止迭代过程得到一个
w
w
w值中等大小的弗罗贝尼乌斯范数。
early stopping的主要缺点是不能独立地处理这两个问题,因为提早停止梯度下降,也就停止优化代价函数 J J J,所以代价函数 J J J的值可能不够小,同时又希望不出现过拟合,你没有采取不同的方式来解决这两个问题,而是用一种方法同时解决两个问题。如果不用early stopping,另一种方法就是 L 2 L2 L2正则化,训练神经网络的时间就可能很长,导致超参数搜索空间更容易分解,也更容易搜索,但是缺点在于必须尝试很多正则化参数 λ \lambda λ的值,这也导致搜索大量 λ \lambda λ值的计算代价太高。
1.9归一化输入(Normalizing inputs)
归一化输入可以加速训练,归一化需要两个步骤:
- 零均值化: μ = 1 m ∑ i = 1 m x ( i ) \mu=\frac{1}{m}\sum^m_{i=1}x^{(i)} μ=m1∑i=1mx(i)是一个向量, x x x等于每个训练数据 x x x减去 μ \mu μ,即移动训练集直到完成零均值化。
- 归一化方差: σ 2 = 1 m ∑ i = 1 m ( 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 ] = n p . r a n d o m . r a n d ( s h a p e ) ∗ n p . s q r t ( 1 n [ 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 d W [ 1 ] , d b [ 1 ] , . . . , d W [ L ] , d b [ 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\theta dθ
循环执行,对每一个 i i i也就是每个 θ \theta θ组成元素计算 d θ a p p r o x [ i ] d\theta_{approx}[i] dθapprox[i]的值,使用双边误差:
d θ a p p r o x [ 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 θ a p p r o x [ i ] d\theta_{approx}[i] dθapprox[i]应该接近 d θ [ i ] = ∂ J ∂ θ i d\theta[i]=\frac{\partial J}{\partial \theta_i} dθ[i]=∂θi∂J, d θ [ i ] d\theta[i] dθ[i]是代价函数的偏导数,需要对 i i i的每个值都执行这个运算,最后得到逼近值 d θ a p p r o x d\theta_{approx} dθapprox,取 ϵ = 1 0 − 7 \epsilon=10^{-7} ϵ=10−7时,求出 ∥ d θ a p p r o x − d θ ∥ 2 ∥ d θ a p p r o x ∥ 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的值,若其在 1 0 − 7 10^{-7} 10−7范围内,则结果正确,若在 1 0 − 5 10^{-5} 10−5范围内,可能存在bug。
1.14梯度检验应用的注意事项(Gradient Checking Implementation Notes)
错题笔记
dropout只用在训练集上,目的是在每层添加噪声,降低对权重的依赖,从而防止过拟合。但是测试的时候目的是真实反映当前模型的优化程度,当然不能用dropout,否则会影响评估