预训练——词嵌入(word2vec)、 近似训练

  • 词向量是用于表示单词意义的向量,也可以看作词的特征向量。将词映射到实向量的技术称为词嵌入

  • word2vec工具包含跳元模型连续词袋(CBOW)模型

  • 跳元模型假设一个单词可用于在文本序列中,生成其周围的单词;而连续词袋模型假设基于上下文词来生成中心单词。

  • 负采样通过考虑相互独立的事件来构造损失函数,这些事件同时涉及正例和负例。训练的计算量与每一步的噪声词数成线性关系。

  • 分层softmax使用二叉树中从根节点到叶节点的路径构造损失函数。训练的计算成本取决于词表大小的对数。

要理解文本,我们可以从学习它的表示开始。 利用来自大型语料库的现有文本序列, 自监督学习(self-supervised learning) 已被广泛用于预训练文本表示, 例如通过使用周围文本的其它部分来预测文本的隐藏部分。 通过这种方式,模型可以通过有监督地从海量文本数据中学习,而不需要昂贵的标签标注!

当将每个单词或子词视为单个词元时, 可以在大型语料库上使用word2vec、GloVe或子词嵌入模型预先训练每个词元的词元。 经过预训练后,每个词元的表示可以是一个向量。 但是,无论上下文是什么,它都保持不变。 例如,“bank”(可以译作银行或者河岸)的向量表示在 “go to the bank to deposit some money”(去银行存点钱) 和“go to the bank to sit down”(去河岸坐下来)中是相同的。 因此,许多较新的预训练模型使相同词元的表示适应于不同的上下文, 其中包括基于Transformer编码器的更深的自监督模型BERT。

目录

1.词嵌入(word2vec)

1.1 为何独热向量是一个糟糕的选择

1.2自监督的word2vec 

1.3跳元模型(Skip-Gram)

1.3.1训练

1.4连续词袋(CBOW)模型

1.4.1训练

2.近似训练

2.1 负采样

2.2层序Softmax 


1.词嵌入(word2vec)

自然语言是用来表达人脑思维的复杂系统。 在这个系统中,词是意义的基本单元。顾名思义, 词向量是用于表示单词意义的向量, 并且还可以被认为是单词的特征向量或表示。 将单词映射到实向量的技术称为词嵌入。 近年来,词嵌入逐渐成为自然语言处理的基础知识。

1.1 为何独热向量是一个糟糕的选择

在 循环神经网络的实现(独热编码,梯度裁剪)_流萤数点的博客-CSDN博客中,我们使用独热向量来表示词(字符就是单词)。假设词典中不同词的数量(词典大小)为N,每个词对应一个从0到N−1的不同整数(索引)。为了得到索引为i的任意词的独热向量表示,我们创建了一个全为0的长度为N的向量,并将位置i的元素设置为1。这样,每个词都被表示为一个长度为N的向量,可以直接由神经网络使用。

虽然独热向量很容易构建,但它们通常不是一个好的选择。一个主要原因是独热向量不能准确表达不同词之间的相似度,比如我们经常使用的“余弦相似度”。对于向量x,y∈R^{d},它们的余弦相似度是它们之间角度的余弦:

由于任意两个不同词的独热向量之间的余弦相似度为0,所以独热向量不能编码词之间的相似性。

1.2自监督的word2vec 

word2vec工具是为了解决上述问题而提出的。原文论文可以参考向量空间中单词表示的有效估计_流萤数点的博客-CSDN博客它将每个词映射到一个固定长度的向量,这些向量能更好地表达不同词之间的相似性和类比关系。word2vec工具包含两个模型,即跳元模型(skip-gram) (Mikolov et al., 2013)和连续词袋(CBOW) (Mikolov et al., 2013)。对于在语义上有意义的表示,它们的训练依赖于条件概率,条件概率可以被看作使用语料库中一些词来预测另一些单词。由于是不带标签的数据,因此跳元模型和连续词袋都是自监督模型。

下面,我们将介绍这两种模式及其训练方法。

1.3跳元模型(Skip-Gram)

跳元模型假设一个词可以用来在文本序列中生成其周围的单词。以文本序列“the”“man”“loves”“his”“son”为例。假设中心词选择“loves”,并将上下文窗口设置为2,如图 图14.1.1所示,给定中心词“loves”,跳元模型考虑生成上下文词“the”“man”“him”“son”的条件概率:

P("the","man","his","son"∣"loves").                                                                           (14.1.2)

假设上下文词是在给定中心词的情况下独立生成的(即条件独立性)。在这种情况下,上述条件概率可以重写为:

P("the"∣"loves")⋅P("man"∣"loves")⋅P("his"∣"loves")⋅P("son"∣"loves").                      (14.1.3)

 其中可以省略小于1或大于T的任何时间步。

1.3.1训练

跳元模型参数是词表中每个词的中心词向量和上下文词向量。在训练中,我们通过最大化似然函数(即极大似然估计)来学习模型参数。这相当于最小化以下损失函数:

当使用随机梯度下降来最小化损失时,在每次迭代中可以随机抽样一个较短的子序列来计算该子序列的(随机)梯度,以更新模型参数。为了计算该(随机)梯度,我们需要获得对数条件概率关于中心词向量和上下文词向量的梯度。通常,根据 (14.1.4),涉及中心词w_{c}和上下文词w_{o}的对数条件概率为:

 通过微分,我们可以获得其相对于中心词向量v_{c}的梯度为

 

注意, (14.1.8)中的计算需要词典中以w_{c}为中心词的所有词的条件概率。其他词向量的梯度可以以相同的方式获得。 

对词典中索引为i的词进行训练后,得到v_{i}(作为中心词)和u_{i}(作为上下文词)两个词向量。在自然语言处理应用中,跳元模型的中心词向量通常用作词表示。

1.4连续词袋(CBOW)模型

连续词袋(CBOW)模型类似于跳元模型。与跳元模型的主要区别在于,连续词袋模型假设中心词是基于其在文本序列中的周围上下文词生成的。例如,在文本序列“the”“man”“loves”“his”“son”中,在“loves”为中心词且上下文窗口为2的情况下,连续词袋模型考虑基于上下文词“the”“man”“him”“son”(如 图14.1.2所示)生成中心词“loves”的条件概率,即:

P("loves"∣"the","man","his","son").                                                                            (14.1.9)

1.4.1训练

训练连续词袋模型与训练跳元模型几乎是一样的。连续词袋模型的最大似然估计等价于最小化以下损失函数:

 请注意, 

通过微分,我们可以获得其关于任意上下文词向量V_{oi}(i=1,…,2m)的梯度,如下: 

其他词向量的梯度可以以相同的方式获得。与跳元模型不同,连续词袋模型通常使用上下文词向量作为词表示。

2.近似训练

跳元模型的主要思想是使用softmax运算来计算基于给定的中心词wc生成上下文字wo的条件概率(如 (14.1.4)),对应的对数损失在 (14.1.7)给出。

由于softmax操作的性质,上下文词可以是词表V中的任意项, (14.1.7)包含与整个词表大小一样多的项的求和。因此, (14.1.8)中跳元模型的梯度计算和 (14.1.15)中的连续词袋模型的梯度计算都包含求和。不幸的是,在一个词典上(通常有几十万或数百万个单词)求和的梯度的计算成本是巨大的!

为了降低上述计算复杂度,本节将介绍两种近似训练方法:负采样分层softmax。 由于跳元模型和连续词袋模型的相似性,我们将以跳元模型为例来描述这两种近似训练方法。

2.1 负采样

负采样修改了原目标函数。给定中心词w_{c}的上下文窗口,任意上下文词w_{o}来自该上下文窗口的被认为是由下式建模概率的事件:

其中σ使用了sigmoid激活函数的定义:

让我们从最大化文本序列中所有这些事件的联合概率开始训练词嵌入。具体而言,给定长度为T的文本序列,以w^{(t)}表示时间步t的词,并使上下文窗口为m,考虑最大化联合概率: 

然而, (14.2.3)只考虑那些正样本的事件。仅当所有词向量都等于无穷大时, (14.2.3)中的联合概率才最大化为1。当然,这样的结果毫无意义。为了使目标函数更有意义,负采样添加从预定义分布中采样的负样本。

用S表示上下文词w_{o}来自中心词w_{c}的上下文窗口的事件。对于这个涉及w_{o}的事件,从预定义分布P(w)中采样K个不是来自这个上下文窗口噪声词。用Nk表示噪声词wk(k=1,…,K)不是来自wc的上下文窗口的事件。假设正例和负例S,N1,…,NK的这些事件是相互独立的。负采样将 (14.2.3)中的联合概率(仅涉及正例)重写为

 

我们可以看到,现在每个训练步的梯度计算成本与词表大小无关,而是线性依赖于K。当将超参数K设置为较小的值时,在负采样的每个训练步处的梯度的计算成本较小。

2.2层序Softmax 

作为另一种近似训练方法,层序Softmax(hierarchical softmax)使用二叉树( 图14.2.1中说明的数据结构),其中树的每个叶节点表示词表V中的一个词。

 

 幸运的是,由于二叉树结构,L(w_{o})−1大约与O(log_{2}|V|)是一个数量级。当词表大小V很大时,与没有近似训练的相比,使用分层softmax的每个训练步的计算代价显著降低。

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Word2vec和GloVe是两种常见的预训练词嵌入方法,它们可以将单词转换为低维向量表示,以便于在自然语言处理任务中使用。下面分别介绍如何使用Word2vec和GloVe实现预训练词嵌入。 使用Word2vec实现预训练词嵌入 Word2vec是一种基于神经网络的预训练词嵌入算法,它可以将单词转换为低维向量表示。下面介绍如何使用Python的gensim库实现Word2vec预训练词嵌入。 1. 安装gensim库 使用pip安装gensim库: ``` pip install gensim ``` 2. 准备语料库 准备一个文本语料库,可以是一个文本文件或一个列表,其中每个元素都是一个字符串,代表一篇文档或一个句子。 3. 训练Word2vec模型 使用gensim库的Word2Vec训练Word2vec模型: ```Python from gensim.models import Word2Vec sentences = [["cat", "say", "meow"], ["dog", "say", "woof"]] model = Word2Vec(sentences, size=10, window=3, min_count=1, workers=4) ``` 其中,sentences是语料库,size是每个单词的向量维度,window是上下文窗口大小,min_count是单词出现的最小次数,workers是线程数。 4. 使用预训练词嵌入 使用训练好的Word2vec模型,可以将单词转换为向量表示: ```Python vector = model.wv["cat"] ``` 其中,wv是Word2vec模型的词汇表,可以通过它获取单词的向量表示。 使用GloVe实现预训练词嵌入 GloVe是一种基于全局词频统计的预训练词嵌入算法,它可以将单词转换为低维向量表示。下面介绍如何使用Python的gensim库实现GloVe预训练词嵌入。 1. 安装gensim库 使用pip安装gensim库: ``` pip install gensim ``` 2. 准备语料库 准备一个文本语料库,可以是一个文本文件或一个列表,其中每个元素都是一个字符串,代表一篇文档或一个句子。 3. 训练GloVe模型 使用gensim库的Glove类训练GloVe模型: ```Python from gensim.models import Glove sentences = [["cat", "say", "meow"], ["dog", "say", "woof"]] model = Glove(sentences, size=10, window=3, min_count=1, workers=4) ``` 其中,sentences是语料库,size是每个单词的向量维度,window是上下文窗口大小,min_count是单词出现的最小次数,workers是线程数。 4. 使用预训练词嵌入 使用训练好的GloVe模型,可以将单词转换为向量表示: ```Python vector = model.word_vectors[model.dictionary["cat"]] ``` 其中,word_vectors是GloVe模型的词向量矩阵,可以通过它获取单词的向量表示;dictionary是GloVe模型的词汇表,可以通过它获取单词的索引。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流萤数点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值