【Nan‘s 吴恩达深度学习笔记】第二课第一周 深度学习的实践层面

1.1 训练,验证,测试数据集(Train / Dev / Test sets)

概念表示

  1. 训练集 Train set
  2. 验证集 Hold-out cross(简单交叉) validation set(Development set)
  3. 测试集 Test set
    在这里插入图片描述

常用划分

小数据量:(<10000)
①70%验证集, 30%测试集
②如果没有明确设置验证集,也可以按照 60%训练, 20%验证和 20%测试集来划分
大数据量:

验证集是验证不同的算法,检验哪种算法更有效,可能不需要拿出 20%的数据作为验证集
测试集的目的是正确评估分类器的性能
①验证集和测试集要小于数据总量的 20%或 10%
②确保验证集和测试集的数据来自同一分布
没有测试集也无所谓,测试集的目的是对最终所选定的神经网络系统做出无偏估计,如果不需要无偏估计,也可以不设置测试集。
P.S.:
如果只有一个训练集和一个验证集, 而没有独立的测试集,训练集被人们称为训练集,而验证集则被称为测试集,人们只是把测试集当成简单交叉验证集使用。

1.2 偏差,方差(Bias/Variance)

以只有𝑥1和𝑥2两个特征的二维数据集为例:
在这里插入图片描述
欠拟合(underfitting):不能很好地拟合该数据, 这是高偏差(high bias)的情况。
过拟合(overfitting):非常适用于这个数据集的拟合,但是分类器方差较高(high variance)。
最优误差也被称为贝叶斯误差。

  1. 通过查看训练集误差,判断数据拟合情况,至少对于训练数据是这样,可以判断是否有偏差问题然后查看错误率有多高
  2. 开始使用验证集验证时,我们可以判断方差是否过高,比较训练集与验证集的错误率

机器学习基础方法

初始模型训练完成后,
①首先要知道算法的偏差bias高不高
若偏差较高,试着评估训练集或训练数据的性能,可能的方法:

  1. 选择一个新的网络(含有更多隐藏层或者隐藏单元的网络)一般很有效
  2. 花费更多时间来训练网络 不一定有用
  3. 尝试更先进的优化算法

训练学习算法时,不断尝试这些方法,直到解决掉偏差问题,可以拟合数据为止,至少能够拟合训练集。
②一旦偏差降低到可以接受的数值,检查一下方差有没有问题
为了评估方差,我们要查看验证集性能,如果方差高,可能的方法:

  1. 采用更多数据 !最有效的!
  2. 正则化 Regularization

正则化:训练一个更大的网络几乎没有任何负面影响,而训练一个大型神经网络的主要代价也只是计算时间,前提是网络是比较规范化的

1.4 正则化(Regularization)

L2正则化

L2正则化公式非常简单,是最常见的正则化类型,直接在原来的损失函数基础上加上权重参数的平方和,这里用了欧几里德法线|| ||,被称为向量参数𝑤的𝐿2范数。

对于逻辑回归:
在这里插入图片描述
只正则化参数w,不加上参数b,是因为w是个高维参数矢量,已经可以表达高偏差bias问题,b一般就忽略不计了!

对于神经网络:
该矩阵范数被称作“弗罗贝尼乌斯范数”, 用下标𝐹标注
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相当于我们给矩阵 W 乘以(1 − 𝑎·𝜆/𝑚)倍的权重,该系数小于 1,故𝐿2正则化也被称为“权重衰减”。

正则化参数λ

通常使用验证集或交叉验证集来配置这个参数,把参数设置为较小值, 这样可以避免过拟合, 所以 λ 是另外一个需要调整的超参数

注:Python 编程语言中, 𝜆(lambda)是一个保留字段,写成𝑙𝑎𝑚𝑏𝑑,以免与 Python 中的保留字段冲突.

Why预防过拟合

当正则化参数𝜆增加到足够大, 𝑊会接近于 0,从而使得神经网络变得简单,类似一个逻辑回归,所以可以预防过拟合。

为了调试梯度下降,请务必使用新定义的𝐽函数,它包含第二个正则化项,否则函数𝐽可能不会在所有调幅范围内都单调递减。
在这里插入图片描述

Dropout (随机失活)正则化

工作原理

①dropout 会遍历网络的每一层,并设置消除神经网络中节点的概率。假设网络中的每一层,每个节点都设置概率,每个节点得以保留和消除的概率都是 0.5。
②设置完节点概率,我们会消除一些节点,然后删除掉从该节点进出的连线,最后得到一个节点更少,规模更小的网络,然后用 backprop 方法进行训练。

实施方法

①反向随机失活(inverted dropout)—— dropout 最常用的方法

  1. d [ 3 ] d^{[3]} d[3]表示一个三层的 dropout 向量:
d3 = np.random.rand(a3.shape[0],a3.shape[1])<keep_prob
#(keep_prob保留某个隐藏单元的概率)

img.shape[0]:图像的垂直尺寸(高度)/ 表示矩阵的行数
img.shape[1]:图像的水平尺寸(宽度)/ 表示矩阵的列数
img.shape[2]:图像的通道数

  1. 乘法运算,让𝑑[3]中 0 元素与𝑎[3]中相对元素归零
#作用就是让𝑑[3]中所有等于0的元素(输出),
a3 =np.multiply(a3,d3)
  1. 精髓:向外扩展𝑎[3]
    修正或弥补我们所需的那 20%(在此假设keep_prob=0.8),保证𝑎[3]的期望值不会变.
a3/= keep_prob

在测试阶段不使用dropout 函数,因为在测试阶段进行预测时,我们不期望输出结果是随机的

why有效

dropout 将产生收缩权重的平方范数的效果,实施 dropout的结果是它会压缩权重,并完成一些预防过拟合的外层正则化。

dropout 的功能类似于𝐿2正则化,与𝐿2正则化不同的是,被应用的方式不同,dropout 也会有所不同,甚至更适用于不同的输入范围。

对于一个多层神经网络,不同层的 keep-prob 也可以变化。对于不同规模的权重矩阵,最大的权重矩阵的keep_prob值应该相对较低。
小结:
①如果你担心某些层比其它层更容易发生过拟合,可以把某些层的 keep-prob值设置得比其它层更低,缺点是为了使用交叉验证,你要搜索更多的超参数
②在一些层上应用 dropout,而有些层不用 dropout,应用 dropout 的层只含有一个超参数,就是 keep-prob。

技巧

  1. 计算机视觉应用广泛
    计算视觉中的输入量非常大,输入太多像素,以至于没有足够的数据,所以 dropout在计算机视觉中应用得比较频繁
  2. 在其它领域应用少
    dropout 是一种正则化方法,它有助于预防过拟合,因此除非算法过拟合,不然不会使用 dropout
  3. 缺点:代价函数J不被明确定义
    解决方法:通常关闭 dropout 函数,将 keepprob 的值设为 1,运行代码,确保J函数单调递减。然后打开 dropout 函数,希望在 dropout过程中,代码并未引入 bug。

其他正则化方法

①数据扩增(Data augmentation)
有时候我们无法扩增数据,但我们可以通过添加这类图片来增加训练集。例如,水平翻转图片/随意裁剪图片,并把它添加到训练集。
额外生成假训练数据。和全新的,独立的图片数据相比,这些额外的假的数据无法包含像全新数据那么多的信息,但减少过拟合比较廉价。
②early stopping(?)
验证集误差通常会先呈下降趋势,然后在某个节点处开始上升
在这里插入图片描述
你长期训练神经网络之前𝑤依然很小,在迭代过程和训练过程中𝑤的值会变得越来越大。
early stopping 要做就是在中间点停止迭代过程,代表提早停止训练神经网络。

1.9 归一化输入(Normalizing inputs)

训练神经网络,其中一个加速训练的方法就是归一化输入。
归一化需要两个步骤:

  1. 零均值(Subtract out/zero out the mean)
    μ = 1 m ∑ i = 1 m x ( i ) μ=\frac{1}{m}∑_{i=1}^mx^{(i)} μ=m1i=1mx(i)
    μ是一个向量,再令𝑥等于每个训练数据 𝑥 减去𝜇,意
    思是移动训练集,直到它完成零均值化。
    在这里插入图片描述
  2. 归一化方差(normalize the variances)
    给σ赋值, σ 2 σ^2 σ2是一个向量,它的每个特征都有方差,注
    意,我们已经完成零值均化, ( x ( i ) ) 2 (x^{(i)})^2 (x(i))2元素 y 2 y^2 y2就是方差,我们把所有数据除以向量 σ 2 σ^2 σ2,使得𝑥1和𝑥2的方差都等于1
    σ 2 = 1 m ∑ i = 1 m ( x ( i ) ) 2 σ^2=\frac1m∑_{i=1}^m(x^{(i)})^2 σ2=m1i=1m(x(i))2 在这里插入图片描述

不论是训练数据还是测试数据,都是通过相同 μ 和 σ 2 σ^2 σ2定义的相同数据转换,其中𝜇和 σ 2 σ^2 σ2是由训练集数据计算得来的。

总的直观理解是代价函数会更圆一些,而且更容易优化,前提是特征都在相似范围内,这使得代价函数𝐽优化起来更简单快速。

所以如果输入特征处于不同范围内,可能有些特征值从 0 到 1,有些从 1 到 1000,那么归一化特征值就非常重要了

1.10 梯度消失/梯度爆炸(Vanishing/Exploding gradients)

权重𝑊只比 1 略大一点,或者说只是比单位矩阵大一点,深度神经网络的激活函数将爆炸式增长;
如果𝑊比 1 略小一点,激活函数将以指数级递减。

不完美解决方案——权重初始化

为了预防𝑧值过大或过小,你可以看到𝑛越大,你希望 w i w_i wi越小。
最合理的方法就是设置 w i = 1 n w_i= \frac1n wi=n1,𝑛表示神经元的输入特征数量
在这里插入图片描述
如果对于 Relu 激活函数,设置为2/𝑛会更好
对于 tanh 激活函数, 1 n [ l − 1 ] \sqrt\frac{1}{n^{[l-1]}} n[l1]1 ,被称为 Xavier 初始化
如果激活函数的输入特征被零均值和标准方差化,方差是 1, 𝑧也会调整到相似范围。

1.13 梯度检验

①对每个𝑖也就是对每个𝜃组成元素计算 d θ a p p r o x [ i ] dθ_{approx}[i] dθapprox[i]的值,双边误差,即:
在这里插入图片描述
这个值应该逼近𝑑𝜃[𝑖]=𝜕𝐽/𝜕𝜃𝑖。
②验证这些向量是否彼此接近
计算这两个向量的距离, d θ a p p r o x [ i ] dθ_{approx}[i] dθapprox[i] d θ [ i ] dθ[i] dθ[i]的欧几里得范数 ∣ ∣ d θ a p p r o x [ i ] − d θ [ i ] ∣ ∣ ||dθ_{approx}[i] −dθ[i]|| dθapprox[i]dθ[i],然后求平方根,得到欧式距离,然后用向量长度归一化
在这里插入图片描述
𝜀可能为10−7,使用这个取值范围内的𝜀,如果你发现计算方程式得
到的值为10−7或更小,这就很好,这就意味着导数逼近很有可能是正确的。

注意事项

  1. 不要在训练中使用梯度检验,它只用于调试,因为太慢了!
  2. 如果算法的梯度检验失败,要检查所有项,检查每一项,并试着找出 bug
    𝑑𝜃approx[𝑖]的值与𝑑𝜃[𝑖]的值相差很大,你会发现所有这些项目都来自于𝑑𝑤或某层的𝑑𝑤,帮助精准定位
  3. 实施梯度检验时,如果使用正则化,请注意正则项。
  4. 梯度检验不能与 dropout 同时使用
    难以计算 dropout 在梯度下降上的代价函数𝐽
  5. 只有在𝑤和𝑏接近 0 时, backprop 的实施才是正确的。但是当𝑊和𝑏变大时,它会变得越来越不准确
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值