- 先overfit 再trade off,首先保证你的模型capacity能够过拟合,再尝试减小模型,各种正则化方法
- 学习率 ,最重要的参数,一般nlp bert类模型在1e-5级别附近,warmup,衰减;cv类模型在1e-3级别附近,衰减;学习率的设置,一般可以先从1e-3、3e-4、1e-4开始,用类似二分的方法迭代搜索;
- 学习率衰减很有用,设置一个指数衰减的scheduler,衰减率0.99,是一个不错的选择,当然,如果训练集很大,也可以增大衰减率
- batch size 在表征学习,对比学习领域一般越大越好,显存不够上累计梯度,否则模型可能不收敛,其他领域看情况;当然,batch有的时候并非越大越好,虽然batch越大训练越快,但有的时候batch太大网络性能会降低,有的时候减小batch有奇效
- dropout,现在大部分任务都需要使用预训练模型,要注意模型内部dropout ratio是一个很重要的参数,使用默认值不一定最优,有时候dropout reset到0有奇效
- 初始化方法,linear / cnn一般选用kaiming uniform 或者normalize,embedding 一般选择截断 normalize;如果训练一开始不容易收敛或陷入局部最优,可以试试更换网络初始化方法,虽然pytorch默认会进行初始化,但试试别的初始化方法也是一种不错的选择
- 序列输入上LN,非序列上BN
- 基于banckbone 构建层次化的neck 一般都比直接使用最后一层输出要好,reduce function 一般attention 优于简单pooling,多任务需要构建不同的qkv
- 数据增强要结合任务本身来设计
- 随机数种子设定好,否则很多对比实验结论不一定准确;如果数据集不是很大,而且性能离基线系统差距不大,可以试试指定批量跑一批随机种子,然后早停,选loss下降的随机种子进行深度训练,有可能就能找到一个有所突破的结果
- cross validation方式要结合任务设计,数据标签设计,其中时序数据要避免未来信息泄漏
- 不知道用啥优化器,就用Adam,对绝大多数问题都有不错的效果
- 为网络增加各种norm:batchnorm、weightnorm、layernorm、groupnorm等等,不一定有用,但也是可能的优化方向,最重要的是代码改动不大
- 对于激活函数,relu也在大多数情况下表现不错,当然也可以试试leakyrelu和prelu
