吴恩达《改善深层神经网络》笔记(一)深度学习的实用层面

训练/开发/测试集

  • 数 据 集 { 训 练 集 ( t r a i n ) : 数 据 集 越 大 , 占 比 越 大 验 证 集 ( d e v ) 测 试 集 ( t e s t ) : 对 最 终 所 选 定 的 神 经 网 络 做 出 无 偏 估 计 ( 无 需 无 偏 估 计 可 以 不 设 测 试 集 ) 数据集\left\{ \begin{aligned} &训练集(train):数据集越大,占比越大& \\ &验证集(dev)& \\ &测试集(test):对最终所选定的神经网络做出无偏估计 \\ &(无需无偏估计可以不设测试集)& \end{aligned} \right. traindev)test)
  • 只有Train sets和Dev sets,通常也有人把这里的Dev sets称为Test sets,注意加以区别。
    我们可以通过Train sets训练不同的算法模型,然后分别在Dev sets上进行验证,根据结果选择最好的算法模型。

偏差/方差

  • high bias表示欠拟合,high variance表示过拟合。
    在这里插入图片描述

偏差用于衡量Train set error,方差用于衡量Train set error与Dev set error的差值。
在这里插入图片描述

正则化

  • 如果出现了高方差,也就是过拟合的情况,则需要采用正则化(regularization)来解决。
    解决过拟合的方法有正则化和扩大数据。但通常获得更多训练样本的成本太高,比较困难。

在这里插入图片描述

使用L2正则化逻辑回归模型,表达式修正为:
J ( ω , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) + λ 2 m ∣ ∣ ω ∣ ∣ 2 2 J(\omega,b)=\frac{1}{m}\sum_{i=1}^m L(\hat y(i),y(i))+\frac{\lambda}{2m}||\omega||^2_2 J(ω,b)=m1i=1mL(y^(i),y(i))+2mλω22
∣ ∣ ω ∣ ∣ 2 2 = ∑ j = 1 n x ω j 2 = ω T ω ||\omega||^2_2=\sum_{j=1}^{n_{x}}\omega^2_j=\omega^T\omega ω22=j=1nxωj2=ωTω
其中 λ \lambda λ就是正则化参数(超参数的一种)。

也可以对b进行正则化。但是一般w为高维参数矢量,而b只是一个常数。相比较来说,参数很大程度上由w决定,改变b值对整体模型影响较小。所以为了简便,一般忽略对b的正则化。

在深度学习模型中,L2 regularization的表达式为:
J ( ω [ 1 ] , b [ 1 ] , … , ω [ L ] , b [ L ] ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) + λ 2 m ∑ l = 1 L ∣ ∣ ω [ l ] ∣ ∣ 2 J(\omega^{[1]},b^{[1]},…,\omega^{[L]},b^{[L]})=\frac{1}{m}\sum_{i=1}^m L(\hat y(i),y(i))+\frac{\lambda}{2m}\sum_{l=1}^L||\omega^{[l]}||^2 J(ω[1],b[1],,ω[L],b[L])=m1i=1mL(y^(i),y(i))+2mλl=1Lω[l]2
∣ ∣ ω [ l ] ∣ ∣ 2 = ∑ i = 1 n [ l ] ∑ j = 1 n [ l − 1 ] ( ω i j [ l ] ) 2 ||\omega^{[l]}||^2=\sum_{i=1}^{n^{[l]}}\sum_{j=1}^{n^{[l-1]}}(\omega^{[l]}_{ij})^2 ω[l]2=i=1n[l]j=1n[l1](ωij[l])2
其中 ∣ ∣ ω [ l ] ∣ ∣ 2 ||\omega^{[l]}||^2 ω[l]2称为弗罗贝尼乌斯(Frobenius)范数。

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

使用L2 regularization,当λ很大时,w[l]≈0,意为将某些神经元权重趋于0,给忽略掉了,问题就从high variance变成了high bias了。
在这里插入图片描述
另外,假设激活函数是tanh函数。tanh函数的特点是在z接近零的区域,函数近似是线性的,而当|z|很大的时候,函数非线性且变化缓慢。当使用正则化,λ较大,即对权重w[l]的惩罚较大,w[l]减小。因为z[l]=w[l]a[l]+b[l]。当w[l]减小的时候,z[l]也会减小。则此时的z[l]分布在tanh函数的近似线性区域。那么这个神经元起的作用就相当于是线性回归(linear regression)。如果每个神经元对应的权重w[l]都比较小,那么整个神经网络模型相当于是多个linear regression的组合,即可看成一个linear network。得到的分类超平面就会比较简单,不会出现过拟合现象。
在这里插入图片描述

Dropout正则化

  • 除了L2 regularization之外,还有另外正则化合的有效方法:Dropout(随机失活)。
  • Dropout是指在深度学习网络的训练过程中,对于每层的神经元,按照一定的概率将其暂时从网络中丢弃。对于m个样本,单次迭代训练时,随机删除掉隐藏层一定数量的神经元;然后,在删除后的剩下的神经元上正向和反向更新权重w和常数项b;接着,下一次迭代中,再恢复之前删除的神经元,重新随机删除一定数量的神经元,进行正向和反向更新w和b。不断重复上述过程,直至迭代训练完成。
    注意 使用dropout ** 训练 结束后,在测试和实际应用**模型时,不需要进行dropout和随机删减神经元,所有的神经元都在工作。

理解Dropout

  • 不同隐藏层的dropout系数keep_prob可以不同。一般来说,神经元越多的隐藏层,keep_out可以设置得小一些.,例如0.5;神经元越少的隐藏层,keep_out可以设置的大一些,例如0.8,甚至是1。
  • 实际应用中,不建议对输入层进行dropout,如果输入层维度很大,例如图片,那么可以设置dropout,但keep_out应设置的大一些,例如0.8,0.9。
  • 使用dropout的时候,可以通过绘制cost function来进行debug,看看dropout是否正确执行。一般做法是,将所有层的keep_prob全设置为1,再绘制cost function,即涵盖所有神经元,看J是否单调下降。下一次迭代训练时,再将keep_prob设置为其它值。

其他正则化方法

除了L2 regularization和dropout regularization之外,还有其它减少过拟合的方法。
1.增加训练样本数量。
例如图片识别问题中,可以对已有的图片进行水平翻转、垂直翻转、任意角度旋转、缩放或扩大等等。
2.early stopping。
一个神经网络模型随着迭代训练次数增加,train set error一般是单调减小的,而dev set error 先减小,之后又增大。 也就是说训练次数过多时,模型会对训练样本拟合的越来越好,但是对验证集拟合效果逐渐变差,即发生了过拟合。因此,迭代训练次数不是越多越好,可以通过train set error和dev set error随着迭代次数的变化趋势,选择合适的迭代次数,即early stopping。

  • Early stopping有其自身缺点。
    机器学习训练模型有两个目标:一是选择一个算法来优化代价函数 J ( ω , b ) J(\omega,b) J(ω,b);二是防止过拟合。 这两个目标彼此对立的,即减小 J ( ω , b ) J(\omega,b) J(ω,b)的同时可能会造成过拟合,反之亦然。我们把这二者之间的关系称为正交化(orthogonalization)。
    在深度学习中,我们可以同时减小Bias和Variance,构建最佳神经网络模型。但是,Early stopping提早停止了梯度下降,同时也就停止了优化代价函数 J ( ω , b ) J(\omega,b) J(ω,b)
  • 与early stopping相比,L2 正则化可以实现“分而治之”的效果:迭代训练足够多,减小J,而且也能有效防止过拟合。
    而L2 regularization的缺点之一是最优的正则化参数λ的选择比较复杂。对这一点来说,early stopping比较简单。
    总的来说,L2 regularization更加常用一些。

正则化输入

  • 在训练神经网络时,标准化输入可以提高训练的速度
    标准化输入就是对训练数据集进行归一化的操作,让所有输入归一化同样的尺度上,方便进行梯度下降算法时能够更快更准确地找到全局最优解。
    即将原始数据减去其均值 μ μ μ后,再除以其方差 σ 2 σ^2 σ2,书写表达式为:
    μ = 1 m ∑ i = 1 m X ( i ) μ=\frac{1}{m}\sum_{i=1}^m X^{(i)} μ=m1i=1mX(i)
    σ 2 = 1 m ∑ i = 1 m ( X ( i ) ) 2 σ^2=\frac{1}{m}\sum_{i=1}^m (X^{(i)})^2 σ2=m1i=1m(X(i))2
    X : = X − μ σ 2 X:=\frac{X-μ}{σ^2} X:=σ2Xμ
    图示为:
    在这里插入图片描述注意 由于训练集进行了标准化处理,那么对于测试集或在实际应用时,应该使用同样的 μ μ μ σ 2 σ^2 σ2对其进行标准化处理。

梯度消失与梯度爆炸

  • 梯度消失和梯度爆炸(Vanishing and Exploding gradients):当训练一个 层数非常多的神经网络时,计算得到的梯度可能非常小或非常大,甚至是指数级别的减小或增大。这样会让训练过程变得非常困难。
    *例如,假设一个多层的每层只包含两个神经元的深度神经网络模型,如下图所示:在这里插入图片描述为了简化复杂度,便于分析,我们令各层的激活函数为线性函数,即 g ( Z ) = Z g(Z)=Z g(Z)=Z。且忽略各层常数项b的影响,令b全部为零。那么,该网络的预测输出 Y ^ \hat Y Y^为:
    Y ^ = W [ L ] W [ L − 1 ] W [ L − 2 ] … W [ 3 ] W [ 2 ] W [ 1 ] X \hat Y=W^{[L]}W^{[L-1]}W^{[L-2]}…W^{[3]}W^{[2]}W^{[1]}X Y^=W[L]W[L1]W[L2]W[3]W[2]W[1]X

    也就是说,如果各层权重W[l]都大于1或者都小于1,那么各层激活函数的输出将随着层数l的增加,呈指数型增大或减小。当层数很大时,出现数值爆炸或消失。

神经网络的权重初始化

  • 神经网络的权重初始化用于改善上述Vanishing and Exploding gradients问题
  • 以单个神经元为例,该层 ( l ) (l) l的输入个数为 n n n,其输出为(忽略常数项b):
    z = w 1 x 1 + w 2 x 2 + … + w n x n z=w_1x_1+w_2x_2+…+w_nx_n z=w1x1+w2x2++wnxn
    a = g ( z ) a=g(z) a=g(z)
    为了让z不会过大或者过小,思路是让w与n有关,且n越大,w应该越小才好。
    另外,我们可以对这些初始化方法中设置某些参数,作为超参数,通过验证集进行验证,得到最优参数,来优化神经网络。

梯度的数值逼近

  • 梯度的数值逼近用于近似求解梯度值
    在这里插入图片描述利用微分思想,函数f在点 θ θ θ处的梯度可以表示成:
    g ( θ ) = f ( θ + ε ) − f ( θ − ε ) 2 ε g(θ)=\frac{f(θ+ε)−f(θ−ε)}{2ε} g(θ)=2εf(θ+ε)f(θε)
    其中 ε > 0 且 ε → 0 ε>0且ε→0 ε>0ε0

梯度检验

  • 梯度检验用于检查验证反向传播过程中梯度下降算法是否正确。

  • 梯度检查首先要做的是分别将 W [ 1 ] , b [ 1 ] , ⋯ , W [ L ] , b [ L ] W^{[1]},b^{[1]},⋯,W^{[L]},b^{[L]} W[1],b[1],,W[L],b[L]这些矩阵构造成一维向量,然后将这些一维向量组合起来构成一个更大的一维向量θ。这样cost function J ( W [ 1 ] , b [ 1 ] , ⋯ , W [ L ] , b [ L ] ) J(W^{[1]},b^{[1]},⋯,W^{[L]},b^{[L]}) J(W[1],b[1],,W[L],b[L])就可以表示成 J ( θ ) J(θ) J(θ)

    然后将反向传播过程通过梯度下降算法得到的 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]
    按照一样的顺序构造成一个一维向量 d θ dθ dθ d θ dθ dθ的维度与 θ θ θ一致。

    接着利用 J ( θ ) J(θ) J(θ)对每个 θ i θ_i θi计算近似梯度,其值与反向传播算法得到的 d θ i dθ_i dθi相比较,检查是否一致。例如,对于第 i i i个元素,近似梯度为:
    d θ a p p r o x [ i ] = J ( θ 1 , θ 2 , ⋯ , θ i + ε , ⋯ ) − J ( θ 1 , θ 2 , ⋯ , θ i + ε , ⋯ ) 2 ε dθ_{approx}[i]=\frac{J(θ_1,θ_2,⋯,θ_i+ε,⋯)−J(θ_1,θ_2,⋯,θ_i+ε,⋯)}{2ε} dθapprox[i]=2εJ(θ1,θ2,,θi+ε,)J(θ1,θ2,,θi+ε,)
    计算完所有 θ i θ_i θi的近似梯度后,可以计算 d θ a p p r o x 与 d θ dθ_{approx}与dθ dθapproxdθ的欧式(Euclidean)距离来比较二者的相似度。公式为:
    ∣ ∣ d θ a p p r o x − d θ ∣ ∣ 2 ∣ ∣ d θ a p p r o x ∣ ∣ 2 + ∣ ∣ d θ ∣ ∣ 2 \frac{||dθ_{approx}-dθ||_2}{||dθ_{approx}||_2+||dθ||_2} dθapprox2+dθ2dθapproxdθ2
    一般来说,如果欧氏距离越小,例如10−7,甚至更小,则表明 d θ a p p r o x 与 d θ dθ_{approx}与dθ dθapproxdθ越接近。反之如果欧氏距离较大,例如10−5,则表明梯度计算可能出现问题,需要再次检查是否有bugs存在。如果欧氏距离很大,例如10−3,甚至更大,则表明 d θ a p p r o x 与 d θ dθ_{approx}与dθ dθapproxdθ差别很大,梯度下降计算过程有bugs,需要仔细检查。

关于梯度检验实现的注记

  • 不要在整个训练过程中都进行梯度检查,仅仅作为debug使用。
  • 如果梯度检查出现错误,找到对应出错的梯度,检查其推导是否出现错误。
  • 注意不要忽略正则化项,计算近似梯度的时候要包括进去。
  • 梯度检查时关闭dropout,检查完毕后再打开dropout。
  • 随机初始化时运行梯度检查,经过一些训练后再进行梯度检查(不常用)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值