给定包含
每篇文档
词的表达任务要解决的问题是:如何表示每个词汇
最简单的表示方式是one-hot
编码:对于词汇表中第 1
,剩余位取值为0
。
这种表示方式有两个主要缺点:
无法表达单词之间的关系:对于任意一对单词
向量维度过高:对于中文词汇表,其大小可能达到数十万,因此one-hot
向量的维度也在数十万维。这对于存储、计算都消耗过大。
BOW:Bag of Words
:词在文档中不考虑先后顺序,这称作词袋模型。
向量空间模型主要用于文档的表达。
向量空间模型假设单词和单词之间是相互独立的,每个单词代表一个独立的语义单元。实际上该假设很难满足:
文档中的单词和单词之间存在一定关联性,单词和其前面几个单词、后面几个单词可能存在语义上的相关性,而向量空间模型忽略了这种上下文的作用。
文档中存在很多的一词多义和多词同义的现象,每个单词并不代表一个独立的语义单元。
给定语料库 文档-单词
矩阵为:
令矩阵为
于是文档
事实上,文档的上述表达并未考虑单词的顺序,也未考虑单词出现的次数。一种改进策略是考虑单词出现的次数,从而赋予文档-单词
矩阵以不同的权重:
其中
如果单词
如果单词
权重
单词权重等于单词出现的频率TF
:
函数
其缺点是:一些高频词(如:我们
,是
,大家
)以较大的权重出现在每个文档中,这意味着对每篇文档这些高频词是比较重要的。事实上对于绝大多数 NLP
任务,将这些词过滤掉不会有任何影响。
单词权重等于单词的TF-IDF
:
函数
TF-IDF
对于高频词进行降权。如果单词
TF-IDF
不仅考虑了单词的局部特征,也考虑了单词的全局特征。
词频
逆文档频率
给定 文档-单词
矩阵,则很容易得到文档的向量表达:
给定文档
其中
也可以使用其它方式的相似度,如
距离相似度。
潜在语义分析latent semantic analysis:LSA
的基本假设是:如果两个词多次出现在同一篇文档中,则这两个词具有语义上的相似性。
给定文档-单词
矩阵
其中 0/1
值、单词 TF-IDF
值。
定义 单词-文档向量
,描述了该单词和所有文档的关系。
向量内积
矩阵乘积
定义 文档-单词
向量,描述了该文档和所有单词的关系。
向量内积
矩阵乘积
对矩阵 SVD
分解。假设矩阵
其中
SVD
分解的物理意义为:将文档按照主题分解。所有的文档一共有
第 文档-主题向量
)为:
第 主题-单词向量
)为:
第 单词-主题
向量)为:
根据
则该分解的物理意义为:文档-单词
矩阵 = 文档-主题
矩阵 x 主题强度
x 主题-单词
矩阵。
得到了文档的主题分布、单词的主题分布之后,可以获取文档的相似度和单词的相似度。
文档
单词
虽然获得了文档的单词分布,但是并不能获得主题的相似度。因为
则有:
因此,任意两个主题之间的相似度为 0 。
文档-主题向量
由 文档-主题向量
为 文档-单词向量
为
因此对于一篇新的文档 文档-单词向量
为 文档-主题向量
为:
LSA
可以应用在以下几个方面:
通过对文档的文档-主题向量
进行比较,从而进行基于主题的文档聚类或者分类。
通过对单词的单词-主题向量
进行比较,从而用于同义词、多义词进行检测。
通过将query
映射到主题空间,进而进行信息检索。
LSA
的本质是将矩阵 SVD
进行降维,降维主要是由于以下原因:
原始的文档-单词
矩阵
原始的文档-单词
矩阵
原始的文档-单词
矩阵
LSA
的降维可以解决一部分同义词的问题,也可以解决一部分二义性的问题。
经过降维,意义相同的同义词的维度会因降维被合并。
经过降维,拥有多个意义的词,其不同的含义会叠加到对应的同义词所在的维度上。
LSA
的缺点:
产生的主题维度可能存在某些主题可解释性差。即:它们并不代表一个人类理解上的主题。
由于Bag of words:BOW
模型的局限性,它无法捕捉单词的前后顺序关系。
一个解决方案是:采用二元词组或者多元词组。
LSA
假设单词和文档形成联合高斯分布。实际观察发现,它们是一个联合泊松分布。这种情况下,用pLSA
模型效果会更好。
CBOW
模型(continuous bag-of-word
):根据上下文来预测下一个单词。
在一个单词上下文的CBOW
模型中:输入是前一个单词,输出是后一个单词,输入为输出的上下文。
由于只有一个单词作为输入,因此称作一个单词的上下文。
一个单词上下文的CBOW
模型如下:
其中:
网络输入 one-hote
编码,其中只有一位为 1,其他位都为 0 。
网络输出
相邻层之间为全连接:
输入层和隐层之间的权重矩阵为
隐层和输出层之间的权重矩阵为
假设没有激活函数,没有偏置项。给定输入
令:
由于 one-hot
编码,假设它为词表
则有:
即:
给定隐向量
则有:
softmax
层,则有:
即
假设输入单词为
考虑语料库
则网络的优化目标为:
设张量
则该参数的单次更新
因此本节的参数更新推导是关于单个样本的更新:
定义
它刻画了每个输出单元的预测误差:
当
当
根据:
则
其物理意义为:
当估计过量 (
当估计不足 (
当
定义:
根据:
考虑到
写成矩阵的形式为:
由于 one-hote
编码,所以它只有一个分量非零,因此
其中
考虑更新
当
当
当给定许多训练样本(每个样本由两个单词组成),上述更新不断进行,更新的效果在不断积累。
根据单词的共现结果,输出向量与输入向量相互作用并达到平衡。
输出向量
这里隐向量
输入向量
这里
平衡的速度与效果取决于单词的共现分布,以及学习率。
考虑输入为目标单词前后的多个单词(这些单词作为输出的上下文),输入为
隐向量为所有输入单词映射结果的均值:
其中:
假设给定一个单词序列
定义损失函数为交叉熵:
它的形式与一个单词上下文
中推导的完全相同,除了这里的
考虑语料库
则网络的优化目标为:
.
与一个单词上下文
中推导的结果相同,这里给出参数更新规则:
更新
其中
更新
其中 :
在更新
你也可以直接减去
Skip-Gram
模型是根据一个单词来预测其前后附近的几个单词(即:上下文)。
Skip-Gram
网络模型如下。其中:
网络输入 one-hot
编码,其中只有一位为 1,其他位都为 0 。
网络输出
对于网络的每个输出
这里的权重共享隐含着:每个单词的输出向量是固定的、唯一的,与其他单词的输出无关。
Skip-Gram
网络模型中,设网络第
因为
并不是网络每个输出中,得分最高的单词为预测单词。因为每个输出中,概率分布都相同,即: Skip-Gram
网络的目标是:网络的多个输出之间的联合概率最大。
假设输入为单词
其中
由于网络每个输出的得分的分布都相同,令
.
定义
定义:
它刻画了网络第
当
当
根据:
定义
则有更新方程:
定义:
根据:
则有:
考虑到
写成矩阵的形式为:
由于 one-hote
编码,所以它只有一个分量非零,因此
其中
原始的CBOW
模型和Skip-Gram
模型的计算量太大,非常难以计算。
模型在计算网络输出的时候,需要计算误差 。对于CBOW
模型,需要计算 Skip-Gram
模型,需要计算
另外,每个误差的计算需要用到 softmax
函数,该 softmax
函数涉及到
每次梯度更新都需要计算网络输出。
如果词汇表有 100万
单词,模型迭代 100
次,则计算量超过 1 亿次。
虽然输入向量的维度也很高,但是由于输入向量只有一位为 1,其它位均为 0,因此输入的总体计算复杂度较小。
word2vec
优化的主要思想是:限制输出单元的数量。
事实上在上百万的输出单元中,仅有少量的输出单元对于参数更新比较重要,大部分的输出单元对于参数更新没有贡献。
有两种优化策略:
通过分层 softmax
来高效计算 softmax
函数。
通过负采样来缩减输出单元的数量。
分层 softmax
是一种高效计算 softmax
函数的算法。
经过分层 softmax
之后,计算 softmax
函数的算法复杂度从
在分层softmax
中,字典
叶子结点值为某个具体单词的概率(如下图中的白色结点)
中间节点值也代表一个概率(如下图中的灰色结点)。它的值等于直系子节点的值之和,也等于后继的叶子结点值之和,也等于从根节点到当前节点的路径的权重的乘积。
之所以有这些性质,是由于结点值、权重都是概率,满足和为1的性质
根据定义,根节点的值等于所有叶子结点的值之和,即为 1.0
二叉树的每条边代表分裂:
向左的边:表示选择左子节点,边的权重为选择左子节点的概率
向右的边:表示选择右子节点,边的权重为选择右子节点的概率
对于任意一个中间节点
选择左子节点的概率为:
选择右子节点的概率为 :
如果求得所有中间节点的向量表达,则根据每个中间节点的分裂概率,可以很容易的求得每个叶节点的值。
在分层softmax
中,算法并不直接求解输出向量
当需要计算某个单词的概率时,只需要记录从根节点到该单词叶子结点的路径。给定单词
定义
定义
定义
输出为单词
其中:
当第
当第
对于从根节点到单词
因此
对于所有的叶子节点,有
利用数学归纳法,可以证明:左子节点的值+右子节点的值=父节点的值
。上式最终证明等于根节点的值,也就是 1.0 。
为了便于讨论,这里使用CBOW
的一个单词上下文
模型。
记
则有:
其中:
定义:
如果下一个节点选择第
如果下一个节点选择第
考虑内部节点
得到向量表达为
对于每个单词
当模型的预测概率较准确,即
当模型的预测概率较不准,则
对于内部结点的向量表达 CBOW
模型和 Skip-Gram
模型。但是在 Skip-Gram
模型中,需要对
CBOW
输入参数更新:对于 CBOW
模型,定义:
考虑到
写成矩阵的形式为:
将
其中
Skip-Gram
输入参数更新:对于 Skip-Gram
模型,定义:
其中:
注意:由于引入分层softmax
,导致更新路径因为输出单词的不同而不同。因此
与Skip-Gram
中推导相同,
其中
在网络的输出层,真实的输出单词对应的输出单元作为正向单元,其它所有单词对应的输出单元为负向单元。
正向单元的数量为 1,毋庸置疑,正向单元必须输出。
负向单元的数量为
可以从所有负向单元中随机采样一批负向单元,仅仅利用这批负向单元来更新。这称作负采样。
负采样的核心思想是:利用负采样后的输出分布来模拟真实的输出分布。
对于真实的输出分布,有:
对于负采样后的输出分布,假设真实输出单词
在参数的每一轮更新中,负采样实际上只需要用到一部分单词的输出概率。
对于未被采样到的负向单元
随着训练的推进,概率分布
而概率分布
负采样时,每个负向单元是保留还是丢弃是随机的。负向单元采样的概率分布称作noise
分布,记做
其中:
假设输出的单词分类两类:
正类:只有一个,即真实的输出单词
负类:从
论文word2vec Explained: Deriving Mikolov et al.’s Negative-Sampling Word-Embedding Method
的作者指出:下面的训练目标能够得到更好的结果:
其中:
该目标函数是一个经验公式,而不是采用理论上的交叉熵
它是从另一个角度考虑:输出为正向单元的概率 * 输出为负向单元的概率。
其负的对数似然为:
仅仅考虑负采样,则可得到:
根据
其中
令
当
当
根据:
则有输出向量的更新方程:
给定一个样本,在更新输出向量时,只有
相比较而言:
原始算法中,给定一个样本在更新输出向量时,所有输出向量(一共
分层softmax
算法中,给定一个样本在更新输出向量时,
输出向量的更新方程可以用于CBOW
模型和 Skip-Gram
模型。
若用于Skip-Gram
模型,则对每个输出依次执行输出向量的更新。
CBOW
输入向量参数更新:对于 CBOW
模型,定义:
与分层softmax: CBOW 输入向量参数更新
中的推导相同,
其中
Skip-Gram
输入向量参数更新:对于 Skip-Gram
模型,定义:
其中:
注意:由于引入负采样,导致网络每个输出中,对应的输出单词有所不同,负采样单词也有所不同。因此
与Skip-Gram
中推导相同,
其中
对于一些常见单词,比如 the
,我们可以在语料库中随机删除它。这有两个原因(假设使用 CBOW
):
当 the
出现在上下文时,该单词并不会为目标词提供多少语义上的信息。
当 the
作为目标词时,该单词从语义上本身并没有多大意义,因此没必要频繁更新。
降采样过程中,单词
其中 0.001
)。
可以看到:随着单词在语料库中出现的词频越来越大,该单词保留的概率越来越低。
论文 《Enriching Word Vectors with Subword Information》
中,作者提出通过增加字符级信息来训练词向量。
下图给出了该方法在维基百科上训练的词向量在相似度计算任务上的表现(由人工评估模型召回的结果)。sisg-
和 sisg
模型均采用了 subword embedding
,区别是:对于未登录词,sisg-
采用零向量来填充,而 sisg
采用 character n-gram embedding
来填充。
单词拆分:每个单词表示为一组 character n-gram
字符(不考虑顺序),以单词 where
、 n=3
为例:
首先增加特殊的边界字符 <
(单词的左边界)和 >
(单词的右边界)。
然后拆分出一组 character n-gram
字符:<wh, whe,her,ere,re>
。
最后增加单词本身:<where>
。
为了尽可能得到多样性的 character n-gram
字符,作者抽取了所有 3<= n <= 6
的 character n-gram
。以单词 mistake
为例:
<mi,mis,ist,sta,tak,ake,ke>, // n = 3
<mis,mist,ista,stak,take,ake>, // n = 4
<mist,mista,istak,stake,take>, // n = 5
<mista,mistak,istake,stake>, // n = 6
<mistake> // 单词本身
注意:这里的 take
和 <take>
不同。前者是某个character n-gram
,后者是一个单词。
一旦拆分出单词,则:
词典 N-gram
字符。
网络输入包含单词本身以及该单词的所有 character n-gram
,网络输出仍然保持为单词本身。
模型采用 word2vec
,训练得到每个character n-gram embedding
。最终单词的词向量是其所有 character n-gram embedding
包括其本身 embedding
的和(或者均值)。
如:单词 where
的词向量来自于下面embedding
之和:
单词 <where>
本身的词向量。
一组 character n-gram
字符 <wh, whe,her,ere,re>
的词向量。
利用字符级信息训练词向量有两个优势:
有利于低频词的训练。
低频词因为词频较低,所以训练不充分。但是低频词包含的 character n-gram
可能包含某些特殊含义并且得到了充分的训练,因此有助于提升低频词的词向量的表达能力。
有利于获取 OOV
单词(未登录词:不在词汇表中的单词)的词向量。
对于不在词汇表中的单词,可以利用其 character n-gram
的embedding
来获取词向量。
模型、语料库、超参数这三个方面都会影响词向量的训练,其中语料库对训练结果的好坏影响最大。
根据论文 How to Generate a Good Word Embedding?
,作者给出以下建议:
模型选择:所有的词向量都是基于分布式分布假说:拥有相似上下文的单词,其词义相似。根据目标词和上下文的关系,模型可以分为两类:
通过上下文来预测目标词。这类模型更能够捕获单词之间的可替代关系。
通过目标词来预测上下文。
通过实验发现:简单的模型(Skip-Gram
) 在小语料库下表现较好。复杂的模型在大语料库下略有优势。
语料库:实际上语料库并不是越大越好,语料库的领域更重要。
选择了合适的领域,可能只需要 1/10
甚至 1/100
的语料就能够得到一个大的、泛领域语料库的效果。
如果选择不合适的领域,甚至会导致负面效果,比随机词向量效果还差。
超参数:
词向量的维度:
做词向量语义分析任务时,一般维度越大,效果越好。
做具体NLP
任务时(用作输入特征、或者网络初始化),50
维之后效果提升就比较少了。
迭代次数:由于训练词向量的目标是尽可能精确地预测目标词,这个优化目标和实际任务并不一致。因此最好的做法是:直接用实际任务的验证集来挑选迭代次数。
如果实际任务非常耗时,则可以随机挑选某个简单任务(如:情感分类)及其验证集来挑选迭代次数。
word2vec
还有一些重要的超参数:
窗口大小:该超参数通常和语料库中句子长度有关,可以统计句子长度分布来设置。
min-count
:最小词频训练阈值,词频低于该阈值的词被过滤。
降采样率 subsampling_rate
:降采样率越低,高频词保留的越少低频词保留的越多。
word2vec
结果评估:
通过 kmeans
聚类,查看聚类的簇分布。
通过词向量计算单词之间的相似度,查看相似词。
通过类比来查看类比词:a
之于 b
,等价于 c
之于 d
。
使用 tsne
降维可视化查看词的分布。
在 word2vec
中实际上存在两种类型的embedding
向量:
大多数论文中都采用输入向量 Using the Output Embedding to Improve Language Models
综合了输入向量和输出向量。在该论文中,作者得出结论:
在 skip-gram
模型中,在常见的衡量词向量的指标上,输出向量略微弱于输入向量。
在基于 RNN
的语言模型中,输出向量反而强于输入向量。
通过强制要求 perplexity
。
word2vec
可以用于计算句子相似度。博客 Comparing Sentence Similarity Methods
总结了 6 种计算句子相似度的方法:
无监督方法:
对句子中所有的词的词向量求平均,获得sentence embedding
。
对句子中所有的词的词向量加权平均,每个词的权重为 tf-idf
,获得sentence embedding
。
对句子中所有的词的词向量加权平均,每个词的权重为 smooth inverse frequency:SIF
;然后考虑所有的句子,并执行主成分分析;最后对每个句子的词向量加权平均减去first principal componet
,获得sentence embedding
。
SIF
定义为:
通过 Word Mover's Distance:WMD
,直接度量句子之间的相似度。
WMD
使用两个句子中单词的词向量来衡量一个句子中的单词需要在语义空间中移动
到另一个句子中的单词的最小距离。
有监督方法:
通过分类任务来训练一个文本分类器,取最后一个 hidden layer
的输出作为 sentence embedding
。
其实这就是使用文本分类器的前几层作为 encoder
。
直接训练一对句子的相似性,其优点是可以直接得到 sentence embeding
。
最终结论是:简单加权的词向量平均已经可以作为一个较好的 baseline
。
论文 《NeuralWord Embedding as Implicit Matrix Factorization》
证明了带负采样的 SkipGram
模型 skip-gram with negative-sampling:SGNS
等价于隐式的矩阵分解。
给定语料库
定义 word-context
组合。
定义 context
单词的词汇表,通常有
定义 word-context
组合在
其中:
定义单词 current word
时 embedding
向量为 context
时embedding
向量为
定义单词的 representation
矩阵为 embeddign
向量。
定义上下文的 representation
矩阵为 embeddign
向量。
给定一对 word-context
current word
的 embedding
为 context
的 embedding
为 postive
)的概率为:
其中
SGNS
最大化观察到的 word-context
组合、最小化未观察到的 word-context
组合。由于 word-context
组合都是观察到的,属于postive
样本,因此SGNS
需要通过随机采样一些 word-context
作为负样本。这就是负采样名称的由来。
理论而言只有随机采样的、未观察到的 word-context
才能作为负样本。这里直接使用随机采样的结果作为负样本有两个原因:
便于理论上推导。但是二者并不影响 SGNS
等价于矩阵分解的性质。
由于 word-context
集合仅仅占据很小的部分,因此采样得到的 word-context
组合是未观察到的概率几乎为 1
。
理论而言未观察到的 word-context
组合不一定是负样本,某些word-context
组合是合理的,只是它们从未在语料库中出现过。
对于每一对观察到的 word-context
组合 SGNS
的损失函数为:
其中 current word
非均匀分布:
这和前面介绍的一致。
均匀分布:
虽然非均匀分布在某些任务上能够产生更好的结果,但是这里采用均匀分布从而得到更好的理论推导。另外,二者并不影响 SGNS
等价于矩阵分解的性质。
最终得到 SGNS
总的损失函数为:
SGNS
的优化目标使得:
观察到的 word-context
embedding
,即
未观察到的 word-context
embedding
,即
当
因此有:
因此样本空间 word-context
组合
由于样本空间
解得:
给定随机变量 Pointwise Mutual Information :PMI
定义为
记单词 word-context
组合
定义矩阵
则有:
这里的推导只有当维度
设矩阵
当负采样个数 SGNS
等价于分解 PMI
矩阵。
直接计算 PMI
矩阵非常具有挑战性:
矩阵的维度
绝大多数组合
这可以通过引入一些先验概率使得未见过的 PMI
为一个有效的数来解决。
PMI
矩阵是 dense
矩阵。
一个解决方案是:当 PMI
矩阵成为一个巨大的稀疏矩阵,称作
事实上当
word-context
word-context
考虑到未观察到的 word-context
word-context
的 PMI
都设置为零,仅考虑正的PMI
(即 PPMI
):
这和人类的直觉相符:人们很容易联想到正的关联,如 “加拿大”
和 “滑雪”
,但是很难关注一些无关的组合,如“加拿大”
和 “沙漠”
。因此将无效的信息丢弃(PMI
置为零)而仅保留有效信息更符合经验和直觉。
如果继续在 PPMI
中考虑偏移,则得到 Shifted PPMI:SPPMI
:
可以直接将PMI
矩阵、PPMI
矩阵 或者 SPPMI
矩阵中,单词 representation
,此时单词的 representatioin
是一个高维向量。对于 PPMI,SPPMI
,该向量还是稀疏的。此时有:
也可以通过降维获得单词的低维representatiion
,如:可以通过 SVD
分解来求解
首先将 SVD
分解:
其中
选择最大的
可以选择 SGNS
效果较差。注意到这种分解方法中,SGNS
中,求解的这两个矩阵都不是正交矩阵,因此可以进行如下分解:
虽然理论上无法证明这种方式的效果更好,但是实践中发现它确实表现更佳。
基于随机梯度下降的 SGNS
和基于矩阵分解的方式各有优点:
基于矩阵分解的优点:
无需精心调优学习率等超参数。
可以按照 word-context
聚合之后的频次数据来训练,这种方式可以训练比 SGNS
大得多得语料库。
与之相反,SGNS
中每个 word-context
出现一次就需要训练一次。
基于 SGNS
的优点:
SGNS
可以区分观测值和未观测值,而 SVD
无法判断一个 word-context
为零是因为未观测还是因为 PMI
较低。这在 word-context
矩阵中非常常见。
SGNS
的目标函数对不同的
在 SVD
分解中,无法区分
SGNS
仅仅关注于观测值,因此它不要求底层的矩阵是稀疏的,可以直接优化 dense
矩阵。
因为 SVD
的求解困难,所以SVD
通常要求底层矩阵是稀疏的,因此它通常采用 PPMI/SPPMI
。
noise-contrastive estimation:NCE
采用类似的推导过程可以分解为:
实验:
数据集:英文维基百科。经过清理非文本字符、句子拆分、词干化之后,数据集包含 7750万句子、15亿 token
。
每个token
分别取左右两侧2
个token
作为上下文从而生成 word-context
集合
过滤掉 word-context
组合。
最终得到
模型:SPPMI
、SGNS
以及 SVD
。其中:
所有模型评估当
对于 SPPMI
,将该矩阵的各行作为对应单词的 representation
对于 SVD
采用分解
我们根据训练目标函数和理论目标函数来评估各算法的优化算法效果。
考虑目标函数:
对于 SGNS
我们直接通过随机梯度下降结束时的目标函数值作为
对于 SVD
我们根据
对于 SPPMI
,我们将它的各行作为对应单词的 representatioin
,上下文采用 one-hot
向量的形式,因此有:
然后根据
然后我们评估优化目标函数值和理论目标函数值的相对误差:
结果见下表。其中 PMI-log k
表示理论误差,SPPMI
表示采用 SPPMI
理论值对应的误差。
尽管 SPPMI
仅考虑非负元素而丢弃大量信息,它与最优解的理论值非常接近。
SVD
方法中,维度
对于 SVD
优化效果比 SGNS
更好;但是当维度更高时 SGNS
的优化误差比 SVD
的降低得多得多。
SVD
对于 SVD
的分解结果更接近零矩阵。因为 SVD
的目标函数是无权重的,它无法 “更关注” 那些观测结果。
在四个数据集上评估 word similarity
单词相似任务和单词类比任务。
在数据集 WordSim353
和 MEN
上评估单词相似任务。这些数据集包含人工标注的 pair-wise
单词相似度得分。
在数据集 Syntactic
和 Mixed
上评估单词类比任务。
在单词相似任务上 SVD
超越了SPPMI
(采用随机梯度下降),而 SPPMI
超越了 SGNS
。
在单词相似任务上对于 SGNS
任务 SPPMI,SVD
随着
这是因为SPPMI,SVD
中仅保留正的值,随着
在单词类比任务上 SGNS
超越了 SVD
。这是因为单词类比任务中更依赖于那些上下文中频繁出现的单词,如the,each,many
以及辅助动词 will,had
。SGNS
训练过程会更关注于这些频繁出现的 word-context
组合,而 SVD
对所有的 word-context
是无权重的。
学习词向量的所有无监督方法最终都是基于语料库的单词共现统计,因此这些模型之间存在共性。
词向量学习算法有两个主要的模型族:
基于全局矩阵分解的方法,如:latent semantic analysis:LSA
。
优点:能够有效的利用全局的统计信息。
缺点:在单词类比任务(如:国王 vs 王后
类比于男人 vs 女人
)中表现相对较差。
基于局部上下文窗口的方法,如:word2vec
。
优点:在单词类比任务中表现较好。
缺点:因为word2vec
在独立的局部上下文窗口上训练,因此难以利用单词的全局统计信息。
Global Vectors for Word Representation:GloVe
结合了LSA
算法和Word2Vec
算法的优点,既考虑了全局统计信息,又利用了局部上下文。
设单词-单词
共现矩阵为
从经验中可以发现以下规律:
单词 | 单词 | |
---|---|---|
单词 | ||
单词 |
因此
假设单词
GloVe
认为:这三个单词的词向量经过某个函数的映射之后等于
假设这个映射函数为
现在的问题是
由于
由于
上式左边为差的形式,右边为商的形式。因此联想到函数
要想使得上式成立,只需要令
向量的内积具有对称性,即
为了解决这个问题,模型引入两个偏置项:
上面的公式仅仅是理想状态,实际上只能要求左右两边尽可能相等。于是设计代价函数为:
其中
根据经验,如果两个词共现的次数越多,则这两个词在代价函数中的影响就应该越大。因此可以设计一个权重来对代价函数中的每一项进行加权,权重为共现次数的函数:
其中权重函数应该符合三个条件:
这是为了确保
的
与其它词的组合) ,但是它们的重要性并不是很大。
GloVe
论文给出的权重函数
其中:
GloVe
论文给出参数
GloVe
论文指出:
考虑对所有词向量增加一个常量
令 Glove
的解,则 Glove
的解。
因此假设
GloVe
模型的算法复杂度取决于共现矩阵
实际上单词共现的次数满足齐普夫定律(Zipf's Law
),因此算法复杂度较低,约为
Zipf's Law
:如果有一个包含个词的文章,将这些词按其出现的频次递减地排序,那么序号 和其出现频次 之积 ,将近似地为一个常数,即
GloVe
模型评估任务:
semantic
任务: 语义任务。如:'雅典'之于'希腊' = '柏林'之于'_'?
syntactic
任务:语法任务。如:'dance'之于'dancing' = 'fly'之于'_'?
GloVe
模型性能与语料库大小的关系:
在语法任务中,模型性能随着语料库大小的增长而单调增长。
这是因为语料库越大,则语法的统计结果越可靠。
在语义任务中,模型性能与语料库绝对大小无关,而与语料库的有效大小有关。
有效大小指的是语料库中,与目标语义相关的内容的大小。
GloVe
模型超参数选择:
词向量大小:词向量大小越大,则模型性能越好。但是词向量超过 200
维时,维度增加的收益是递减的。
窗口对称性:计算一个单词的上下文时,上下文窗口可以是对称的,也可以是非对称的。
对称窗口:既考虑单词左侧的上下文,又考虑单词右侧的上下文。
非对称窗口:只考虑单词左侧的上下文。
因为语言的阅读习惯是从左到右,所以只考虑左侧的上下文,不考虑右侧的上下文。
窗口大小:
在语法任务中,选择小的、非对称的窗口时,模型性能更好。
因为语法是局部的,所以小窗口即可;因为语法是依赖于单词顺序的,所以需要非对称窗口。
对于语义任务,则需要选择更大的窗口。
因为语义是非局部的。
fastText
是 Facebook AI Research
在 2016
年开源的文本分类器,其提出是在论文 《Bag of Tricks for Efficient Text Classification》
中。目前 fastText
作为文本分类的基准模型。
fastText
的优点是:在保持分类效果的同时,大大缩短了训练时间。
在 8个 数据集上,不同模型的测试误差:
单个 epoch
的训练时间(char-CNN
、VDCNN
和 fastText
):
fastText
的网络结构与 word2vec
的 CBOW
非常相似。区别在两个地方:
输入:单篇文档的所有单词都作为网络的输入。因此这里的参数 C
是动态的,它等于当前文档的单词数量。
输出:这里网络的输出是各类别的概率。通常文本分类的类别 softmax
和负采样。
隐向量为所有输入单词映射结果的均值:
其中:
单个样本的损失函数为(
定义每个输出单元的预测误差 CBOW
多个单词上下文的推导相同:
更新
其中
更新
其中 :
如果考虑词序则分类的效果还可以进一步提升,因此在 fastText
中可以引入 N-gram
特征。如:2-gram
合并文档中连续的2个单词作为特征。
fastText
生成的词向量嵌入的是分类的信息,而word2vec
生成的词向量更多的嵌入了通用语义信息。
fastText
词向量得到的相似度是基于分类类别的相似。如:商品评论情感分类任务中,好吃
和 好玩
是相似的,因为它们都是正向情感词。
word2vec
词向量得到的相似度是基于语义的相似。此时 好吃
和 美味
是相似的,因为这二者经常出现在类似的上下文中。
ELMo:Embeddings from Language Models
引入了一种新的单词表示方式,该 表示方式的建模目标是:对单词的复杂特征建模(如:语法特征、语义特征),以及能适应不同的上下文(如:多义词)。
ELMo
词向量是由双向神经网络语言模型的内部多层向量的线性加权组成。
LSTM
高层状态向量捕获了上下文相关的语义信息,可以用于语义消岐等任务。
如下图中的左图为语义消岐任务的结果,第一层、第二层分别表示单独使用 biLM
的representation
的效果。结果表明:越高层的状态向量,越能够捕获语义信息。
LSTM
底层状态向量捕获了语法信息,可以用于词性标注等任务。
如下图中的右图为词性标注任务的结果,第一层、第二层分别表示单独使用 biLM
的representation
的效果。结果表明:越低层的状态向量,越能够捕获语法信息。
ELMo
词向量与传统的词向量(如:word2vec
)不同。在ELMo
中每个单词的词向量不再是固定的,而是单词所在的句子的函数,由单词所在的上下文决定。因此ELMo
词向量可以解决多义词问题。
下图中,GloVe
无法区分 play
这个单词的多种含义。而 ELMo
由于引入了上下文,因此可以区分其不同含义。
实验表明,ELMo
在多个任务上取得了广泛的提升。
给定一个句子 :
可以用一个 LSTM
模型来实现该概率。其中:
embedding
向量, LSTM
层的第
第 LSTM
的输出经过 softmax
输出层输出对应的条件概率。
softmax
输出层由一个全连接函数和一个softmax
函数组成。
由于 RNN
的性质,所有softmax
输出层的参数都共享。
ELMo
模型采用双向神经网络语言模型,它由一个前向LSTM
网络和一个逆向 LSTM
网络组成。ELMo
最大化句子的对数前向生成概率和对数逆向生成概率。
其中:
前向 LSTM
网络和逆向 LSTM
网络共享embedding
层的参数 softmax
输出层的参数
LSTM
网络的参数, LSTM
网络的参数,二者不同。
ELMo
认为单词
最简单的情况下,ELMo
取出第 :
表示向量的拼接。
也可以直接采用这
可以给每层的向量一个权重,而这些权重(一共
此时ELMo
通用的词表达为:这
其中 softmax
归一化结果,
应用 ELMo
时,首先训练无监督的 ELMo
模型,获取每个单词的
冻结 ELMo
的模型参数并计算得到
拼接 embedding
。
对于 RNN
网络,还可以将
实验表明:在 ELMo
中添加 dropout
是有增益的。另外在损失函数中添加 ELMo
权重倾向于接近所有ELMo
权重的均值。