[学习] 这些深度学习网络训练技巧,你了解吗?

2017 年 7 月 29 日 菜鸟的机器学习 潇湘

作者:萧瑟

链接:https://zhuanlan.zhihu.com/p/20767428

编辑:菜鸟的机器学习,仅用于学习记录,非商业用途


众所周知,很多机器学习的算法工程师每天的工作就是跑数据、调整参数、对比效果,如此“恶性”循环,机器学习算法的参数很多,例如,点击率(CTR)预估中,广泛使用的LR,有学习率、L1正则、L2正则等参数。想要调得一手好参,需身经百练,这里练是训练的练哦。


当前,深度学习越发的火热,覆盖的公司业务也越来越多,对于点击率预估来讲,几乎成为每个团队的标配。不知道、不了解DNN如何进行点击率预估模型,出门见面都抬不起头来,开句玩笑哈。


下面是篇关于深度学习网络训练技巧的一些总结,有些是“菜鸟机器学习”知道的,有些是不了解的,记录在此,希望对我、对大家有所帮助。


话不多说,正文如下


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


参数初始化

下面几种方式,随便选一个,结果基本都差不多。但是一定要做。否则可能会减慢收敛速度,影响收敛结果,甚至造成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有比较好的效果,请参考论文arxiv.org/abs/1312.6120


数据预处理方式

  • zero-center,这个挺常用的

    X -= np.mean(X, axis = 0)     # zero-center

    X /= np.std(X, axis = 0)         # normalize


  • PCA  Whitening,这个用的比较少


训练技巧

  • 要做梯度归一化,即算出来的梯度除以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没有下降,就对学习率减半. 我看过很多论文都这么搞,我自己实验的结果也很好. 当然,也可以先用ada系列先跑,最后快收敛的时候,更换成sgd继续训练.同样也会有提升.据说adadelta一般在分类问题上效果比较好,adam在生成问题上效果比较好。

  • 除了gate之类的地方,需要把输出限制成0-1之外,尽量不要用sigmoid,可以用tanh或者relu之类的激活函数.1. sigmoid函数在-4到4的区间里,才有较大的梯度。之外的区间,梯度接近0,很容易造成梯度消失问题。2. 输入0均值,sigmoid函数的输出不是0均值的。

  • 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和传统模型.



若大家有什么训练技巧,欢迎留言讨论。另外,上面提及的论文正在阅读,可以一起交流。




登录查看更多
7

相关内容

[ICML-Google]先宽后窄:对深度薄网络的有效训练
专知会员服务
34+阅读 · 2020年7月5日
还在修改博士论文?这份《博士论文写作技巧》为你指南
【MIT深度学习课程】深度序列建模,Deep Sequence Modeling
专知会员服务
77+阅读 · 2020年2月3日
【模型泛化教程】标签平滑与Keras, TensorFlow,和深度学习
专知会员服务
20+阅读 · 2019年12月31日
【推荐系统/计算广告/机器学习/CTR预估资料汇总】
专知会员服务
87+阅读 · 2019年10月21日
深度学习算法与架构回顾
专知会员服务
80+阅读 · 2019年10月20日
你有哪些深度学习(rnn、cnn)调参的经验?
七月在线实验室
10+阅读 · 2019年3月27日
7个实用的深度学习技巧
机器学习算法与Python学习
16+阅读 · 2019年3月6日
深度学习面试100题(第41-45题)
七月在线实验室
15+阅读 · 2018年7月18日
入门 | 深度学习模型的简单优化技巧
机器之心
9+阅读 · 2018年6月10日
深度学习超参数简单理解
计算机视觉战队
4+阅读 · 2017年11月28日
如何使用高大上的方法调参数
AI研习社
3+阅读 · 2017年9月11日
[学习] 这些深度学习网络调参技巧,你了解吗?
菜鸟的机器学习
7+阅读 · 2017年7月30日
Adversarial Transfer Learning
Arxiv
12+阅读 · 2018年12月6日
Parsimonious Bayesian deep networks
Arxiv
5+阅读 · 2018年10月17日
Arxiv
19+阅读 · 2018年6月27日
Arxiv
7+阅读 · 2018年5月23日
Arxiv
8+阅读 · 2018年5月15日
Arxiv
8+阅读 · 2018年1月25日
VIP会员
相关VIP内容
相关资讯
你有哪些深度学习(rnn、cnn)调参的经验?
七月在线实验室
10+阅读 · 2019年3月27日
7个实用的深度学习技巧
机器学习算法与Python学习
16+阅读 · 2019年3月6日
深度学习面试100题(第41-45题)
七月在线实验室
15+阅读 · 2018年7月18日
入门 | 深度学习模型的简单优化技巧
机器之心
9+阅读 · 2018年6月10日
深度学习超参数简单理解
计算机视觉战队
4+阅读 · 2017年11月28日
如何使用高大上的方法调参数
AI研习社
3+阅读 · 2017年9月11日
[学习] 这些深度学习网络调参技巧,你了解吗?
菜鸟的机器学习
7+阅读 · 2017年7月30日
相关论文
Adversarial Transfer Learning
Arxiv
12+阅读 · 2018年12月6日
Parsimonious Bayesian deep networks
Arxiv
5+阅读 · 2018年10月17日
Arxiv
19+阅读 · 2018年6月27日
Arxiv
7+阅读 · 2018年5月23日
Arxiv
8+阅读 · 2018年5月15日
Arxiv
8+阅读 · 2018年1月25日
Top
微信扫码咨询专知VIP会员