心法利器[47] | 为什么我的BERT不行?

心法利器

本栏目主要和大家一起讨论近期自己学习的心得和体会,与大家一起成长。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有

近期,我再次总结了我的历史文章,累积起来有50w字,百余篇文章了,有兴趣可以拿来看看,获取方式:七夕清流,百余篇累计50w字文章合集发布

往期回顾

这个标题,应该是很多人问过的问题了。

听说BERT非常厉害,各个领域都拿到过SOTA,虽然已经发布好几年了,但是现在依旧是标杆级别的存在,可是,现在我用了我的数据,BERT不会好,到底是怎么回事?

往扎心的说,其实就是一味地万能钥匙不灵了,所以无从下手。

非常推荐大家好好看看我前面几篇有关效果调优、问题分析的文章,文章不长,不过花了很大心血对这些自己的经验trick进行了系统化,可以看看:

原因的探索

这节只列举问题,思路放下一章。这里是给大家去定位问题的思路,通过这些渠道能发现一些问题,而不是对问题束手无策了。

数据层面的分析

NLP的一大好处就是数据本身是可解释可推理,人本身也可以推测的,而分析数据,往往可以知道一些非常直接的问题。

首先需要看的是测试集,这个相当于是考试的答卷,做错了那些题一目了然,通过这些数据我们能知道模型做错了那些事,强如BERT,也是可能出错的,常见的错误是这些:

  • 标注质量。在现实很多场景,其实是很容易出现标注错误的,很多NLP的问题准确率天花板都停留在90左右,大都是因为标注质量问题,说白了就是标错,这些标错的数据很可能是模型预测对了标注错误了导致的正确,这就导致指标不好看,“效果不好了”。

  • 标注的分布。尤其是分类问题,正负样本是否符合预期,各个类目的数据是否达到了统计意义,实际占比和与其占比是否一致等。

  • 数据是否可靠。额,可能比较少见,有的人做的测试集和训练集压根就不是一回事,值得关心。

  • 当然了,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的任务来微调。

这里一提提供数据,肯定很多人会提数据增强。增强本质不是增多,不是所有缺数据的问题都是因为数量不足,模型要泛化能力,他的泛化能力来源于数据的泛化,很多时候数据提供的不足那就不会有这么强的泛化,得到的反而是过拟合。类似的思路其实我在这两篇文章里其实都有谈过:

所以,很多时候你需要的可能是更多地挖掘数据,从日志,从更多渠道去找,这个可能比增强本身要好。

另外值得强调的是,对于名词性比较强的任务,最好不要用BERT了,甚至是模型都不要用,举个例子,现在告诉你“非诚勿扰”、“中国诗词大会”、“脱口秀大会”这些是综艺,你能推断出“哈哈哈哈哈”也是综艺吗,你这不就是难为人家模型了吗,所以此处词典的作用会比模型本身要大,哪怕是为了提升泛化能力要用模型,那也需要和模型结合着来做。这里背后的逻辑可以参考我这篇文章:

训练问题

针对训练问题,其实也就是一个经验的问题了,多弄其实问题就会小很多,大家可以多去看各个论文使用的超参,一般调的差不多基本都不会有的,当然这里也是要避免代码bug。常见需要关心的超参是学习率、初始化规则、epoch等,另外针对BERT,还要考虑各个层是否要trainable。

模型策略

这个是最考验模型和数据功底的东西了。首先要做基线,一般是考虑折腾这个CLS,而在下游加插件的时候,也要注意不能让BERT模型被学走,注意调整学习率、trainable,同时也可以结合MLM任务来维持模型的稳定,平衡BERT原有的基础知识与实际场景问题的差距。

摆正两个心态

有两个需要在这里和大家强调的两个核心观点。

第一,BERT不是万能的。首先,NLP下有很多场景,BERT虽然能承载出很多语义信息,但是很多时候不止有语义信息,甚至有的时候不需要语义信息,例如上面提到的名词性场景,而且,在很多时候,其实BERT的优势好像不太明显,在考虑成本啥的性价比其实就不是很高了。那么,降低BERT效用的会有哪些因素呢?

  • 过于专业,信息需求较大的领域,如专业化极强的医学等科学领域,或者是电影电视剧等名词性比较强的任务或者说领域。

  • 数据和问题的特点非常鲜明,例如短文本等,实质上ATT、LSTM、CNN等都有自己适合的领域和问题。

  • 数据量。要喂饱BERT,需要足量的数据,哪怕是finetuning,当然在数据量不足的情况下,啥模型都不好使。

第二,要想知道怎么解决问题,就要深入整体流程去思考,要足够理解现有的资源,数据、模型、方案等等,而不是就着手里的积木硬搭做实验,或者撑死调调参数就完事了。

小结

最近是一直在对自己的一些经验进行系统化整理,发现很多文章的东西也出现了耦合,慢慢把这些思路给整理好后,自己感觉有了一些新的提升,是希望和大家分享吧。而文章本身的输出并非是按照这个思路走,而是从一些大家经常问的点深入来讨论,希望能从我的角度和风格来思考和回答问题。

本期从BERT的失效入手来讨论,让大家对训练BERT这条龙有一些大家可能聊的不多但却很常见的问题有更深入的理解。

6d8ece112445d4900b5386a9f6ca05fd.png

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值