文本匹配方法系列––BERT匹配模型
公众号关注 “ML_NLP”
设为 “星标”,重磅干货,第一时间送达!
来自 | 知乎
地址 | https://zhuanlan.zhihu.com/p/85506365
作者 | debuluoyi
编辑 | 机器学习算法与自然语言处理公众号
本文仅作学术分享,若侵权,请联系后台删文处理
1、概述
在介绍深层次交互匹配方法之前,本文接着多语义匹配方法[1]介绍基于BERT模型实现文本匹配的方法。将其单独介绍主要因为BERT实现文本匹配操作方便且效果优秀,比较适用于工业应用场景。关于bert模型,Devlin, J., Chang, M. W., Lee, K., & Toutanova, K. (2018)[2]在论文中有较为详细的介绍,官方代码可以在以下GitHub网址中找到:github.com/google-resea[3]。
2、模型&实践
2.1 BERT模型介绍
BERT本质上是一个两段式的NLP模型。第一个阶段叫做:Pre-training,通过大规模无监督预料训练获得的模型,可以获取文本动态字符级语义embedding,简单地可以视为加强版的字符级word2vec。实际上由于bert预训练阶段在Masked LM之外的另一个pre-training任务就是Next Sentence Prediction,即成对句子构成的句子级问题,所以用BERT做文本匹配是有天然优势的。
第二个阶段叫做:Fine-tuning,利用预训练好的语言模型,完成具体的NLP下游任务,NLP下游任务下游任务多种多样,NLP在多种任务中当时都取得了SOTA的效果,其中之一就是文本匹配任务,只需要直接输入分割好的句子对就可以直接获取匹配结果。
当然除了直接使用bert的句对匹配之外,理论上还可以只用bert来对每个句子求embedding,之后再通过向Siamese Network这样的经典模式去求相似度也可以。但从实操来说是不可取的,使用bert获取embedding后再去接复杂的交互计算,整个模型会非常大,训练时耗也会很长,不适于工业常见。
2.2 文本匹配任务实践
实际BERT模型中的输入本身就是适应两段文本的,在常见的分类任务中,是令text_b=None,只输入了第一段文本,在文本匹配时正常输入text_a,text_b即可。
(1) 数据处理
输入数据格式:texta \t text_b \t label 。两个句子之间通过[SEP]分割,[CLS]的向量作为分类的输入,标签是两个句子是否相似,1表示正例,0表示负例。
(2)部分关键代码展示
example结构设计文本对输入:
文本对编码处理
text_a,text_b合起来的输入编码长度是你设置的max_length;
如果len(text_a)+len(text_b)>max_length,那么 在一对文本中,谁长就会截断谁。
模型训练
增加一个processor name 如text_matching,在sh文件里面按照GitHub上面样式设置参数即可 :sh run_train.sh
(3)实践效果
**由于bert预训练阶段任务之一就是Next Sentence Prediction,即成对句子构成的句子级问题,所以使用bert进行文本匹配任务可以非常轻易地达到很好的效果,**一般工业级数据效果可以达到80%甚至超过,比一般非预训练匹配模型所需训练数据少,训练模型效果好。
工业上推荐使用,如需解决上线平响问题,可以考虑减少bert中transformer层数,distill一下/混合精度/量化压缩等手段压缩至较小的模式上线。
参考文献
[1] 文本匹配方法系列––多语义匹配模型:zhuanlan.zhihu.com/p/85;
debuluoyi:文本匹配方法系列––多语义匹配模型 zhuanlan.zhihu.com
[2] Devlin, J., Chang, M. W., Lee, K., & Toutanova, K. (2018). Bert:
Pre-training of deep bidirectional transformers for language
understanding.arXiv preprint arXiv:1810.04805.
可以扫描下方二维码,小助手将会邀请您入群交流,
注意:请大家添加时修改备注为 [学校/公司 + 姓名 + 方向]
例如 —— 哈工大+张三+对话系统。
号主,微商请自觉绕道。谢谢!