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