深入了解Word2Vec
word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包。作者:Tomas Mikolov等,相关论文:
Efficient Estimation of Word Representations in Vector Space
http://arxiv.org/pdf/1301.3781.pdf– Mikolov等。「2013年」
单词和短语的分布式表示及其组成– Mikolov等。「2013年」
https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf
Linguistic Regularities in Continuous Space Word Representations
-
http://www.aclweb.org/anthology/N13-1090– Mikolov等。「2013年」
你了解如下问题吗?
什么是统计语言模型
神经概率语言模型的网络结构
什么是词向量
CBOW模型和Skip-gram模型的网络结构和训练方法
Hierarchical Softmax和Negative Sampling的训练方法
Hierarchical Softmax与Huffman树的关系
word2vec两种训练模型
CBOW模型根据中心词W(t)周围的词来预测中心词
Skip-gram模型则根据中心词W(t)来预测周围词
word2vec两种加速算法
Hierarchical Softmax-分层 Softmax
Negative Sampling-负采样
CBOW & Skip-gram简易框架对比
统计语言模型-「Statistical Language Model」
是NLP的基础模型,它是从概率统计角度出发,解决自然语言上下文相关的特性的数学模型。统计语言模型的核心就是判断一个句子在文本中出现的概率,并不尝试去理解句子的内容含义。
那什么是句子的概率呢?
假设 S= ,是由m个词w1,w2,...,wm按顺序构成的一个句子,则
的联合概率
利用Bayes公式上式可分解为:
也就是表示在已知了前面词的前提下,第m个单词是 的条件概率。
在统计语言模型中为了减少参数数量,基于马尔可夫假设,通常采用n-gram模型,我们可以认为下一个词的出现仅依赖于他前面的一个或者 个词,因此模型简化为:
这称为 -gram模型,其中
表示当前单词依赖它前面单词的个数,通常
可以取1、2、3、4,其中
取1、2、3、4时模型分别称为:
unigram
bigram
trigram
4-gram等
-gram模型的参数一般采用最大似然估计方法进行计算:
其中 表示短语
的语料中出现的次数。
n-gram模型参数数量和n的关系
在计算复杂度方面,显然n不能取太大,实际中用的比较多的就是n=3.这样无法学习到long-distance dependency.
在模型效果方面,理论上n越大越好,注意,当n大到一定程度时,模型提升效果会变小。具体原因这里不说明,感兴趣可以参考吴军《数学之美》。
神经概率语言模型
神经网络的结构包括四个层:输入层Input、投影层Projection、隐藏层Hidden和输出层Output,其中W,U分别为投影层与隐藏层以及隐藏层和输出层之间的权值矩阵。
这里,N=3个上下文单词表示为3个one-hot向量,通过E嵌入矩阵的3个实例完全连接到嵌入层。
注意,我们不想学习将前三个单词映射到投影层的独立权重矩阵,我们想要在这三个单词之间共享一个嵌入字典E(已经学习到的词向量矩阵)。这是因为随着时间的推移,许多不同的单词会以 或
的形式出现,我们想用一个向量来表示每个单词,不管它出现在哪个上下文位置。因此,嵌入权矩阵E对于每个单词都有一行,每个向量都有d维,因此具有维数
。
神经网络语言模型的复杂性(前馈或递归)来源于非线性隐层。
【在 NLP任务中,我们把自然语言交给机器学习算法来处理,但是机器无法识别人类的语言,所以首先要做的事情就是把语言数值化,词向量就是很好的方式。】
说了这么多,单词向量到底是什么?
词向量
一种简单的词向量是one-hot representation
另一种词向量是distributed representation
词向量并不唯一,他的质量依赖于语料库和训练的算法等。
在一个层面上,它只是权重的向量。
One-hot
one-hot将有序排列的全部单词看作整个向量空间,向量内只有0,1两种数值,如果某个单词出现在第i个位置,则向量的第i个元素是1,其他元素是0。
举个著名的“King – Man + Woman = Queen”例子.我们现在只有五个词:King, Queen, Man, Woman, and Child。我们可以将单词“ Queen”编码为:
one-hot解决了单词的表示问题,但却不能拿来计算单词间的相似度,因为,任意两个词向量间都是正交的,即内积为0,模1,相似度同样为0。
因此,我们需要降维词空间,尝试去找一个可以计算单词间相似度的子空间。
在word2vec中,使用单词的分布式表示形式,更多参考「电影评价情感分析」。取一个具有几百个维度(例如1000)的向量。每个单词都由这些元素上的权重分布表示。
此时的词向量就是训练神经网络时候的隐藏层参数或者说矩阵。
如果我在假设的词向量中标注尺寸,它可能看起来像这样:
用词向量推理
我们发现,学习的单词表示实际上以非常简单的方式捕获了有意义的句法和语义规律。具体而言,将规则性视为共享特定关系的成对单词之间的恒定矢量偏移。例如,如果我们将单词i的向量表示为xi,并关注单数/复数关系,我们会发现x苹果– x苹果≈x汽车– x汽车,x家庭– x家庭≈x汽车– x汽车,等。也许更令人惊讶的是,我们发现,对于各种语义关系而言,情况也是如此,正如通过测量关系相似性的任务所衡量的那样。
这些向量很擅长回答类比问题a和b之间的关系就像c和?之间的关系一样。例如,男人之于女人就像叔叔之于女人?(aunt)采用一种简单的基于余弦距离的矢量偏移方法。
例如,下面是三个词对表示性别关系的向量偏移量:
在这里我们看到单数和复数的关系:
这种向量组合也让我们回答“King – Man + Woman = ?” 的问题,得出的结果是“Queen” !当你想到所有这些知识仅仅来自于在上下文中查看大量的单词,而没有提供关于它们语义的其他信息时,这一切都是值得注意的。
有些令人惊讶的是,人们发现单词表征的相似性超出了简单的句法规律。使用单词偏移技术,在单词向量上执行简单的代数操作,例如,向量(“King”)-向量(“Man”)+向量(“Woman”)得到的向量与单词Queen的向量表示最接近。
King, Man, Queen, & Woman 的向量:
King – Man + Woman = ?
Mikolov等人并不是第一个使用单词的连续向量表示的人,但他们确实展示了如何降低学习这种表示的计算复杂性——使在大量数据上学习高维单词向量成为现实。
既然词向量这么有用,我们该怎么获得呢?
估计词向量的算法有很多,比如LSA「 Latent semantic analysis」、LDA「Latent Dirichlet Allocation」,当然还有神经网络。
下面介绍一种词向量的估计方法Word2Vec,他包括两个训练模型:CBOW和Skip-gram.
CBOW-「Continuous Bag-of-Words Model」
网络结构
CBOW的网络结构包括三层:输入层、投影层、输出层.
输出是一棵Huffman树。
对比神经概率语言模型:
1:输入层到投影层,前者【神经网络】是通过拼接,后者是通过求累加和。
2:前者有隐藏层,后者没有
3:前者输入是线性结构,后者输出是一棵二叉树。
想象一下,在文本上方有一个滑动窗口,其中包括当前关注的中心词、前面的四个词以及后面的四个词:
上下文词形成输入层。每个单词都以一种热的形式编码,因此如果词汇表大小为V,那么它们将是V维向量,其中只有一个元素被设置为1,其余的元素都为0。有一个隐藏层和一个输出层。
训练的目标是在给定输入上下文词的情况下,最大限度地提高观察实际输出词(焦点词)的条件概率。在我们的例子中,给定输入(“an”,“efficient”,“method”,“for”,“high”,“quality”,“distributed”,“vector”),我们希望最大化获得“learning”作为输出的概率。
由于我们的输入向量是单热的,将一个输入向量乘以权重矩阵W1相当于从W1中选择一行。
给定C输入字向量,隐层h的**函数等于W1中相应的“hot”行之和,再除以C取其平均值。
这意味着隐含层单元的链接(**)函数是简单的线性函数(即,直接将其加权输入总和传递给下一层)。
从隐含层到输出层,利用第二个权重矩阵W2对词汇表中的每个单词进行打分,利用softmax获得单词的后验分布。
skip-gram
输出同样是Huffman树。
skip-gram模型与CBOW模型相反。它以焦点词作为单一输入向量构建,目标上下文词现在位于输出层:
隐层的**函数相当于从权重矩阵W1(线性)中复制相应的行,就像我们之前看到的那样。在输出层,我们现在输出的是C多项分布而不是一个。训练的目标是模拟输出层中所有上下文单词的预测误差总和。在我们的例子中,输入将是“学习”,我们希望在输出层看到:
(“an”、“efficient”、“method”、“for”、“high”、“quality”、“distributed”、“vector”)。
加速算法
必须为训练实例中的每个单词更新每个输出单词向量是非常耗时的....
为了解决这个问题,一种直觉是限制每个训练实例必须更新的输出向量的数量。Mikolov等人引入了分层Softmax(Hierarchical Softmax)和负采样(Negative Sampling)。
Softmax(Hierarchical Softmax)
它的基本思想是将复杂的归一化概率分解为一系列条件概率乘积的形式:
其中,每一层条件概率对应一个二分类问题,可以通过一个简单的逻辑回归函数去拟合。这样,我们将对????V个词的概率归一化问题,转化成了对logV个词的概率拟合问题。
分层softmax使用一棵二叉树来表示词汇表中的所有单词。文字本身就是树上的叶子。对于每一个叶子,都存在一条从根到叶子的唯一路径,该路径用于估计叶子所代表的单词的概率。“我们把这个概率定义为从根结点到叶结点的随机游走的概率。”
主要优势在于,无需评估神经网络中的V输出节点以获得概率分布,仅需要评估大约log 2(V)个单词即可。在我们的工作中,我们使用二进制霍夫曼树「更详细的参考Huffman树与Huffman编码」,因为它分配了短代码频繁的单词会导致快速训练。
Mikolov等还使用简单的子采样方法来抵消训练集中稀有词和常见词之间的不平衡(例如,“ in”,“ the”和“ a”提供的信息价值要比稀有词少)。训练集中的每个单词都以概率P(wi)丢弃,其中
word2vec还有很多细节,篇幅有限,老夫更不动了......
欢迎评论区讨论,虽然NLP现在已经是BERT的天下了,但是参考一下大佬们的创造过程还是很爽的,膜拜这种造轮子的人!
01
02
03
03
参考:
[1]The amazing power of word vectors
[2]Efficient Estimation of Word Representations in Vector Space
[3]Distributed Representations of Words and Phrases and their Compositionality
[4]Linguistic Regularities in Continuous Space Word Representations