word2vec: 理解nnlm, cbow, skip-gram

word2vec 论文笔记

1 word rep

怎么表示词的意思?
传统的想法有查字典. 近义词,缺点:主观,费人力, 难记算相似性
one-hot 缺点:维度灾难,正交,无法计算similarity.
那么,通过借鉴近义词,学习将similarity编码到词向量中去.

1.1 one-hot

n-gram language model见我之前写的csdn Blog:
1. BOW
2. TF-IDF

BOW, TF-IDF这类n-gram表示,在文本分类还是挺有用的,利用统计学的优势.

其对词意的表示还是以one-hot encoding的形式,稀疏向量, 任意两向量都是正交的,点乘为0, 没有相似性的一个自然的表达.

key: A word’s meaning is given by the words that
frequently appear close-by

“You shall know a word by the company it keeps” (J. R. Firth 1957: 11)

为解决以上问题,可以借鉴查字典的方法去计算相似性,通过向量本身编码相似性.

1.2 embedding

why called embedding?

embedding 和 encoding 意思一样就是用一个dense vector 去表示词的特征.可以想象将这个词嵌入到高维空间的一个点. 本质上就是映射,将原空间的词映射到另一空间的高维向量, 这样的表示也叫word representation. 同理, image embedding也是这么理解的.

对一个corpus,假设有10k个词,词向量特征维度是300, embedding就是一个10k*300 的密集矩阵

why better than one-hot?

  1. 泛化性更强
  2. 在多种任务中效果更好, 如文本生成, 名词实体识别, sentiment analysis, text summarization, co-reference resolution, parsing等.
  3. 迁移学习

similarity:intuition

通过学习获得的word embedding可以捕捉语义和语法规律 Mikolov et al 2013. 可以帮助理解为什么word embedding有效果.

e m a n e w o m a n e k i n g e q u e e n
e a p p l e e a p p l e s e c a r e c a r s

这种语义语法的相似性使word embedding具有很好的泛化性:

  • The cat is walking in the bedroom
  • A dog was running in a room
  • The cat is running in a room
  • A dog is walking in a bedroom
  • The dog was walking in the room

这种相似性也是检验word embedding是否有用的标准之一.(另一种是看各种任务效果的提升)

2 模型

实际上通过训练模型学习word embedding的方法非常悠久. 像众多问题一样,模型的演化是从复杂到简单,人们发现用一个看起来非常简单的模型,在corpus数据量巨大的情况下进行训练依然能得到效果非常不错的word embedding.

13年word2vec的目标其实是提出针对数据量达到特别大,十亿级的文本库,百万级的单词的corpus,高效的学习word embedding. 论文的核心也是围绕各种模型的复杂度进行比较的,衡量模型复杂度的是模型的参数数量.

key: A word’s meaning is given by the words that
frequently appear close-by

“You shall know a word by the company it keeps” (J. R. Firth 1957: 11)

这里再提一下一下模型的核心思想.

2.1 A Neural Probabilistic Language Model

03年Bengio提出的learning a distributed representation by words的模型.

2.1.1 Feedforward Neural Net Language Model

词数量 V , 词向量维度 m , Embedding C , shape ( V × m ) , 通过前 n 1 个词来预测第n个词的likelihood.

输入: { w t n 1 , . . . , w t 2 , w t 1 } , 以通过 C 映射得到前 n 个词的词向量 { C ( w t n + 1 ) , . . . , C ( w t 2 ) , C ( w t 1 ) } , 输入就是将这n个词向量合并的向量, 长度为 ( n 1 ) × m . 这样理解,每个词以one-hot表示输入,经过Embedding layer,一个没有激活函数的隐藏层,得到特征向量.

经过只有一个隐藏层(#hidden units = h)的神经网络,隐藏层 W ( h × ( n 1 ) m ) ,然后经过一个tanh激活函数, 进入输出层 H ( V × h ) .

输出: 一个长度为 V 的向量 y ^ ( y ^ 1 , y ^ 2 , . . . , y ^ i , . . . y ^ V ) ,计算softmax.相当对词库V中每一个词i计算出现的可能性

p ^ ( w t = i | c o n t e x t ) = e y i j V e y j

模型要最大化 p ^ ( t a r g e t w o r d | c o n t e x t ) .

目标函数:

J ( θ ) = 1 T t T l o g f ( w t , w t 1 , . . . , w t n + 1 ; θ ) + R ( θ )

T 是一段文本,对每个位置t,对其的预测计算likelihood, 反向传播minimize J ( θ ) , R ( θ ) 是正则化. θ 是模型参数,**包括**embedding层 C .

模型复杂度: 对每个训练样本 word embedding有 n × m 个参数, 中间隐藏层有 h × n m 个参数,输出层有 V × h 个参数.

Q = n × m + h × n m + V × h

其中占大头的是 V × h , 但是通过hierarchical softmax,这一part要考虑的参数可以减少到 l o g ( V ) .这下子模型参数的大头变成了 h × n m .也就是隐藏层.

这里写图片描述

2.1.2 Recurrent NNLM

我并没有深入看这一part, 但网上的有个blog不错.

RNNLM的模型复杂度: Q = h × h + V × h .

同样通过hierarchical softmax, V × h 可以被减小到 l o g ( V ) × h . 大多数复杂度来自RNNLM的隐藏层 h × h .

2.2 word2vec

既然NNLM的复杂度主要来自隐藏层,word2vec提出了接下来的两个模型,既能和NNLM一样准确的表达词义,又能再更大的数据集上更高效的训练.

两个模型的核心思想和NNLM是一样的,再次强调

“You shall know a word by the company it keeps” (J. R. Firth 1957: 11)

非常奇怪的是网上的各种课程,blogs都是先从skip-gram模型开始介绍word2vec(可能SG效果更好,更高效?),甚至不提CBOW模型, 但是从模型相似程度和理解的角度, CBOW和NNLM更像, 所以我也先说CBOW.

2.2.1 CBOW

CBOW和feedforward NNLM非常相似, 只是将中间的隐藏层除去了,同时,用来预测object word的context word的词向量不再合并, 而是求平均

1 n C i = 1 n w i

reminder: n个上下文词, CBOW使用的是目标词前4个词和后4个词,相比NNLM更考虑了上下文. C 是embedding矩阵, w i 是one-hot编码, 结果出来是一个m维的词向量. 值得一提, 实现的时候应该不是将one-hot加起来之后进行矩阵-向量乘法, 这样太费时了, 应该是直接对词向量取平均吧

然后直接到输出层 H ( V × h ) , 得到V维向量,softmax. 后面的目标函数,反向传播,更新参数和NNLM如出一辙.

OK, 将隐藏层丢掉之后, 模型复杂度:

Q = n × m + l o g ( V ) × h

这里直接考虑用了hierarchical softmax的方法,所以是 l o g ( V ) .

这里写图片描述

2.2.2 Skip-gram

首先,为什么叫skip-gram,因为n-gram是根据n个相邻的词进行学习的模型,skip的idea相当于是从中心词上下文的一个window中选择一个或n个词,增加了随机性,所以叫skip.

SG相当于CBOW的逆过程. 通过中心词预测上下文. 一个中心词 c , n个上下文词 o . 论文中,window大小为10, 随机一个1到10的数r, 就会在中心词左边和右边分别选r个词作为上下文词target word.

每次输入只有一个词的one-hot编码, 得到词向量 v c 后, 直接进入输出层.
**这里我看了很多blog对输出层结构的解释都有些不同,不得不去看Mikolov另一篇论文(Distributed Representations of Words and Phrases
and their Compositionality)**

输出层的参数,还是一个Embedding 矩阵 C ,shape V × m , 针对每个target word o , softmax公式计算

p ( w o | w c ) = e v o T v c w V e v w T v c

中心词c的词向量 v c 和Embedding 矩阵 C 中的每一个词向量 v w 做点乘求和计算. 以此预计在给定中心词的条件下,预测出附近词的概率. 目标当然是要这个概率最大,所以要minimize目标函数

J ( θ ) = 1 T t = 1 T r j r , j 0 l o g p ( w o + j | w c )

训练得到了两个Embedding C C , 取平均就行.

SG的模型复杂度

Q = n × ( m + m × l o g ( V ) )

n决定要预测几个附件的词, 因为输入只有一个词, 就是m个参数, 加上通过hierarchical softmax 和 negative sampling 的简化的输出层参数使得 V 变成 l o g ( V ) .

*同时在Distributed Representations of Words and Phrases
and their Compositionality中提到了hierarchical softmax 和 negative sampling这两种简化softmax计算的方法,由于时间有限,留个坑*

result

最后再来说一下论文提到的检验Embedding的方法,前人一般会观察和理解两个相似的词向量比如FranceItaly,列一些表什么的.

而Mikolov又用了他在另一篇自己的论文Linguistic Regularitics in Continuous Space Word Representaions上用的方式,也就是上面提到过的

e m a n e w o m a n e k i n g e q u e e n
e a p p l e e a p p l e s e c a r e c a r s

怎么发现这种关系的呢,以 e m a n e w o m a n e k i n g e q u e e n 为例, 只要找到一个词的词向量 e w e k i n g e q u e e n + e w o m a n 最接近就行, 可以用余弦相似性:

a u g m a x w V C o s ( e w , e k i n g e q u e e n + e w o m a n )

所以理想情况下, w会是man.

参考

  1. Skip-gram
  2. Skip-gram原论文
  3. cs224n
  4. CBOW
  5. deeplearning.ai
  6. 花书12.4
  7. 知乎
  8. nnlm1
  9. nnlm2

猜你喜欢

转载自blog.csdn.net/nemoyy/article/details/80603438