深入剖析Transformer架构:自然语言处理的核心突破与奥秘
在人工智能领域,特别是自然语言处理(NLP)的浪潮当中,架构是近年来极为重要的突破之一。它完全解决了传统循环神经网络(RNN)健忘的问题,它也完全解决了传统循环神经网络(RNN)训练速度慢的问题,它还开启了大语言模型的新纪元。本文将从机器翻译这一经典任务开始,深入分析架构的核心原理,其中涵盖编码器 - 解码器架构,包括注意力机制的奥秘,以及它怎样凭借纯注意力机制达成高效的序列处理。按照惯例,结论先行
这篇文章要讨论啥?
你提供的内容存在信息缺失,无法准确完成改写,请补充完整准确的内容。
我会将解决双语翻译问题作为切入口,剖析通过纯注意力机制构建编码器 - 解码器架构的方式,以此来解决这个问题。
文章讨论的核心问题和结论是啥?
① 什么是编码器-解码器架构?
这是一个经典架构,用于解决翻译问题,整个模型由两部分构成,分别是编码器与解码器,编码器的职责是把原文转化成数字,让机器能够高效理解,解码器的职责是把数字转化为语言,使人类能够理解。
② 什么是注意力机制?
这是一种方法,这种方法能让机器理解字词之间的关联关系。例如在“这老板真水”这句话里,只有注意到“水”和“老板”的修饰关系,才能够将这里的“水”理解为水平低下,而不是物理意义上的水。
③ 什么是?
这是一个双语翻译模型,它采用了编码器 - 解码器架构,并且是完全使用注意力机制构建起来的 。
④ 是怎么训练的?
不断的给它“原文→译文”语料对,通过这些语料来调整参数
⑤ 怎么量化翻译质量?
采用BLEU评分,其核心思想是查看机器翻译结果与人工翻译结果的重合程度究竟有多高。
⑥ 和现在的大模型到底是什么关系?
拿出编码器进行优化,进而得到了BERT。拿出解码器进行优化,进而得到了GPT。
我让GPT帮我修改这篇文章,它只回复了一句话,这句话是“你见过儿子指点老子的吗?”
——题记
在上一篇文章《从0构建大模型知识体系(3):大模型的祖宗RNN》里,我们介绍了循环神经网络(RNN)处理自然语言这类序列数据的方式,即借助循环结构,还训练了一个简单的客服机器人去完成文本生成任务,同时深入探讨模型基于概率的输出机制,以此阐释大模型幻觉现象的根本原因。
在相当长的一段时间当中,RNN以及它的改良版本(LSTM)在自然语言处理领域都是处于王者地位的。可是,RNN上面的两朵乌云始终都没有被完全驱散:
健忘表现为句子一长,模型就记不住开头的信息。例如问它“小明的妈妈生了三个儿子,大儿子叫大毛,二儿子叫二毛,三儿子叫什么?”若它回答叫三毛,明显是没记住开头“小明的妈妈生了三个儿子”这个信息,所以三儿子应该叫小明 。
训练速度慢,是因为RNN中有大量串行计算,这使得GPU加速程度有限。所谓串行计算,是指不先算出A,就算不出B。而并行计算,是指A算没算出来都不影响B算不算得出来。如果模型中的计算都是并行的,就能用GPU极大加速。但很可惜,RNN中的很多计算都是串行的。
有没有一种方法,它能让模型记住长距离信息,它还能并行计算,进而让模型训练又快又好呢?肯定有啊,不然我不会这么设问~~
2017年,有一篇名为is All You Need的论文发表了,它彻底解决了这两个问题。平时咱们刷文章刷视频所看到的内容就是这篇论文里提出的。哇~这篇论文非常厉害:
首先它这个标题十分霸气,“is All You Need”好像是在向全世界宣称,“你们都别再胡乱尝试了,采用我的方法就可以了”
更拽的是,他们给自身的模型取了个名字叫“”(变形金刚,这下明白为何封面图要放个变形金刚了吧~),这就好比我们设计一个模型后,给它取名为“齐天大圣” 。
当然,最厉害的是这篇论文完完全全地改变了NLP领域的游戏规则。这么讲吧,要是把、看作摩天大楼,那它就是砖瓦,没有砖瓦是建不起楼的。比如我们快速看一下-V3的架构图。
其中明确表明它是由多个块堆叠而成的,因此将其比喻成砖瓦颇为恰当。
缔造这一切的传奇论文,并非是为了解决“创造一个与人类智能水平相当的机器”这般宏大的问题,反而是为了解决“提高机器翻译质量”的问题,这种问题相比起来“没那么起眼” 。
从机器翻译说起:序列到序列的挑战
输入是一个序列,输出同样是一个序列的任务,被称作“序列到序列”任务,简称为“-to-”。假设你要开发一个中译英的翻译工具。用户输入中文“这老板真水”,模型能够输出英文“This boss isa joke” 。这里的输入是个完整句子序列,输出同样是完整句子序列,并且输入与输出长度很可能不同,中文五个字,英文六个词 。更复杂的是,词语间并非简单逐字对应,“水”被翻译成“a joke”而非“water” 。
解决问题的经典架构为:编码器 - 解码器(-) 。不要害怕,编码器解码器这些词汇尽管听起来颇为高端,然而其背后的思想十分简单:
人类进行翻译时,也能够视作一个编码和解码的过程。以中英翻译为例,当别人说出一句“你好”后,我们要先领会这句中文所表达的是“简单问候”这样的“意思”。接着,再借助脑内的语言系统,将这个“意思”转译为“hello”并输出。我们能够如此呈现这个过程:
对于机器来说,这个图就得改成这样
唯一的区别在于,编码器输出的那个“意思”,在机器里是用一串数字表示的。你看,机器把我们给它的输入“你好”,编写成一串人类无法理解的数字“1,5,9,8”。而这串数字通过解码器,能翻译成人类可理解的输出“hello”。这就是所谓的编码器 - 解码器架构。
总结一下,编码器负责理解外界输入,解码器负责向外界输出。
采用的是这个架构,很明显,在这个架构下,决定翻译质量优劣的是编码器和解码器的具体设计,这就不得不提及大名鼎鼎的注意力机制,也就是论文标题is All You Need中的
理解注意力机制需要4步
先感性理解注意力机制的作用,这是第一步。它能让模型理解序列中元素之间的关系。以“这老板真水”为例,“这老板真”几个字没什么特殊的。特殊的是“水”。因为这里的“水”并非物理意义上的水。而是指一个人水平低下。人类能理解这一点。是因为我们能“注意到”这里的“水”是用来形容“老板”的。也就是说,当我们读到“水”这个字时,只有留意到它与“老板”之间的修饰关系,才可以正确领会其含义。注意力机制所要做的事情,就是让机器也能够如此理解一个序列中元素之间的关系。
第二步,对注意力机制的原理进行感性理解。我们来看一个故事。存在一场相亲会。相亲会上一共有3个嘉宾:
https://img0.baidu.com/it/u=3653820404,594684950&fm=253&fmt=JPEG&app=138&f=JPEG?w=510&h=500
在这个故事中我们重点注意以下几点:
注意力是嘉宾带着自己的问题(q)去查看所有人的关键词(k)后产生的,这里的所有人包含嘉宾自己。
被识破包装伎俩后的信息才是真正有价值的,关键词只能吸引注意力,大家关心的是去伪存真后的真实信息。
嘉宾的收获是自己的注意力,它是对所有嘉宾实际价值进行加权平均得到的,这其中也涵盖嘉宾自身。
到这里,我们对于注意力机制的理解实际上已经差不多了,接下来迅速介绍两个数学运算,以此为从技术层面理解注意力机制进行铺垫。
第3步,快速理解矩阵乘法和向量内积两个数学运算。
1)矩阵乘法就是说两个矩阵相乘可以得到一个新的矩阵。比如:
向量内积的意思是,两个向量的元素先相乘,然后将相乘的结果相加,最终可以得到一个数。例如:
第4步,从技术层面去理解注意力机制,我们以“这老板真水”为例,假设一个汉字就是一个token 。
所以从输入输出的角度来看,注意力机制的输入是一个序列,输出是序列中每个元素生成的上下文向量。之所以叫“上下文向量”,是因为生成过程中计算了元素之间的注意力,以此将其他元素,也就是上下文,有权重地融入到当前元素最终生成的向量中,所以叫上下文向量。
注意力的计算不取决于元素的距离,模型因此不会遗忘。不管两个元素相距多远,我们都能够便捷地用一个元素的k向量与另一个元素的q向量进行向量内积运算,从而计算注意力,全然不受两个元素距离的影响,这让模型能够有效地捕捉长距离信息,不会再遗忘。
注意力能够进行并行计算,模型训练速度因此大幅提升。在上图中,我们虽依次计算token注意力,然而实际上,只要算好了每个token的k、q、v向量,计算两个token间的注意力便完全不依赖其他任何计算,所以能够同时计算所有元素对所有其他元素的注意力,这也就是并行计算。
因此,只要元素间注意力计算足够准确,我们就能实现“水”的上下文向量较多地融入“老板”,进而让机器正确理解这句话中“水”的含义。
那怎样才能保证注意力计算足够准确呢?问得好~!
K、Q、V三个矩阵决定注意力计算的准确性,它们是需经数据训练的参数。在上述过程里,最终生成的上下文向量是计算得出的,元素间的注意力是计算得出的,每个token的k向量(即key)、q向量(即query)、v向量(即value)也是通过K、Q、V矩阵与token相乘计算得出的。因此,决定整个注意力机制效果的根基在于K、Q、V三个矩阵的参数,这些参数正是模型需要通过大量数据来不断调整的地方。
这,就是
文章开篇指出,为解决翻译问题采用了编码器 – 解码器架构,使用这种架构并非罕见,稀奇之处在于,是用纯注意力机制来构建编码器 - 解码器,我们一起来看下:
需要注意的是,这张图仅画出了中的注意力层。它最大的创新之处是以注意力层为核心构建编码器 - 解码器,所以论文叫need。但真正的还有位置编码、归一化、残差连接、前向反馈等其他层。
我们还是从输入输出的角度来理解一下编码器-解码器。
编码器容易理解,其输入是要翻译的原文,字词间的关系经6层注意力层后被机器完全理解,最终输出为一堆数字,这堆数字随后被送往解码器。
解码器的输入为译文,译文会先经过一层注意力层,之后译文会和编码器送来的原文编码结果一同再经过一层注意力层,这样的过程循环6次,最终可得到输出token的概率分布,情况如下 。
模型认为每个词都有被输出的可能性,只是概率大小不同,这就是所谓输出token的概率分布。(在《从0构建大模型知识体系(3):大模型的祖宗RNN》中的《来,让我们给AI开记忆》对输出token的概率分布有详细介绍)
从这张图来看,模型认为“this”是最有可能成为输出的,所以要是我们的token采样策略是输出最大概率的token,那么模型就会输出“this”
https://img0.baidu.com/it/u=3707720769,300903316&fm=253&fmt=JPEG&app=138&f=JPEG?w=500&h=513
等下,好像屏幕前有人在问,你不是说是用来做翻译的吗,然后你又说这里还需要把译文喂给解码器,也就是说得在有译文的情况下才能翻译,我都有译文了还翻译个啥,这是在搞笑吗 ?
问得好!先快速回答,在训练阶段,我们确实会将原文和译文都输入进去,使其学会翻译,不过在完成训练后真正用它来翻译时,就只会给出原文了。这便引出了我们接下来要讨论的内容:训练数据如何准备?如何训练?训练后如何使用?
训练前:准备训练数据
翻译嘛,那自然是准备一堆原文及其对应译文的语料即可。比如:
训练中:输入语料对调整参数
每一对语料都会被用来调整模型参数,拿第一个语料对(我爱你,I love you)当作例子:
训练后:翻译
模型完成训练后便可投入使用来进行翻译。我们仅需将原文输入到编码器。以翻译“我爱你”为例,实际的翻译过程如下:
在实际进行翻译工作时,我们仅把原文输入到编码器中,解码器的输入是空白的。解码器每次输出的token都会被再次用作生成下一个token的输入。
好了,现在我们搭建的已能够用于翻译,接下来一个自然的问题是,我们要如何去衡量它翻译得好不好呢?
评价翻译好坏的标准:BLEU
现在被广泛采用的评估指标称作BLEU,也就是双语评估替补。BLEU的核心思想极为简单,即查看机器翻译的结果与人工翻译结果在“词语片段”上的重合程度。举例如下:
我们先来查看一个词(称作:1-gram)的重合程度。这需要先把机器翻译和人工翻译的结果,一个词一个词地进行拆分 。
然后我们逐个查看机翻拆分结果,看其是否存在于人翻拆分结果之中。也就是说,“the”是否存在于人翻的拆分结果里呢?存在;“cat”是否存在于人翻拆分结果里呢?存在;“is”是否存在呢?存在……机翻拆分后的6个词都存在,那么1 - gram精度就是6/6
然后再去看2个词(称作:2-gram)的重合程度,这需要先把机翻的结果两个词两个词地拆分,还要把人翻的结果两个词两个词地拆分 。
接着我们逐个查看机翻的拆分结果,看其是否存在于人翻的拆分结果里。也就是说:“the cat”是否存在于人翻的拆分结果中呢?答案是存在;“cat is”是否存在于人翻的拆分结果中呢?答案是存在;“is on”是否存在呢?答案是不存在……要是机翻拆分后的5个结果中有4个存在,那么2 - gram精度就是4/5
然后再去看称作3-gram的3个词的重合度,需要先把机翻的结果三个词三个词地拆分,还要把人翻的结果三个词三个词地拆分。
这回机翻的4个拆分结果里,只有“the cat is”和“on the mat”在人翻拆分结果当中,因此3 - gram进度是2/4
一般来说还会再看4-gram的进度,这里就不做演示了。
得到1 - gram到4 - gram的精度后,会对4种情况下的精确度进行加权,其具体计算公式如下,咱们感受一下就行。
其中:
这套公式会给出一个分数,这个分数在0到1之间,不过通常会乘以100表示为0 - 100,以符合百分制的习惯。分数越高,表明机器翻译和人工翻译越接近,质量或许越好。当然,BLEU只是一个机械性的评估,它没有考虑语义,所以有时高分翻译不一定通顺自然,低分翻译也可能有可取之处。它提供了一个参考标准,这个标准快速且量化,在模型开发迭代过程中十分常用。
最后在WMT 2014英德翻译任务上取得了28.4的BLEU分数,该分数比当时行业最佳分数高出2分以上。在8个GPU上训练3.5天后,在WMT 2014英法翻译任务上达到了41.8的单模型最高BLEU纪录。
的后裔:BERT与GPT
它本身是一个强大的架构,其强大之处在于,它是以注意力机制为核心构建的编码器和解码器,这些编码器和解码器能够让模型高效地理解外界输入,并且能够向外界输出 。
之后研究者们发现,将编码器单独拿出来进行优化,模型就不只是能理解待译原文字词间的关系这么简单了,于是有了BERT。
研究者们还发现,将解码器单独拿出来进一步优化,模型的功能就不只是局限于做翻译了,于是便有了GPT(没错,就是那个广为人知的GPT)。
页:
[1]