作者:Solaris
链接:
https://www.zhihu.com/question/347847220/answer/28410032790
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
坐高铁无聊,读到这个问题,也来贡献一些我的经验吧,主要围绕深度学习+推荐,大模型这些方向哈。
实现难度档次一:
1. 补Dropout,以及调整Drop Rate,不要小看这个地方,很多时候合适位置加入一个好的Dropout可以涨不少点。
2. 在一切有Softmax的地方都加上温度,注意力,交叉熵多分类,对比学习,都可以加。因为温度可以控制Sofmax之前的logits 分布,从而提供优良的梯度。详见: 为何自注意力中使用点积计算相似度
2. 各种Normalization,深度学习终究还是表征学习,表征分布不对齐的话,层数深了,或者多个模块的组合都容易出问题。LLM中讨论的Pre-norm, Post-norm,搜推广系统里引入多模态表征,都是在围绕这个点思考。
3. Bsz + Learning Rate: 这两者是需要同步调整,Batch Size越大就相当于一个人下山的方向准确性,LR就相当于是下山的速度,所以当然是在方向准的时候应该下得更快。 不过也有玄学操作:微调预训练模型的时候把学习率拉到极低(e-7)然后多训几轮。
4. 学习率策略: Warmup + Cosine Decay一定得有。
6. 正则化: 简单的正则化如weight decay是可以起到很大帮助的。
7. Label smoothing和 Hinge Loss: 这里两位都是我的最爱,强烈推荐使用。去年底OAI搞了一个weak-to-strong generation,他们的基础实现版本我认为就是一种进阶Label Smoothing,也很有用!
8. 数据采样: 其实很多做排序相关的paper都喜欢耍一些数据采样上的花招,往往调整一下负样本的采样策略,比如提升负样本数量,保留难负例,就可以得到非常显著的提升。 LLM的训练以后说不定也会有这么一天。
9. 能用哈达马积来融合特征,就不要用拼接或者相加,因为哈达马积可以引入更多非线性,并且还可以理解成一种滤波。
以上的实现PyTorch基本都有提供原生api,一两行代码就可以搞定。
实现难度档次二:
1. 优化表征分布。 这个其实是一个思想,实际操作下来triplet loss,对比学习都行。目标就是让模型内部有一个高质量的表征分布,深度学习本质还是表示学习,同等数据和算力下表征更好的模型总是有更好的鲁棒性,泛化性。不同模型都需要根据它们的特点去优化关键位置的表征。
2. 花式加权平均: 这块我看其它答主也有提,我也深有同感,特别感叹 SE Layer这种东西确实是太好用了,不仅仅是cv里有用。
3. 花式多头xxx: 多头注意力的成功大家也是都看在眼里嘛,现在大家也知道算力大就是王道,所以搞个多头xxx自然是稳赚不赔。
4. 各种Gating操作: 这一点主要还是受RWKV的启发,其中的token shift操作让人印象深刻。 事实Sigmoid只要不加在神经网络的critical path上,而是作为门控出现,对于建模复杂依赖还是很有用的。
总结:
做深度学习核心的tricks其实都围绕这两样:表征分布+梯度流通,时刻牢记这两个要素,祝大家炼丹顺利!
作者:黄哲威 hzwer
链接:
https://www.zhihu.com/question/347847220/answer/26536819499
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
算力碾压
1.1 改大 batchsize,假装迭代次数对齐
1.2 多训 epoch,但是不明说,把训练长度换成以迭代次数报告,反之亦然,反正不能让人一眼看出来不对齐
1.3 epoch 数不变,但是一个样本用好几回,从而偷偷多过数据
1.4 把模型里下采样次数减小,模型计算量大了好几倍,但是只和别人比参数量
1.5 不在意计算量和参数量的领域狂堆算力
1.6 把算力很大的组件描述一笔带过,效率分析也只分析其它组件
1.7 用重参数化把模型搞的很大,训练很慢但是反正比推理开销
1.8 EMA / 多模型融合涨点,有条件还能自蒸馏
1.9 选个超级小的训练集,这样只要专心解决过拟合
超参数
2.1 通过把 cosine 学习率变化调成固定学习率,或者反过来,来得到想要的实验结果(cosine 降低学习率的最后那一部分一般会让模型性能快速上涨,提前下降学习率就会显得训练高效)
2.2 稍微调大一点学习率,把 baseline 的学习率调小
2.3 把各种超参数都隐藏在代码里面成为 magic number
2.4 优化器都有好多超参数可以调!
2.5 挑随机种子
小修小改
3.1 把模型的 relu 都换成 swish 或者 leaky relu / prelu
3.2 偷偷到处加 SE layer,反正基本上会涨点;加便宜的 attention 连接
3.3 把诸如 pooling, resize 不带参数的组件都换成带可学参数的,多学一点是一点
3.4 模组之间乱拉跳边,多 concat 一些特征反正不亏
3.5 在没 BN 的地方加 BN,在有 BN 的地方把 BN 去掉,还有 GN / IN / LN / WN 等等可以换
3.6 针对训练集和测试集的差异对训练集增广,改训练集分布
增量设计
4.1 加奇奇怪怪的 GAN Loss,一致性 Loss,反正有没有用很难说还能贴很多公式
4.2 把别人在论文里一句话带过的技术详细展开,加上一些魔法公式变换凑半页论文
4.3 要设计组件 x 加到模型上时,造一个可学习的 beta 参数,初始值为 0,改成把 beta * x 加到模型上,最差情况 beta=0 保持不变
4.4 扩展上一条,设计一堆组件,以可学参数的方式加起来
4.5 继续扩展,加一个 NAS 进去
4.6 从别的模型拿一些预训练参数,这样模型起点变高,上限也会变高因为相当于加数据和标注
4.7 搞一些非常复杂的课程学习,花式蒸馏(特征层,特征层的特征,跨模态蒸),别人做不 work 就说需要调参
4.8 不管有没有用,套上强化学习框架,让模型更多拥有自主能力
测试方法
5.1 测十个指标,报告有进步的三个
5.2 做十个数据集的实验,把没效果的五个扔掉
5.3 故意让测试方法和别人的训练场景不对齐,做低 baseline,比如把 RGB 通道搞反让别人挂掉
5.4 发明新的创新评价指标;魔改指标,比如 Y 通道测 PSNR,但是和别人 RGB 测的一起比
5.5 找 trivial 但是别人没考虑的场景,做出极其大的提升
5.6 用大模型比别人小模型,不报告别人的大模型;用针对某种指标训练的模型比别人没训的
5.7 在不同的硬件上测速,放在一起报告
5.8 最近语言大模型的,偷偷在测试 prompt 里加提示,few-shot 和 zero-shot 比
5.9 变相在测试集过拟合,比如泄露数据,泄露随机种子;把测试样本放到上游预训练里
5.10 测试数据集加真实场景,OOD 样本,baseline 掉点很多,这时候加点增广或者 dropout 把点补回来,但是把涨点贡献算到其它地方
5.11 私有测试集,人工评判,改进要多显著都能做出来
5.12 客观比不过比主观,主观比不过 cherry pick
终极方法
6.1 抄一个别人的方法,但是把名字换一遍
6.2 报高性能,问开源就是只有 README
6.3 直接开始写论文,不用做实验,反正恰好比 sota 高那么一点点
dummy class
做多元分类的时候,加1-3个假类别。比如做3分类,output弄成4分类,那个虚拟出来的假类别(dummy class)不需要训练数据什么,input层面不用管他,只需要output里面写成4分类这么简单。结果会比单纯3分类同样条件下好几个点。
作者:skzzskzz
链接:https://www.zhihu.com/question/347847220/answer/2895963746
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1. self-gating基本加上都涨点
变体有context gating和SE模块等
核心思想都是用自己gate自己
基本形式是 y = sigmoid(wx)x
2. 各种重建,先把输入corrupt一下,然后用autoencoder重建一下,基本都能让feature更robust,何凯明的MAE也是如此。
3. 各种dropout,是个地方都可以试着加点dropout,embedding可以加dropout,attention可以加,ffn可以加,mlp可以加,输入上也可以直接加,相当于某种corrupt
4. mixup,也是个神级idea,输入上a类+b类混合一下,然后label也变成a+b混合,基本也是无脑增强,必定涨点
5. 对比学习大神器,核心就看如何构造正样本和负样本。有个惊艳的idea,同一个输入foward两次,因为dropout不同,就可以当正样本,也是无脑涨点
作者:momo
链接:https://www.zhihu.com/question/347847220/answer/3351403565
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。