📕参考:大模型研讨课第一期:Why LLMs?、模型结构1(共10期)_哔哩哔哩_bilibili
(本系列是课程笔记)
tokenization(词元化/分词)
NLP中如何对文本进行预处理(将文本转换为训练数据)?
词元化:分词,变成token 最后再嵌入转换变成训练数据
tokenization(词元化/分词):将清洗后的文本字符串划分为有意义的基本单元(词元) 组成的序列。
三个基本概念:token(词元)、tokenization(词元化/分词)、词表。
Subword Tokenization: Byte Pair Encoding (BPE,字节对编码)
核心思路:不断将最频繁出现的一对词元合并成一个词元。
刚开始每个字符为一个词元,然后找一直成对出现的将他们合并成新的词元,一直循环。
这样也就实现了让出现频率高的有自己的token,出现频率低的划分成sub-words。
上面那个句子“A hippopotamus ate my homework.”
hippopotamus 在数据库的数据中这个词出现的频率较低,不足以让他单独成为一个词,所以它被划分了子词,hip pop。
homework 明显是由home和work拼接而成的,但是由于数据库中 homework这个词出现的频率很高,所以就让它单独成为一个新的词元了。
以上这些是分词,将清洗后的文本字符串划分为有意义的基本单元(词元) 组成的序列。
分词之后呢,计算机还是不容易处理,需要进行编码,生成embedding。
embedding
embedding(词表示/词嵌入): 将离散的token转化为连续的向量表示,方便计算机进行运算。
one-hot
one-hot: one-hot(独热)编码是最简单的词向量表达方式。它以字典建立向量,每个词都单独用一个很长的向量表示,该向量的维度是词典大小。向量中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。
缺陷:无法准确表达不同词之间的相似度(任意两个token的余弦相似度为0),维度较高,稀疏表示,计算不友好。
举例:
word2vec
word2vec:可以较为准确的表达不同词之间的相似性和关系稠密表示,维度降低,计算更加友好。
Continuous Bag-of-Words(CBOW,连续词袋模型):用前后词的概率预测中间的词。
Skip-gram(跳元模型):用中间的预测两边的。
word2vec embedding 方式:
训练数据:利用大量语料,无监督训练。
训练方法:将条件概率转化为若干个二类分类问题。
再加一些加速的方法:层次化softmax、negative sampling
它的一个优势是:可以自发的发现不同词之间的相似性和关系。
下面这个 King – Man = Queen – Woman,然后可以推出 Queen = King – Man + Woman
Transformer中使用的embedding:学习embedding矩阵
方法: 输入为token(如one-hot),输出embedding向量。
输入为token(如one-hot),embedding过程使用线性变换(与embedding矩阵相乘),在训练过程中学习embedding矩阵权重。
解释:
one-hot中的 某个词是 knowledge = [1 0 0 0 0 0],那么 一个句子的编码可能就是一个【矩阵】:
给了一个embedding matrix (embedding 矩阵)对原来的token做线性变换,最后得到该词的embedding。
与embedding矩阵相乘,相当于把与embedding矩阵 中对应的一行抽出来,这就是学习embedding矩阵。
position encoding(位置编码)
position encoding (位置编码):
动机:序列中token的顺序信息对于句子语义表达很重要
作用:表示序列中的位置信息
循环神经网络中包含位置信息,attention会丢失序列的位置信息,所以需要补进去(用位置编码补进去)
三角函数表示position encoding(Transformer里的)
transformer的输入是position encoding与 token embedding直接相加
这就是用不同的频率来记录相对的位置。
i越大,频率越小,周期越大。看Col6 和Col9 ,9的周期就比6的大。
position embedding(BERT使用)
BERT里面是对于每个位置,从数据中学习一个embedding。
缺点:单独学习的,所以可能相对位置信息编码能力不足。
rotary position encoding(RoPE,旋转位置编码)
如果 q k 同时转,那它们相对位置不变
计算化简方法:任意偶数维的RoPE可以表示为二维形式的拼接
对于 token 序列中的每个词嵌入向量,首先计算其对应的 query 和 key 向量(x1x2),
然后对每个 token 位置都计算对应的旋转位置编码(m,θ),
接着对每个 token 位置的 query 和 key 向量的元素按照两两一组应用旋转变换,
最后再计算 query 和 key 之间的内积得到 self-attention 的计算结果。