📘今日学习总结
tokenization分词算法
BPE分词(Byte-Pair Encoding)
- BPE 算法从一组基本符号(例如字母和边界字符)开始,迭代地寻找语料库中的两个相邻词元,并将它们替换为新的词元,这一过程被称为合并。
- 合并的选择标准是计算两个连续词元的共现频率,也就是每次迭代中,最频繁出现的一对词元会被选择与合并。
- 合并过程将一直持续达到预定义的词表大小。
例子:
- 单词列表:
"{“l o w </w>”: 3, “l o w l y </w>”: 1, “l o w e r </w>”: 1, “n e w e r </w>”: 2}" - 词汇表:
{l, o, w, </w>, y, e, r, n}
| 子词对 | 总频率 |
|---|---|
| (l,o) | 3+1+1=5 |
| (o,w) | 3+1+1=5 |
| (w,e) | 1+2=3 |
| (e,r) | 1+2=3 |
| (r,</w>) | 1+2=3 |
| ... | ... |
- 选择频率最高的对(若有并列,任选其一,此处选
(l,o)),将其合并为新子词lo,加入词汇表。 - 此时词汇表更新为:
{l, o, w, </w>, y, e, r, n, lo} - 单词列表:
"{“lo w </w>”: 3, “lo w l y </w>”: 1, “lo w e r </w>”: 1, “n e w e r </w>”: 2}" - 重复迭代,直到满足终止条件
Byte-level BPE分词
- 2019年12月,论文:
Neural Machine Translation with Byte-Level Subwords在基于BPE基础上提出以Byte-level为粒度的分词算法Byte-level BPE - 改进的UTF-8编码是一个变长的编码,有1~4个范围的字节(bytes)长度。对于不同语言中字符采用不同长度的字节编码,例如英文字符基本都是1个字节(byte),中文汉字通常需要2~3个字节
WordPiece分词
- 与 BPE 类似,WordPiece 分词算法也是从一个小的词汇表开始,其中包括模型使用的特殊词元和初始词汇表。
- 与 BPE 方法的不同点在于,WordPiece 分词算法并不选择最频繁的词对,而是使用下面的公式为每个词对计算分数:
\[\text{得分}=\frac{\text{词对出现的频率}}{\text{第一个词出现的频率} \times \text{第二个词出现的频率}}
\]
例子:
- 单词列表:
"l o w </w>", "l o w e s t </w>", "n e w e r </w>", "w i d e r </w>" - 词汇表:
{l, o, w, e, s, t, n, r, i, d, </w>} - 比如
(e, s):freq=1,freq(e)=3,freq(s)=1->score = 1/(3*1) = 0.33 - 选择得分最大的合并
- 重复迭代,直到满足终止条件
Unigram 分词算法
- 与 BPE 分词和 WordPiece 分词不同,Unigram 分词方法从语料库的一组足够大的字符串或词元初始集合开始,迭代地删除其中的词元,直到达到预期的词表大小。
- 它假设从当前词表中删除某个词元,并计算训练语料的似然增加情况,以此来作为选择标准。这个步骤是基于一个训练好的一元语言模型来进行的。
- 为估计一元语言模型,它采用期望最大化(Expectation–Maximization, EM)算法:在每次迭代中,首先基于旧的语言模型找到当前最优的分词方式,然后重新估计一元概率从而更新语言模型。
- 这个过程中一般使用动态规划算法(即维特比算法,Viterbi Algorithm)来高效地找到语言模型对词汇的最优分词方式。
- UniLM算法步骤
输入:训练语料;词表大小V; 保留阈值X;1.准备基础词表:初始化一个很大的词表,比如所有字符+高频Ngram,也可以通过BPE算法初始化;
2.针对当前词表,用语言模型(unigram lm)估计每个子词在语料上的概率;
3.计算删除每个Subword后对总loss的影响及Score得分,作为该Subword排序的Score得分;
4.将子词按照Score大小进行排序,保留前X%的Subword;注意,建议单字符的Subword不能被丢弃,以免OOV;
5.重复步骤2到4,直到词表大小减少到设定值
Word2Vec算法
Word2Vec如何捕捉词义关系
词向量的生成
- Word2vec通过训练过程学习到每个词的向量表示,这些向量能够捕捉到词与词之间的语义和句法关系。
- 具体来说,模型通过最大化某个单词与其上下文单词之间的联合概率来学习词向量。这样,词向量不仅包含了单词本身的含义,还包含了它在不同上下文中的使用情况。
- 在训练过程中,模型通过反向传播算法调整词向量,使得模型的预测结果尽可能接近实际的上下文词或中心词。
- 具体步骤如下:
- 1.初始化:为词汇表中的每个词随机初始化一个向量。
- 2.前向传播:根据模型的结构(CBOW或Skip-gram),计算每个词的条件概率。
- 3.计算损失:使用损失函数(如交叉熵损失)计算模型的预测误差。
- 4.反向传播:计算损失函数关于词向量的梯度,并通过梯度下降算法更新词向量
词义关系的捕捉
- 上下文信息:在训练过程中,模型会根据单词在句子中的上下文来调整词向量。
- 例如,在句子 "The king is a man" 和 "The queen is a woman" 中,"king" 和 "man" 经常一起出现,"queen" 和"woman"也经常一起出现。
- 因此,模型会学习到"king” 和"man” 之间的关系,以及"queen” 和"woman"之间的关系。
- 向量空间中的关系:在高维向量空间中,相似的单词会靠近彼此,而相关的单词也会表现出特定的向量关系。例如,“king-man +woman ≈ queen" 表明 "king" 和 "man" 之间的关系类似于"queen" 和"woman"之间的关系。
词向量的作用
- 语义相似性:词向量可以捕捉到单词之间的语义相似性。例如,"quick" 和 "fast” 的向量在高维空间中距离较近
- 词义关系:词向量可以捕捉到单词之间的关系。例如,"king -man + woman≈queen”,这表明词向量可以捕捉到性别、角色等关系。
- 作为特征:词向量可以作为特征输入到其他机器学习模型中,用于各种自然语言处理任务,如情感分析、机器翻译、命名实体识别等。
线性层的权重
CBOW模型
- 输入:上下文词的向量\(v_{w_{t-n}}, \dots, v_{w_{t-1}}, v_{w_{t+1}}, \dots, v_{w_{t+n}}\)
- 输出:中心词\(w_t\)的概率分布\(P(w_t|w_{t-n},\dots, w_{t-1}, w_{t+1}, \dots, w_{t+n})\)
- 在CBOW模型中,词向量是输入层的权重\(W\)的列向量。
- 具体来说,假设\(W\)是一个\(V \times d\)的矩阵,其中\(V\)是词汇表的大小,\(d\)是词向量的维度。
- 矩阵\(W\)的第 \(i\) 列\(W_i\)。就是词汇表中第 \(i\) 个词的词向量
- CBOW模型的损失函数通常使用交叉熵损失(Cross-EntropyLoss)。
- 假设我们有一个词汇表\(V\),中心词的真实标签是\(w_t\)
- 模型的预测概率分布是\(P(w_t|w_{t-n},\dots, w_{t-1}, w_{t+1}, \dots, w_{t+n})\)
- 那么损失函数可以表示为:\(J(\theta) = - \log P(w_{t}|w_{t-n}, \dots, w_{t-1}, w_{t+1}, \dots, w_{t+n})\)
- 假设\(y\)是一个one-hot编码的向量,表示中心词\(w_t\),那么损失函数可以写成:
- \(J(\theta) = - \sum_{i=1}^{V} y_{i} \log P(w_{i}|w_{t-n},..., w_{t-1}, w_{t+1},...)\)
- 其中,\(y_i\)是一个one-hot 向量,只有在\(i=w_t\)时为1,其他位置为0
SKip-gram模型
- 输入:中心词的向量\(v_{w_t}\)
- 输出:上下文词\(w_{t-n}, \dots, w_{t-1}, w_{t+1}, \dots, w_{t+n}\) 的概率分布\(P(w_{t+j}|w_t)\)
- 在 SKip-gram 模型,词向量是输入层的权重\(W\)的列向量。
- 具体来说,假设\(W\)是一个\(V \times d\)的矩阵,其中\(V\)是词汇表的大小,\(d\)是词向量的维度。
- 矩阵\(W\)的第 \(i\) 列\(W_i\)。就是词汇表中第 \(i\) 个词的词向量
- Skip-gram模型的损失函数同样使用交叉熵损失。
- 假设我们有一个词汇表\(V\),上下文词的真实标签是\(w_{t+j}\)
- 模型的预测概率分布是\(P(w_{t+j}|w_t)\)
- 那么损失函数可以表示为:\(J(\theta) = - \sum_{-n \leq j \leq n, j \neq 0} \log P(w_{t+j}|w_t)\)
- 假设\(y_j\)是一个one-hot编码的向量,表示中心词\(w_{t+j}\),那么损失函数可以写成:
- \(J(\theta) = - \sum_{-n \leq j \leq n, j \neq 0} \sum_{i=1}^{V} y_{j,i} \log P(w_i|w_t)\)
- 其中,\(y_{j,i}\)是一个one-hot 向量,只有在\(i=w_{t+j}\)时为1,其他位置为0
优化技巧
- 为了提高训练效率,通常会使用一些优化技巧,如负采样(Negative Sampling)和层次Softmax(Hierarchical Softmax)。
负采样
- 负采样通过在每次训练时只考虑一小部分负样本,而不是所有词汇表中的词,来减少计算量。
- 具体来说,对于每个正样本(实际的上下文词),随机选择一些负样本(不在上下文中的词),并只计算这些样本的损失。
层次Softmax
- 层次Softmax通过构建一个二叉树结构,将词汇表中的词组织起来,从而减少计算量。
- 在计算损失时,只需要沿着树的路径计算,而不是计算所有词的概率。