人人都能懂的Transformer架构

Transformer中文图()

Transformer架构用做样本数据的训练以及训练预输出文字的预测,在训练的时候输入一些样本的数据,然后把这些数据第一步转换成对应的数字(Input Embedding),有了文本对应的数据再加入位置信息编码Position Embedding(每一个数字在原本文字中的位置是第几位),有了数字代码的文字和它的位置信息后,将Input Embedding+Position Embedding相加得到矩阵(Matrix); 然后将矩阵copy成三份,分别給语义学习关系这个模块,在语义学习关系模块里面进行一系列的运算之后,得出来一个矩阵(这个矩阵就是文字长度*文字长度的一个矩阵),矩阵里面的每一个值都是数字,这个数字代表了每一个文字对应其他文字的语义关系,这个数字越高代表了这两个文字的关系越近,有了这个矩阵数字之后(因为做的是乘法,所以大的数据越来越大,小的数据越来越小),将数字进行缩放,把它们的空间拉的近一些,然后给了经典的神经网络层(机器学习训练中的一个经典架构,里面含有很多隐藏层),出了神经网络层后数字又被打散了(大的非常大,小的非常小),再进行一次缩放;经过以上步骤就完成了一个Transformer块的计算;由于有多个块,出来一个后,再返回进行第二次的计算,第二次结束之后再返回进行下一次的计算,经过多次的循环之后,最后一次输出的结果,把结果给到全部数组列队训练出来的数据,往全部数组列表里面填,最终会的到一个全数组列表,这个数字列表里面的每一个数字就是这种概率,然后将这种概率转换成百分比概率的形式,每行总和为100%,每一个数字的值就是百分比,选百分比最高的那个数字就是模型预测的语义关系最近的那个数字

简单来说:Transformer结构的大语言模型,就是在不断的通过文字转换成数字进行关系学习,神经网络就是记录到这些学习到的权重的过程,然后输出一个概率最高的字,往复不断的循环这个过程就形成了大语言模型

一:Tokenization (文字转数字,Token化)

两个重要的概念, 

1、input(样本文字)

2、token(转换成的数字)

在语料库里就是大量的学习样本里可能有很多不同的文字,那么每一次单独抽出来连续的一段字用作当前这次训练的样本,然后随机每次抽取连续的同等长度的不同字进行训练。

文字转成数字有很多种方法,比较常用的是Tiktoken, (在线Tokenizer

通过这一步有了数字表达形式(也就是Token表达形式)后,还要再做一次嵌入向量的变换

二:Embedding数字变矩阵

把训练样本文字转成数字(也就是token化),这一步需要将转成的数字做一次嵌入向量的转换

embedding lookup table 向量查找表

目前Open某AI的cl100k_base的整体词汇量是100256。每一行代表一个文字(比如:0代表感叹号...100255代表Conveyor)。实际训练并不是将这些0~100255数字給模型去训练。在后续的训练中要做很多的乘法,为了避免大的更大小的越小,所以定义能够代替这些数字的更小的数字来代表这些token(如上图),至于为什么要定义很多列原因是语言的魅力就在于语境和语义有多种不同的关系(通过不同的多个句子的子token,来代表不同语义当中的意思),这就是定义d_model参数(超参数)的意义,代表在大模型训练多少重不同语境下的语义关系;如上图有512个不同的语义关系。这样就有了一个100256*512的一个矩阵,这个表在训练之前只建立一次即可。使用方法:当每次抽取样本训练的时候,样本可能对应了不同的token,把token对应的每一行抽出来(如下图:从100256*512的矩阵中,分别将对应样本token对应的的每一行取出来),至此样本文字已经转换成一个content_length*d_model的一个矩阵Embedding vector,每一行代表一个token每一列代表这个token在不同语境中下学习的数字

三:位置信息编码Position Encoding

将Input Embedding喂給模型(Transformer架构)之前还需要提供位置信息编码(让模型知道每一个字分别出现在第几个位置),为什么一定要位置信息:如果样本中有同样的字,对应的是同样的一组token,如果不给位置信息,模型是不是知道同样的字分别出现在什么位置,模型在学习的时候就会混淆这两个字分别对应其他文字的关注度是多少;加入位置信息就是让模型在训练的时候即知道它的语义信息同时也要知道当前的这个训练文字出现在训练样本中的第几个位置,也就是将语义信息和位置信息合在一起时给模型去做训练

位置

加入位置信息希望模型知道什么,总结就是三点:

1、每个单词的token都能包含它的位置信息

2、模型可以看到文字之间的“距离”

3、模型可以看懂并学习到位置编码的规则

embedding+position

上图就是Embedding vector+Position vector的示意图。 

\alpha 、如果样本大的话,位置信息的数字就会很大,在做多头注意力机制的时候(主要是乘法),那么大的会越来越大,小的会越来越小,这样会造成原本关注度很高的两个字由于初始化位置比较靠前而导致乘积很小,会让模型无法高效的学习到真正的语义关系。为了屏蔽这个问题需要把位置信息转换为1~-1之间不重复的连续数字来组成位置信息

\beta 、由于位置信息在不同维度上同样的位置是同样的值,这样会让模型学习不到同样的一个文字在不同维度下的语义信息的差别,所以在不同维度下将位置信息也要变成不一样的

总结来说就是无论在纵向还是横向上,需要让位置信息编码的数值要在-1和1这个区间之内,同时要让所有的位置信息数字不能重复并且有一定的趋势和关联性

那么是如何实现的内,根据论文《Attention is all you need》可知,巧妙的应用了正弦Sin和余弦Cos函数

计算位置公式
计算后的位置信息 Position vector
位置趋势图
embedding+position=matrix

经过以上步骤后,生成的数字矩阵(matrix)就是往模型里面输入的训练样本,以及后续所有的计算都是基于这个matrix

Transformer Block

在进行下一步之前,先了解下

一、注意力机制(Attention)的本质

首先需要明确一个点,注意力模型从大量信息Values中筛选出少量重要信息,这些重要信息一定是相对于另外一个信息Query而言是重要的,也就是说要搭建一个注意力模型,必须得要有一个Query和一个Values,然后通过Query这个信息从Values中筛选出重要信息(计算Query和Values中每个信息的相关程度)

通过上图(Transformer Block图)可知,Attention通常可以进行如下描述,表示为Query(Q)和key-value pairs(把Values拆分成键值的形式),映射到输出上,其中query、每个key、每个value都是向量,输出是V中所有values的加权,其中权重是由Query(Q)和每个key计算出来的:

查询对象Q,被查询对象K(也就是找出K里面的关键点)

step1: 计算Q、K相似度

Q , K = K_{1} ,K_{2} ,K_{3} ...K_{n} ,通过点乘的方式计算Q和K里面每一个事物的相似度,就可以拿到Q和K_{1}  的相似值s_{1} ,Q和K_{2}  的相似度s_{2} ... Q和K_{n}  的相似度s_{n}

step2:做一层softmax,进一步归一化

softmax(s_{1} ,s_{2} ... s_{n} )就可以得出概率(a_{1} ,a_{2} ...a_{n} ),进而就可以找出哪个对Q而言更重要;

step3:针对计算出来的权重,对V中所有values进行加权求和计算,得到Attention向量

在这一步得到Q与V点乘概率后再进行一次汇总

V= (V_{1} ,V_{2} ...V_{n}

(a_{1} ,a_{2} ...a_{n} )*(V_{1} ,V_{2} ...V_{n} ) = (a_{1} *V_{1} ,a_{2} *V_{2} ...a_{n} *V_{n} ) = V^1

这样的话就得到了一个新的V^1 ,这个V^1 就包含了哪些更重要,哪些不重要的信息在里面; 然后用V^1 代替V

在Transformer 一般K是等于V的(K==V),当然K可以不等一V(K!=V),但是K和V一定是有联系的,这样Q、K相乘得到的相似度才有意义、才能去指导V哪些重要,哪些不重要

二、自注意力机制Self-Attention

关键点:在于,不仅仅是K\approx V\approx Q,Q、K、V来源于同一个X(三者同源)

即:X与X求相似度,然后再X与X找关键点

并不是Q=K=V=X,而是通过参数W_{q} ,W_{k} ,W_{v}  W*介绍可以参考这篇文章

即:X*W_{q} =Q,      X*W_{k} =K,    X*W_{v} =V,通过三层线性变化得到了不同的Q、K、V

接下来的机制就和上面介绍的注意力机制一摸一样

即:Z_{1} =softmax(Q_{1} *K_{1} )*V_{1}  ... Z_{n} =softmax(Q_{n} *K_{n} )*V_{n}  得到的值就是句子与句子之间内部的联系,也就是Z里面的每一个单词现在的词向量都会包含句子里面哪个词对我是最重要的,最终得到一个n*n的矩阵


四:Transformer Block

4.1多头注意力机制Multi-Head Attention

multi-head

什么是Multi-Head(多头):

Multi-Head(多头)即表示多层,一般用h表示;

对于X,不是用X直接得到Z,而是把X分成h块(h头),使原先在一个位置上的X去了空间上的h个位置,通过对h个点进行寻找,找到更合适的位置;

Q与K相乘得到Z_{1} ...Z_{n} ,然后把Z_{1} ~Z_{n}  拼接起来,做一次线性变化,得到Z,这里得到的Z比单头具有更好的特征表示

具体多头内部的步骤,详见:Transformer架构Multi-Head Attention的计算过程

attention公式
multihead方式

4.2 Add & Layer norm 残差连接(Add)和数字缩放(Layer norm)在英文里面是layer normalization,主要用于将前一步出来的结果(大的变大,小的变小)缩放一下,从而使计算不会太分散,基本上在每一步的计算之后都有一个数字缩放(layer norm)的过程

4.3 FeedForward 就是全连接神经网络(fully connected feed foward)目前机器学习最具创新力的地方,顾名思义就是模仿人的大脑,所以大模型几十亿、几百亿的参数就跟人类的大脑神经元是一个道理,每一个神经元相当于一个参数,模拟了大脑神经元开关闭合再往下一层一层走,就是基于这样一个机制模拟出来的;神经网络就是海量的数据+无限制的算力堆起来,海量层的神经网络模型层就越好,神经网络在大语言模型里面就是一个辅助的工具。通过其他的架构和算法出来的值只要经过它一下,那么它就会学会,然后我们把这些参数记录下来,就可以去使用。

4.4 Add & Layer norm :避免做softmax的时候避免出现极端情况

结果:经过自注意力层的计算后:序列X的中的全局信息,会附加到每个单词上

五:Linear 线性层 Linear Transformation 线性变换:把矩阵乘以一个向量

使用线形层Linear将多个自注意力结果进行合并

将Transformer Block的输出向量投影到单词分数中,其中目标词汇表中每个唯一单词在句子中的每个位置都有一个分数值
例如,如果我们的最终输出句子有 7 个单词,而目大的词汇表有100256(vocab size)个唯一单词,我们会为这7个单词中的分别生成100256个分值。分值表示词汇表中每个单词在句子的该位置出现的可能性

六:Softmax 就是变数字为百分比

将分数转换为概率(加起来为 1.0)。在每个位置,我们找到概率最高的单词的索引,然后将该索引映射到词汇表中相应的单词。然后这些单词形成Transformer 的输出序列

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,188评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,464评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,562评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,893评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,917评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,708评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,430评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,342评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,801评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,976评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,115评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,804评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,458评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,008评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,135评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,365评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,055评论 2 355

推荐阅读更多精彩内容