5 Star 13 Fork 7

liuyaox / roadmap_nlp

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
25_Engineering_and_Tricks.md 13.63 KB
一键复制 编辑 原始数据 按行查看 历史
liuyaox 提交于 2020-12-15 16:40 . add lr scheduling

25. Engineering and Tricks

25.1 Overview

Article

25.2 Parameter Tuning

Article

  • 【Great】别再喊我调参侠!夕小瑶“科学炼丹”手册了解一下 - 2020

  • 【Great】听说你不会调参?以TextCNN为例的优化经验Tricks汇总 - 2019

    YAO:OK

    • 调优基本方法:用模型在Test上做Badcase分析以发现共性原因。一般从2个角度来解决,一是特征,二是模型结构。对于特征,要做一些特征分析,以找到对某些类别有区分度的特征。要考虑特征与特征之间的结合,如何判断与测试集结果是否相关。

    • Badcase原因:一般有4种,分别是标注错误、数据分布不平衡、缺乏先验知识、过于依赖A特征

    • 原因归类和排序:按照Badcase原因进行归类,并按频次从高到低排列,也是需要解决问题的优先级。假设依次是:

      • 训练集与测试集部分特征提取方式不一致(前者是离线使用Python,后者在线上使用Java,占比40%)
      • 结果过于依赖A特征(但A特征本身的准确率只有88%左右,导致模型有瓶颈,占比30%)
      • 泛化能力差('我要看黄渤的电影'预测正确,'我想看周星驰的电影'预测错误,占比20%)
      • 缺乏先验知识(比如青花瓷更容易出现在音乐中,而非baike中,但训练数据中并没有特征可体现这一先验知识,占比10%)
    • 特征提取方式不一致:统一训练集和测试集的代码,共用一套,并且使用的数据源也要一样,提升了0.4%

    • 过于依赖A特征:基本思想是减少A特征,dropout和数据预处理时都可以

      • 在模型结构的FC后增加dropout(keep_rate=0.7),**随机扔掉30%**的所有特征(包括A特征),让训练结果与A特征不强相关,提升0.11%
      • 在数据预处理时,随机扔掉10%的A特征(数据增广时设置一概率值,若<0.1则不输出A特征,否则输出),相比dropout,此处只扔掉了A特征,更有针对性,提升了0.29%
    • 泛化能力差:针对部分文本,增加槽位抽取,比如把'黄渤'和'周星驰'都映射为artist,则两句话都变成了'我要看artist的电影'和'我想看artist的电影',则就不存在泛化能力问题了,当然前提是槽位抽取的准确率要过关!

    • 缺乏先验知识:引入200万外部词表,同时计算'青花瓷'在整体语料中出现在其他类别的频率来部分解决,提升了0.5%

    • 模型优先实操记录:

      • Baseline: 默认结构和参数的TextCNN,test_acc=85.14%
      • embed_dim: 128-->64,希望了解不同dim对结果的影响,diff=-0.17%
      • dropout: 在FC后添加一个dropout(0.7),diff=0.11%;改为dropout(0.5),diff=-0.04%,说明不宜扔掉太多特征
      • 预处理: 随机扔掉10%的A特征,diff=0.29%;改为随机扔掉20%,diff=0.28%,并不优于10%,故选择10%
      • 训练集和测试集统一:在预处理基础上,统一两者特征抽取的代码和数据源,diff=0.64%
      • 增加特征:在统一基础上,进一步分析B特征对Badcase有很好的区分度,将B引入训练,diff=1.14%
  • step-by-step: 夕小瑶版神经网络调参指南 上篇 - 2018

    YAO: GREAT GREAT GREAT GREAT GREAT GREAT TO BE CONTINUED …… 做NER项目时再阅读

    • 调参前请务必

      • 做好可视化:可视化每个Step(Batch)的loss和metrics(如准确率或f1-score),推荐使用tensorboard;建议既输出到屏幕也写入文件,推荐使用logging
      • 关闭正则化:如L2, Dropout等,它们很可能会极大影响loss曲线,主要在初始调参前
    • learning_rate & num_steps

    • batch_size & momentum

    • learning_rate衰减策略

  • 有哪些deep learning(rnn、cnn)调参的经验 - 2019

    YAO: HEREHEREHEREHEREHEREHEREHEREHEREHERE

    • 参数初始化:

    • 数据预处理:

    • 训练技巧之梯度:

  • 你在训练RNN的时候有哪些特殊的trick? - 2017

    YAO: HEREHEREHEREHEREHEREHEREHEREHEREHERE

  • 神经网络训练trick - 2019

  • 深度学习中训练参数的调节技巧 - 2018

  • 深度学习网络调参技巧 - 2017

  • 调参是否能对深度学习模型的性能有极大提升? - 2019

  • 是否有办法提高深度学习的调参效率? - 2019

  • Practical guide to hyperparameters search for deep learning models - 2018

    超参数搜索不够高效?这几大策略了解一下

  • Complete Machine Learning Guide to Parameter Tuning in Gradient Boosting (GBM) in Python - 2016

  • 你必须知道的六个深度炼丹好习惯 - 2019

  • 33 个神经网络「炼丹」技巧 - 2019

Library

25.3 Learning Rate

最重要的超参,没有之一

Article

25.4 Finetuning

关键因素两个:新数据集大小、新数据集和原数据集的相似程度。有四个场景:

  • 小 + 相似:因为小,finetune可能会过拟合;因为相似,它们高层特征相似,可以当作特征提取器:使用整个预训练网络,用提取的高层特征训练线性分类器

  • 小 + 不相似:因为小,最好不要finetune;因为不类似,最好也不使用高层特征。可以当作特征提取器:提取前面几层的通用特征来训练简单分类器

  • 大 + 相似:因为足够大,可以finetune整个网络,或后面多层

  • 大 + 不相似:因为足够大,可以重新训练,但是实践中finetune还是有益的,可以finetine整个网络。但可能会较大偏离Base Model,如果想尽量维持Base Model的前提下,只是提高一些召回能力,用于finetuning的数据量不宜太大???

  • 总结:新数据集小,当作特征提取器,相似时使用高层特征,不相似时使用低层特征;新数据集大,则都可以finetune整个网络或多层,若不相似,也可以从零重新训练模型

Article

  • A Comprehensive guide to Fine-tuning Deep Learning Models in Keras -2016

25.5 GPU & Hardware

Article

Practice

25.6 Pseudo Labeling

训练集训练好的模型应用于测试集后的结果(即伪标签),与训练集混合在一起后重新训练模型。?

一般模型能忍受10%的噪音,所以不要把所有测试集与训练集混合,建议保持比例在10:1左右。?

Article

25.x Others

Article

Python
1
https://gitee.com/liuyaox/roadmap_nlp.git
git@gitee.com:liuyaox/roadmap_nlp.git
liuyaox
roadmap_nlp
roadmap_nlp
master

搜索帮助