【吴恩达深度学习笔记】2.1 深度学习实践方面Practical aspects of Deep Learning

第二门课 改善深层神经网络:超参数调试、正则化以及优化(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 variancehigh biashigh bias&high variancelow bias&low variance
Train set error1%15%15%0.5%
Dev set error11%16%30%1%

1.3机器学习基础(Basic Recipe for Machine Learning)

在这里插入图片描述

  • 高偏差和高方差是两种不同的情况,通常会用训练验证集来诊断算法是否存在偏差或方差问题,然后根据结果选择尝试部分方法。若算法存在高偏差问题增加训练数据也没用。
  • 现在我们有工具可以做到在减少偏差或方差的同时,不对另一方产生过多不良影响。

1.4正则化(Regularization)

正则化可以避免过度拟合并减少神经网络的误差
wwwbbb是逻辑回归的两个参数,w∈Rnxw\in \mathbb{R}^{n_x}wRnx是多维度参数矢量,b∈Rb\in \mathbb{R}bR是一个实数,我们想要的是求成本函数的最小值,正则化表达式如下:

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=1mL(y^(i),y(i))+2mλw22

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:w22=j=1nxwj2=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=1nxwj=2mλw1

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=1mL(y^(i),y(i))+2mλl=1Lw[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})^2w[l]F2=i=1nl1j=1nl(wijl)2

∥w[l]∥F2\left\| w^{[l]}\right\|^{2}_Fw[l]F2矩阵范数被称作“弗罗贝尼乌斯范数”,用下标FFF标注,代表矩阵中所有元素的平方求和,其中W:(n[l−1],n[l])W:(n^{[l-1]},n^{[l]})W:(n[l1],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(反向随机失活),定义向量dddd[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.8keepprob=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)

  1. 数据扩增:翻转、旋转、扭曲图片以增大数据集
    在这里插入图片描述
  2. early stopping:在迭代过程和训练过程中www的值会变得越来越大,通过early stopping在中间点停止迭代过程得到一个www值中等大小的弗罗贝尼乌斯范数。
    在这里插入图片描述

early stopping的主要缺点是不能独立地处理这两个问题,因为提早停止梯度下降,也就停止优化代价函数JJJ,所以代价函数JJJ的值可能不够小,同时又希望不出现过拟合,你没有采取不同的方式来解决这两个问题,而是用一种方法同时解决两个问题。如果不用early stopping,另一种方法就是L2L2L2正则化,训练神经网络的时间就可能很长,导致超参数搜索空间更容易分解,也更容易搜索,但是缺点在于必须尝试很多正则化参数λ\lambdaλ的值,这也导致搜索大量λ\lambdaλ值的计算代价太高。

1.9归一化输入(Normalizing inputs)

归一化输入可以加速训练,归一化需要两个步骤:

  1. 零均值化:μ=1m∑i=1mx(i)\mu=\frac{1}{m}\sum^m_{i=1}x^{(i)}μ=m1i=1mx(i)是一个向量,xxx等于每个训练数据xxx减去μ\muμ,即移动训练集直到完成零均值化。
  2. 归一化方差:σ2=1m∑i=1m(x(i))2\sigma^2=\frac{1}{m}\sum^m_{i=1}(x^{(i)})^2σ2=m1i=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[l1]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]=θiJdθ[i]d\theta[i]dθ[i]是代价函数的偏导数,需要对iii的每个值都执行这个运算,最后得到逼近值dθapproxd\theta_{approx}dθapprox,取ϵ=10−7\epsilon=10^{-7}ϵ=107时,求出∥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θapprox2+dθ2dθapproxdθ2的值,若其在10−710^{-7}107范围内,则结果正确,若在10−510^{-5}105范围内,可能存在bug。

1.14梯度检验应用的注意事项(Gradient Checking Implementation Notes)

在这里插入图片描述

错题笔记

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值