一、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的相关性。在这个过程中会进行向量计算并得到相关的结果2FFNFeed-Forward Neural Network前馈神经网络。听名字就知道一路向前不再回头。所以它是一种最简单的神经网络。它在transformer中起到的作用主要有三个即提供非线性能力用来解决自注意力机制的线性问题、信息的深度加工提升表达力即多头注意力并通过升降维进行信息的消化和提炼以及个体化的处理和存储模型知识大参数的处理分析来关联上下文这两层在完成后都会进行一次AddNorm即残差连接和归一化。前者用来处理神经网络中层数过多引起的网络退化的问题梯度消失或梯度退化而后者后来将数据进行“标准化”用来消除操作或对比时的不统一问题有点类似于把长度换算为国际单位而非英制或中国古代等。4. 解码器的输入解码器当然也需要Embedding它和编码器原理是一样的不再赘述。的输入数据主要有两部分即编码器的输出和目标序列的前缀。前者好理解后者就是上图中的右侧部分的最下面的那个Outputs。它代表着已经生成的结果序列。它意味着解码器生成下一部分序列既需要编译器的输出也需要已经解码输出的结果。有点拗口。举个例子把英文翻译成中文解码器在工作时不但需要编码器的输出结果也需要已经翻译好的中文作为前缀来进行下一步的翻译。但是一开始这部分是没有的则会固定为或表示序列开始相当于一个起始标志。5. 解码器位置编码此处的目标序列在训练阶段一般是已知的经过索引转换后可以转换为向量形式然后将其增加位置编码用来进行Token的位置信息描述。此向量可以作为解码器的输入除了继续维持位置信息词语的顺序外它还可以控制上下文中相关部分的距离关联度以及在交叉注意力时对齐数据序列保证输出的数据更加准确。6. 解码器解决码器主要有三层1具有掩码的多头注意力Masked Multi-Head Attention这是一种多头自注意力的带掩码的机制它是解码器的核心。即通过对已经解码输出的结果进行处理。解码器的自回归性需要将真正的已知输出序列获取而之后未出现的部分则通过掩码屏蔽。2多头注意力此处的多头注意力为多头交叉注意力用来限制未来生成的结果序列的可能性。当然也是通过计算进行概率控制的。举个例子已经生成的的结果是“今天天气是”那么后面的结果就必须消除非今天的天气内容。3FFN当然如编码器一样它们每次完成后也都进行一次AddNorm的操作请参考上面的说明。需要注意的是解码器是自回归的。所谓自回归就是一种序列生成任务其中模型在生成每个新元素时都依赖于之前已经生成的序列。意思很明确就是新数据的产生会使用到此之前的已生成的所有输出作为相关联的上下文信息。7. 分类器就是通过Liner线性层和Softmax来得到单词的最终概率去计算相关的索引并查询最终的数据8. 输出层这个也好理解就是根据最终查询得到的数据组成输出结果一段数据序列。上面的编码器和解码器等可以根据情况进行堆叠形成多层的神经网络这也是说transformer机制Scale方便的原因。四、自注意力机制注意力机制已经在上面分析了很多这里只是说明一下自注意力机制是一种解决问题的思想在transformer中分成了多头自注意力机制和多头交叉注意力机制以及带掩码的多头自注意力机制。它们起着不同的作用并应用在不同的层上这一点要明白。五、扩展transformer机制是大语言模型的基础通过此机制对海量数据的训练以及硬件厂商特别是GPU的大量堆叠计算对诸如GPT等大语言模型的出现提供了必然的条件。所以不要惊讶于chatGPT的智能它只是在传统处理数据的基础上向前迈进了一小步但这一小步非常重要。transformer机制不再执着于对复杂的RNN或CNN的追求而是换了一个思路使用注意力机制来解决问题。就如数学解题的思路传统的可能又复杂又不容易说明但使用最新的数形结合的方式则可以迅速的问题剖析的清楚明白。六、总结本文只是对transformer机制的一个整体的自我理解的概括说明为初步学习大模型者扫清认知上的障碍。如果想从此深入展开对机制内部的学习可以查看相关的论文和资料。在后续的AI深入学习中也会对其进行内部机制的探讨。