跳过正文

·176 字·1 分钟
Chuck Chan
作者
Chuck Chan
分享技术、思考与生活

1. Transformer模型
#

在深度学习序列建模的发展中,RNN、LSTM等传统模型因难以捕捉长距离依赖、无法并行计算的瓶颈,难以满足大规模数据处理需求,Transformer模型应运而生。2017年,Google Brain团队发表《Attention Is All You Need》,正式提出这一纯注意力架构,打破循环结构的局限;历经多年演进,它从机器翻译任务起步,衍生出BERT、GPT等经典模型,如今已成为所有现代大模型的核心基础,支撑着多模态、千亿级参数模型的发展,奠定了当前人工智能产业化的技术根基。

2. 模型架构
#

Transformer模型的架构图如下所示,总共可以分成6个步骤

  1. Tokenization:文本变成token
  2. Embedding:token变成向量
  3. Positional Encoding:在向量中加入位置信息
  4. Encoder & Decoder:深度理解语义
  5. Linear:生成“下一个字”的权重分布
  6. Softmax:将权重分布转换成概率分布

2.1 Tokenization
#

第一步要做的是Tokenization,即把一段文本(这里应该叫输入更合适,但为了好理解还是用文本吧),变成一组Token。⽐如:

  • “subword"这个词,可以拆分成"sub"和"word"两个⼦词
  • “encoded"可以拆解为"encod”+“ed”
  • “encoding"可以拆解为“encod”+“ing”

使用OpenAI的tiktoken对“海南麒麟瓜”进行词元化,输出如下:

可见通过GPT-3.5模型拆分出来的token跟中文汉字的UTF-8编码并不是一一对应的。

在Transformer模型中,输出其实并不是在一次性生成的,而是每轮计算都输出一个token,所以对大模型来说token总数越少,计算量越少。例如上面“麒麟”对应6个token,需要6轮计算才能输出这个词,但如果“麒麟”只对应一个token,那就只需要1轮计算就能输出这个词(事实上国产模型会对汉字进行优化,因为麒麟这两个词几乎每次都是一起出现的,所以把他们视为一个token似乎也是OK的)。

2020年的GPT-3,Token词表:50257个Token 2023年的GPT-4,Token词表:100256个Token 2024年的Llama 3,Token词表:128000个Token

对不同的大模型来说切分token的方式可能不一样,但他们的目标都是尽可能减少token总数

2.2 Embedding
#

Embedding的目的是将token变成向量,也就是说把我们的token用某个向量来表示。那么,如何将一个token表示成向量?

在日常生活中,我们常用的汉字大概3000个,那我们制作一张3000*3000的映射表,每个汉字对应空间中的一个点:

这种方式就叫这种方式叫one-hot编码,并且这样做似乎没有问题,因为token的总数是固定的,只要维数够大,我们可以把所有token都放到这个表里。

但仔细思考,one-hot会出现下面的这些问题:

  1. 维度过高,过于稀疏:容纳3000个汉字就需要30003000的映射表,容纳5000个汉字则需要5000 5000的映射表
  2. 没有体现出“距离”概念:如果两个字之间的意思相近,那两个对应的向量求“距离”的时候,就应该更相近
  3. 没有数学或逻辑关系:最好能满足 国王 - 男人 + 女人 = 女王

为了解决这些问题,我们需要加上神经网络,每个token都能通过这个神经网络处理Embedding模型得到一个对应的向量。不同的模型,对应的维度不同:

2017年的经典Transformer,向量维度:512维 2018年的GPT,向量维度:768 2019年的GPT-2,向量维度:1600 2020年的GPT-3,向量维度:12288维 2024年的Llama 3,向量维度:16384维

以GPT-3为例子,“我”这个字,转成向量是【7, 4, 6, -2, 11, -1.2, 6.3, 0.56, ……】总计12288个坐标数值

2.3 Positional Encoding
#

一句话的语义除了取决于文字外,还受文字位置的影响,例如下面两句话:

  • “猫咬了狗”
  • “狗咬了猫”

两句话的文字完全一样,因为每个字的位置不同,而得到了完全不同的语义。假设“猫咬了狗”这句话经过Tokenization跟Embedding之后,得到四个向量,至此还需要再加上四个他们的位置向量,组合成一个新的向量。

input[0] = embedding[0] + position[0] input[1] = embedding[1] + position[1] input[2] = embedding[2] + position[2] input[3] = embedding[3] + position[3]

这里position向量表示的是这个token在整句话中的位置(例如“狗”在这句话的第4个位置,且是这句话的宾语,),另外,position向量跟embedding向量拥有相同的维度,如在GPT-3中都是12288维的,位置编码的信息也是通过神经网络处理后获得的。

2.4 Encoder & Decoder
#

Encoder & Decoder 是编码器及解码器,其只要目的是深度理解语义,大模型中的大部分计算都集中在这一步骤中。

Encoder
#

Encoder的作用是通过对输入序列进行深度编码,提取并融合全局上下文特征,生成包含完整输入信息的特征向量),同样地,当两个语义相同的文本经过Encode后得到的两个向量,他们的应该是相近的。

如何融合上下文的信息,让一堆向量融合成能代表这段话的一个向量?以下面这段文本为例

这段文本约有650个汉字,大概转换成1300个token。大模型会循环遍历每一个token,在遍历所有token过程中将这个token设置成中心主题词,然后再跟其他的1299个token进行关联,例如当遍历到“问题”这个词的token时,跟“外遇”、“分割”、“伤心”、“失望”等其他词的token做关联及计算权重。这些词大概率跟“问题”这个词关系较大,所以权重较高,当然对应的“视频”、“照片”等关联性较小,权重较低。这样根据权重关联聚合后,“问题”对应的token就会得出一个新的向量,这个向量包含了更加丰富的且与上下文关联的语义信息。

遍历完后就得到了1300个这样得向量,这就完成了一轮聚合。这样的聚合,需要做N轮,经过每一轮之后,每个token的语义都会更加丰富,最终会输出1300个语义非常丰富的向量,这些向量会交给下一步解码器作为全局上下文。

Decoder
#

Decoder是以已生成的 token 序列为基础、Encoder的全局上下文为参考,逐一生成下一个 token 的概率分布,最终完成序列的生成任务。

​ N轮后…

注意这里的输出实际上输出的是对应的向量,还需要经过并不是真正回答的文字。

Encoder一般用来做分析,Decoder一般用来做生成,但是现在最新的大语言模型几乎都是Decoder Only架构。

2. 4 Linear & Softmax
#

Linear
#

在Transformer模型中,Linear 层(线性层) 是特征向量到目标结果的 “桥梁转换器”,目的是固定维度特征向量(比如 128 维 / 768 维,模型内部统一维度),映射成和模型词表维度一致的向量。

例如上面的Decoder生成的第一个字“法”时,实际上生成的是一个特征向量,这是向量是模型内部的 “抽象数据”,没法直接对应文字。Linear需要做的就是将向量与一个N * 12288维的表做点乘(N为模型的token总数),得出的一个N * 12288维的新表,这个新表里的维度值就是对应词表中一个字成为下一个 token 的 “原始得分”

Softmax
#

Softmax 的作用就是把 Linear 层的 “原始得分” 变成 “归一化的概率”,让模型能清晰判断 “哪个词最该被生成。Softmax 做两件事:

  1. 先给每个得分做指数运算e^得分):放大高分、压低低分(比如 98→e^98,23→e^23,5→e^5,差距会变得极大)
  2. 再用 “每个得分的指数值 ÷ 所有得分指数值的总和”:得到每个 token 的概率,且所有概率加和 = 1

整体流程
#