Andrew Ng - 深度学习工程师 - Part 2. 改善深层神经网络:超参数调试、正则化以及优化(Week 1. 机器学习的实用层面)...

===========第1周 机器学习的实用层面================

 

===1.1 训练/开发/测试===

早期机器学习时代(数据规模较小),如果不需要dev set,常见的划分有 70%/30% 的训练/测试 划分,如果需要验证集,常见的是 60%/20%/20%划分

在big data era,由于数据集非常大,test和dev的占比通常变得更小,因为dev set的目的就是检测哪个算法更有效,所以dev集只需要big enough for you to evaluate 不同算法,比如你有100million数据,使用1万data作为dev集is more than enough,test集也是一样。

MAKE SURE the dev and test sets come from the same distribution

In practice,有时没有/不需要test set,很多人会直接把train/dev划分称为 train/test划分,Andrew认为这是不严谨的

 

===1.2 偏差(Bias) / 方差(Variance)===

High Bias:欠拟合

High Variance: 过拟合

举个例子,以错误率为例,train/dev:1%/11%(高方差,过拟合),15%/16%(高偏差,欠拟合),15%/30%(高偏差+高方差,欠拟合)

 

===1.3 机器学习基础===

在现代的deep learning,只要bigger network & more data & 合适的其他设置如regulation等,在降低偏差的同时通常可以同时 降低/不伤害 方差,反之亦然。这也是为什么在深度学习中我们不用太关注Bias-Variance trade-off 的原因,Andrew认为这也是deep火起来的一个原因。

 

===1.4 正则化===

以logistic regression为例,我通常只加对W的L2正则项,不加b的正则项目(加不加影响不大),因为W通常是很高维的,高偏差问题主要和它有关,we aren't fitting all the parameters well

L1 norm可以使模型更sparse,有人认为这有利于降低存储模型的存储空间,但in practice,我发现L1 norm可以使模型稀疏,但其实并没有降低太多存储内存,所以我不认为L1的目的是为了压缩模型。我在实践中喜欢L2 norm。

对矩阵的L2正则化叫做 Frobenious norm,而不叫 L2 norm,|| W ||^2

在对于的BP过程中,dW要额外加一项,你可以看到这也是为什么L2 regularization 被称为i weight decay

 

===1.5 正则化为什么可以减少过拟合===

直观上来感受,以一个多层神经网络和L2 正则化为例,通过控制正则化参数lambda,它相当于消除,实践中更准确的说是降低了许多神经元unit的影响,从而simpler the network。

另一个直观例子,假设激活函数为tanh(),在靠近0周围的部分近似线性,而两边是非线性的,正则化使得W值变小,W乘以上一层输入得到的值也变小了,就会集中在线性区。

 

===1.6 dropout正则化===

反向随机失活 inverted dropout,记得在 a = (a*mask) / keep_prop

 

 ===1.7 理解dropout===

dropout相当于降低了模型复杂度

Intuition: 依然以网络结构为例,不能依赖any one feature(也就是,给某一个输入节点赋予过大的权重),因为任何feature都有可能被drop,so have to spread the weights,利用绝大部分特征。

类似L2正则化,dropout通常会产生一个效果,即 shrinking the squared norm of the weights,并且does some outer regularization。甚至更适用于不同scale的输入范围。

根据不同层可能过拟合的程度,不同层可以设置不同的keep_prop,缺点是交叉验证选参数代价大。一直替代的方法是对所有层,keep_prop= 1 / a same number.

除非网络过拟合了,否则我通常不会用dropout。它在其他领域应用得比较少,主要是在CV,因为通常我们没有足够的数据,导致过拟合。

一个缺点是,此时代价函数 J is no longer well-defined,此时你很难监测迭代进行梯度下降时的J的性能,所以我们失去的debug工具绘制损失图。通常我会先关闭dropout,运行NN,确保J单调递减,然后再加入dropout。

 

===1.7 其他正则化方法===

Data Augmentation. 比如对称图像,随机旋转和裁剪,OCR图像设置可以各种扭曲

early stopping. 画出 training/dev error 随着 迭代次数的 曲线。

缺点是,它couple了两个任务(最优化代价函数J,同时要降低过拟合风险),这使得我们无法独立地处理这两个任务。即,我们尝试用一种方式同时解决两个问题,这也使得我们的任务变得更复杂。提早停止梯度下降,在某种程度上我们breaking 了 降低J的任务,此时代价函数可能还不够小

优点是,这个正则化方法不需要额外参数,在梯度下降的过程中就可以完成。但是如果负担得起 L2 正则化超参数搜索的计算开销的话,通常我们还是选择 L2。我发现 L2使得超参数的search space更容易分解(咸鱼对这句话的理解是,加了L2之后迭代过程相对固定,只要不断迭代就行了,最终比较不同超参数组合的J值,而early stopping看中间迭代值,不同超参数组合具体在哪次迭代停止都不一样,我们关注了中间值使得range search可能也不是那么容易锁定)。

===1.9 标准化输入===

当不同特征scale相差较大时,可以看到 J 的等高图是一个扁长的椭圆(假设此时特征2维),此时直接使用SGD,会导致Z字形轨迹(不同方向梯度大小不一样,而学习率一样)。

特征尺度相差不大就不需要做归一化,但即使做了归一化也不会有什么harm,所以当我不确定特征scale是否相差很大时,我都会选择做归一化。

 

===1.10 梯度消失和梯度爆炸===

直观理解

Andrew举了一个使用线性激活函数的例子,那就相当于不断乘以Wi,那么前向时,Wi略大于1激活值就会爆炸,偏小就会消失接近0,反向时梯度值类似。咸鱼觉得Relu会遇到这种情况。

另外CS231n中Karpathy讲的以tanh为激活函数时,直接使用高斯随机产生权重*某较小的数,也会存在梯度消失问题,要么激活值接近0,要么激活值接近1,两者都导致梯度消失。

===1.11 神经网络的权重初始化===

使用  标准高斯函数*一个较小的数  随机初始化权重,存在一个问题,随着输入数据量的增长,随机初始化的神经元的输出数据的分布中的方差也在增大。我们可以除以输入数据量的平方根来调整其数值范围,这保证了网络中所有神经元起始时有近似同样的输出分布。实践经验证明,这样做可以提高收敛的速度。

Xavier初始化,以tanh为激活函数,Wi = np.random.randn( Ni - 1 *  Ni ) / np.sqrt( Ni-1),这使得 Zi 和 Ai-1 有大致相同的范围(方差) 。

In practice,我认为这些初始化公式只是给了你一个起始点,如果你愿意,W的方差参(Xavier将其调整为1/n)数可以作为你可以调整的一个超参数。有时这样调优的效果很微小,通常这不会是我想要调的首要超参,但在有些应用中调这个参数也能提升了一些性能。考虑到其他超参的重要性,我通常给这个超参低点的优先级。

 

=== 1.12 梯度的数值逼近===

使用  双边的数值梯度  近似  解析梯度

=== 1.13 梯度检验===

 

 

=== 1.14 关于梯度检验实现的标注===

1、不要再训练中使用梯度检验,它只用在调试中。因为梯度检验很费时

 2、如果检验失败,look at specific components to try to identify bug

3、记住正则化项

4、Doesn‘t work with dropout。梯度检验时先关闭dropout,设置keep_node=1

5、Run at random intialization; perhaps again after some training. 这种情况很少发生,但是也有可能,small random initial values,运行梯度检验,有可能是对的,但随着训练进行权重away from zero,梯度检验将失败。虽然我不常这么做,但你可以选择的是,在初始化时跑梯度检验,然后让模型训练一段时间,权重away from 初始化值后,在进行梯度检验。

 

转载于:https://www.cnblogs.com/JesusAlone/p/8513487.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jms 如何测试_使用JMSTester对JMS层进行基准测试

jms 如何测试对于我去过的大多数客户端,使用ActiveMQ扩展JMS消息传递层是一个优先事项。 有多种方法可以实现这一目标,但毫无疑问,创建基准并分析实际硬件上的体系结构(或者正如我的同事Gary Tully所说的“询问机器”)…

为什么待办事项清单不管用

为什么待办事项清单不管用 时间管理 November 22nd, 2012 本文原文来自 Harvard Business Review,由 换装迷宫tayy 翻译。 停止制作你的待办事项清单吧。它们只会让你感觉失败和受挫。想想你正在管理的那些待办清单:有多少事项从年初起就已经在那儿了&…

charts 画饼图

统计某一天某类物体的百分比 新知识点:aggregate https://blog.csdn.net/congcong68/article/details/51619882 主要的 $group $match $sort $limit pipeline [{$group:{_id:$area,count:{$sum:1}}}, # count 是聚合之后新增的一个字段。{$sort:{count:1}}, # …

Apache Camel 2.18 –即将推出的功能的亮点

骆驼骑士正在忙于即将发布的Apache Camel 2.18版本。 当我们动态更新发行说明时 ,这是一种快速查看即将发生的情况的方法。 我只是想在夏天在这里进行快速更新,到目前为止,我们已经完成了简短的重点介绍。 随着发行版的临近和文档的完善&…

实时多线程系统的日志实现

实时多线程系统的日志实现 2008-03-21 09:19 黄明/戴颖  软件世界 我要评论(0) 字号:T | T为了分析软件系统在测试和运行期产生的故障,目前大多数软件系统所广泛使用的一种方法就是日志记录。本文给出了利用循环缓冲区和单独的日志读写线程实现实时系统…

51NOD 1424 零树

Discription 有一棵以1为根的树,他有n个结点,用1到n编号。第i号点有一个值vi。 现在可以对树进行如下操作: 步骤1:在树中选一个连通块,这个连通块必须包含1这个结点。 步骤2:然后对这个连通块中所有结点的值…

nosql的数据服务_使用NoSQL实现实体服务–第1部分:概述

nosql的数据服务在过去的几周中,我一直在进行一些研发工作,以了解使用NoSQL数据库实现实体服务 (也称为数据服务)的优势。 实体服务是Thomas Erl的《服务技术》丛书中提出的服务分类。 它用于描述高度不可知和可重复使用的服务&am…

Java中获取当前函数名

Java中获取当前函数名 博客分类: Java JavathreadJDKIDEA 有时候我们需要在程序中获取当前运行的函数名,如何简单的做到这点呢?我们可以用getStackTrace轻松搞定。 一提到getStatckTrace多数人会联想到Thowable中的getStackTrace方法。的确&…

day19 复习,组合和继承

组合:当一个类的对象作为另一个类对象的属性就叫组合 表示的一种什么有什么的关系 面向对象的思想 不关心程序的执行过程 关心的事一个程序中的角色以及角色与角色的关系 python中一切皆对象 实例化的过程 创建一个对象 __init__给对象添加属性,对…

Spring Boot和数据库初始化

Spring Boot是一个很好的框架,可在开发Spring应用程序时为开发人员节省大量时间和精力。 它的主要功能之一是数据库初始化。 您可以使用spring boot来初始化您的sql数据库。 我们将从gradle文件开始 group com.gkatzioura version 1.0-SNAPSHOTapply plugin: java…

学习Java: Queue

15 08, 2007 学习Java: Queue Java — 作者 zybing 15:17Java提供了Quere,相当好用,在1.5版本中又有增强。Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构 offer,add区别&#xff1…

建站手册-网站主机:电子商务主机

ylbtech-建站手册-网站主机:电子商务主机1.返回顶部 1、http://www.w3school.com.cn/hosting/host_ecommerce.asp2、2.返回顶部1、如果您的公司正在销售某种产品或服务,那么电子商务也许是做生意的一种好办法。 Internet 商业 电子商务就是在 Internet 上…

ConcurrentLinkedQueue

ConcurrentLinkedQueue 因为ConcurrentLinkedQueue是线程序安全的并且是针对并发的 主类 Java代码 public class conn{ public static void main(String[] args) throws Exception{ Queue<String> queuenew ConcurrentLinkedQueue<String>(); …

【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器

每天学习一点点 编程PDF电子书、视频教程免费下载&#xff1a;http://www.shitanlife.com/code一、反向代理&#xff1a;Web服务器的“经纪人” 1.1 反向代理初印象 反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服务器来接受internet上的连接请求&#xff0c;…

剖析java中的String之__拼接

剖析java中的String之__拼接 分类&#xff1a; java 2011-08-24 17:46 31人阅读 评论(0) 收藏 举报 出处, http://blog.csdn.net/izard999/article/details/6708433 网上剖析String的不少&#xff0c;关于其他的String的知识我就不累赘去说了&#xff01; 本文只解释下我在面…

mfc 弹簧_整合弹簧,速度和瓷砖

mfc 弹簧我喜欢 Tiles&#xff0c; 并且听到了很多有关 Velocity的信息 。 它们似乎有不同的用途&#xff0c;并且据说很容易结合在一起&#xff0c;所以我决定试一试&#xff0c;并在Spring Web应用程序中同时使用它们。 集成实际上花费了许多小时&#xff0c;并且是一次真正的…

STM32-RS485通信软硬件实现

OS&#xff1a;Windows 64 Development kit&#xff1a;MDK5.14 IDE&#xff1a;UV4 MCU&#xff1a;STM32F103C8T6/VET6 AD&#xff1a;Altium Designer 18.0.12 1、RS485简介  RS-485又名TIA-485-A, ANSI/TIA/EIA-485或TIA/EIA-485。RS485是一个定义平衡数字多点系统中的驱动…

MFC如何使控件大小随着对话框大小自动调整

MFC如何使控件大小随着对话框大小自动调整 2012-04-27 16:24:50| 分类&#xff1a; MFC | 标签&#xff1a; |字号大中小 订阅 对话框的大小变化后&#xff0c;假若对话框上的控件大小不变化&#xff0c;看起来会比较难看。下面就介绍怎么让对话框上的控件随着对话框的…

Spring MVC整合Ehcache缓存框架

https://blog.csdn.net/u012562943/article/details/52289433转载于:https://www.cnblogs.com/pjlhf/p/8818747.html

Java 枚举7常见种用法

DK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能&#xff0c;却给我的开发带来了“大”方便。 用法一&#xff1a;常量 在JDK1.5 之前&#xff0c;我们定义常量都是&#xff1a; publicstaticfianl....。现在好了&#xff0c;有了枚举&#xff0c;可以把相关的常…