Encoder的输入层和Decoder的输入层是一样的结构,都是由Token embedding(词向量 word embedding) 和 Positional embedding(位置向量) 组合而成,并到最终的 输入向量x。
Transformer引入Positional embedding主要是解决词序问题。因为Transformer不包含任何递归和卷织(不采用RNN的结构),都同时使用流经编码和解码堆栈(全局信息),无法捕捉到序列的顺序信息,因此没有特殊的顺序或位置,单使用Token embedding会存在不知词序的情况。因此Transformer中单词的输入向量x,该x则是由 Word Embedding和Position Embedding相加得到。
Embedding时Transformer会提取重要的两个信息:词的意思(Input Embedding) 和 词的位置信息 (Position Embedding), 并将位置信息加入到 Input embedding里面
Word Embedding = Token embedding
word embedding
所谓的词嵌入层 是自然语言处理(NLP)中的一种表达技术,它将词语或短语从词汇表映射到向量的实数空间中。
处理流程
送词入模型
首先将每个词的信息放入到模型中,得到的数据维度将为 (batch_size, seq_length, bemedding_size(d_model))
batch_size是批次大小, seq_len是序列长度
embedding_size(d_model):维度,transfomer为512维,BERT是768维
进行预处理 (进行文本填充(PAD)和截断)和 分词等
如上图:不足的用特殊文本PAD填充,截断的信息会造成信息丢失
构建Index词表
同时确定”按字或按词处理”的处理方式,确定维度512维(该维度由所选模型而定,Transformer的整个向量传输都是512维 BERT则是768维)
【词表格式】
- 行数: 行Id为Index,通过Lookup或查询可以查到唯一的一个字/词。
- 纵深: 一个字的维度(512维),如上图中第二列的图(如上图,一行10个字,一个字512维,一行共有10*512维,即每一切片都按维度
seq_len * embedding_size
计算 - 高度: batchsize,一批样本的批次大小。transformer是按Batchsize处理文字/词的,当所有的文本都转换完成之后,会形成一个高为Batchsize的矩阵,如上上图最右侧的矩阵。,每一切片代表输入的一行文本即一个序列, 如上上图最右则矩阵。
形成矩阵
最后数据会以右侧矩阵的方式输入到模型里(每一行的结构都是 seq_len * embedding_size
的结构,如上一点所述)
总结
经过Embedding后,文本中的每一个字就被转变为一个向量 ,能够在计算机中表示。《Attention is all you need》这一论文中,作者采用的是 512维词向量表示,也就是说,每一个字被一串长度为512的字向量表示。
特征向量工具
将词汇表示成特征向量的方法有多种, 对于要处理的一串文本,我们要让其能够被计算机处理,需要将其转变为词向量,方法有最简单的one-hot或者有名的Word2Vec等,甚至可以随机初始化词向量。本文介绍One-hot和数字表示。
One-hot编码
One-hot编码使用一种常用的离散化特征表示方法,在用于词汇向量表示时,向量的列数为所有单词的数量,只有对应的词汇索引为1,其余都为0。
举个例子,“我爱我的祖国”这句话,总长为6,但只有5个不重复字符,用One-hot表示后为6*5的矩阵,如图所示:
但是这种数据类型十分稀疏,即便使用很高的学习率,依然不能得到良好的学习效果。
数字表示
数字表示是指用整个文本库中出现的词汇构建词典,以词汇在词典中的索引来表示词汇。所以与其叫做“数字表示”,还不如叫“索引表示”。
举个例子,还是“我爱我的祖国”这句话,就是我们整个语料库,那么整个语料库有5个字符,假设我们构建词典{‘我’:0, ‘爱’:1, ‘的’:2, ‘祖’:3, ”:4},“我爱我的祖国”这句话可以转化为向量:[0, 1, 0, 2, 3, 4]。如图所示。这种方式存在的问题就是词汇只是用一个单纯且独立的数字表示,难以表达出词汇丰富的语义。
主流文本处理工具
现在主流的工具是BPE,在早期用 结巴/Word2vec等需要自己手工切词,自己建词表等。而BPE不需我们建词表等,而且性能更高。
BPE(BytePairEncoding) 是一种用于自然语言处理(NLP)的技术,它可以将较大的语料库压缩到更小的尺寸,以便更好地处理。
BPE的原理是通过查找文本中出现次数最多的字节对(bytepair),然后将它们合并为一个新的字符,从而减少语料库中的字符数量。
BPE现在已经被广泛应用于NLP领域,例如机器翻译、语音识别、自然语言理解等,它可以帮助模型更好地处理大规模的语料库,从而提高模型的性能。
关于中文处理
1.大模型不需要大动词量,特别是百川2等模型出来之后,完全不需要修改中文词表(基本包含全网数据,垂直领域的词也不需要)
2.llama2直接训练,可能需要修改词表。如果需要添加,只需追加
position embedding
Transformer 中除了Word Embedding,还需要使用Position Embedding 表示单词出现在句子中的位置。因为 Transformer 不采用 RNN 的结构,而是使用全局信息,因此是无法捕捉到序列顺序信息的,例如将K、V按行进行打乱,那么Attention之后的结果是一样的。但是序列信息非常重要,代表着全局的结构,因此必须将序列的分词相对或者绝对position信息利用起来。
文本是时序型数据,词与词之间的顺序关系往往影响整个句子的含义。
绝对位置编码
给每个位置的位置信息建模,最简单的实现方式:使用每个词汇的次序 1,2,…,T 作为位置编码信息。
例如,BERT使用的是Learned Positional Embedding(可学习的位置嵌入),先初始化位置编码,再放到预训练过程中,训练出每个位置的位置向量。
绝对位置编码问题解析
绝对位置编码存在一个严重的问题,假如模型最大序列长度为 512,那么预测阶段输入超过 512 的序列就无法进行处理:pos = 1,2,3,...,T-1
。总结就是 当文本较长时,位置序列没有上界,T位置的编码比0位置的编码大很多,这会导致与 token embedding 合并后出现特征在数值的倾斜和干扰。
归一化同样存在问题 如果对上面的位置序列进行归一化: pos = pos / (1 + T)
。 还是有问题,不同长度的位置编码的步长是不同的,在较短的文本中相邻的两个字的位置编码的差异与长文本中的相邻两个字的位置编码存在数量级上的差异,这会导致长文本的相对位置关系被稀释。
1. 念熹编程培训(T=5)
pos(念) = 1 / 5 = 0.2
pos(熹)= 2 / 5 = 0.4
2. 念熹编程是一家优秀的培训机构,秉承... (T=500)
pos(念) = 1 / 500 = 0.002
pos(熹) = 2 / 500 = 0.004
相对位置编码 – 使用 sin/cos 函数
相对位置并没有每个输入的位置信息做完整建模,而是在计算Attention的时候考虑当前位置与被Attention的位置的相对距离。
由于自然语言一般更依赖于相对位置,所以相对位置编码通常也有着优秀的表现。在Transformer中使用的就是相对位置编码的方式。
Transformer引入了相对位置的概念-使用 sin/cos函数,根据上面的讨论,位置编码能满足transformer以下的需求:
1.能够体现词汇在不同位置的区别(特别是同一词汇在不同位置的区别)。
2.能够体现词汇的先后次序,并且编码值不依赖于文本的长度。
3.有值域范围限制。
使用 sin/cos 函数(有界周期函数)来表示相对位置, sin/cos 函数周期变化规律稳定,使得编码具有一定的不变性 。因此,Transformer在不同维度上使用不同的函数来生成位置编码,也就是给位置编码的每一维赋予不同的α,同时区分奇偶维度的函数形式 。
Position Embedding 用 PE表示,PE 的维度与Word Embedding 是一样的。PE 可以通过训练得到,也可以使用某种公式计算得到。在 Transformer 中采用了后者,《Attention is all you need》论文中给出的计算公式:
PE(pos,2i)=sin(pos100002i/dmodel)PE_(pos,2i) = sin(frac{pos}{ 10000^{2i/d_{model}} })
PE(pos,2i+1)=cos(pos100002i/dmodel)PE_(pos,2i+1) = cos(frac{pos}{ 10000^{2i/d_{model}} })
其中 pos表示字词的位置,2i表示在512维词向量中的偶数位置,2i+1表示在512维词向量中的奇数位置dmodeld_{model}表示词向量的维度(例如为512);公式表达的含义是在偶数的位置使用sin函数计算,在奇数的位置使用cos函数计算。为了表示方式, 用 α 表示分母: 100002i/dmodel10000^{2i}/d_{model}
通过α来调节函数周期,α越大,1/α 越小,sin图像在纵轴方向被“压扁”,周期变长,相邻位置(横坐标)的位置编码差值变小(相邻横坐标对应y值差异减小)。在 sin/cos 函数 [-1, 1] 的值域范围内,如果 α 比较大,相邻字符之间的位置差异体现得不明显;如果 α 比较小,在长文本中还是可能会有一些不同位置的字符的编码一样。
在上式中,不同的维度会有不同的α值,周期从2π到10000*2π,并且区分了奇偶维度的函数形式,这使得每一维度上都包含了一定的位置信息,而各个位置字符的编码值又各不相同。
但从BERT之后,就没有再用sin与cos的方式,是直接变成可训练的形式,下一章节介绍更好的编码工具。
更优秀的编码方式
从BERT之后,就没有再用sin与cos的方式,从BERT之后是直接变成可训练的形式。目前,已经出现了更优秀的位置编码方式:RoPE(Rotary Positional Embedding)和ALiBi(Attention with Linear Biases),两个都是相对位置编码形式。
RoPE它兼顾了绝对位置信息与相对位置信息,可以不受固定长度限制处理任意长度的序列。其工作原理是,通过一个基于位置的旋转矩阵将每个位置的嵌入旋转到一个新的位置。该方法的优点是可以保持相对位置信息的一致性,在旋转后相邻的位置仍然会有相似的嵌入。
ALiBi能够让Transformer语言模型在推理时可以处理比训练时更长的序列。它在处理文本序列时不使用实际的位置嵌入,而是在计算某个键和查询之间的注意力时,根据键和查询之间的距离对查询可以分配给键的注意力值进行惩罚。当键和查询靠近时,惩罚非常低,当它们远离时,惩罚非常高 —— 动机:靠近的词比远离的词更重要。
—— 笔记写于:2023年11月05日