word2vec
word2vec工具包含两个模型,即跳元模型(skip-gram)和连续词袋(CBOW (Continuous Bag-of-Words)。Skip-gram是给定一个中心词,预测其周围的上下文词。CBOW是给定一段文本中的一个中心词周围的上下文词,预测中心词。
负采样
在标准的 softmax 方法中,我们有
这涉及到计算所有词汇表中词汇的条件概率, 在词汇表非常大的时候是非常耗时的。
负采样的核心思想是通过随机选择一部分非上下文词(负样本)来近似这个条件概率分布。具体来说,对于每个中心词和对应的上下文词,我们不仅更新这两个词的向量表示,而且还随机选择若干个不在上下文中的词作为“负样本”,并更新它们的向量表示。在负采样中,我们采用一个简化的逻辑回归目标函数来替代标准的 softmax 函数。对于每个训练样本,我们希望模型能够正确区分真正的上下文词和负样本词。因此,我们可以定义一个目标函数,它希望对于上下文词,有$\sigma(\u_o\v_i+b)=1$而对于每个负样本,有$\sigma(\u_o\v_i+b)=0$。 通过这种方式,负采样实际上是在模拟原始 softmax 的行为,但它只考虑了一小部分词汇,即一个正样本加上几个负样本。这意味着负采样通过一系列独立的二元分类任务来近似这个条件概率。
层次softmax
层次softmax 的核心思想是构建一个词汇的层次结构,通常是一棵哈夫曼树(Huffman Tree),并将分类问题转化为沿着树的路径进行的一系列二元分类问题。这样可以将原始的 softmax 层的计算复杂度从线性减少到对数级别。层次softmax 的目标是通过计算从根节点到词汇的叶子节点的路径概率来近似原条件概率。
GloVe
GloVe模型的主要特点是它试图捕捉单词之间的共现频率信息,即一个单词出现时另一个单词出现的概率。通过这种方式,模型可以学习到词汇语义以及词汇间的关系,比如同义词、反义词、以及类比关系等。
训练GloVe模型涉及到最小化词对共现概率预测值与实际共现概率之间的损失函数。
子词嵌入
fastText
在跳元模型和连续词袋模型中,同一词的不同变形形式直接由不同的向量表示,不需要共享参数。为了使用形态信息,fastText模型提出了一种子词嵌入方法,其中子词是一个字符n-gram。fastText可以被认为是子词级跳元模型,而非学习词级向量表示,其中每个中心词由其子词级向量之和表示。
字节对编码(Byte Pair Encoding)
字节对编码(Byte Pair Encoding,简称 BPE)是一种用于词汇归一化和文本压缩的技术,近年来,BPE 被重新引入到自然语言处理领域,特别是在机器翻译和语言建模中,作为一种生成子词单位的有效方法。BPE 的基本思想是不断地合并最常出现的相邻字符对,直到达到预定的词汇表大小。
ELMo
word2vec和GloVe都将相同的预训练向量分配给同一个词,而不考虑词的上下文,考虑到自然语言中丰富的多义现象和复杂的语义,上下文无关表示具有明显的局限性,同一个词可以根据上下文被赋予不同的表示。
ELMo(Embeddings from Language Models)是一种上下文敏感的词嵌入方法,使用双向 LSTM(长短期记忆网络)构建深度语言模型,这种模型可以捕获来自句子左右两边的信息。通过训练这种模型,可以得到一个对上下文敏感的词嵌入。
GPT
初代 GPT 基于 Transformer 架构,使用的是单向的 Transformer,这意味着它在生成文本时只能访问之前的位置信息,而不能访问当前位置之后的信息。通过自回归方式训练,即模型学习给定前面的文字后预测下一个文字。
BERT
ELMo对上下文进行双向编码,但使用特定于任务的架构;而GPT是任务无关的,但是从左到右编码上下文,BERT结合了这两个方面的优点。
BERT输入序列明确地表示单个文本和文本对。当输入为单个文本时,BERT输入序列是特殊类别词元“\
为了双向编码上下文以表示每个词元,BERT随机掩蔽词元并使用来自双向上下文的词元以自监督的方式预测掩蔽词元。此任务称为掩蔽语言模型。
尽管掩蔽语言建模能够编码双向上下文来表示单词,但它不能显式地建模文本对之间的逻辑关系。为了帮助理解两个文本序列之间的关系,BERT在预训练中考虑了一个二元分类任务——下一句预测。在为预训练生成句子对时,有一半的时间它们确实是标签为“真”的连续句子;在另一半的时间里,第二个句子是从语料库中随机抽取的,标记为“假”。
在预训练BERT时,最终的损失函数是掩蔽语言模型损失函数和下一句预测损失函数的线性组合。
参考文献
https://zh.d2l.ai/chapter_natural-language-processing-pretraining/word2vec.html
https://zh.d2l.ai/chapter_natural-language-processing-pretraining/subword-embedding.html