实践指南: hzwer大佬的模型优化与迭代策略

教育   2024-12-19 22:00   江苏  

知乎:黄哲威 hzwer (已授权)
链接:https://www.zhihu.com/question/31785984/answer/53910308820
编辑:深度学习自然语言处理


LLM所有细分领域群、投稿群从这里进入!

搭积木心得

从头造轮子已经不适合现在的深度学习生产方式了,很多方案都是把很多项目搭在一起

现在有一个定义好的任务和一个简单的基建可以跑出效果,不管是祖传的还是开源社区魔改来的,现在嫌结构不够先进,怎么换一块积木?

以图进图出任务为例,上网一搜光是结构有编解码 CNN,各种魔改 UNet,UNet + transformer,随便哪个还有一堆参数,怎么选?

找个大佬一问,指了几篇 ICLR 新论文,说这个结构听说上限高你试试,一搜都没代码

刷谷歌学术或者知乎,好像有非常多的新技术能用,连优化器好像都能换个新的

钻个牛角尖,两周就过去了,周会又要装死了。设计一整套新方案,不知道怎么有效验证,魔改几个月后变成民科。。。

一些建议

  1. 有 SoTA 前先看久经考验的工作学术工作
  • 引用 < 100,或者 Github star < 1000 的,或者 issue 中没有任何人说能跑出好效果的,建议不看,先等社区验证一波
  • 有些著名复现作者,比如 lucidrains 就相对靠谱一些
  1. 确认评测指标
    评测如果有问题,可能让整个迭代方向走偏,要先确认好。通常要看到随着模型训练,指标是在提升的,最好能再用人类的主观评价检验一下
  2. 具体结构选型方法
    按照 1 的标准,可能找到了五个新模型,现在需要做实验来找到比较合适的
    有几个步骤
  • 先根据手头的 baseline 实验,估计模型的期望算力开销。选小模型训的数据多,大模型上限高,会有个权衡。这时可以想一个能接受的实验迭代开销,比如说 8 卡 15 个小时,在这个预算下,起几个大小不同的 baseline 模型实验,找到合适的模型计算开销
  • 对于每个新模型,先确定输入分辨率不要和它处理的原始任务差别太大:比如说有的 transformer 可能原来是处理特征图的,patchsize 很小,因此需要加一些卷积胶水层接起来。
  • 确认输出的值域符合期望,图像可能有 [0, 1],[-1, 1] 这种限制
  • 超参数怎么选?学习率选 1e-4,batchsize 都选个一致的。开始训练后,如果某个模型崩了,就把学习率折半重训
  • 训练结果特别离谱的可以看一看有没有明显 bug
    如果十天半月以后,改了任务定义 / 数据,要不要重新选型?
    —— 建议不要,不要期待换一个新结构 / 方法能直接解决手头的问题,偶尔有时间试试就行了,重要的是建立对当前问题的理解
    模型有很多奇怪的超参数,要不要多试试再选型?
    —— 不要,如果 A 模型的默认配置效果比 B 模型好,应该继续研究的大概率是 A 模型而不是 B
  1. 迭代改进
  • 如果你的方法需要改动超过二十行代码,得到某个别人论文中的新方法,你按照描述实现以后,99% 的情况是有 bug 比原来还差,或者看不到明显差别
  • 那怎么改良方法呢?
  • 渐进式改良,考虑朝向新方法的最小改进,确保每次改进都是至少无害的,一步步改过去
  • 如果有 insight,可以做激进的实验来确认,但不要把手头方法扔了
  • 坚持在 baseline 上持续迭代改进
  1. 保持简单
  • 如果删掉一个组件或者简化策略,能得到更好或差不多的结果,可以先简化
  • 因为系统复杂度太高容易出 bug,完全把控细节也会越来越困难
  • 简化以后才更可能找到方法瓶颈
  1. 不要从理论工作中为实际工作找具体方法
  • 我可以很负责任地说,对于一个具体任务,99% 的情况下你不用动 Adam,所以看到那些卖新优化器的不要凑热闹
  • 如果一个理论工作同时非常好用,相信我它不需要咱小白来发掘
  • 可以看 paper 找灵感,但不要期待捡到武功秘籍

暂时想到这些,欢迎评论区讨论



备注:昵称-学校/公司-方向/会议(eg.ACL),进入技术/投稿群


id:DLNLPer,记得备注呦

深度学习自然语言处理
一个热衷于深度学习与NLP前沿技术的平台,期待在知识的殿堂与你相遇~
 最新文章