美文网首页
CS224N笔记——词向量表示

CS224N笔记——词向量表示

作者: random_walk | 来源:发表于2020-02-05 21:48 被阅读0次

one hot 表示

image.png

主要问题

  • 所有的向量都是正交的,无法准确表达不同词之间的相似度,没有任何语义信息
  • 向量维度是语料库中所有单词的数量,维度太大。

以下内容主要摘抄自

分布假说(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参见

image.png

基于神经网络的分布表示——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也较为相似。

image.png

skip-gram

跳字模型(skip-gram)基于某个词来生成它在文本序列周围的词。且假设给定中心词(center word)的情况下,背景词(context word)的生成是相互独立的,算法如下:

表示说明:
词库大小设为|V|
w_i:词库中的第i个单词
\mathcal{V} \in \mathbb{R}^{n \times|V|}:输入矩阵
v_{i}:输入矩阵的第i列,实际就是w_i的向量表示。
\mathcal{U} \in \mathbb{R}^{[V| \times n}:输出矩阵
u_i:输出矩阵的第i行,w_i的输出向量表示
步骤:

  1. 生成输入中心词的one-hot表示 x \in \mathbb{R}^{|V|}
  2. 词嵌入v_{c}=\mathcal{V} x \in \mathbb{R}^n
  3. z=\mathcal{U} v_{c}
  4. \hat{y}=\operatorname{softmax}(z)
  5. \hat{y}_{c-m}, \ldots, \hat{y}_{c-1}, \hat{y}_{c+1}, \dots, \hat{y}_{c+m}作比较

PS:

  • 在实践中步骤一通常是一个随机向量
  • 每个词实际上有两个向量来表示,一个是它作为中心词时,另一个是作为背景词时,即算法中的\mathcal{V}\mathcal{U}

目标函数,单个单词时:
\begin{aligned} \text { minimize } J &=-\log P\left(w_{c-m}, \ldots, w_{c-1}, w_{c+1}, \ldots, w_{c+m} | w_{c}\right) \\ &=-\log \prod_{j=0, j \neq m}^{2 m} P\left(w_{c-m+j} | w_{c}\right) \\ &=-\log \prod_{j=0, j \neq m}^{2 m} P\left(u_{c-m+j} | v_{c}\right) \\ &=-\log \prod_{j=0, j \neq m}^{2 m} \frac{\exp \left(u_{c-m+j}^{T} v_{c}\right)}{\sum_{k=1}^{T} \exp \left(u_{k}^{T} v_{c}\right)} \\ &=-\sum_{j=0, j \neq m}^{2 m} u_{c-m+j}^{T} v_{c}+2 m \log \sum_{k=1}^{|V|} \exp \left(u_{k}^{T} v_{c}\right) \end{aligned}
另一种表达:
\begin{aligned} J &=-\sum_{j=0, j \neq m}^{2 m} \log P\left(u_{c-m+j} | v_{c}\right) \\ &=\sum_{j=0, j \neq m}^{2 m} H\left(\hat{y}, y_{c-m+j}\right) \end{aligned}
H\left(\hat{y}, y_{c-m+j}\right)表示交叉熵
利用了独立性假设,然后梯度下降更新参数即可。

skip gram.png

CBOW

连续词袋模型与跳字模型类似。与跳字模型最大的不同在于,连续词袋模型假设基于某中心词在文本序列前后的背景词来生成该中心词。因为连续词袋模型的背景词有多个,我们将这些背景词向量取平均,然后使用和跳字模型一样的方法来计算条件概率。

表示说明:
词库大小设为|V|
w_i:词库中的第i个单词
\mathcal{V} \in \mathbb{R}^{n \times|V|}:输入矩阵
v_{i}:输入矩阵的第i列,实际就是w_i的向量表示。
\mathcal{U} \in \mathbb{R}^{[V| \times n}:输出矩阵
u_i:输出矩阵的第i行,w_i的输出向量表示
步骤:

  1. 输入:根据窗口大小生成one-hot的上下文向量 \left(x^{(c-m)}, \ldots, x^{(c-1)}, x^{(c+1)}, \ldots, x^{(c+m)} \in \mathbb{R}^{|V|}\right)
  2. 得到上下文的embedded word vectors(v_{c-m} = \mathcal{V} x^{(c-m)}, v_{c-m+1}=\mathcal{V} x^{(c-m+1)}, \ldots, v_{c+m}=\mathcal{V} x^{(c+m)} \in \mathbb{R}^{n} )
  3. 求平均\hat{v}=\frac{v_{c-m}+v_{c-m+1}+\ldots+v_{c+m}}{2 m} \in \mathbb{R}^{n}
  4. 生成score vector z=\mathcal{U} \hat{v} \in \mathbb{R}^{|V|}
  5. softmax,\hat{y}=\operatorname{softmax}(z) \in \mathbb{R}^{|V|},实际就是给定中心词,产生上下文的概率。与真实作比较,定义损失函数,一般是交叉熵。groundtruth是样本对应的那个词的one-hot表示。

对于每个单词,我们想要得到的是两个向量,v: (input vector) when the word is in
the context,u: (output vector) when the word is in the center,输入和输出矩阵是我们想要学习的参数。一个问题是我们究竟用哪一个作为embedding呢?实际上输入和输出矩阵都可以作为embedding,但是原文中使用的是输入矩阵作为embedding。
如何计算:
\begin{aligned} \text { minimize } J &=-\log P\left(w_{c} | w_{c-m}, \ldots, w_{c-1}, w_{c+1}, \ldots, w_{c+m}\right) \\ &=-\log P\left(u_{c} | \hat{v}\right) \\ &=-\log \frac{\exp \left(u_{c}^{T} \hat{v}\right)}{\sum_{j=1}^{|V|} \exp \left(u_{j}^{T} \hat{v}\right)} \\ &=-u_{c}^{T} \hat{v}+\log \sum_{j=1}^{|V|} \exp \left(u_{j}^{T} \hat{v}\right) \end{aligned}
然后用梯度下降的方法更新参数即可。

image.png

Negative Sampling

基于skip-gram,上面推导的两个目标函数最大的问题是连加那里,要对整个词库进行计算,对于大词库,这是很大运算量,所以想办法近似求解。负采样(negative sampling)解决了这个问题,它是用来提高训练速度并且改善所得到词向量的质量的一种方法。不同于原本每个训练样本更新所有的权重,负采样每次让一个训练样本仅仅更新一小部分的权重,这样就会降低梯度下降过程中的计算量。负采样修改了原来的目标函数。给定中心词 c 的一个背景窗口,我们把背景词 w 出现在该背景窗口看作一个事件
考虑(w,c)是否来自训练数据,来自训练数据的概率可以表示为:
P(D=1 | w, c, \theta)=\sigma\left(v_{c}^{T} v_{w}\right)=\frac{1}{1+e^{\left(-v_{c}^{T} v_{w}\right)}}
转变优化目标为,当中新词和上下文来自训练数据时最大化其概率,不来自的时候,最大化不来自的概率。然后简单的用极大似然估计:
\begin{align} \theta &= \underset{\theta}{\operatorname{argmax}} \prod_{(w, c) \in D} P(D=1 | w, c, \theta) \prod_{(w, c) \in \tilde{D}} P(D=0 | w, c, \theta) \\ &=\underset{\theta}{\operatorname{argmax}} \prod_{(w, c) \in D} P(D=1 | w, c, \theta) \prod_{(w, c) \in \tilde{D}}(1-P(D=1 | w, c, \theta)) \\ & =\underset{\theta}{\operatorname{argmax}} \sum_{(w, c) \in D} \log P(D=1 | w, c, \theta)+\sum_{(w, c) \in \tilde{D}} \log (1-P(D=1 | w, c, \theta)) \\ &=\underset{\theta}{\operatorname{argmax}} \sum_{(w, c) \in D} \log \frac{1}{1+\exp \left(-u_{w}^{T} v_{c}\right)}+\sum_{(w, c) \in \tilde{D}} \log \left(1-\frac{1}{1+\exp \left(-u_{w}^{T} v_{c}\right)}\right) \\ &=\underset{\theta}{\operatorname{argmax}} \sum_{(w, c) \in D} \log \frac{1}{1+\exp \left(-u_{w}^{T} v_{c}\right)}+\sum_{(w, c) \in \tilde{D}} \log \left(\frac{1}{1+\exp \left(u_{w}^{T} v_{c}\right)}\right) \end{align}
极大似然也就等价于极小以下函数:
J=-\sum_{(w, c) \in D} \log \frac{1}{1+\exp \left(-u_{w}^{T} v_{c}\right)}-\sum_{(w, c) \in \tilde{D}} \log \left(\frac{1}{1+\exp \left(u_{w}^{T} v_{c}\right)}\right)
对于skip-gram得到新的目标函数
-\log \sigma\left(u_{c-m+j}^{T} \cdot v_{c}\right)-\sum_{k=1}^{K} \log \sigma\left(-\tilde{u}_{k}^{T} \cdot v_{c}\right)

如何选择negative words

使用“一元模型分布(unigram distribution)”来选择“negative words”。
P\left(w_{i}\right)=\frac{f\left(w_{i}\right)^{3 / 4}}{\sum_{j=0}^{n}\left(f\left(w_{j}\right)^{3 / 4}\right)}
每个单词被赋予一个权重,即f(w_i), 它代表着单词出现的频次。
关于负采样的详细解释,可以参考Yoav Goldberg的那篇paper。

Hierarchical Softmax

层序softmax是另一种近似训练法。它使用了二叉树这一数据结构,树的每个叶结点代表词典 \mathcal{V} 中的每个词。
[图片上传失败...(image-2ea297-1580910479330)]
假设 L(w) 为从二叉树的根结点到词 w 的叶结点的路径(包括根结点和叶结点)上的结点数。设 n(w,j) 为该路径上第 j个结点,并设该结点的背景词向量为 \boldsymbol{u}_{n(w,j)}。如图L(w_3)=4 。层序softmax将跳字模型中的条件概率近似表示为P(w_o \mid w_c) = \prod_{j=1}^{L(w_o)-1} \sigma\left( [\![ n(w_o, j+1) = \text{leftChild}(n(w_o,j)) ]\!] \cdot \boldsymbol{u}_{n(w_o,j)}^\top \boldsymbol{v}_c\right)
其中\text{leftChild}(n)是是结点 n 的左子结点,如果判断 x 为真, [\![x]\!] = 1,反之为-1。例子:给定词 w_c 生成词 w_3 的条件概率
P(w_3 \mid w_c) = \sigma(\boldsymbol{u}_{n(w_3,1)}^\top \boldsymbol{v}_c) \cdot \sigma(-\boldsymbol{u}_{n(w_3,2)}^\top \boldsymbol{v}_c) \cdot \sigma(\boldsymbol{u}_{n(w_3,3)}^\top \boldsymbol{v}_c).
时间复杂度降低至\mathcal{O}(\text{log}_2|\mathcal{V}|)

相关文章

  • 2019斯坦福CS224N笔记-(2)词向量的优化与评价

    【2019斯坦福CS224N笔记】(2)词向量的优化与评价 [toc] 写在前面 在【2019斯坦福CS224N笔...

  • CS224N笔记——词向量表示

    one hot 表示 主要问题 所有的向量都是正交的,无法准确表达不同词之间的相似度,没有任何语义信息 向量维度是...

  • CS224N学习笔记(三)—— 高级词向量表示

    一、GloVe模型 基于统计的词向量模型以基于SVD分解技术的LSA模型为代表,通过构建一个共现矩阵得到隐层的语义...

  • NLP笔记 - 词向量

    学习词向量的笔记 词向量 or word2vec,一种NLP中对词语的特征表示。由于one-hot会产生维度灾难,...

  • TensorFlow实现Word2Vec并进行代码详解

    1.代码部分 2. 词向量图词向量空间表示

  • 词向量表示

    word2vec 独热编码One-Hot 文本深度表示模型——word2vec&doc2vec词向量模型https...

  • 预训练好的词向量资源

    词向量是用来表示词的向量,通常也被认为是词的特征向量。现在已经成为自然语言处理的基础技术。词向量的好坏,会直接影响...

  • 2021-06-17 ch21 词向量review

    词向量:和独热编码不同的是,可以表示一个词的含义,但无法表示一词多义 训练词向量的方法:基于非语言模型的方法:CB...

  • 词向量Word2vec

    下面是记录一下,学习词向量的笔记(根据自己的风格) 一、词向量 假设现在词向量长度length=3,一个词对应on...

  • 词向量:word2vec

    词向量技术将自然语言中的词转化为稠密向量,使得相近的词有相似的向量表示,方便后续在向量的基础上做运算,进一步挖掘文...

网友评论

      本文标题:CS224N笔记——词向量表示

      本文链接:https://www.haomeiwen.com/subject/bqlsxhtx.html