one hot 表示
主要问题
- 所有的向量都是正交的,无法准确表达不同词之间的相似度,没有任何语义信息
- 向量维度是语料库中所有单词的数量,维度太大。
以下内容主要摘抄自
- 来斯惟的博士论文基于神经网络的词和文档语义向量表示方法研究
- CS224n的notes
- Yoav Goldberg的word2vec Explained: Deriving Mikolov et al.’s
Negative-Sampling Word-Embedding Method
分布假说(distributional hypothesis)
Harris 在 1954 年提出的分布假说(distributional hypothesis):上下文相似的词,其语义也相似 。Firth 在 1957 年对分布假说进行了进一步阐述和明确:词的语义由其上下文决定(a word is characterized by the company it keeps)。到目前为止,基于分布假说的词表示方法,根据建模的不同,主要可以分为三类:基于矩阵的分布表示、基于聚类的分布表示和基于神经网络的分布表示。从广义上看,所有基于分布假说得到的表示均可称为分布表示(distributional representation),如上述的三种。而狭义的分布表示通常指基于矩阵的分布表示 。
而十分接近的一个术语是Distributed Representation,而Distributed Representation中的distributed 没有统计上的“分布”含义,而是“分散”、“分配”的意思。一段文本的语义分散在一个低维空间的不同维度上,相当于将不同的文本分散到空间中不用的区域。Distributed Representation是文本的一种表示形式,具体为稠密、低维、连续的向量。向量的每一维都表示文本的某种潜在的语法或语义特征。Distributed Representation翻译为分散式表示可能理解起来会更明确些。总之,Distributional Representation指的是一类获取文本表示的方法,而Distributed Representation指的是文本表示的形式,就是低维、稠密的连续向量。但这两个并不对立。比如Skip-Gram、CBOW和glove等模型得到词向量,即是Distributional Representation,又是Distributed Representation参见。
基于神经网络的分布表示——Word2vec
基于神经网络的分布表示一般称为词向量(word vector)、词嵌入(word embedding)或分布式表示(distributed representation)。
几个重要模型
- 神经网络语言模型(Neural Network Language Model ,NNLM)
- log双线性语言模型(Log-Bilinear Language Model,LBL)
- 循环神经网络语言模型(Recurrent Neural Network based Language Model,RNNLM)
- word2vec
下面主要介绍Word2vec,这也是现在最流行的表示方法之一。
Word2vec不是一个单一模型,实际是两个表示模型 CBOW(Continuous Bag of Words)、Skip-Gram和两个优化训练的方法Negative-Sampling、Hierarchical Softmax的方法组成的。one hot表示得到的是一个高维稀疏向量,现在我们想要构建的是dense vector即大多数元素不为零且维度较小的向量,并且希望在相似的context下的word vector也较为相似。
skip-gram
跳字模型(skip-gram)基于某个词来生成它在文本序列周围的词。且假设给定中心词(center word)的情况下,背景词(context word)的生成是相互独立的,算法如下:
表示说明:
词库大小设为
:词库中的第个单词
:输入矩阵
:输入矩阵的第列,实际就是的向量表示。
:输出矩阵
:输出矩阵的第行,的输出向量表示
步骤:
- 生成输入中心词的one-hot表示
- 词嵌入
- 作比较
PS:
- 在实践中步骤一通常是一个随机向量
- 每个词实际上有两个向量来表示,一个是它作为中心词时,另一个是作为背景词时,即算法中的和
目标函数,单个单词时:
另一种表达:
表示交叉熵
利用了独立性假设,然后梯度下降更新参数即可。
CBOW
连续词袋模型与跳字模型类似。与跳字模型最大的不同在于,连续词袋模型假设基于某中心词在文本序列前后的背景词来生成该中心词。因为连续词袋模型的背景词有多个,我们将这些背景词向量取平均,然后使用和跳字模型一样的方法来计算条件概率。
表示说明:
词库大小设为
:词库中的第个单词
:输入矩阵
:输入矩阵的第列,实际就是的向量表示。
:输出矩阵
:输出矩阵的第行,的输出向量表示
步骤:
- 输入:根据窗口大小生成one-hot的上下文向量
- 得到上下文的embedded word vectors
- 求平均
- 生成score vector
- softmax,,实际就是给定中心词,产生上下文的概率。与真实作比较,定义损失函数,一般是交叉熵。groundtruth是样本对应的那个词的one-hot表示。
对于每个单词,我们想要得到的是两个向量,: (input vector) when the word is in
the context,: (output vector) when the word is in the center,输入和输出矩阵是我们想要学习的参数。一个问题是我们究竟用哪一个作为embedding呢?实际上输入和输出矩阵都可以作为embedding,但是原文中使用的是输入矩阵作为embedding。
如何计算:
然后用梯度下降的方法更新参数即可。
Negative Sampling
基于skip-gram,上面推导的两个目标函数最大的问题是连加那里,要对整个词库进行计算,对于大词库,这是很大运算量,所以想办法近似求解。负采样(negative sampling)解决了这个问题,它是用来提高训练速度并且改善所得到词向量的质量的一种方法。不同于原本每个训练样本更新所有的权重,负采样每次让一个训练样本仅仅更新一小部分的权重,这样就会降低梯度下降过程中的计算量。负采样修改了原来的目标函数。给定中心词 的一个背景窗口,我们把背景词 出现在该背景窗口看作一个事件
考虑是否来自训练数据,来自训练数据的概率可以表示为:
转变优化目标为,当中新词和上下文来自训练数据时最大化其概率,不来自的时候,最大化不来自的概率。然后简单的用极大似然估计:
极大似然也就等价于极小以下函数:
对于skip-gram得到新的目标函数
如何选择negative words
使用“一元模型分布(unigram distribution)”来选择“negative words”。
每个单词被赋予一个权重,即, 它代表着单词出现的频次。
关于负采样的详细解释,可以参考Yoav Goldberg的那篇paper。
Hierarchical Softmax
层序softmax是另一种近似训练法。它使用了二叉树这一数据结构,树的每个叶结点代表词典 中的每个词。
[图片上传失败...(image-2ea297-1580910479330)]
假设 为从二叉树的根结点到词 的叶结点的路径(包括根结点和叶结点)上的结点数。设 为该路径上第 个结点,并设该结点的背景词向量为 。如图 。层序softmax将跳字模型中的条件概率近似表示为
其中是是结点 的左子结点,如果判断 为真, ,反之为-1。例子:给定词 生成词 的条件概率
时间复杂度降低至