这节只列举问题,思路放下一章。这里是给大家去定位问题的思路,通过这些渠道能发现一些问题,而不是对问题束手无策了。
NLP的一大好处就是数据本身是可解释可推理,人本身也可以推测的,而分析数据,往往可以知道一些非常直接的问题。
首先需要看的是测试集,这个相当于是考试的答卷,做错了那些题一目了然,通过这些数据我们能知道模型做错了那些事,强如BERT,也是可能出错的,常见的错误是这些:
说完测试集,就到训练集,训练集内同样可能有问题,而有些问题其实可通过训练集的问题来体现:
其实数据层面的问题,很可能是导致BERT效果不好的根本原因,他的背后其实是场景问题,场景的数据可没有实验室的那么理想,各有各的特色。在实验室中BERT的效果确实会比常规的textcnn、biltm-crf、ESIM等小模型效果好,但是在很多现实场景优势没那么明显,甚至会不如,大家可以持乐观态度,但请别成为信仰。
BERT的训练其实挺多讲究的,这里的实验效果要保证对参数的有一定的要求,所以大家要多去观察训练过程暴露的问题,训练过程其实就是要观测loss变化、验证集效果等的问题,放置没学到、学飘了之类的问题。
检查有没有bug,代码整体流程是否有问题,无论是训练还是推理,这个就得自己检查和使用了,这个没法解,只能自己debug,找问题然后解决。
一般用BERT的常规操作是PTM-finetuning,很多人会按照自己的想法去加插件,预期是效果会更好,但其实并没有,这点我在知乎里有聊过(https://www.zhihu.com/question/477075127/answer/2042059620),不要盲目的有这个“信仰”,有一个东西叫做“过拟合”。
上面聊了怎么发现问题,排查,现在来聊各个问题的解决思路吧。
对于数据问题,当然就是要从数据层面吧这些问题给剔除掉,一方面尽可能削减错误数据的,一方面是根据模型的需要提供必要的数据。
测试集是考试题,本质是考验模型能力的,所以这里核心是要保质保量,质在于题目可靠,真的能考验出模型的真实能力,量在于统计意义,现在的指标都是用的统计指标,所以数据本身必须具有统计意义,例如某个类只有2条数据,两条全错能证明有问题吗,其实也不太好说。
至于训练集,首先要说的是训练集内部的问题,其实还是数据的数量和质量问题:
这里一提提供数据,肯定很多人会提数据增强。增强本质不是增多,不是所有缺数据的问题都是因为数量不足,模型要泛化能力,他的泛化能力来源于数据的泛化,很多时候数据提供的不足那就不会有这么强的泛化,得到的反而是过拟合。类似的思路其实我在这两篇文章里其实都有谈过:
所以,很多时候你需要的可能是更多地挖掘数据,从日志,从更多渠道去找,这个可能比增强本身要好。
另外值得强调的是,对于名词性比较强的任务,最好不要用BERT了,甚至是模型都不要用,举个例子,现在告诉你“非诚勿扰”、“中国诗词大会”、“脱口秀大会”这些是综艺,你能推断出“哈哈哈哈哈”也是综艺吗,你这不就是难为人家模型了吗,所以此处词典的作用会比模型本身要大,哪怕是为了提升泛化能力要用模型,那也需要和模型结合着来做。这里背后的逻辑可以参考我这篇文章:
针对训练问题,其实也就是一个经验的问题了,多弄其实问题就会小很多,大家可以多去看各个论文使用的超参,一般调的差不多基本都不会有的,当然这里也是要避免代码bug。常见需要关心的超参是学习率、初始化规则、epoch等,另外针对BERT,还要考虑各个层是否要trainable。
这个是最考验模型和数据功底的东西了。首先要做基线,一般是考虑折腾这个CLS,而在下游加插件的时候,也要注意不能让BERT模型被学走,注意调整学习率、trainable,同时也可以结合MLM任务来维持模型的稳定,平衡BERT原有的基础知识与实际场景问题的差距。
有两个需要在这里和大家强调的两个核心观点。
第一,BERT不是万能的。首先,NLP下有很多场景,BERT虽然能承载出很多语义信息,但是很多时候不止有语义信息,甚至有的时候不需要语义信息,例如上面提到的名词性场景,而且,在很多时候,其实BERT的优势好像不太明显,在考虑成本啥的性价比其实就不是很高了。那么,降低BERT效用的会有哪些因素呢?
第二,要想知道怎么解决问题,就要深入整体流程去思考,要足够理解现有的资源,数据、模型、方案等等,而不是就着手里的积木硬搭做实验,或者撑死调调参数就完事了。
最近是一直在对自己的一些经验进行系统化整理,发现很多文章的东西也出现了耦合,慢慢把这些思路给整理好后,自己感觉有了一些新的提升,是希望和大家分享吧。而文章本身的输出并非是按照这个思路走,而是从一些大家经常问的点深入来讨论,希望能从我的角度和风格来思考和回答问题。
本期从BERT的失效入手来讨论,让大家对训练BERT这条龙有一些大家可能聊的不多但却很常见的问题有更深入的理解。