一、深度学习建模与调试流程

先看训练集上的结果怎么样(有些机器学习模型没必要这么做,比如决策树、KNN、Adaboost 啥的,理论上在训练集上一定能做到完全正确,没啥好检查的)

Deep Learning 里面过拟合并不是首要的问题,或者说想要把神经网络训练得好,至少先在训练集上结果非常好,再考虑那些改善过拟合的技术(BN,Dropout 之类的)。否则的话回去检查三个 step 哪里有问题。

Deep Learning 中的方法为了解决两个主要问题而提出:1.训练集做得不好;2.训练集做得好,测试集做得不好

实际应用的时候搞清楚自己面对的问题,选择对应的技巧。

二、激活函数

1. sigmoid

梯度消失:网络很深的时候,靠近输入的 hidden layers 的梯度对损失函数影响很小, 参数更新的就很慢;靠近输出的情况反之。前面几层的参数都还没怎么更新的时候就收敛了。

原因也比较简单,反向传播的时候每经过一层,都会乘上小于 1 的数(sigmoid 函数 会把输入压到 0~1 之间),结果就越来越衰减。

早期用 RBM ,先训练好前面几层。

2. ReLU

计算快;有些生物学的来源;相当于无穷多个不同偏置的sigmoid函数叠加;不存在梯度消失

输出要么是0,要么是输入本身,相当于把原来的网络变成一个 thinner linear network。
 
这样网络还是非线性的吗? —— 是。只要输入的变化比较大,跨越函数分段,网络依旧具有非线性。
好像不可微? —— 确实。但做浮点运算也几乎不会正好要在原点处计算微分,所以直接忽略这个问题。
 
一些变种,亲测过确实会有提升。
 

3. maxout network

每个神经元的激活函数的具体形式,是可以学习来的(不一定非得像 ReLU 那样在原点分段):

哪些神经元要被 group 起来是事先决定的(比如随机2个或者3个一组之类的,几个一组也可以作为一个参数来学习)。

ReLU 就是特殊情况下的 maxout ;但 maxout 可以实现更多可能的激活函数(具体是什么样的函数,根本上是由参数 w 决定的)。

怎么训练?—— 给定一个输入,是能够知道每次取 max,留下的是哪一条路径。训练去掉不作用的神经元之后的“瘦长”的线性网络就行了。
怎么保证参数都能被更新?—— 训练的时候每次给不同的输入数据,去掉的神经元是不一样的。所以一直给不同的输入,差不多每个参数都会被更新到。

三、梯度下降的改进

1. Adagrad 

在梯度下降中已经总结过,在不同方向上需要不同的学习率。

学习率时间衰减 + 从开始到当前时刻的梯度平方和求平均来估计二阶微分的大小趋势

2. RMSProp

error surface 非常复杂,即使在同一个方向上,学习率也需要不断调整。进阶版 Adagrad,动态调整学习率。

在 decaying 累计的先前梯度,通过调整alpha的大小,来选择是考虑先前的梯度(t 时刻之前的累积)多一些,还是当前的梯度(t时刻的)多一些

真的会卡在 local minima 吗?
实际这种情况下的几率很小(by lecun)如果是 local minima 的话,那在每一个方向上都得是“谷底”,参数越多这个几率就越小。
 

3. Momentum

解决一点 local minima 和 plateau 的问题

每次移动的方向不仅考虑当前时刻的梯度,也考虑之前移动的方向(惯性)。
用 vt 来记录 t 时刻移动的方向,v0 = 0;参数更新的公式为:
vt+1  = λv- ηgt
θt+1  = θ+ vt+1
例如:第一次更新 θ = θ+ v= θ+ λv- ηg0 = θ- ηg0
   第二次更新 θ2  = θ+ v= θ+ λv- ηg1 = θ1 + (λ)2v- ληg0 - ηg1 = θ1 - ληg0 - ηg1
 
所以化简的递推公式为  θt+1 = θt - ηgt - ληgt-1 - ... - (λ)tηg0
  
 
另一个角度理解 v:把公式展开,v 其实就是以往所有时刻梯度的 weighted sum,只不过越往前的初始时刻的梯度被考虑的越少( 每往前一个时刻就多乘一个λ),但也依旧对当前要更新的方向存在影响。

4. Adam 

RMSProp + Momentum,利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。

其中,在迭代初始阶段,m和 v有一个向初值的偏移(过多的偏向了 0),因此可以对一阶和二阶动量做偏置校正 (bias correction),这样每次迭代学习率都有一个确定的范围,参数更新比较平稳。

四、正则化

1. Early Stopping 

机器学习中比较常见的技巧

2. Dropout

神经网络中才会用

随机 kill 掉一定比例的神经元。测试的时候不做,而且还要补偿参数。

为什么要这么做?
如果不乘以 1 - dropout rate,参数其实是比较大的:

Dropout 可以理解成是一种 Ensemble,因为训练时每次都随机干掉一部分网络,但测试时要综合起来全部都用。

深度学习模型训练技巧 Tips for Deep Learning的更多相关文章

  1. 深度学习模型调优方法(Deep Learning学习记录)

    深度学习模型的调优,首先需要对各方面进行评估,主要包括定义函数.模型在训练集和测试集拟合效果.交叉验证.激活函数和优化算法的选择等. 那如何对我们自己的模型进行判断呢?——通过模型训练跑代码,我们可以 ...

  2. AI佳作解读系列(一)——深度学习模型训练痛点及解决方法

    1 模型训练基本步骤 进入了AI领域,学习了手写字识别等几个demo后,就会发现深度学习模型训练是十分关键和有挑战性的.选定了网络结构后,深度学习训练过程基本大同小异,一般分为如下几个步骤 定义算法公 ...

  3. 深度学习与计算机视觉(11)_基于deep learning的快速图像检索系统

    深度学习与计算机视觉(11)_基于deep learning的快速图像检索系统 作者:寒小阳 时间:2016年3月. 出处:http://blog.csdn.net/han_xiaoyang/arti ...

  4. TensorFlow和深度学习入门教程(TensorFlow and deep learning without a PhD)【转】

    本文转载自:https://blog.csdn.net/xummgg/article/details/69214366 前言 上月导师在组会上交我们用tensorflow写深度学习和卷积神经网络,并把 ...

  5. TensorFlow和深度学习新手教程(TensorFlow and deep learning without a PhD)

    前言 上月导师在组会上交我们用tensorflow写深度学习和卷积神经网络.并把其PPT的參考学习资料给了我们, 这是codelabs上的教程:<TensorFlow and deep lear ...

  6. 深度学习FPGA实现基础知识10(Deep Learning(深度学习)卷积神经网络(Convolutional Neural Network,CNN))

    需求说明:深度学习FPGA实现知识储备 来自:http://blog.csdn.net/stdcoutzyx/article/details/41596663 说明:图文并茂,言简意赅. 自今年七月份 ...

  7. 用 Java 训练深度学习模型,原来可以这么简单!

    本文适合有 Java 基础的人群 作者:DJL-Keerthan&Lanking HelloGitHub 推出的<讲解开源项目> 系列.这一期是由亚马逊工程师:Keerthan V ...

  8. 利用 TFLearn 快速搭建经典深度学习模型

      利用 TFLearn 快速搭建经典深度学习模型 使用 TensorFlow 一个最大的好处是可以用各种运算符(Ops)灵活构建计算图,同时可以支持自定义运算符(见本公众号早期文章<Tenso ...

  9. 在NLP中深度学习模型何时需要树形结构?

    在NLP中深度学习模型何时需要树形结构? 前段时间阅读了Jiwei Li等人[1]在EMNLP2015上发表的论文<When Are Tree Structures Necessary for ...

随机推荐

  1. spring源码深度解析— IOC 之 bean 的初始化

    一个 bean 经历了 createBeanInstance() 被创建出来,然后又经过一番属性注入,依赖处理,历经千辛万苦,千锤百炼,终于有点儿 bean 实例的样子,能堪大任了,只需要经历最后一步 ...

  2. shiro自定义异常无法被捕获总是抛出AuthenticationException解决方案

    这个问题我也是出的莫名其妙,刚开始好好的,然后配置多realm之后出的. 现在直入主题 在继承了 org.apache.shiro.authc.pam.ModularRealmAuthenticato ...

  3. Java学习笔记之---方法和数组

    Java学习笔记之---方法与数组 (一)方法 (1)什么是方法? 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 (2)方法的优点 使程序变得更简短而 ...

  4. C# Linq 笛卡尔积

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. 雅阁微信群、雅阁车友群、十代雅阁交流微信QQ群

    最近一直在关注第十代雅阁,不论是普通汽油版本还是油电混动版本都很不错,在网上看到很多评测文章和视频 后续都会整理发布到微信群中. 由于论坛发帖,博客发文都不是很方便,为了及时沟通,先创建了微信群,方便 ...

  6. 视频4K技术的解读

    前几年4K技术就已经有人提及,今年更是成了一个非常热门的词汇,而且4K技术已经普遍应用于各类终端,如电视机.机顶盒.手机等.那么如何来理解4K这个东东呢?今天博主就谈谈自己对4K技术的认识. 博主认为 ...

  7. 基础篇-1.2Java世界的规章制度(上)

    1 Java标识符 在Java语言中,有类.对象.方法.变量.接口和自定义数据类型等等,他们的名字并不是确定的,需要我们自己命名.而Java标识符就是用来给类.对象.方法.变量.接口和自定义数据类型命 ...

  8. TLS示例开发-golang版本

    目录 前言 制作自签名证书 CA 服务器证书相关 客户端证书相关 证书如何验证 在浏览器中导入证书 导入证书 修改域名 golang服务端 目录 main.go 测试 参考 前言 在进行项目总结的时候 ...

  9. HAproxy+Keepalived实现高可用

    HAproxy+Keepalived实现高可用 说明: HA1:HAproxy+Keepalived(master) HA2:HAproxy+Keepalived(backup) 1.HA1上keep ...

  10. 物联网时代 跟着Thingsboard学IOT架构-CoAP设备协议

    thingsboard官网: https://thingsboard.io/ thingsboard GitHub: https://github.com/thingsboard/thingsboar ...