Transformer模型详解
前言
Transformer模型现在已经是大语言模型搭建的主流框架,其由谷歌团队在2017年发表的论文《Attention is All You Need》[1706.03762] Attention Is All You Need (arxiv.org)提出,论文相关的Tensorflow代码:tensorflow/tensor2tensor: Library of deep learning models and datasets designed to make deep learning more accessible and accelerate ML research. (github.com)。
本文的目的是在弄懂Transformer模型结构、底层逻辑的基础上,进一步理解当前大语言模型的主要技术架构。
参考链接:
Transformer模型详解(图解最完整版) - 知乎 (zhihu.com)
十分钟理解Transformer - 知乎 (zhihu.com)
【Transformer模型】曼妙动画轻松学,形象比喻贼好记_哔哩哔哩_bilibili
The Annotated Transformer (harvard.edu)
The Annotated Transformer的中文注释版(1) - 知乎 (zhihu.com)
The Annotated Transformer(译) - 知乎 (zhihu.com)
【LLM】万字通俗讲解大语言模型内部运行原理 (qq.com)
Large language models, explained with a minimum of math and jargon (understandingai.org)
自注意力(Self-attention)清晰解释 (qq.com)
一、Transformer模型整体结构
Transformer是一个利用注意力机制来提高模型训练速度的模型,因其适用于并行化计算以及本身模型的复杂程度使其在精度和性能上都要高于之前流行的循环神经网络。
标准的Transformer结构如下图所示,是一个编码器-解码器架构,其编码器和解码器均有一个编码层和若干相同的Transformer模块层堆叠组成。
1.1 Encoder-Decoder结构
神经网络均可理解为是一个黑箱模型,Transformer的黑箱主要由两部分组成:Encoders和Decoders。以文本翻译任务为例,输入文本会先经过Encoders模块(编码器),该模块对文本数据进行编码;编码后的文本数据再被传入Decoders模块(解码器),该模块对文本数据进行解码得到最终的翻译结果。
上述的编、解码模块都是由多个编码器组成的,经典的Transformer模型一般都是6个编码器和6个解码器。在编码模块,每个编码器的输出作为下一个编码器的输入;而在解码模块,则是每个解码器的输出结合整个编码模块的输出作为下一个编码器的输入。
1.2 编解码器组成部分
每个编码器内部又可以分为“self-attention”和“前馈网络”两个部分,每个解码器则分为“self-attention”、“编解码-attention”和“前馈网络”三个部分。
二、模型输入
原始文本 → 令牌化(Tokenization) → 嵌入(Embedding) → 模型
Transformer模型的输入是文本经转换(embedding/嵌入)后的向量矩阵,矩阵则是由输入文本中每个单词的表示向量组成,表示向量由每个单词的词向量和位置向量相加得到。
2.1 词向量
原始输入文本经Word2Vec等方法进行embedding后的得到的长列表称为单词的词向量。例如单词“cat”的词向量可以表示为:[0.0074, 0.0030, -0.0105, …… , -0.0396, -0.0998, -0.0796, …… , 0.0002]。完整向量长度为300(具体使用的维度根据实际情况确定),点击该链接可以查看完整内容:Semantically related words for “cat_NOUN” (nlpl.eu)
对于使用词向量来表示单词的方法,我们可以类比于经纬度坐标的使用,经纬度构成的向量可以表示一个地点的具体位置,通过计算两个向量的距离或相似性可以用于判断两个地点距离的远近。如:
- Washington DC is at [38.9, 77]
- New York is at [40.7, 74]
- London is at [51.5, 0.1]
- Paris is at [48.9, -2.4]
我们可以通过38.9接近于40.7以及77接近于74来判断纽约离华盛顿特区很近。同样的道理,巴黎靠近伦敦,但巴黎离华盛顿特区很远。
语言模型采用类似的方法:每个词向量代表了虚拟的“词空间”中的一个点,具有更相似含义的单词会被放置在彼此更靠近的位置。
例如,在词向量空间中,最接近"cat"的词包括"dog"、“kitten"和"rabbit”。
使用实数向量(而不是像"C-A-T"这样的字母序列)来表示单词的一个关键优势是,数字使得可以进行字母无法实现的操作。
单词太复杂,无法仅用二维空间表示,因此语言模型使用具有数百甚至数千维度的向量空间,如基础Transformer模型使用的512维,GPT3中的Transformer使用的是12288维。人类无法想象具有如此多维度的空间,但计算机完全能够利用矩阵运算对其进行推理并产生有用的结果。
2.2 位置向量
上述的词向量实现了单词的表示、单词间相似性度量等等,但仍无法解决的一个问题是:单词通常具有多个含义,具体的词义取决于上下文。单词在语句中出现的位置对语义理解非常重要,而且Transformer与循环神经网络不同,它不能利用单词的顺序信息,而是使用文本的全局信息。因此,还需要引入位置向量来表示单词在语句中的相对或绝对位置。
位置向量(Positional Encoding, PE)利用如下公式进行求解:
P E ( p o s , 2 i ) = s i n ( p o s / 1000 0 2 i / d ) PE(pos,2i)=sin(pos/10000^{2i/d}) PE(pos,2i)=sin(pos/100002i/d)
P E ( p o s , 2 i + 1 ) = c o s ( p o s / 1000 0 2 i / d ) PE(pos,2i+1)=cos(pos/10000^{2i/d}) PE(pos,2i+1<