-
Ten Techniques Learned From fast.ai - 2018
Chinese:称霸Kaggle的十大深度学习技巧
-
37 Reasons why your Neural Network is not working - 2017
Chinese: 训练的神经网络不工作?一文带你跨过这37个坑
-
YAO:OK 归一化推荐一看,其他just soso
-
零均值化:可避免参数梯度过大
-
归一化:可使不同维度的数据具有大致相同的分布规模
原因:S=W1*x1+W2*x2+b => dS/dW1=x1,dS/dW2=x2参与形成参数的梯度 => x1与x2本身差异巨大会导致梯度差异巨大,影响梯度下降的效果和速度
进一步讲,之所以会影响,是因为在实际操作中为了方便,所有维度共用同一套更新策略,即设置相同的步长,随着迭代进行,步长的缩减也是同步的,这就要求不同维度数据的分布规模大致相同。BTW,理论上讲,不同维度需要设置不同的迭代方案,则不受以上影响了。
-
初始化:使用非常接近零的随机数初始化参数,以打破网络的对称性
-
模型集成
- 常见的,省略……
- 相同模型 + 相同超参 + 不同参数初始化: 缺点是模型多样性仅仅取决于初始化
- 单个模型的不同Checkpoint
-
-
Ten Techniques Learned From fast.ai - 2018
Chinese: 10大称霸Kaggle的深度学习技巧
-
【Great】半天2k赞火爆推特!李飞飞高徒发布33条神经网络训练秘技 - 2019
YAO: HERE HERE HERE HERE HERE HERE
-
Practical Advice for Building Deep Neural Networks
Chinese: 构建神经网络的一些实战经验和建议
-
【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
-
参数初始化:
-
数据预处理:
-
训练技巧之梯度:
-
-
YAO: HEREHEREHEREHEREHEREHEREHEREHEREHERE
-
Practical guide to hyperparameters search for deep learning models - 2018
超参数搜索不够高效?这几大策略了解一下
-
Complete Machine Learning Guide to Parameter Tuning in Gradient Boosting (GBM) in Python - 2016
-
hyperopt: 机器学习调参神器
Article: Optimizing hyperparams with hyperopt
Article: python调参神器hyperopt
最重要的超参,没有之一
-
Cyclical Learning Rates for Training Neural Networks - USNavy2017
CLR: Cyclic Learning Rate
-
Guide to Pytorch Learning Rate Scheduling - 2020
YAO: 赞!主流scheduling,并且有画图!
-
Using Learning Rate Schedules for Deep Learning Models in Python with Keras - 2016
-
Understanding Learning Rates and How It Improves Performance in Deep Learning - 2018
关键因素两个:新数据集大小、新数据集和原数据集的相似程度。有四个场景:
-
小 + 相似:因为小,finetune可能会过拟合;因为相似,它们高层特征相似,可以当作特征提取器:使用整个预训练网络,用提取的高层特征训练线性分类器
-
小 + 不相似:因为小,最好不要finetune;因为不类似,最好也不使用高层特征。可以当作特征提取器:提取前面几层的通用特征来训练简单分类器
-
大 + 相似:因为足够大,可以finetune整个网络,或后面多层
-
大 + 不相似:因为足够大,可以重新训练,但是实践中finetune还是有益的,可以finetine整个网络。但可能会较大偏离Base Model,如果想尽量维持Base Model的前提下,只是提高一些召回能力,用于finetuning的数据量不宜太大???
-
总结:新数据集小,当作特征提取器,相似时使用高层特征,不相似时使用低层特征;新数据集大,则都可以finetune整个网络或多层,若不相似,也可以从零重新训练模型
-
深度学习的GPU:深度学习中使用GPU的经验和建议 - 2018
YAO: HERE HERE HERE HERE HERE HERE
-
Code: https://github.com/tanglang96/DataLoaders_DALI (PyTorch)
-
Speed Up your Algorithms Part 1 — PyTorch - 2018
Chinese: PyTorch 算法加速指南
Github: https://github.com/PuneetGrov3r/MediumPosts/tree/master/SpeedUpYourAlgorithms
训练集训练好的模型应用于测试集后的结果(即伪标签),与训练集混合在一起后重新训练模型。?
一般模型能忍受10%的噪音,所以不要把所有测试集与训练集混合,建议保持比例在10:1左右。?