- 深度学习调参指南
可调参数:Loss function、Learning rate、Batch size、Epoch number、Optimizer、Activation function、Weights initialization、使用Regularization、Validation、使用的GPU个数
Dropout虽然思想很简单,但效果出奇的好,首选0.5。
Batch normalization很好用。
如果在train模型时,loss可以降到非常低,那么模型的学习能力是够的;如果train能达到,validation达不到,则说明模型泛化能力不强。
- 做新模型的时候,最开始不要加激活函数,不要加batchnorm,不要加dropout,先就纯模型。然后再一步一步的实验,不要过于信赖经典的模型结构(除非它是预训练的),比如加了dropout一定会有效果,或者加了batchnorm一定会有提升所以先加上,首先你要确定你的模型处于什么阶段,到底是欠拟合还是过拟合,然后再确定解决手段。
- 如果是欠拟合,直接模型宽度深度增加,一般2倍递增或者数据集增强,特别在nlp领域可以用大量数据增强方式-比如,同义词替换,随机抛弃词语,句子改写,句子转译等。这些方法都试过可以,考虑增加relu,mish等作为某些层的激活函数不过在此做之前建议最好把每一层的参数打印出来,看是否符合正态分布,一般来说relu可能有奇效,but最后一层千万不要relu,因为relu可能把很多数值都干为0,所以使用relu需要慎重,如果效果严重下降,建议看看relu的参数分布。
- 如果过拟合,首先是dropout,然后batchnorm,过拟合越严重dropout+bn加的地方就越多,有些直接对embedding层加,有奇效。
- 对于数据量巨大的推荐系统的模型来说一个epoch足矣,再多就会过拟合。
- 做召回的同学,不要迷信专家们说的embedding做l2 norm,笔者就踩过这个坑,直接对embedding l2结果效果贼垃圾,查了半天,直接去掉l2,效果正常了。
- 做推荐的同学,一般特征不要直接全怼进去,最好是一个一个的加特征进行效果测试,因为有些特征可能导致模型过拟合,最好还是一个一个加
- 对于稀疏特征多的模型采用adagrad,稠密特征多的模型用adam
- 召回负采样负样本效果肯定高于曝光未点击负样本
- 粗排用精排后topk做负样本,基本是有效果的
- 对于负样本太多的数据集,测试集的loss降并不代表没有过拟合,试试看看f1或者auc有没有降低,因为有可能负样本学的爆好,所以loss降低,但是正样本凉了
- 对于长文本来说longformer的效果高于各种bert变体
- 对于图像和nlp,效果一直不提高,可以尝试自己标注一些模型经常分错的case,然后加入训练会有奇效。
- 对于推荐序列来说pooling和attention的效果差别真的不大,基本没有diff
- 对于推荐来说senet和lhuc,是深度学习领域为数不多的可以观察特征重要性的模型结构
- 一般不要尝试用强化学习优化,因为真的很费力气,而且效果很一般
- bert不要太过于相信cls的embedding能力,还是要看看它有没有做过相关任务,特别对于文本匹配场景
- 序列特征才用layernorm,正常用batchnorm。
- 推荐召回用softmax效果比sigmoid更好,意思就是召回更适合对比学习那种listwise学习方式。
- 参数初始化用xavier和truncated_normal可以加速收敛,但是,同样是tensorflow和pytorch用同样的初始化,pytorch可能存在多跑一段时间才开始收敛的情况,所以,如果出现loss不下降的情况,大哥请耐心一点,多跑几个epoch,当然你也可以用tensorflow实现一把,看看效果是不是一样
- 对于推荐系统的老汤模型,建议热启动,但是热启动大概率也是追平,小概率找到了之前没有找到的关键特征,可以超越,其他操作笔者的实验都是负向,除了热启动,而且就算热启动,如果只启动embedding层也是不行的,必须embedding+DNN全部热启动,然后仅对倒数第一层作扰动,或者类似wide&deep,新加一个结构对最后一层个性化扰动,为啥最后一层,因为,你扰动太多又负向了。
- 对于nlp任务,采用embedding扰动的方式有奇效,比如Fast Gradient Method(FGM)和Projected Gradient Descent(PGD)
- 推荐多目标任务可以考虑采用Gradient Surgery的方式,帕累托就算复杂度又高,效果也没有好很多,不推荐。
- 对于embedding可视化的问题最好是先用pca降维,然后采用t-sne进行可视化,但是,对于类别很多的情况,个人建议还是肉眼抽样观察,t-sne只能对于类目不多的情况的embedding进行可视化。
- 显存不够用的时候,gradient checkpointing可以起到降低显存的效果
- 对于机器阅读任务,在bert层后加bi-attention或者coattention有奇效。
- 在推荐系统中,神经网络模型对于连续数值的处理是不如xgb的,所以,最好对连续数值分箱,一般等频分箱足矣,但是,个人建议还是观察数据分布,把outlier单独一箱,如果还想完美一点可以,用IV值看看分箱的优劣。
上次更新: 2025/04/02, 12:03:38