查看原文
其他

心法利器[45] | 模型需要的信息提供够了吗

机智的叉烧 CS的陋室 2022-08-24

心法利器


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

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


往期回顾

接着上次样本不均衡的问题接着聊下去:心法利器[44] | 样本不均衡之我见

很容易引出一个问题,其实也是一个非常通用的问题——=模型训练后的预测预测所需要的信息,我们是否已经都提供够了?

背景

不管模型,先看人,人在做决策做分析的时候,是需要足够的依据的,这些依据能让我们做出更加准确的判断,甚至是缺一不可的。举两个例子:

  • 找对象,得看性格爱好长相家庭状况性别等等。
  • 全等三角形的判定,需要根据两个三角形的角边关系来判断,边边边、角边角、角角边、边角边,那我们需要提供两个三角形的边角大小信息。

人如此,模型亦是如此,模型在做各种预测的时候,同样需要通过信息才能做出不同的决策,如果提供不够,则很难得到准确的效果了,用人话,其实就是“你都没告诉过我,我咋知道怎么做?”,道理显而易见。

  • 常规的例如一个情感分析,评估用户对商品的满意程度,如果样本里没有出现过“垃圾”,那模型很难会为“垃圾”这个判定用户的满意度。注意,如果你要用的是bert之类的预训练,倒是可能因为模型理解“垃圾”的意思,说白了就是已经学过了,那其实也说明这方面的信息模型其实是具备的。
  • 做一个推荐系统,根据用户偏好推荐东西的前提是要知道用户的偏好,这也是为什么冷启动问题一直以来都是一个关键问题被讨论,就是因为我们对新用户的了解不够,不能很好地给模型提供用户偏好信息供他判断。

人和模型的信息沟通机理

人和模型的信息沟通,主要是两个渠道,训练时的数据信息和推理阶段的数据特征。

训练阶段我们之所以要这么多数据,就是因为,我们需要模型根据这些数据能学到一些特定的规律,模型就能通过这些规律进行预测,所以,我们力求数据能尽可能多,这个多就体现在能让模型能把这个规律学清楚、学明白,那模型就能通过这个规律进行预测决策,这也是为什么我们其实可以把模型理解为一套复杂的规则模块的原因。

预测阶段的数据特征,则更像是我们要“具体情况具体分析”的那个“具体情况”,规律是恒定不变的,但是现实是变化的,我们要把现实情况和模型说清楚,这样模型才能够预测准确,就像招聘时候的简历,姓名年龄学历工作经历等,这些都是有助于HR是否给offer的重要信息。这里值得注意的是,这个特征并不一定是明文特征,可能是经过其他模型抽象或者抽取的特征,例如embedding,再例如我在模型里加了个LSTM做序列特征,再再例如我加个交互式的attention抽取两者的相同或者相异的信息,我觉得都可以归属到这一类里。

如果用经典的三段论来说,训练阶段的信息是为了让模型能够理解一些通用的“大前提”(当然这里也只是用了归纳法而非演绎法,不知道模型啥时候能用到演绎推理进行学习提升?),而数据特征则是我们需要给出的特定独立的一些现实情况,即小前提,模型就可以根据学到的“大前提”,以及特定情况的“小前提”,就能得出正确的结论了。

在这里,我们开始反思,为什么模型的预测不正确,会出现bad case,这个很大程度上就可以从这个“大前提”和“小前提”里面找原因了。

  • 一本正经的胡说八道。不太可能是小前提的问题,一般是大前提的问题,模型能有这么大的把握,大概率是样本里有错误样本,导致模型学错了。
  • 预测模糊,模棱两可,二分类的预测结果在0.5附近。大概率是信息缺失,要么是样本里不存在对这种信息的解释,例如未登录词,要么是缺乏用于决策的关键特征,这种信息哪怕从已有信息里去解析抽取也推理不出来的,例如打仗的时候不知道己方兵力,那决策肯定是模糊的。

当然了,这些错误的判断大是在数据层面找原因的视角了,如问题二的原因还可能是学习方式不对,这里没有讨论,不代表我们思考问题点的时候就不思考了,学习方式的错误会导致大前提学不好(注意不是学错,是学不好),我们同样要查看。

案例思考

来个比较抽象的案例吧,假设有几个这样的样本,我把提供的信息点设置为英文字母,任务是二分类。

信息点标签
ABC1
ACA1
BC1
C1
AB0
B0
AAB0

这里我们可以得到一个置信度还挺高的结论:

  • 有C的正类,没有C的是负类。

我们可以很轻易地分析出“DCA”应该是1,这里D我们显然不认识,这里的大前提和小前提就会非常明显,而回到日常使用,我们通常会因为任务的特性而准备数据,最终让模型识别到一个错误的结论。

场景是开放域,要单独把用户问账号密码相关问题的query给识别出来,简单地说就是一个“密码问题意图”的意图识别问题,文本二分类,此时我们就会准备大量和密码有关的样本和一批和密码无关的样本做分类训练,然后高高兴兴地开始训练了,这时候很可能会遇到这样一个query:

遗传密码是什么

头皮发麻有米有!这是文本分类问题一个很常见的失误,出现的原因很简单,我们在正类里面塞了大量含有“密码”的样本,而负类里面没有或者很少(估计被当成噪音了),这时候模型很容易就认为带有“密码”的query都是正类,按照上面的我们提到的字母的案例,人也会有这样的直线思维,模型也是有的,而且非常正常,这个时候能怪模型吗,当然不能,这是因为我们提供的数据让模型学到了一个错误的“大前提”,那么此时,该怎么去解决呢,其实想法已经呼之欲出了:

增加一些带有“密码”但是不是密码问题意图的样本到负类样本里。

这就是一个case分析的思路,我们通过查阅query,就能发现模型常出的错误是什么,从而找到问题根源从而釜底抽薪解决。当然了,这个问题可以通过替换信息更多,尤其是原有外部信息更多的模型(BERT:报我身份证得了),可以缓解,但是相比之下解决的成本就很大了。

当然了,我们还可以深挖,这个分析的过程,其实我们不仅看了测试集的bad case,还看了训练集,毕竟我们要验证训练集里正负类中对“密码”这个词的占比才能证实我们的这个猜想,所以再进一步总结,我们可以再总结一下这类问题的思考和解决思路:

  • 该问题的信息在训练集有且充分,说明信息提供充足。
  • 该问题的信息在训练集没有或者不足,那说明我们需要补充,要么是加样本让模型学成大前提,要么是加特征让模型学成小前提。

补充

这里呼应一下,上一篇文章讲过的样本不均衡问题,尤其是少样本这块,我让大家要增加样本,尤其是多样性,所以要做的是挖掘而不是增强,主要原因就是模型缺少信息,数据少到模型对这类信息的理解不够,模型的视角就是,我现在告诉你“AA”是正类,然后问你“BB”是什么类,能知道就真的奇怪了对吧,你再怎么增强,你依旧不知道"BB"是什么,甚至,你增强了个"aa"还不一定是对的。

同样举例子,现在我要做一个电影意图识别,有一部电影是少年的你,在样本里好好的,然后现在问你,“风之谷”是不是,模型从哪猜,他没见过不认识,你去做样本增强,少年的你能增强出一个“年轻的您”,是电影吗,我们该做的是把“风之谷”之类的也挖掘好才是关键。对了,模型选型角度也不能考虑泛化能力太强的,否则“年轻的您”还是会出来,这个问题下词典法,结合挖掘手段挖掘足量的数据,会非常合适。

小结

整篇文章思路来源依据我和朋友说的一句话“你怎么不早说”,是的,你没和我说我确实不知道,我做错真的并不奇怪,模型亦然,我们需要给模型提供足够的信息,他才能帮我们做好分析决策,因此,当模型出错的时候,不妨尝试思考一下自己是否给模型提供了足够的信息,把它补足补对了,他应该就能解决的很好了有的时候,这个视角去解决问题效率会更高,三十六计之釜底抽薪就是希望我们能从根源上解决问题更加高效,而这个信息,私以为,就非常接近根源了。

后记:这篇文章其实想写很久了,自己是很早就意识到这个问题,但是难以归纳系统化,也很难用话说出来,最近算是把这个给整理的明白一些了,尝试聊出来,自己对这篇文章还挺满意的,希望对大家理解模型有帮助吧。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存