心法利器
本栏目主要和大家一起讨论近期自己学习的心得和体会,与大家一起成长。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。
近期,我再次总结了我的历史文章,累积起来有50w字,百余篇文章了,有兴趣可以拿来看看,获取方式:七夕清流,百余篇累计50w字文章合集发布。
往期回顾
心法利器[42] | 润物细无声-残差网络
心法利器[43] | 算法工程师的晋升思考
心法利器[44] | 样本不均衡之我见
心法利器[45] | 模型需要的信息提供够了吗
心法利器[46] | 模型部署的主要技术
这个标题,应该是很多人问过的问题了。
听说BERT非常厉害,各个领域都拿到过SOTA,虽然已经发布好几年了,但是现在依旧是标杆级别的存在,可是,现在我用了我的数据,BERT不会好,到底是怎么回事?
往扎心的说,其实就是一味地万能钥匙不灵了,所以无从下手。
非常推荐大家好好看看我前面几篇有关效果调优、问题分析的文章,文章不长,不过花了很大心血对这些自己的经验trick进行了系统化,可以看看:
心法利器[37] | bad case治疗术:认知篇
心法利器[38] | bad case治疗术:现状篇
心法利器[39] | bad case治疗术:分析篇
心法利器[40] | bad case治疗术:解决篇
心法利器[43] | 算法工程师的晋升思考
心法利器[44] | 样本不均衡之我见
心法利器[45] | 模型需要的信息提供够了吗
这节只列举问题,思路放下一章。这里是给大家去定位问题的思路,通过这些渠道能发现一些问题,而不是对问题束手无策了。
NLP的一大好处就是数据本身是可解释可推理,人本身也可以推测的,而分析数据,往往可以知道一些非常直接的问题。
首先需要看的是测试集,这个相当于是考试的答卷,做错了那些题一目了然,通过这些数据我们能知道模型做错了那些事,强如BERT,也是可能出错的,常见的错误是这些:
标注质量。在现实很多场景,其实是很容易出现标注错误的,很多NLP的问题准确率天花板都停留在90左右,大都是因为标注质量问题,说白了就是标错,这些标错的数据很可能是模型预测对了标注错误了导致的正确,这就导致指标不好看,“效果不好了”。
标注的分布。尤其是分类问题,正负样本是否符合预期,各个类目的数据是否达到了统计意义,实际占比和与其占比是否一致等。
数据是否可靠。额,可能比较少见,有的人做的测试集和训练集压根就不是一回事,值得关心。
当然了,bad case分析这块我也聊了很多,多分析能发现其中的端倪,知道模型需要什么,该怎么处理,我再放一遍在这里,希望能好好阅读。
心法利器[37] | bad case治疗术:认知篇
心法利器[38] | bad case治疗术:现状篇
心法利器[39] | bad case治疗术:分析篇
心法利器[40] | bad case治疗术:解决篇
说完测试集,就到训练集,训练集内同样可能有问题,而有些问题其实可通过训练集的问题来体现:
标注质量。上面聊过不重复了。
数据数量。越是复杂的模型,对数据的渴求度越大,尤其是场景比较偏的,需要更多数据集才行,少数据不足以让模型对你的数据有足够的了解。
样本分布情况。参考数据不均衡的文章:
领域性。这里单独谈,很多领域专业性强,是需要更多数据支撑的,例如医学,另外是名词性比较强的,对数据有特殊的依赖性。
其实数据层面的问题,很可能是导致BERT效果不好的根本原因,他的背后其实是场景问题,场景的数据可没有实验室的那么理想,各有各的特色。在实验室中BERT的效果确实会比常规的textcnn、biltm-crf、ESIM等小模型效果好,但是在很多现实场景优势没那么明显,甚至会不如,大家可以持乐观态度,但请别成为信仰。
BERT的训练其实挺多讲究的,这里的实验效果要保证对参数的有一定的要求,所以大家要多去观察训练过程暴露的问题,训练过程其实就是要观测loss变化、验证集效果等的问题,放置没学到、学飘了之类的问题。
检查有没有bug,代码整体流程是否有问题,无论是训练还是推理,这个就得自己检查和使用了,这个没法解,只能自己debug,找问题然后解决。
一般用BERT的常规操作是PTM-finetuning,很多人会按照自己的想法去加插件,预期是效果会更好,但其实并没有,这点我在知乎里有聊过(https://www.zhihu.com/question/477075127/answer/2042059620),不要盲目的有这个“信仰”,有一个东西叫做“过拟合”。
上面聊了怎么发现问题,排查,现在来聊各个问题的解决思路吧。
对于数据问题,当然就是要从数据层面吧这些问题给剔除掉,一方面尽可能削减错误数据的,一方面是根据模型的需要提供必要的数据。
测试集是考试题,本质是考验模型能力的,所以这里核心是要保质保量,质在于题目可靠,真的能考验出模型的真实能力,量在于统计意义,现在的指标都是用的统计指标,所以数据本身必须具有统计意义,例如某个类只有2条数据,两条全错能证明有问题吗,其实也不太好说。
至于训练集,首先要说的是训练集内部的问题,其实还是数据的数量和质量问题:
学习资料和练习题要足够,才能让模型学得会,学得好。
数据分布问题,不能偏科,各个类型的数据最好都能覆盖。
领域性的问题,最好由领域性的数据选择,甚至是用这些数据做MLM的任务来微调。
这里一提提供数据,肯定很多人会提数据增强。增强本质不是增多,不是所有缺数据的问题都是因为数量不足,模型要泛化能力,他的泛化能力来源于数据的泛化,很多时候数据提供的不足那就不会有这么强的泛化,得到的反而是过拟合。类似的思路其实我在这两篇文章里其实都有谈过:
心法利器[44] | 样本不均衡之我见
所以,很多时候你需要的可能是更多地挖掘数据,从日志,从更多渠道去找,这个可能比增强本身要好。
另外值得强调的是,对于名词性比较强的任务,最好不要用BERT了,甚至是模型都不要用,举个例子,现在告诉你“非诚勿扰”、“中国诗词大会”、“脱口秀大会”这些是综艺,你能推断出“哈哈哈哈哈”也是综艺吗,你这不就是难为人家模型了吗,所以此处词典的作用会比模型本身要大,哪怕是为了提升泛化能力要用模型,那也需要和模型结合着来做。这里背后的逻辑可以参考我这篇文章:
心法利器[45] | 模型需要的信息提供够了吗
针对训练问题,其实也就是一个经验的问题了,多弄其实问题就会小很多,大家可以多去看各个论文使用的超参,一般调的差不多基本都不会有的,当然这里也是要避免代码bug。常见需要关心的超参是学习率、初始化规则、epoch等,另外针对BERT,还要考虑各个层是否要trainable。
这个是最考验模型和数据功底的东西了。首先要做基线,一般是考虑折腾这个CLS,而在下游加插件的时候,也要注意不能让BERT模型被学走,注意调整学习率、trainable,同时也可以结合MLM任务来维持模型的稳定,平衡BERT原有的基础知识与实际场景问题的差距。
有两个需要在这里和大家强调的两个核心观点。
第一,BERT不是万能的。首先,NLP下有很多场景,BERT虽然能承载出很多语义信息,但是很多时候不止有语义信息,甚至有的时候不需要语义信息,例如上面提到的名词性场景,而且,在很多时候,其实BERT的优势好像不太明显,在考虑成本啥的性价比其实就不是很高了。那么,降低BERT效用的会有哪些因素呢?
过于专业,信息需求较大的领域,如专业化极强的医学等科学领域,或者是电影电视剧等名词性比较强的任务或者说领域。
数据和问题的特点非常鲜明,例如短文本等,实质上ATT、LSTM、CNN等都有自己适合的领域和问题。
数据量。要喂饱BERT,需要足量的数据,哪怕是finetuning,当然在数据量不足的情况下,啥模型都不好使。
第二,要想知道怎么解决问题,就要深入整体流程去思考,要足够理解现有的资源,数据、模型、方案等等,而不是就着手里的积木硬搭做实验,或者撑死调调参数就完事了。
最近是一直在对自己的一些经验进行系统化整理,发现很多文章的东西也出现了耦合,慢慢把这些思路给整理好后,自己感觉有了一些新的提升,是希望和大家分享吧。而文章本身的输出并非是按照这个思路走,而是从一些大家经常问的点深入来讨论,希望能从我的角度和风格来思考和回答问题。
本期从BERT的失效入手来讨论,让大家对训练BERT这条龙有一些大家可能聊的不多但却很常见的问题有更深入的理解。