RNN模型训练经验总结

文章目录

  • RNN模型训练经验总结
    • 数据准备
      • “look at your data”!!
      • 小步试错。
    • 搭建模型
      • 设置端到端的训练评估框架
    • forward propagation设置
      • 激活函数
      • dropout
    • back propagation设置
      • 学习率 learning rate
      • 优化算法
    • 避免出现NaN的几个方法
    • 利用好过拟合。
    • 其他经验
    • 技巧集锦

RNN模型训练经验总结

数据准备

“look at your data”!!

训练神经网络前,别管代码,先从预处理数据集开始。一定要认认真真先去了解数据的分布并找出其中的规律。在检查数据的过程中,可能会发现重复的、标记错误的样本,在早期发现这些错误都可以避免以后走弯路。

由于神经网络实际上是数据集的压缩版本,因此您将能够查看网络(错误)预测并了解它们的来源。如果你的网络给你的预测看起来与你在数据中看到的内容不一致,那么就会有所收获。
一旦从数据中发现规律,可以编写一些代码对他们进行搜索、过滤、排序。把数据可视化能帮助我们发现异常值,而异常值总能揭示数据的质量或预处理中的一些错误。

小步试错。

在数据集很大的情况下,建议先用 1/100、1/10 的数据跑一跑,对模型性能和训练时间有个底,外推一下全量数据到底需要跑多久。在没有足够的信心前不做大规模实验。

batchsize通常影响没那么大,除了特殊的算法需要batch大一点。Rnn模型如果不考虑时间,试一试 batch size=1。

如果初步训练效果还不错,就可以试一试增广数据,但是增广不能违反数据的基本规律,比如行人识别一般就不会加上下翻转的,因为不会碰到头朝下的情况。

搭建模型

设置端到端的训练评估框架

处理完数据集,还是不要着急训练模型,下一步应该做的是建立一个完整的训练+评估框架。
在这个阶段,要选择一个简单又不至于搞砸的模型,比如线性分类器、CNN,可视化损失。获得准确度等衡量模型的标准,用模型进行预测。

forward propagation设置

激活函数

常用的激活函数有relu、leaky-relu、sigmoid、tanh等, CNN优选ReLU,RNN来说推荐: tanh=relu>other.

输出层,多分类任务选用softmax输出,二分类任务选用sigmoid输出,回归任务选用线性输出。

中间隐层,则优先选择relu激活函数(relu激活函数可以有效的解决sigmoid和tanh出现的梯度弥散问题,多次实验表明它会比其他激活函数以更快的速度收敛)。

dropout

分类问题用dropout ,只需要最后一层softmax 前用基本就可以了,能够防止过拟合,可能对accuracy提高不大,但是dropout 前面的那层如果是之后要使用的feature的话,性能会大大提升。

RNN dropout一般在循环层以后加。一层循环层,一个dropout层,如此叠加,或者1~2层循环层,加一个dropout层,之后是输出层。

back propagation设置

学习率 learning rate

learning rate 最重要,推荐了解 cosine learning rate 和 cyclic learning rate。
在确定初始学习率的时候,从一个很小的值(例如 1e-7)开始,然后每一步指数增大学习率(例如扩大1.05 倍)进行训练。训练几百步应该能观察到损失函数随训练步数呈对勾形,选择损失下降最快那一段的学习率即可。

优化算法

首选Adams。根据经验,Adam对超参数更加宽容,包括不良的学习率。

Adam和L2正则结合可能会有很好的效果。

在设定基线的早期阶段,使用学习率为1e-4的Adam 。

避免出现NaN的几个方法

RNN一定要设置 gradient clipping,如果不这样做,就会导致训练一段时间以后 loss 突然变成 NaN。
对于语言模型或者机器翻译, tying input & output embedding(就是词向量层和输出 softmax 前的矩阵共享参数,在语言模型或机器翻译中常用)时学习率需要设置得非常小,不然容易 Nan。

利用好过拟合。

首先我们得有一个足够大的模型,它可以过拟合,减少训练集上的损失,然后适当地调整它,放弃一些训练集损失,改善在验证集上的损失。

其他经验

  1. 要有耐心!有些模型一定要训练很久才会有比较好的结果,尽量不要在一开始觉得收敛不好就停了模型乱改参数。
  2. 能用经典模型就用经典模型,绝大多数情况自己设计的参数都不如教程和框架的默认参数好。除非对问题有独到的间接,不要自己随便设计新组件。
  3. 要学会利用tensorboard! 可以帮助监视网络状态,调整网络参数。比如在学习率下降的一瞬间,通过tensorboard就会发现,网络会有个巨大的性能提升,同样的fine-tuning也要根据模型的性能设置合适的学习率,比如一个训练的已经非常好的模型你上来就1e-3的学习率,那之前就白训练了,就是说网络性能越好,学习率要越小。
  4. 网络层数,参数量什么的都不是大问题,在性能不丢的情况下,减到最小
  5. 一定要重视调参数的论文/实验报告,要认识到AI的理论基础,特别还缺乏严密的数学证明这个事实,更类似于实验科学。看论文时务必注意超参数设置等细节。比如google著名的BERT语言模型激活函数用的是GELU,而不是transformer元论文中的ReLU。
  6. 随时保存模型和代码。每次运行之前都可以备份以下运行时调用的代码文件,以便以后查看修改。随时存档模型,要有validation 。把每个epoch和其对应的validation 结果存下来,可以分析出开始overfitting的时间点,方便下次加载fine-tuning。

技巧集锦

Must Know Tips/Tricks in Deep Neural Networks,trick 合集 2。
33条神经网络训练秘技,trick 合集 3。
26秒单GPU训练CIFAR10,工程实践。
Batch Normalization,
Searching for Activation Functions,swish 激活函数。
NLP领域推荐:
Regularizing and Optimizing LSTM Language Models(LSTM 的训练技巧)
Massive Exploration of Neural Machine Translation Architectures(NMT 里各个超参的影响)
Training Tips for the Transformer Model(训练 Transformer 时会发生的各种现象)
RoBERTa: A Robustly Optimized BERT Pretraining Approach(BERT 预训练技巧)

你可能感兴趣的:(Deep,Learning)