4.主流方法介绍
4.1 BERT模型
在计算机视觉处理中,人们越来越多地采用预训练好的大型网络来提取特征,然后再进行后续任务。目前这种处理方式已经是图像处理中很常见的做法。
相比之下,自然语言处理目前通常会使用预训练的词向量来进行后续任务。但词向量是通过浅层网络进行无监督训练,虽然在词的级别上有着不错的特性,但却缺少对连续文本的内在联系和语言结构的表达能力。假如可以通过大量数据来预训练一个大型的神经网络,然后用它来对文本提取特征去做后续的任务,得到更好的效果,会是自然语言处理方面的大进步。其实这一方向的研究一直在持续,直到今年的早些时候AllenAI提出的ELMo由于其在后续任务上的优异表现获得了不小的关注。此后OpenAI又提出了GPT。预训练的语言模型是在百度15亿词文本的语料上进行的,模型参数选择了12层,12head的Transformer结构。
谷歌提出的BERT就是在GPT的基础上对预训练的目标进行修改,并用更大的模型及更多的数据去进行预训练,从而得到目前最好的效果。BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的编码,因为解码是不能获取预测的信息的。模型的主要创新点在进行预训练的方法上,即用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别的表示。
4.1.1 Transformer的编码器
Transformer所使用的注意力机制的核心思想是去计算一句话中的每个词对于这句话中所有词的相互关系,然后认为这些词与词之间的相互关系在一定程度上反应了这句话中不同词之间的关联性以及重要程度。因此再利用这些相互关系来调整每个词的重要性(权重)就可以获得每个词新的表达。这个新的表征不但蕴含了该词本身,还蕴含了其他词与这个词的关系,因此和单纯的词向量相比是一个更加全局的表达。Transformer的编码器结构如图4.2所示。
对于“今天天气不错,我们去公园玩吧。”这句话,单向语言模型在学习的时候是从左向右进行学习的,先给模型看到“今天天气”两个词,然后告诉模型下一个要填的词是“不错”。然而单向语言模型有一个欠缺,就是模型学习的时候总是按照句子的一个方向去学的,因此模型学习每个词的时候只看到了上文,并没有看到下文。更加合理的方式应该是让模型同时通过上下文去学习,这个过程有点类似于完形填空题。例如:今天天气 { },我们去公园玩吧。通过这样的学习,模型能够更好地把握“不错”这个词所出现的上下文语境。而BERT对GPT的第一个改进就是引入了双向的语言模型任务。
4.1.2 MaskLM训练语言模型
BERT的作者提出了采用MaskLM的方式来训练语言模型,就是在输入一句话的时候,随机地选一些要预测的词,然后用一个特殊的符号来代替它们。尽管模型最终还是会看到所有位置上的输入信息,但由于需要预测的词已经被特殊符号代替,所以模型无法事先知道这些位置上是什么词,这样就可以让模型根据所给的标签去学习这些地方该填的词了。
然而这里还有一个问题,就是我们在预训练过程中所使用的这个特殊符号,在后续的任务中是不会出现的。
因此,为了和后续任务保持一致,作者按一定的比例在需要预测的词位置上输入原词或者输入某个随机的词。当然,由于一次输入的文本序列中只有部分的词被用来进行训练,因此BERT在效率上会低于普通的语言模型,作者也指出BERT的收敛需要更多的训练步数。
BERT另外一个创新是在双向语言模型的基础上额外增加了一个句子级别的连续性预测任务。这个任务的目标也很简单,就是预测输入BERT的两端文本是否为连续的文本,作者指出引入这个任务可以更好地让模型学到连续的文本片段之间的关系。在训练的时候,输入模型的第二个片段会以50%的概率从全部文本中随机选取,剩下50%的概率选取第一个片段的后续的文本。
4.1.3 Next Sentence Prediction
很多句子级别的任务如自动问答(QA)和自然语言推理(NLI)都需要理解两个句子之间的关系,譬如上述Masked LM任务中,经过第一步的处理,15%的词汇被遮盖。那么在这一任务中我们需要随机将数据划分为等大小的两部分,一部分数据中的两个语句对是上下文连续的,另一部分数据中的两个语句对是上下文不连续的。然后让Transformer编码器来识别这些语句对中,哪些语句对是连续的,哪些对子不连续。
BERT的成功还有一个很大的原因来自于模型的体量以及训练的数据量。BERT训练数据采用了英文的开源语料BooksCropus 以及英文维基百科数据,一共有33亿个词。同时BERT模型的标准版本有1亿的参数量,与GPT持平,而BERT的大号版本有3亿多参数量,这应该是目前自然语言处理中最大的预训练模型了。
4.2 seq2seq加attention模型
根据输出和输入序列不同数量rnn可以有多种不同的结构,不同结构自然就有不同的引用场合。one to one 结构,仅仅只是简单的给一个输入得到一个输出,此处并未体现序列的特征,例如图像分类场景。one to many 结构,给一个输入得到一系列输出,这种结构可用于生产图片描述的场景。many to one 结构,给一系列输入得到一个输出,这种结构可用于文本情感分析,对一些列的文本输入进行分类,看是消极还是积极情感。many to many 结构,给一些列输入得到一系列输出,这种结构可用于翻译或聊天对话场景,对输入的文本转换成另外一些列文本。同步 many to many 结构,它是经典的rnn结构,前一输入的状态会带到下一个状态中,而且每个输入都会对应一个输出,我们最熟悉的就是用于字符预测了,同样也可以用于视频分类,对视频的帧打标签。
在 many to many 的两种模型中,第四和第五种是有差异的,经典的rnn结构的输入和输出序列必须要是等长,它的应用场景也比较有限。而第四种它可以是输入和输出序列不等长,这种模型便是seq2seq模型,即Sequence to Sequence。它实现了从一个序列到另外一个序列的转换。例如Google曾用seq2seq加attention模型来实现了翻译功能,类似的还可以实现聊天机器人对话模型。经典的RNN模型固定了输入序列和输出序列的大小,而seq2seq模型则突破了该限制。
4.2.1 attention原理
Attention的思想就是在解码阶段对输入中的信息赋予不同权重。在nlp中就是针对序列的每个时间步输入。
传统RNN基础模型如图4. 3所示:
而比较基础的加入attention与RNN结合的模型如图4.4所示:
其中是对应的权重,算出所有权重后进行softmax和加权,得到。
可以看出编码阶段相似。但解码阶段使用attention的输出结果,作为了RNN的输入。
自Attention机制提出后,加入attention的Seq2seq模型在各个任务上都有了提升,所以现在的seq2seq模型指的都是结合RNN和attention的模型。之后
Google又提出了解决sequence to sequence问题的transformer模型,用全attention的结构代替了LSTM,在翻译任务上取得了更好的成绩。
4.3 机器翻译有关的Google Transformer 模型
图4.5 为Google Transformer 模型说明,这其中左半部分是 Encoder 右半部分是 Decoder。
Encoder: 这里面有 N=6 个一样的layers, 每一层包含了两个sub-layers. 第一个sub-layer 就是多头注意力层(multi-head attention layer) 然后是一个简单的全连接层。 这里还有一个残差连接 (residual connection), 在这个基础上, 还有一个标准层。
Decoder: 这里同样是有六个一样的Layer层,但是这里的layer 和encoder 不一样,这里的layer 包含了三个sub-layers, 其中有一个self-attention layer, encoder-decoder attention layer 最后是一个全连接层。 前两个sub-layer 都是基于multi-head attention layer,这里有个特别点就是masking, masking 的作用就是防止在训练的时候使用未来输出的单词。比如训练时,第一个单词是不能参考第二个单词的生成结果的。Masking就会把这个信息变成0,用来保证预测位置i 的信息只能基于比 i 小的输出。
4.3.1 该模型中的Attention组成
(1) Scaled dot-product attention
这个算法是通过queries, keys and values 的形式描述的, 非常抽象。所以我找了一张梅隆大学的自然语言处理课里的图(如图4.6)来解释, Q(queries), K (keys) and V(Values), 其中 Key and values 一般对应的同样 vector, K=Q。图里的query vector 来自 decoder state, key vectors 来自所有的encoder state.具体的操作有三个步骤。 首先每个query-key 会做出一个点乘的运算过程;然后会使用soft max 把他们归一,最后会乘以V (values) 用来当做attention vector。如公式4.1所示;
(2)Multi-head attention
这个是Google提出的新概念,是Attention机制的完善。不过从形式上看,它其实就再简单不过了,就是把Q,K,V通过参数矩阵映射一下,然后再做Attention,把这个过程重复做h次,结果拼接起来就行了,可谓“大道至简”了。具体来说
通过上述两个公式,最后得到一个n*(hdv)的序列。Multi-Head,就是只多做几次同样的事情(参数不共享),然后把结果拼接。但在Google的论文中,大部分的Attention都是Self Attention,即“自注意力”,或者叫内部注意力。
(3)Position Embedding
上述的模型并不能捕捉序列的顺序,换句话说,如果将K,V按行打乱顺序(相当于句子中的词序打乱),那么Attention的结果还是一样的。这就表明了,到目前为止,Attention模型顶多是一个非常精妙的“词袋模型”而已。对于时间序列来说,尤其是对于NLP中的任务来说,顺序是很重要的信息,它代表着局部甚至是全局的结构,学习不到顺序信息,那么效果将会大打折扣(比如机器翻译中,有可能只把每个词都翻译出来了,但是不能组成合理的句子)。
于是Google提出了Position Embedding,也就是“位置向量”,将每个位置编号,然后每个编号对应一个向量,通过结合位置向量和词向量,就给每个词都引入了一定的位置信息,这样Attention就可以分辨出不同位置的词了。虽然以前的RNN和CNN,都出现过Position Embedding,也可以捕捉位置信息,但它只作为辅助手段。但纯Attention模型,它是模型的核心成分之一。以往的Position Embedding是根据任务训练出来的向量。而Google则直接给出了一个构造公式;
这里的意思是将id为p的位置映射为一个d_pos维的位置向量,这个向量的第i个元素的数值就是PE_i(p) 。Google在论文中说到他们比较过直接训练出来的位置向量和上述公式计算出来的位置向量,效果是接近的。显然我们更倾向于使用公式构造的Position Embedding了。
5.性能评价标准
5.1 BLEU和ROUGE
BLEU的全名为:bilingual evaluation understudy,即:双语互译质量评估辅助工具。它是用来评估机器翻译质量的工具。当然评估翻译质量这种事本应该由人来做,机器现在是无论如何也做不到像人类一样思考判断的,但是人工处理过于耗时费力,所以才有了BLEU算法。
BLEU的设计思想与评判机器翻译好坏的思想是一致的:机器翻译结果越接近专业人工翻译的结果,则越好。BLEU算法实际上在做的事:判断两个句子的相似程度。假如:我想知道一个句子翻译前后的表示是否意思一致,显然没法直接比较,那我就拿这个句子的标准人工翻译与我的机器翻译的结果作比较,如果它们是很相似的,说明我的翻译很成功。因此,BLEU去做判断:一句机器翻译的话与其相对应的几个参考翻译作比较,算出一个综合分数。这个分数越高说明机器翻译得越好。(注:BLEU算法是句子之间的比较,不是词组,也不是段落)
ROUGE是一种自动摘要评价方法,现被广泛应用于摘要评测任务中。ROUGE受到了机器翻译自动评价方法BLEU的启发,不同之处在于,采用召回率作为指标。基本思想是将模型生成的摘要与参考摘要的n元组贡献统计量作为评判依据。
5.2对话系统评估
评价生成回复的质量是对话系统的一个重要方面。任务导向型的对话系统可以基于人工生成的监督信号进行评估,例如任务完成测试或用户满意度评分等。然而,由于高回复的多样性,自动评估非任务导向的对话系统所产生的响应的质量仍然是一个悬而未决的问题。目前的方法有以下几种:
1)计算 BLEU 值,也就是直接计算 word overlap、ground truth和你生成的回复。由于一句话可能存在多种回复,因此从某些方面来看,BLEU 可能不太适用于对话评测。
2)计算 embedding的距离,这类方法分三种情况:直接相加求平均、先取绝对值再求平均和贪婪匹配。
3)衡量多样性,主要取决于 distinct-ngram 的数量和 entropy 值的大小。
4)进行图灵测试,用 retrieval 的 discriminator 来评价回复生成。
6.未来发展趋势
深度学习已成为对话系统的一项基本技术。研究人员将神经网络应用于传统任务导向型对话系统的不同组成部分,包括自然语言理解、自然语言生成、对话状态跟踪。近年来,端到端的框架不仅在非面向任务的聊天对话系统中流行,而且在面向任务的对话系统中逐步流行起来。
深度学习能够利用大量的数据,从而模糊了任务导向型对话系统和非任务导向型对话系统之间的界限。值得注意的是,目前的端到端模型仍然远非完美。尽管取得了上述成就,但这些问题仍然具有挑战性。接下来,我将讨论一些可能的研究方向。
1.快速适应。虽然端到端模型越来越引起研究者的重视,我们仍然需要在实际工程中依靠传统的管道(pipeline)方法,特别是在一些新的领域,特定领域对话数据的收集和对话系统的构建是比较困难的。未来的趋势是对话模型有能力从与人的交互中主动去学习。
2.深度理解。现阶段基于神经网络的对话系统极大地依赖于大量标注好的数据,结构化的知识库以及对话语料数据。在某种意义上产生的回复仍然缺乏多样性,有时并没有太多的意义,因此对话系统必须能够更加有效地深度理解语言和真实世界。
3.隐私保护。目前广泛应用的对话系统服务于越来越多的人。很有必要注意到的事实是我们使用的是同一个对话助手。通过互动、理解和推理的学习能力,对话助手可以无意中隐蔽地存储一些较为敏感的信息。因此,在构建更好的对话机制时,保护用户的隐私是非常重要的。
参考文献上章已经列出;