作者: 龚俊民(昵称: 除夕)

学校: 新南威尔士大学

单位:Vivo AI LAB 算法实习生

方向: 自然语言处理和可解释学习

知乎: https://www.zhihu.com/people/gong-jun-min-74

前言:之前我们讲了很多与语音处理有关的任务,这次我们来讲和自然语言处理相关的任务。NLP任务大体可以分成两大类,一种是文本序列到文本序列,比如机器翻译,文本风格迁移等,另一种是序列到类别,比如情感分类,实体命名识别,主题分类,槽位填充等。


NLP项目 PRD文档 nlp application_自然语言处理

NLP 这个词的用法有点模糊。Language 指的一般是人与人沟通时用的语言。因此 Natural Language 可以是文字也可以是语音。因此语音相关的技术,也应该算是 Natural Language 的范畴。但不知道为什么,一般我们在将自然语言处理的时候,指的都是文字处理相关的技术。而语音生成,语音分类和语音的风格转换,却被分成语音处理了。自然语言处理的应用非常广泛。尽管其变化多端,但无非是以下几种任务的变体。


NLP项目 PRD文档 nlp application_情感分类_02

输入文字输出类别

文本到类别可以分成两种。一种是输入序列输出代表这整个序列的类别,如情感分类。另一种是输入序列输出序列上每个位置的类别,如实体命名识别。它们都可以接一个 LSTM 来获取序列的上下文标注,后面再接一个 MLP 做线性映射,再用 sigmoid 或 softmax 来输出类别。


NLP项目 PRD文档 nlp application_NLP项目 PRD文档_03

文本到文本则倾向于用 Seq2Seq 模型,Encoder-Decoder 架构,中间需要用 attention 来对齐。对于有些输入文字和输出文字内容有很多重复的任务,比如文本摘要,拼写检查,语法纠错,标题改写这类任务,我们还需要在中间加入复制的能力。比如 pointNet 和 CopyNet。


NLP项目 PRD文档 nlp application_自然语言处理_04

如果输入的是多个序列要怎么办呢?我们有大概两种可能的解法。一种是把两个序列,分别用两个模型去做编码。再把它们编码后的嵌入,丢给另一个整合的模块,去得到最终的输出。有时,我们也会在两个模型之间加 Attention,确保二者的编码内容能互相意识。近年来比较流行的做法是直接把两个句子连接起来,中间加一个特殊的字符,如 BERT 里面的 <SEP>,来提示模型去意识到这是两个句子的分隔符。接起来的序列丢给模型后,就可以直接预测下游任务。


NLP项目 PRD文档 nlp application_情感分类_05

虽然 NLP 的任务千变万化,但根据模型的输入输出可以分成几个大类。模型的输入可以分成一个序列和多个序列,模型的输出可以分成整个序列一个类别,每个位置都有类别,是否需要复制输入,还是要输出另一端文本。除了这些以外,还有一些例外,比如 Parsing 和 Coreference Resolution。


NLP项目 PRD文档 nlp application_自然语言处理_06

Part-of-Speech (POS) Tagging 词性标注 需要我们标记出一个句子中的每个词的词性是什么。对应输入一个序列,输出序列每个位置的类别任务。


NLP项目 PRD文档 nlp application_NLP项目 PRD文档_07

中文分词。英文词汇有空格符分割词的边界,但中文中,却没有类似的方式来区分,所以我们需要中文分词。在一个句子中找出词的边界有时并不是一个简单的问题,所以也需要模型来做。一般中文分词是对句子中的每个字的位置做二分类。如果标注为Y,表示这个字是词汇的结尾边界,如果标注为 N,表示这个字不是词汇的结尾。到了下游任务,我们就可以利用分好的词来作为模型输入的基本单位,而不一定用字。但是否有必要用词表征来替代字表征还是一个值得探究的问题。因为 BERT 在处理中文的时候,它已经不是以字为基本单位了。它很有可能已经自动学到了分词这件事。因此输入要不要用词表征倒显得无关紧要。但 BERT-wwm的实验表明,预训练过程中,让 BERT 要预测的随机 MASK 掉的是一个分词的 span 而不是单独的字能表现更好。说明知道词汇的边界在哪里,对语义的理解是非常重要的。


NLP项目 PRD文档 nlp application_中文分词_08

还有一些也会用来作为自然语言理解的前处理的任务,比如说 Parsing。它的输入是一个句子,输出是一棵句法树。它的输出有时会被当作是额外的特征,在接下来的任务中被使用到。


NLP项目 PRD文档 nlp application_中文分词_09

另一个也常来做前处理的任务叫指代消解 Coreference Resolution。模型需要把输入文章中指代同样东西的部分,找出来。比如文中,He 和 Paul Allen 指的就是同一个人。


NLP项目 PRD文档 nlp application_自然语言处理_10

接下来是摘要,它可以分成两种。过去常用的是抽取式摘要。把一篇文档看作是许多句子的组成的序列,模型需要从中找出最能熔炼文章大意的句子提取出来作为输出。它相当于是对每个句子做一个二分类,来决定它要不要放入摘要中。但仅仅把每个句子分开来考虑是不够的。我们需要模型输入整篇文章后,再决定哪个句子更重要。这个序列的基本单位是一个句子的表征。


NLP项目 PRD文档 nlp application_自然语言处理_11

随着深度学习的近年流行,人们开始关注生成式摘要了。模型的输入是一段长文本,输出是短文本。输出的短文本往往会与输出的长文本有很多共用的词汇。这就需要模型在生成的过程中有把文章中重要词汇拷贝出来,放到输出中的复制的能力,比如 Pointer Network。


NLP项目 PRD文档 nlp application_情感分类_12

输入文字或语音可以直接输出文字。为什么我们要做输入语音输出翻译文字的翻译模型呢?因为很多语言比如说当地的一些方言,连文字都没有。我们只能做语音到文字的对应。如果我们输入输出的语言都没有文字,我们有机会做语音到语音的翻译。对于机器翻译领域来说,一个很关键的问题就是无监督学习。因为世界上的语言有非常多,大约7000种语言。两两匹配大约有 7000² 对组合。我们现实中很难收集到所有的两两语言组合,这是不切实际的。因此无监督学习是很有必要的。模型通过看了一大段英文句子,也看了一大段英文句子,但没有给出中文和英文的对应关系,却能够自动学会把英文转换为中文,把中文转换为英文。


NLP项目 PRD文档 nlp application_NLP项目 PRD文档_13

还有语法改错任务,也是文本序列到文本序列。考虑到输入和输出有很多字是重复的,我们考虑用一些复制机制,让模型把没有错的词汇保留下来。这种语法改错任务其实还可以更进一步简化。输入是一个序列,输出是该序列上每个位置的类别标注。标注类型包括是要保留复制,还是要修改删除。


NLP项目 PRD文档 nlp application_情感分类_14

序列到类别则包括商品评论情感分类。句子中可以同时包括正面的词汇和负面的词汇,模型需要根据上下文学到语境中更侧重正面还是负面。比如虽然……但是这种转折关系,"但是"后面的词汇会得到更多的侧重。


NLP项目 PRD文档 nlp application_情感分类_15

立场检测任务也是分类。它的输入是两个序列,输出是一个类别,表示后面的序列是否与前面的序列站在同一立场。常用的立场检测包括 SDQC 四种标签,支持 (Support),否定 (Denying),怀疑 (Querying),Commenting (注释)。


NLP项目 PRD文档 nlp application_情感分类_16

事实验证也是文本分类的一种。模型需要看一篇新闻文章,判断该文章内容是真的还是假的。假新闻检测是典型的。有时从文章本身,我们人自己都很难判断它的真假。因此有时我们还需要把文章的回复评论也加入模型的输入,去预测真假。如果一个文章它回应第一时间都是否认,往往这个新闻都是假新闻。我们还可以让模型看与文章有关的维基百科的内容,来增强它的事实审核能力。


NLP项目 PRD文档 nlp application_自然语言处理_17

还有一类任务叫自然语言推断 (NLI)。输入给模型的是一个陈述前提,和一个假设,输出是能否通过前提推出假设,它包含三个类别,分别是矛盾,蕴含和中性。比如前提是,一个人骑在马上跳过一架破旧的飞机,假设是这个人正在吃午餐。这显然是矛盾的。因为前提推不出假设。如果假设是,这个人在户外,在一匹马上。则可以推理出蕴含。再如果假设是这个人正在一个比赛中训练他的马。则推理不能确定,所以是中性的。


NLP项目 PRD文档 nlp application_情感分类_18

再往下的任务是搜索引擎。模型的输入是一个关键词或一个问句和一堆文章,输出是每篇文章与该问句的相关性。谷歌有把 BERT 用在搜素引擎上在语义理解上得到了提升。比如搜帮你做美容的人是否经常站着工作。没有 BERT 之前,模型会利用关键词 estheticians 和 stand-alone 做合并结果输出。但有了 BERT 之后,搜出的结果会更倾向于文章语义的理解而非单纯的关键字匹配。


NLP项目 PRD文档 nlp application_情感分类_19

https://web.stanford.edu/~jurafsky/slp3/25.pdweb.stanford.edu

问答系统一般都是基于检索式的,会有如下几个模块:

  • 问题预处理(Query 规范化表示,答案类型)
  • 用 Query 去召回一波文档,根据一系列的特征去做排序,找出相关性较强的段落
  • 对候选答案评分再排序、用答案类型去约束提取出的候选答案,返回最终结果

NLP项目 PRD文档 nlp application_中文分词_20

Watson 之所以强大是因为它把每个模块部分做的非常的精细。光问题处理的答案类型它就有几千个,使用了很多特征。在候选答案生成中,它也利用了海量的文档资源。输出的候选答案之后,它还会根据证据做进一步的再排序,选出置信度最高的那个答案。


NLP项目 PRD文档 nlp application_NLP项目 PRD文档_21

QA问题的输入是一连串句子,输出是答案序列。搜索引擎只是做相关性检索,但如果想要理解文档篇章,还是需要机器阅读理解。


NLP项目 PRD文档 nlp application_中文分词_22

当前主流的研究,其实并没有让模型吐出完整的答案。通常我们做的是抽取式的QA,即给定一段文章和问题,模型需要输出答案在文章段落中的位置。它是强制负责原文中的内容,而不是自主生成能基于文章回答问题,但不在文章中的答案。


NLP项目 PRD文档 nlp application_情感分类_23

对话机器人可以分成两种,闲聊和任务导向型。闲聊机器人基本上都是在尬聊,有一堆问题待解决,比如角色一致性,多轮会话,对上下文保有记忆等。


NLP项目 PRD文档 nlp application_情感分类_24

当前的闲聊机器人需要有一致的人格,懂常识和领域知识,有同理心。


NLP项目 PRD文档 nlp application_情感分类_25

任务导向的对话机器人能够协助人完成某件事,比如订机票,调闹钟,问天气等。我们需要一个模型把过去已经有的历史对话,统统都输入到一个模型中,这个模型可以输出一个序列当作现在机器的回复。一般而言,我们会把这个模型再细分成很多模块,而不会是端对端的。


NLP项目 PRD文档 nlp application_自然语言处理_26

这些模块通常包括自然语言理解NLU,行动策略管理,以及自然语言生成NLG。自然语言理解负责根据上下文去理解当前用户的意图,方便选出下一步候选的行为,如执行系统操作,澄清还是补全信息,确定好行动之后,自然语言生成模块会生成出对齐行动的回复。


NLP项目 PRD文档 nlp application_中文分词_27

具体地说,NLU 会用来根据上下文来理解哪些信息是对当前任务重要的,比如订房任务中的联系人,入住人数,入住日期等。理解出的信息,会变成一个类别作为状态,交给策略管理模块去判断当前还有哪些信息缺失,是否需要继续询问,还是说信息已经全部补全,可以执行命令。如果是要补充信息,则要根据缺失的信息去让自然语言生成模块生成问题。


NLP项目 PRD文档 nlp application_自然语言处理_28

NLU 模块在任务型对话机器人中,通常会有两个任务,一个是意图识别,另一个是槽位填充。意图识别需要弄清楚用户在做什么,是提供信息还是询问问题,它是一个分类任务。假如确认了用户是在提供信息,则槽位填充任务需要从用户回复文本中提取出关键信息,如时间,地点,对应的是入住时间还是退房时间等。但如果意图识别出的是询问问题,比如9月9号还有没有空房,那9月9号就可能不是入住的日期。而是要根据当天有无空房间来进行判断。槽位填充实质在做的与实体命名识别一样。


NLP项目 PRD文档 nlp application_中文分词_29

除了之前三个模块,语音助理中,再加上语音识别 ASR 和 语音合成 TTS 就成了完整的对话系统。


NLP项目 PRD文档 nlp application_自然语言处理_30

知识图谱的构建简化地去理解可以看作是实体提取和关系抽取。实体可以是人可以是物,也可以是组织机构,非常灵活。关系可以是人与人的关系,可以是谓语动作,也可以是企业之间的资本流动。信息抽取任务希望从海量文本中自动挖掘出实体关系三元组。这个问题其实非常地复杂。这里只是简单地讲。


NLP项目 PRD文档 nlp application_情感分类_31

什么是实体命名识别呢?其实命名实体它的内容并没有非常清楚的定义。它取决于我们对哪些事情关心。随着领域的不同,有所差异。一般的实体包括人名、组织和地名等等。但这不是完整的实体的定义。它取决于我们的具体应用。比如我们想让机器读大量医学相关的文献,希望它自动知道有什么药物可以治疗新冠状肺炎。这些药物的名字,就是实体。它输入的是一个序列,输出的是序列上每个位置的类别。它就和词性标注、槽位填充一样。NER常见的两个问题是,名字一样但指的是不同的东西,有多个标签需要实体消歧;不一样的名字指的却是相同的东西,需要实体归一化。总之,怎么抽取实体是有非常多的相关研究。


NLP项目 PRD文档 nlp application_自然语言处理_32

假如我们知道如何从文本中获得实体,接下来还需要知道它们之间的关系。比如哈利波特是霍格沃茨的学生。关系抽取的输入是序列和抽取出的实体,输出是两两实体之间的关系。它是一个分类任务。


NLP项目 PRD文档 nlp application_中文分词_33

过去往往是一个NLP任务设计一个模型。听起来不是非常地智能。我们希望知道机器在各种任务上的一般表现。于是就有了一些标准和竞赛,Benchmark。一个知名的竞赛叫作 GLUE,主办方集合了很多觉得重要的能理解人类语言有关的任务,希望我们的模型能去解这些任务,看看可以得到什么样的结果。GLUE中任务分成三大类。第一大类是分类任务,包括语法错误检测和情感分类。它们都是输入是一个序列,输出是一个类别。第二大类是输入是两个句子,输出是二者的语义是否相似对应。第三大类都是自然语言推理相关的任务。输入前提和假设,希望机器能判断二者是否矛盾蕴含还是无关。GLUE 并没有涵盖所有的 NLP 类型问题。


NLP项目 PRD文档 nlp application_自然语言处理_34

NLP项目 PRD文档 nlp application_自然语言处理_35

有了 BERT 和它的好朋友以后,GLUE指标都被打破稍微有些超出人类的表现了,所以需要新的 Benchmark,于是就有了 Super GLUE。它的任务大都是和 QA 比较有关系的,比如输入一个段落,询问一个一般疑问句,回答是yes or no。或者是常识、逻辑推理。也有是把看一个段落,回答填空的。或者是给机器两个句子,两个句子中都有同样的词汇。看看机器能不能知道这两个词汇意思是一样的还是不是一样的。或者是给机器一个句子,句子上标了一个名词和一个代名词,希望机器能够判断二者是不是指代同一个东西。


NLP项目 PRD文档 nlp application_自然语言处理_36

除了Super GLUE 以外,还有一个 Benchmark 叫 DecaNLP。它希望你用同一个模型来解决十个不同的任务。Super GLUE 虽然比 GLUE 增加了难度,但它大多数也还是分类任务,近年来也一直被刷榜。而DecaNLP中它的任务会更加困难,很多任务像摘要、翻译需要输出一个完整的句子。所有这些不同的任务,都可以看作是 QA 类型问题。怎么把各式各样的 NLP 任务看成是 QA 问题呢?比如翻译就是给定一段要把A语言翻译成B语言的问句,和一段文章,希望机器能把这段文章翻译成指定语言。摘要情感分类也是类似的。谷歌的 T5 Text-to-Text 模型,就可以做类似的。把不同任务用统一框架集成起来的好处有两个。一是可以评估一个模型的综合表现,二是可以促进研究者寻找出更通用的自然语言处理模型。

后记:真心推荐访问一下 DecaNLP 的链接去看一下它的 Benchmark。QA 框架统一各种任务非常值得模型来刷榜。这其实也是多任务学习的一个研究方向。


NLP项目 PRD文档 nlp application_NLP项目 PRD文档_37