AI和大模型——Transformer
一、Transformer介绍
人类在理论语言时,并不会单纯的使用一个字或一个词去探究这段语言说了什么。而是需要把这个字或词放到一整个的上下文环境中进行理解。比如网上常见的“汉语等级”考试中的语句,往往都需要在语境内分析,同样的话,可能它的意思完全相反的。
但在传统的中文环境中,是没有词这个概念的(当然,不能拿宋词来说事)。很多人可能觉得反常识,其实现代中文中词这个概念的引入时间并不长。从手头的资料看,应该是章士钊在1907年才在《中等国文典》中引进的。说这个事的目的在于,给大家提个醒,中文的transformer和英文的transformer处理手段其实是有不同的。
拉回本文内容,2017年,谷歌大脑团队发表了一篇论文《Attention Is All You Need》(注意力就是你所需要的一切)。它的突出的一点其实就是把原来复杂的单纯的堆叠神经网络即增加处理深度和宽度变成了注意力相关,也就是说刚刚提到的上下文关联程度。从人类理解语言的角度去理解和处理问题。有点类似于中小学生提取中心思想的味道。
传统的RNN更倾向于对上下文的参数传递,是一种被动的、隐性的处理过程,而transformer机制中的注意力机制则一种如同人类一样对上下文进行处理、分析和汇总的过程,它是显性的、主动的。传统的上下文处理象一个优秀的老师不断的教诲知识而注意力机制则象一个博士生去理解和学习知识。
二、原理
让我们从一个例子开始说明transformer机制的原理。假如正在处理一段数据(可以是语音、文字或者其它),对人来说,可以通过大脑进行综合的上下文推演,从而理解数据的内容并进而推理出实际的意义。这段话怎么理解呢?大家是否看过二战密码的相关电影《模仿游戏》。其实就和那个非常类似,密码就可以理解成另外一种更加复杂的语言,然后将其翻译成自然语言。
transformer的原理核心就是注意力机制,也是尽可能的倾向人类的理解思路,特别是电影中的图灵处理问题的思维方式靠近(当然,现在还远远不及)。所以其最初就是朝着对自然语言的处理去的,这也表明了为什么说是向人类思维靠近的原因。transformer机制使得模型可以有效的处理长距离上下文的依赖(多头注意力,类似于中心思想抽取的过程),而且其设计完全支持并行处理(GPU的应用的天堂),可扩展性强(Scaling Law),所以提供了更强大、更优异的性能。这也是为什么ChatGPT一出来就惊艳众人的原因。
更详细的内容可以去下载论文原文去学习:
“https://proceedings.neurips.cc/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf”
三、框架和流程
transformer机制的框架结构也相当复杂,虽然可以将其简单的划分为“编码器”和“解码器”两部分,但这样看起来,更像是对普通大众的知识普及。对于发者来说,还是要更深入一些,下面看一下论文中的架构图:
图的左侧模块对应着编码器,右侧对应着解码器。但实际上,更好的分割方法是按照流程来划分:
- 输入层
这个很好理解,正如人处理问题一样,需要把问题的相关数据得到才进行处理。但对transformer机制来说,它是不懂人类的语言的。大家可能立刻会想到用编码啊?非常正确。但如果使用普通的编码,如文字的UTF-8或Unicode等编码会有一个问题,这些码值只代表了文字本身,无法体现它们在上下文中的关系也就是说,没有任何语义的相关信息。那么怎么处理呢?首先要对输入的文字进行分词(上面的中文的词说明就在这里),然后将其转成Token,这个假设大家已经知道了。再将Token转成一个向量(embedding机制),这个向量比一般理解的向量维度要大的多(一般是512或1024,想想稀疏矩阵),所以会用矩阵来表示。但在学习理解时,它给出的维度一般也不大。 这些维度就体现了Token本身以及与其它Token间的关系,理论上讲,这种关系越密切,它们越相关。 - 编码器位置编码
即PE,在transformer机制中,一个重要的特点就是并行。但并行就存在一个问题,乱序。在普通的编程中一般使用序号来解决问题。同样,在transformer机制中也可以引入“序号”,不过为了更好的适应环境,此处的序号不是普通的ID而是一个向量。通过这个向量,让所有参与关联的计算都可以明确当前Token在上下文中的位置所在。 - 编码器
编译器主要有两层,即:
1)多头自注意力
多头自注意力是transformer中自注意力机制(一种解决问题的思想)的具体实现的方式,即从多个角度去关注相关联的上下文信息。可以理解为从输入序列的不同位置来(即不同的Token)来查看它们与当前Token的相关性。在这个过程中会进行向量计算并得到相关的结果
2)FFN
Feed-Forward Neural Network,前馈神经网络。听名字就知道一路向前,不再回头。所以它是一种最简单的神经网络。它在transformer中起到的作用主要有三个即提供非线性能力(用来解决自注意力机制的线性问题)、信息的深度加工(提升表达力即多头注意力并通过升降维进行信息的消化和提炼以及个体化的处理)和存储模型知识(大参数的处理分析来关联上下文)
这两层在完成后都会进行一次Add&Norm即残差连接和归一化。前者用来处理神经网络中层数过多引起的网络退化的问题(梯度消失或梯度退化),而后者后来将数据进行“标准化”用来消除操作或对比时的不统一问题(有点类似于把长度换算为国际单位而非英制或中国古代等)。
4. 解码器的输入
解码器当然也需要Embedding,它和编码器原理是一样的,不再赘述。的输入数据主要有两部分即编码器的输出和目标序列的前缀。前者好理解,后者就是上图中的右侧部分的最下面的那个Outputs。它代表着已经生成的结果序列。它意味着,解码器生成下一部分序列既需要编译器的输出也需要已经解码输出的结果。有点拗口。举个例子,把英文翻译成中文,解码器在工作时不但需要编码器的输出结果,也需要已经翻译好的中文作为前缀来进行下一步的翻译。但是一开始这部分是没有的,则会固定为或,表示序列开始,相当于一个起始标志。
5. 解码器位置编码
此处的目标序列在训练阶段一般是已知的,经过索引转换后,可以转换为向量形式,然后将其增加位置编码用来进行Token的位置信息描述。此向量可以作为解码器的输入,除了继续维持位置信息(词语的顺序)外,它还可以控制上下文中相关部分的距离(关联度)以及在交叉注意力时对齐数据序列保证输出的数据更加准确。
6. 解码器
解决码器主要有三层:
1)具有掩码的多头注意力(Masked Multi-Head Attention)
这是一种多头自注意力的带掩码的机制,它是解码器的核心。即通过对已经解码输出的结果进行处理。解码器的自回归性需要将真正的已知输出序列获取而之后未出现的部分则通过掩码屏蔽。
2)多头注意力
此处的多头注意力为多头交叉注意力,用来限制未来生成的结果序列的可能性。当然也是通过计算进行概率控制的。举个例子,已经生成的的结果是“今天天气是”那么后面的结果,就必须消除非今天的天气内容。
3)FFN
当然,如编码器一样,它们每次完成后也都进行一次Add&Norm的操作,请参考上面的说明。
需要注意的是,解码器是自回归的。所谓自回归,就是一种序列生成任务,其中模型在生成每个新元素时都依赖于之前已经生成的序列。意思很明确,就是新数据的产生会使用到此之前的已生成的所有输出作为相关联的上下文信息。
7. 分类器
就是通过Liner(线性层)和Softmax来得到单词的最终概率,去计算相关的索引并查询最终的数据
8. 输出层
这个也好理解,就是根据最终查询得到的数据组成输出结果,一段数据序列。
上面的编码器和解码器等可以根据情况进行堆叠,形成多层的神经网络,这也是说transformer机制Scale方便的原因。
四、自注意力机制
注意力机制已经在上面分析了很多,这里只是说明一下,自注意力机制是一种解决问题的思想,在transformer中分成了多头自注意力机制和多头交叉注意力机制以及带掩码的多头自注意力机制。它们起着不同的作用并应用在不同的层上,这一点要明白。
五、扩展
transformer机制是大语言模型的基础,通过此机制对海量数据的训练以及硬件厂商特别是GPU的大量堆叠计算,对诸如GPT等大语言模型的出现提供了必然的条件。
所以不要惊讶于chatGPT的智能,它只是在传统处理数据的基础上向前迈进了一小步,但这一小步非常重要。transformer机制不再执着于对复杂的RNN或CNN的追求,而是换了一个思路,使用注意力机制来解决问题。就如数学解题的思路,传统的可能又复杂又不容易说明,但使用最新的数形结合的方式则可以迅速的问题剖析的清楚明白。
六、总结
本文只是对transformer机制的一个整体的自我理解的概括说明,为初步学习大模型者扫清认知上的障碍。如果想从此深入展开对机制内部的学习可以查看相关的论文和资料。在后续的AI深入学习中,也会对其进行内部机制的探讨。
更多推荐



所有评论(0)