简单分析下Transformer架构,即大语言模型底层基于什么样的架构训练出来的
在进行训练之前,首选需要进行3个步骤
1、把文字数字化
2、把数字向量化 Word Embedding
3、位置信息向量化 Position Encoding
然后将Input Embedding+Positional Encoding 得到的数据才是给模型喂进去的数据
先分析三步
第一步:Tokenization(将一个输入句子转换为格式的数字表示)
分词(Tokenization)是指将文本分割成更小的单位,称为“token”,这些单位可以是单词、子词、短语或字符。将短语分割成更小的片段有助于模型识别文本的底层结构,并更高效地处理文本。
举个例子:当我们把中文喂給模型去训练的时候,那么給模型喂的并不是中文而是一个数字,这个数字怎么得来,是先建立一个词典然后把每一个可能出现的文字和一个独立的数字一一对应上,比如中文可能有7万个出现的文字,词典里就有7万条记录,可能是1、2、3…到7万,再加上各种标点符号可能是一个非常大的词典;
比如要喂给大模型训练的字符串为 "tiktoken is great!"
经过encode后转换为:[83, 8251, 2488, 382, 2212, 0]
第二步:Word Embedding (词向量)
首先,給定一篇文章后,先构建一个包含词汇表中所有字符的查找表。本质上,这是一个矩阵,其中填充着随机初始化的数字。
如下图,鉴于拥有的最大令牌数为100069,并且考虑到64维(原始论文使用的维度为512维,用表示),则查找表成为一个100,069x64的矩阵,称为令牌嵌入查找表。表示如下(只截取部分,横轴是从0~64):(词汇表图)
每一行是训练集中的文字,每列代表一个维度(维度这个概念在LLM中比较重要),目前,可以将“维度”视为字符的一个特征或方面。在上面的情况下,已指定了64个维度,这意味着我们可以以64种不同的方式理解字符的文本含义,例如将其分类为名词、动词、形容词等
在Transformer架构中,通常会同时处理多个输入序列(通常称为多个批次,可以同时喂给多份样本(batch),更好的利用GPU和内存)。例如将批次大小(batch_size)设置为4。因此,将同时处理4个随机选取的句子作为输入。
假设一次性喂4个批次,每一个批次样本的长度16(16个token),每个字有64个不同的维度,就会得到一个4*16*64的三维矩阵
图中每一行的每一列都是一个文字,接下来要将其旋转过来(即:横轴变纵轴),那么会得到一个16行矩阵,那么根据索引可以去词汇表里面找到对应的行,把其所有的维度拿出来,这时候得到一个筛选过的16*64的矩阵,这个矩阵就叫:Input Embedding(如下图,只截了部分图,完整图,横轴有是从0~63,共64个维度)
一共有4个批次,那么就有4个类似上面的16*64的矩阵,即得到一个4*16*64的矩阵
第三步:Positional Encoding (位置信息)
由于我们的模型不包含递归和卷积,为了使模型利用在序列的顺序中,我们必须注入一些关于序列的相对或绝对位置的信息序列中的记号。为此,我们在输入嵌入中添加了“位置编码”
位置信息的矩阵需要与嵌入向量的矩阵保持一致(也是一个16*64的矩阵)、
计算公式如下:
经过计算后得到的位置信息如下图:
得出位置信息(Position Embedding)后,与第二步得到的嵌入向量(Input Embedding)相加得到矩阵(matrix),上面例子中分了4个批次,所以分别与Position Embedding相加后会的到4个矩阵(matrix),形状是16*64 ,这就是要喂给模型的数据(这里的到的矩阵在下面将会作为输入使用,假设矩阵为X 此处注意X会在下面继续使用到)
至此我们得到了输入模型的向量,接下来将进入Transformer的核心(Transformer Block),
Transformer Block有多层,具有创新性的最重要的部分是上图中橙色部分(Masked Multi-Head Attention)多头注意力机制,然后向上经过Layer Norm、Feed Forward、Layer Norm对外输出;这个过程是一个不断循环的过程(有多层Block的话就循环多次)
Multi-Head Attention的计算过程: 通过前面讲述在第三步结束后得到矩阵X,将X向上输入,将X乘以权重矩阵(如下图Wq、Wk、Wv),蓝色部分的Wq、Wk、Wv是需要不断训练随着学习的不断进行,Wq、Wk、Wv不断调整更新以达到预测效果(第一次的值都是随机数,其大小是,在本例中是64维,即64*64大小)
得到Q、K、V后(由于Wq、Wk、Wv不同,所以Q、K、V不同),首先Q、K放在一起又做一次注意力机制(也是矩阵相乘),可以看到Q、K、V分成多份,即多头注意力机制(Multi-Head Attention)
具体分法:Q、K、V维度都是一样的(例子中是64),如果将其分成4个Head,即每份是16*16,然后分别用每一份Q乘以每一份K(矩阵相乘 矩阵相乘讲解视频),作用就是计算两个矩阵所代表句子的相似度
计算出相似度后,向上又做了Scale(按比例缩小的Pot-Product注意力机制)因为Q、K矩阵相乘后,有的值会变得很大、有的值会变的很小,为了缩小比例所以同时除以一个数(即矩阵维度,例子中为64),将差距缩小,以方便后续计算
Scale做完之后,向上继续做Mask,在给机器训练的时候,将给机器第一个文字的时候,机器并不知道后面的一个字是什么(如果预测对给一个很高的分数,如果预测的不对那么就需要更新参数返回去重新训练),所以在训练的过程中不能让数据集在当前的步骤中知道下一个文字的相似度,要不这个相似度设置为0(也就是当前步骤只能知道自己与前面步骤的相似度),这样的话才能让继续继续进行学习,通过学习预测之后进行更新这个数字
做完Mask这步之后就得出一个矩阵,对角线将其分开(如上图),右上面部分都是0概率,左下方是有数据的概率,然后再做一个Softmax,Softmax可以理解为把数值转换为概率值,在Softmax之前得到的都是数值(有的高、有的低)要将其转化为概率,一行的概率和为100%,这一步之后就得到一个初步的这段话对其他每一个字的一个概率值,然后将其与原始的数据V,再做一次矩阵相乘(看上面图Sacled Dot-Product Attention的右半部分),这一步切分为几个Head就做几次矩阵相乘,得出一个进一步的概率值(多份,与分几个Head有关),然后将多份维度重新拼在一起Concat(见下图右侧红色框)
Concat之后又的到一个矩阵,然后让其再乘以一个可以学习的矩阵(权重矩阵),即得到Multi-Head Attention向上输出的结果。(本例中到此得到的结果是一个16*64的矩阵,即学习更新过的一个矩阵 假设其结果为Y,此处注意Y会在下面继续使用到)
至此Multi-Head Attention步骤完成
接下来将Multi-Head Attention得到的矩阵Y与原始数据残差连接(见下图中S1),即将原始数据X与Y进行相加(相加的原因是Y是计算完之后的概率值,其结果要比原始数据X小很多,加上原始数据X,会进一步缩小矩阵之间的绝对值差距)得到Z ,继续向上添加Norm(Norm作用与Scale相似就是将数据的缩放,其比例不变,但是差距会变小),接下来进入到Feed Forward(典型的神经网络 神经网络学习视频),然后再将Z与Feed Forward结果也进行了残差链接(见下图S2)在进行一次Norm (缩放),最后输出结果Output,至此一个完整的Transformer Block模块结束
Transformer Block的结果会进入到第2块,同样的Transformer Block流程会再来一次,直到把所有的块(见下图Nx)运行完之后,会进入到Linear(线性变化层,即:将一个向量在另外一个向量上做投影)
Linear层输出的也是一个矩阵,它是Transformer Block的结果Output与原始词汇表矩阵相乘,这个矩阵就代表它所预测的单词在词汇表里每一个单词都給分配一个概率,然后所有的概率加起来等于1(那么必然有高概率和低概率),高概率对应的词就是预测的下一个要出来的词,预测完之后,拿回来跟我们所知道的数据集里面的真实数据做比较,看起相差多少,相差多了告诉模型更新下预测(提高或降低一些),重新学习,不断的循环这个过程。
以上就是LLM基于Transfomer架构的整个学习过程