(改了点)

转载请注明:炼丹实验室
新开了一个专栏,为什么叫炼丹实验室呢,因为以后会在这个专栏里分享一些关于深度学习相关的实战心得,而深度学习很多人称它为玄学,犹如炼丹一般。不过即使是炼丹也是可以摸索出一些经验规律的,希望和各位炼丹术士一起多多交流。

训练技巧对深度学习来说是非常重要的,作为一门实验性质很强的科学,同样的网络结构使用不同的训练方法训练,结果可能会有很大的差异。这里我总结了近一年来的炼丹心得,分享给大家,也欢迎大家补充指正。

参数初始化。

下面几种方式,随便选一个,结果基本都差不多。但是一定要做。否则可能会减慢收敛速度,影响收敛结果,甚至造成Nan等一系列问题。
n_in为网络的输入大小,n_out为网络的输出大小,n为n_in或(n_in+n_out)*0.5
Xavier初始法论文:http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf
He初始化论文:https://arxiv.org/abs/1502.01852

  • uniform均匀分布初始化:
    w = np.random.uniform(low=-scale, high=scale, size=[n_in,n_out])

    • Xavier初始法,适用于普通激活函数(tanh,sigmoid):scale = np.sqrt(3/n)
    • He初始化,适用于ReLU:scale = np.sqrt(6/n)
  • normal高斯分布初始化:
    w = np.random.randn(n_in,n_out) * stdev # stdev为高斯分布的标准差,均值设为0

    • Xavier初始法,适用于普通激活函数 (tanh,sigmoid):stdev = np.sqrt(n)
    • He初始化,适用于ReLU:stdev = np.sqrt(2/n)
  • svd初始化:对RNN有比较好的效果。参考论文:https://arxiv.org/abs/1312.6120

数据预处理方式

  • zero-center ,这个挺常用的.
    X -= np.mean(X, axis = 0) # zero-center
    X /= np.std(X, axis = 0) # normalize
  • PCA whitening,这个用的比较少.

训练技巧

5、学习率:

6、验证集的使用:

使用验证集,可以知道什么时候开始降低学习率和什么时候停止训练;

7、weight初始化:

①  如果你不想繁琐的话,直接用0.02*randn(num_params)来初始化,当然别的值也可以去尝试;

②  如果上面那个建议不太好使,那么就依次初始化每一个weight矩阵用init_scale / sqrt(layer_width) * randninit_scale可以被设置为0.1或者1

③  初始化参数对结果的影响至关重要,要引起重视;

④  在深度网络中,随机初始化权重,使用SGD的话一般处理的都不好,这是因为初始化的权重太小了。这种情况下对于浅层网络有效,但是当足够深的时候就不行,因为weight更新的时候,是靠很多weight相乘的,越乘越小,类似梯度消失的意思。

8、RNN&&LSTM(这方面没有深入了解,借用别人的意思):

如果训练RNN或者LSTM,务必保证gradientnorm被约束在15或者5(前提还是要先归一化gradient),这一点在RNNLSTM中很重要;

9、梯度检查:

检查下梯度,如果是你自己计算的梯度;如果使用LSTM来解决长时依赖的问题,记得初始化bias的时候要大一点;

10、数据增广:

尽可能想办法多的扩增训练数据,如果使用的是图像数据,不妨对图像做一点扭转,剪切,分割等操作来扩充数据训练集合;

11、评价结果:

评价最终结果的时候,多做几次,然后平均一下他们的结果。

补充:

1、参数设置技巧  

无论是多核CPU还是GPU加速,内存管理仍然以字节为基本单元做硬件优化,因此将参数设定为2的指数倍,如64,128,512,1024等,将有效提高矩阵分片、张量计算等操作的硬件处理效率;

2、正则优化  

除了在神经网络单元上添加传统的L1/L2正则项外,Dropout更经常在深度神经网络应用来避免模型的过拟合。初始默认的0.5的丢弃率是保守的选择,如果模型不是很复杂,设置为0.2就可以;

4、其他方法 

除了上述训练调优的方法外,还有其他一些常用方法,包括:使用mini-batch learning方法、迁移训练学习、打乱训练集顺序、对比训练误差和测试误差调节迭代次数、日志可视化观察等等。

  • Minibatch:这个有时候还要根据你的硬件设备而定,一般建议用128,8这组,但是128,1也很好,只是效率会非常慢,注意的是:千万不要用过大的数值,否则很容易过拟合;
  • 要做梯度归一化,即算出来的梯度除以minibatch size
  • clip c(梯度裁剪): 限制最大梯度,其实是value = sqrt(w1^2+w2^2….),如果value超过了阈值,就算一个衰减系系数,让value的值等于阈值: 5,10,15
  • dropout对小数据防止过拟合有很好的效果,值一般设为0.5,小数据上dropout+sgd在我的大部分实验中,效果提升都非常明显.因此可能的话,建议一定要尝试一下。 dropout的位置比较有讲究, 对于RNN,建议放到输入->RNN与RNN->输出的位置.关于RNN如何用dropout,可以参考这篇论文:http://arxiv.org/abs/1409.2329
  • adam,adadelta等,在小数据上,我这里实验的效果不如sgd, sgd收敛速度会慢一些,但是最终收敛后的结果,一般都比较好。如果使用sgd的话,可以选择从1.0或者0.1的学习率开始,隔一段时间,在验证集上检查一下,如果cost没有下降,就对学习率减半或者除于0.5.然后继续,学习率会一直变得很小,到最后就可以停止训练了, 我看过很多论文都这么搞,我自己实验的结果也很好。但是如果对于的大数据,何凯明老师也说过,要把学习率调到很小,他说0.00001都不为过(如果记得不错,应该是这么说的); 很多人用的一个设计学习率的原则就是监测一个比率(每次更新梯度的norm除以当前weightnorm),如果这个比率在10e-3附近,且小于这个值,学习会很慢,如果大于这个值,那么学习很不稳定,由此会带来学习失败。
  • 从相同的来源,可以通过在数据的子集上训练网络来获得一个不错的初始学习速率。理想的策略是从一个很大的学习速率开始,除以一半,直到损失值不再分歧(发散)。接近训练结束时,学习速率的衰减应该在100倍以上。这种衰减使学习到的网络模型可以抵抗随机波动,这中随机波动可能会扭转学习(陷入发散状态)。我们将从一个小的LR开始,测试一小组数据,并选择适当的值。
  • adam和sgd,可以组合使用,也可以先用ada系列快速训练到瓶颈处,最后快收敛的时候,更换成sgd继续训练,慢慢搜索,效果可能比只使用adam会好一些。据说adadelta一般在分类问题上效果比较好,adam在生成问题上效果比较好。adam 是自适应学习率算法,对学习率初始值敏感性不强,但初始学习率设为0.0003是个比较合适的值。因为优化问题到底是什么取决于模型+数据。对于不同的优化问题可能不同的求解器的结果都不一样。adam 的主要作用是自适应梯度值。如果数据集巨大,每个类里都有很大的in-class diversity的话可能会对同一个label 得到较大的loss,这时候adam会有优势。如果模型和数据都不是特别大,SGD+moment会有更好的效果。哈哈,调参没有万金油。
  • 除了gate之类的地方,需要把输出限制成0-1之外,尽量不要用sigmoid,可以用tanh或者relu之类的激活函数.1. sigmoid函数在-4到4的区间里,才有较大的梯度。之外的区间,梯度接近0,很容易造成梯度消失问题。2. 输入0均值,sigmoid函数的输出不是0均值的。层数较浅的时候,比如过两三个全连接层的话,从我个人经验来看,使用relu效果是最差的,sigmoid不太稳定,不知道为啥时好时坏。tanh和leakyRelu效果差不多,但tanh前期收敛快一点。
  • rnn的dim和embdding size,一般从128上下开始调整. batch size,一般从128左右开始调整.batch size合适最重要,并不是越大越好.
  • word2vec初始化,在小数据上,不仅可以有效提高收敛速度,也可以可以提高结果.
  • 尽量对数据做shuffle
  • LSTM 的forget gate的bias,用1.0或者更大的值做初始化,可以取得更好的结果,来自这篇论文:http://jmlr.org/proceedings/papers/v37/jozefowicz15.pdf, 我这里实验设成1.0,可以提高收敛速度.实际使用中,不同的任务,可能需要尝试不同的值.
  • Batch Normalization据说可以提升效果,不过我没有尝试过,建议作为最后提升模型的手段,参考论文:Accelerating Deep Network Training by Reducing Internal Covariate Shift
  • 如果你的模型包含全连接层(MLP),并且输入和输出大小一样,可以考虑将MLP替换成Highway Network,我尝试对结果有一点提升,建议作为最后提升模型的手段,原理很简单,就是给输出加了一个gate来控制信息的流动,详细介绍请参考论文: http://arxiv.org/abs/1505.00387
  • 来自@张馨宇的技巧:一轮加正则,一轮不加正则,反复进行。

Ensemble

Ensemble是论文刷结果的终极核武器,深度学习中一般有以下几种方式

  • 同样的参数,不同的初始化方式
  • 不同的参数,通过cross-validation,选取最好的几组
  • 同样的参数,模型训练的不同阶段,即不同迭代次数的模型。

  • 不同的模型,进行线性融合. 例如RNN和传统模型.

深度学习网络训练技巧相关推荐

  1. 深度学习 网络训练技巧

    网络训练技巧: 1.数据增强:缩放.随机位置截取.翻卷.随机旋转.亮度.对比度.颜色变化等方法. 2.学习率衰减:随着训练的进行不断的减小学习率. 例如:一开始学习率0.01,在10000步后降为0. ...

  2. 深度学习-网络训练技巧

    1.深度学习的一些基本概念,学习率.batch.epoch.optimizer.评价函数(损失函数)等 1.1 学习率(Learning Rate) 学习率:是控制模型学习效率(步长)的权重. 学习率 ...

  3. 深度学习网络训练中出现nan的原因分析

    报错: nan:Not a Number 该错误导致的后果:造成训练准确率的断崖式下跌 错误原因分析: 1)在loss函数中出现nan 出现原因:一般是因为tf中的log函数输入了'负数'或'0'值( ...

  4. 深度学习网络调试技巧

    https://zhuanlan.zhihu.com/p/20792837 转载请注明:炼丹实验室 神经网络的代码,比一般的代码要难调试不少,和编译错误以及运行时程序崩溃相比,神经网络比较棘手的地方, ...

  5. 踩坑实录——多光谱影像(.tif)输入深度学习网络训练

    项目场景: 从github下载了fastercnn_Resnet50的目标识别网络,尝试把多光谱影像数据集(.tif)输入进去进行训练,由于本人是刚接触深度学习的小白,网上又没有找到相关教程,只能一边 ...

  6. 深度学习模型训练技巧

    博主以前都是拿别人的模型别人的数据做做分类啊,做做目标检测,搞搞学习,最近由于导师的工程需求,自己构造网络,用自己的数据来跑网络,才发现模型训练真的是很有讲究,很有技巧在里面,最直接的几个超参数的设置 ...

  7. 没有独立显卡,虚拟的显卡,能进行深度学习网络训练吗

    好像不能 什么也没有,检测不出来显卡 虚拟机检测不出来显卡的原因是装了tensorflow和tensorflow-gpu.把tensorflow卸载了,重新装一次tensorflow-GPU即可

  8. 深度学习网络调参技巧

    深度学习网络调参技巧 本文转载自[炼丹实验室],讲了一些深度学习训练的技巧,其中包含了部分调参心得:深度学习训练心得.不过由于一般深度学习实验,相比普通机器学习任务,时间较长,因此调参技巧就显得尤为重 ...

  9. (六)使用ResNet50迁移学习进行COVID-19诊断:从头开始构建深度学习网络

    目录 安装库并加载数据集 预处理数据 构建深度学习网络 训练网络 评估网络 下一步? 下载源 - 300.4 KB 在本系列文章中,我们将应用深度学习网络ResNet50来诊断胸部X射线图像中的Cov ...

最新文章

  1. 只要能坚持下来就是好博客
  2. python编程入门指南怎么样-学习python网络编程怎么入门
  3. linux动态分配全局置换,深入理解计算机系统 第九章 虚拟存储器
  4. 深入浅出vc dll动态链接库
  5. ffplay android 编译,ffmpeg android 平台编译
  6. 梯度下降和随机梯度下降_梯度下降和链链接系统
  7. 我眼中的 NCC,WTM 寻亲之旅
  8. 如何在openGauss 2.1.0中使用Job?
  9. python opencv库下载_PythonopenCV 2.4.3 cv2.SolvePnP
  10. Mybatis 实现关联表查询
  11. 2019 最新 200 道 Java 面试题
  12. 多线程并发-java内存模型和计算机基础
  13. 笔记本电脑性价比排行2019_笔记本电脑性价比排行2020榜单介绍
  14. 读取SqlServer表名及结构
  15. 怎么调用pda的打印机_win7系统如何更改打印机缓存文件夹 win7系统更改打印机缓存文件夹方法【介绍】...
  16. 如何优化程序员的内部培训
  17. PS4 5.05安装Linux系统,PS4主机刷机教程以及游戏安装教程,到5.05 4.55 4.05等系统
  18. Pycharm导入已有的本地安装包
  19. 还贷的那些事III——等额还贷的计算
  20. 在北京开公司,搬家后如何变更税务和工商?

热门文章

  1. NPOI之C#下载Excel
  2. CAD转图片,没有转换器CAD图纸转换成图片
  3. 软件工程专插本_2021年软件工程专业-编译原理-考试大纲(专插本).docx
  4. VMware vSphere虚拟机文件介绍
  5. 64位Windows 7 中最好的杀毒软件!
  6. 矿产资源储量动态监管服务
  7. 将element-plus 默认的使用英语改成其他语言设置
  8. developerWorks 中文社区
  9. Docker 出了个新玩意:软件物料清单
  10. 热导方程的Matlab数值解方法