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

阅读: 评论:0

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

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

训练/开发/测试集

  • 数 据 集 { 训 练 集 ( t r a i n ) : 数 据 集 越 大 , 占 比 越 大 验 证 集 ( d e v ) 测 试 集 ( t e s t ) : 对 最 终 所 选 定 的 神 经 网 络 做 出 无 偏 估 计 ( 无 需 无 偏 估 计 可 以 不 设 测 试 集 ) 数据集left{ begin{aligned} &训练集(train):数据集越大,占比越大& \ &验证集(dev)& \ &测试集(test):对最终所选定的神经网络做出无偏估计 \ &(无需无偏估计可以不设测试集)& end{aligned} right. 数据集⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​​训练集(train):数据集越大,占比越大验证集(dev)测试集(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)=m1​i=1∑m​L(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^Tomega ∣∣ω∣∣22​=j=1∑nx​​ω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])=m1​i=1∑m​L(y^​(i),y(i))+2mλ​l=1∑L​∣∣ω[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=1∑n[l]​j=1∑n[l−1]​(ω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)} μ=m1​i=1∑m​X(i)
    σ 2 = 1 m ∑ i = 1 m ( X ( i ) ) 2 σ^2=frac{1}{m}sum_{i=1}^m (X^{(i)})^2 σ2=m1​i=1∑m​(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[L−1]W[L−2]…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=w1​x1​+w2​x2​+…+wn​xn​
    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θapprox​与dθ的欧式(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θapprox​∣∣2​+∣∣dθ∣∣2​∣∣dθapprox​−dθ∣∣2​​
    一般来说,如果欧氏距离越小,例如10−7,甚至更小,则表明 d θ a p p r o x 与 d θ dθ_{approx}与dθ dθapprox​与dθ越接近。反之如果欧氏距离较大,例如10−5,则表明梯度计算可能出现问题,需要再次检查是否有bugs存在。如果欧氏距离很大,例如10−3,甚至更大,则表明 d θ a p p r o x 与 d θ dθ_{approx}与dθ dθapprox​与dθ差别很大,梯度下降计算过程有bugs,需要仔细检查。

关于梯度检验实现的注记

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

本文发布于:2024-02-02 13:24:58,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170685149944095.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:神经网络   层面   深度   笔记   吴恩达
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23