文章目录

  • 1. 训练,验证,测试集
  • 2. 偏差,方差
  • 3. 机器学习基础
  • 4. 正则化
  • 5. 为什么正则化预防过拟合
  • 6. dropout(随机失活)正则化
  • 7. 理解 dropout
  • 8. 其他正则化
  • 9. 归一化输入
  • 10. 梯度消失 / 梯度爆炸
  • 11. 神经网络权重初始化
  • 12. 梯度的数值逼近
  • 13. 梯度检验
  • 14. 梯度检验的注意事项
  • 作业

参考:
吴恩达视频课
深度学习笔记

1. 训练,验证,测试集

深度学习是一个典型的迭代过程,迭代的效率很关键

创建高质量的训练数据集验证集测试集有助于提高循环效率

  • 切分标准:
    小数据量时代,常见做法是三七分,70%验证集,30%测试集;也可以 60%训练,20%验证和20%测试集来划分。
    大数据时代,数据量可能是百万级别,验证集和测试集占总量的比例会趋于变得更小。
    我们的目的就是验证不同的算法,检验哪种算法更有效,不需要拿出20%的数据作为验证集,很少的一部分占比的数据就已经足够多了。
  • 数据来源:
    最好要确保 验证集 和 测试集 的数据来自同一分布,因为要用验证集来评估不同的模型,如果验证集和测试集来自同一个分布就会很好

2. 偏差,方差


关键数据:
训练集误差、验证集误差


如果最优误差(贝叶斯误差,人分辨的最优误差)非常高,比如15%。那么上面第二种分类器(训练误差15%,验证误差16%),15%的错误率对训练集来说也是非常合理的,偏差不高,方差也非常低。
(以上基于假设:基本误差很小,训练集和验证集 来自相同分布

根据这两个指标,更好的优化算法。

3. 机器学习基础

4. 正则化

正则化有助于防止过拟合,降低方差

范数(norm) 几种范数的简单介绍

  • L1 范数:∣∣X∣∣1=∑i=1n∣xi∣||X||_1 = \sum\limits_{i=1}^n |x_i|∣∣X∣∣1​=i=1∑n​∣xi​∣ 表示非零元素的绝对值之和
  • L2 范数:∣∣X∣∣2=∑i=1nxi2||X||_2 = \sqrt{\sum\limits_{i=1}^n {x_i}^2}∣∣X∣∣2​=i=1∑n​xi​2​ 表示元素的平方和再开方
    矩阵的范数叫做:弗罗贝尼乌斯范数,所有元素的平方和 ∣∣W∣∣F2||W||_F^{2}∣∣W∣∣F2​

加上 L2 正则化 的损失函数:
J(ω,b)=1m∑i=1mL(y^(i),y(i))+λ2m∥ω∥22J(\omega, b)=\frac{1}{m} \sum_{i=1}^{m} \mathcal L \left(\hat{y}^{(i)}, y^{(i)}\right)+\frac{\lambda}{2 m}\|\omega\|_{2}^{2}J(ω,b)=m1​i=1∑m​L(y^​(i),y(i))+2mλ​∥ω∥22​

  • L1 正则,权重 w 最终变得稀疏,多数变成 0
  • L2 正则,使得权重衰减

W[l]=(1−αλm)∗W[l]−α(梯度)W^{[l]} = (1-\frac{\alpha\lambda}{m})*W^{[l]} - \alpha(梯度)W[l]=(1−mαλ​)∗W[l]−α(梯度)
权重不但减少了,还乘以了小于1的系数进行衰减

5. 为什么正则化预防过拟合

J(ω,b)=1m∑i=1mL(y^(i),y(i))+λ2m∥ω∥22J(\omega, b)=\frac{1}{m} \sum_{i=1}^{m} \mathcal L \left(\hat{y}^{(i)}, y^{(i)}\right)+\frac{\lambda}{2 m}\|\omega\|_{2}^{2}J(ω,b)=m1​i=1∑m​L(y^​(i),y(i))+2mλ​∥ω∥22​

当 λ\lambdaλ 设置的很大的时候,最终 WWW 会变得很接近于 0,神经网络中的很多单元的作用变得很小,整个网络越来越接近逻辑回归



λ\lambdaλ 增大时,整个神经网络会计算离线性函数近的值,这个线性函数非常简单,不是复杂的高度非线性函数,不会发生过拟合

L2 正则化是 训练深度学习模型时最常用的一种方法

6. dropout(随机失活)正则化


以上是一个样本的过程,其他样本也是同样的过程。

实施 dropout 举例:最常用的方法 - inverted dropout(反向随机失活)

用一个三层网络举例

  • 定义向量 ddd ,d[3]d^{[3]}d[3] 表示一个三层的 dropout 向量 d3 = np.random.rand(a3.shape[0],a3.shape[1]),对于元素小于 keep-prob 的,对应为 0,其概率为 1 - keep_prob
  • 获取激活函数 a[3]a^{[3]}a[3], a3 = np.multiply(a3, d3),使得 d[3]d^{[3]}d[3] 中为 0 的元素把 a[3]a^{[3]}a[3] 对应元素归零
  • 向外扩展 a[3]a^{[3]}a[3],a3 /= keep_prob

反向随机失活(inverted dropout)方法通过除以keep-prob,确保 a[3]a^{[3]}a[3] 的期望值不变

7. 理解 dropout

  • 其功能类似于 L2 正则化
  • 对于参数集多的层,可以使用较低的 keep-prob 值(不同的层,可以使用不同的值),缺点是:需要交叉验证更多的参数

dropout 一大缺点就是:代价函数不再被明确定义,每次迭代,都会随机移除一些节点,想检查梯度下降的性能,实际上是很难进行复查的

  • 可以先关闭dropout,将keep-prob 设置为 1,确保 J 函数单调递减
  • 然后再尝试打开dropout

8. 其他正则化

  • 数据扩增,假如是图片数据,扩增数据代价高,我们可以:

水平翻转;随意剪裁旋转放大(这种方式扩增数据,进而正则化数据集,减少过拟合成本很低)

对于数字识别图片,我们可以进行旋转,扭曲来扩增数据集

  • early stopping

    在验证集误差变坏的时候,提早停止训练

early stopping 缺点:不能同时处理 过拟合 和 代价函数不够小的问题

  • 提早停止,可能代价函数 J 不够小
  • 不提早结束,可能会过拟合

不使用 early stopping ,那么使用 L2 正则,这样训练时间可能很长,参数搜索空间大,计算代价很高

early stopping 优点:只运行一次梯度下降,可以找出 w 的较小值,中间值,较大值,无需尝试 L2 正则化超参数 λ\lambdaλ 的很多值

9. 归一化输入

归一化输入,可以加速训练

  • 零均值(所有的数据减去均值)
  • 归一化方差(所有数据除以方差)

注意:μ,σ2\mu, \sigma^2μ,σ2 是由训练集得到,然后用于其他所有数据集

10. 梯度消失 / 梯度爆炸


在非常深的神经网络中,权重只要不等于 1,激活函数将会呈指数级递增或者递减,导致训练难度上升,尤其是梯度与 L 相差指数级,梯度下降算法的步长会非常非常小,学习时间很长。

11. 神经网络权重初始化

上面讲到了梯度消失/爆炸,如何缓解这个问题?


为了预防 z 的值 过大 或 过小,n 越大时,你希望 wi 越小,合理的方法是 wi=1/nw_i = 1/nwi​=1/n,n 是输入特征数量

w[l]=np.random.randn(shape)∗np.sqrt(1n[l−1])w^{[l]} = np.random.randn(shape)*np.sqrt(\frac{1}{n^{[l-1]}})w[l]=np.random.randn(shape)∗np.sqrt(n[l−1]1​),n[l−1]n^{[l-1]}n[l−1] 是给第 lll 层输入的特征数量

  • 如果使用ReLu激活函数(最常用),∗np.sqrt(2n[l−1])*np.sqrt(\frac{2}{n^{[l-1]}})∗np.sqrt(n[l−1]2​)
  • 如果使用tanh激活函数,1n[l−1]\sqrt \frac{1}{n^{[l-1]}}n[l−1]1​​,或者 2n[l−1]+n[l]\sqrt \frac{2}{n^{[l-1]}+n^{[l]}}n[l−1]+n[l]2​​

这样设置的权重矩阵既不会增长过快,也不会太快下降到 0
从而训练出一个权重或梯度不会增长或消失过快的深度网络
我们在训练深度网络时,这也是一个加快训练速度的技巧

12. 梯度的数值逼近

在反向传播时,有个测试叫做梯度检验

我们使用双边误差,
f′(θ)=f(θ+ε)−f(θ−ε)2ε\left.f^{\prime}( \theta\right)=\frac{f(\theta+\varepsilon)-f(\theta-\varepsilon)}{2 \varepsilon}f′(θ)=2εf(θ+ε)−f(θ−ε)​
不使用单边误差,因为前者更准确。

13. 梯度检验

梯度检验帮助我们发现反向传播中的 bug

dθapprox [i]=J(θ1,θ2,…θi+ε,…)−J(θ1,θ2,…θi−ε,…)2εd \theta_{\text {approx }}[i]=\frac{J\left(\theta_{1}, \theta_{2}, \ldots \theta_{i}+\varepsilon, \ldots\right)-J\left(\theta_{1}, \theta_{2}, \ldots \theta_{i}-\varepsilon, \ldots\right)}{2 \varepsilon}dθapprox ​[i]=2εJ(θ1​,θ2​,…θi​+ε,…)−J(θ1​,θ2​,…θi​−ε,…)​

dθ[i]=∂J∂θid \theta[i]=\frac{\partial J}{\partial \theta_{i}}dθ[i]=∂θi​∂J​

检验 dθapprox [i]≈dθ[i]d \theta_{\text {approx }}[i] \approx d \theta[i]dθapprox ​[i]≈dθ[i]

∥dθapprox −dθ∥2∥dθapprox ∥2+∣∣dθ∣∣2\frac{\left\|d \theta_{\text {approx }}-d \theta\right\|_{2}}{ \left\|d \theta_{\text {approx }}\right\|_{2}+||d \theta||_2}∥dθapprox ​∥2​+∣∣dθ∣∣2​∥dθapprox ​−dθ∥2​​
检查上式的值是否 <10−7< 10^{-7}<10−7

14. 梯度检验的注意事项

  1. 不要在训练中使用梯度检验,它只用于调试
  2. 如果算法的梯度检验失败,要检查所有项,检查每一项,并试着找出bug
  3. 如果使用了正则化,计算梯度的时候也要包括正则项
  4. 梯度检验不能dropout同时使用,可以关闭dropout,进行梯度检验,检验正确了,再打开dropout

作业

02.改善深层神经网络:超参数调试、正则化以及优化 W1.深度学习的实践层面(作业:初始化+正则化+梯度检验)


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

02.改善深层神经网络:超参数调试、正则化以及优化 W1.深度学习的实践层面相关推荐

  1. 02.改善深层神经网络:超参数调试、正则化以及优化 W1.深度学习的实践层面(作业:初始化+正则化+梯度检验)

    文章目录 作业1:初始化 1. 神经网络模型 2. 使用 0 初始化 3. 随机初始化 4. He 初始化 作业2:正则化 1. 无正则化模型 2. L2 正则化 3. DropOut 正则化 3.1 ...

  2. 2020-6-9 吴恩达-改善深层NN-w3 超参数调试(3.3 超参数训练的实践:Pandas(资源少,一次一个模型) VS Caviar(资源多,一次多个模型))

    1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c 2.详细笔记网站(中文):http://www.ai-sta ...

  3. 02.改善深层神经网络:超参数调试、正则化以及优化 W3. 超参数调试、Batch Norm和程序框架(作业:TensorFlow教程+数字手势预测)

    文章目录 1. 探索TensorFlow库 1.1 线性函数 1.2 计算 sigmoid 1.3 计算损失函数 1.4 One_Hot 编码 1.5 用0,1初始化 2. 用TensorFlow建立 ...

  4. 02.改善深层神经网络:超参数调试、正则化以及优化 W3. 超参数调试、Batch Norm和程序框架

    文章目录 1. 调试处理 2. 为超参数选择合适的范围 3. 超参数调试的实践 4. 归一化网络的激活函数 5. 将 Batch Norm 拟合进神经网络 6. Batch Norm 为什么奏效 7. ...

  5. 02.改善深层神经网络:超参数调试、正则化以及优化 W2.优化算法(作业:优化方法)

    文章目录 1. 梯度下降 2. mini-Batch 梯度下降 3. 动量 4. Adam 5. 不同优化算法下的模型 5.1 Mini-batch梯度下降 5.2 带动量的Mini-batch梯度下 ...

  6. 02.改善深层神经网络:超参数调试、正则化以及优化 W2.优化算法

    文章目录 1. Mini-batch 梯度下降 2. 理解 mini-batch 梯度下降 3. 指数加权平均数 4. 理解指数加权平均数 5. 指数加权平均的偏差修正 6. 动量Momentum梯度 ...

  7. 深度学习(二)吴恩达给你的人工智能第一课: 02.改善深层神经网络:超参数调试、正则化以及优化

    目录 第一周 深度学习的实用层面 1.1 训练 / 开发 / 测试集 1.1.1. 训练集.验证集.测试集 ​         1.2 偏差 / 方差 1.3 机器学习基础 1.3.1.降低偏差/降低 ...

  8. 深度学习系列 -- 第二门课 改善深层神经网络:超参数调试、正则化以及优化(一):深度学习的实践层面(Practical aspects of Deep Learning)

    目录 一.深度学习的实践层面(Practical aspects of Deep Learning) 1 训练,验证,测试集(Train / Dev / Test sets) 2 偏差,方差(Bias ...

  9. 深度学习笔记第二门课 改善深层神经网络 第一周:深度学习的实践层面

    本文是吴恩达老师的深度学习课程[1]笔记部分. 作者:黄海广[2] 主要编写人员:黄海广.林兴木(第四所有底稿,第五课第一二周,第三周前三节).祝彦森:(第三课所有底稿).贺志尧(第五课第三周底稿). ...

最新文章

  1. std::string用法总结
  2. ArcObjects中的几何对象简介(一)
  3. C语言实现Floyd-Warshall(弗洛伊德算法)(附完整源码)
  4. android ndk 多线程mk,NDK开发之Android.mk文件编写
  5. MySQL正则表达式的使用
  6. Windows 的开发好痛苦
  7. hibernate教程笔记2
  8. Java 项目中使用 TongLink/Q 实现消息队列传输
  9. Python从入门到自闭(网络篇)
  10. 计算机专业应聘范围,求职面试自我介绍范围
  11. python自动操作脚本_Python实现自动挂机脚本 | 沐雨浥尘
  12. leetcode学习记录_贪心
  13. 计算机硬件及编程语言
  14. 重叠社区发现-LFM算法
  15. 3:表的基本操作-MySQL
  16. java.io.file 报错_关于java.io.FileNotFoundException异常问题?
  17. java报错java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that
  18. 你不得不熟悉且熟练掌握的前端知识
  19. surprise库源码分析
  20. 二维数组_A_2020美国大选Trump VS Biden

热门文章

  1. innerHTML和value的区别
  2. 【linux】Ubuntu 18.04 设置桌面快捷启动方式
  3. linux nginx完全卸载
  4. 解决 :sudo:/etc/sudoers 可被任何人写
  5. 【python】SOCK_STREAM和SOCK_DGRAM两种类型的区别【转】
  6. python编程中的if __name__ == 'main': 的作用和原理[2]
  7. excel导入linux乱码怎么解决方法,,请大家都来看下,Excel导入有乱码?原因出在哪里?应该怎么解决?...
  8. java事件类_关于Java事件类的一些思考
  9. elasticsearch java_java Elasticsearch详细介绍及使用实例分析
  10. 基于Hi3516A的H265 IPC LIVE555 开发基本原理