如何通俗理解word2vec

 

前言

今年上半年,我在我的上一篇LSTM博客中写道:“众所周知,我们已经把SVM、CNN、xgboost、LSTM等很多技术,写的/讲的国内最通俗易懂了,接下来,我们要把BERT等技术也写的/讲的国内最通俗易懂,成为入门标准,而且不单单是从NNLM、Word2Vec、Seq2Seq、Seq2Seq with Attention、Transformer、Elmo、GPT到BERT,我们希望给所有AI初学者铺路:一步一个台阶,而不是出现理解断层。”

如今惊觉,这简直就是有意无意给自己挖了个大坑,单一个word2vec就让我断断续续看了好几个月(一方面 创业嘛 你懂的,二方面 涉及的东西实在是太多了┭┮﹏┭┮)

  1. 今年8月份,因为要写word2vec的笔记,先看我司AI LAB陈博士在集8上讲word2vec的视频(目前已经可以在七月在线APP上免费试听),让对word2vec有个初步了解;
  2. 网上翻阅各种资料,比如类似浅显易懂的word2vec原理讲解、以及用图形象的解释word2vec(一图胜千言)等等。心想,肯定还能写得更通俗易懂的;
  3. ​​​​继续如饿狼似的在网上查找有没更加通俗易懂的资料,部分不错的文章则注明作者和链接 录入题库;
  4. 9月底,发现写清楚word2vec确实没那么简单,因为涉及到的东西太多了,从神经网络、语言模型、n-gram、One-Hot、NNLM、到CBOW、Skip-gram、哈夫曼编码、Hierarchical SoftMax、负采样等等,各种概念,一有不懂,就容易卡壳;
  5. 10月下旬,再看张俊林老师关于BERT的文章:NLP中的预训练技术发展史:从Word Embedding到Bert模型,觉得高屋建瓴、通俗细致。其实,之前bert刚火起来的时候,就看过俊林老师这篇文章,当时看的不甚了解,及至后来先学习word2vec和Transformer之后,再看此文,才觉得真是高屋建瓴,甚至醍醐灌顶,是关于bert中文介绍少有的好文章。

至此,拖了近半年之久,终于可以开写word2vec笔记了,本笔记从NNLM起步,会类似铺路一样,逐级逐级介绍相关概念,最终完成整篇文章,若发现有何问题,欢迎随时不吝指正,thanks。

 

一、神经网络与语言模型

1.1 神经网络
引入word2vec之前需要先对神经网络的知识有一定了解,。

下图这个是一个简单的三层神经网络,x=[x1,x2,...xK]是模型的输入, 中间经过与权重矩阵如何通俗理解word2vec运算, 矩阵运算结果再经过非线性**函数得到隐层的结果h, 从隐层到输出层同理。

这样从输入层到输出层既有线性变换,又有非线性变换, 因此可以更好刻画出输入变量的特征。

如何通俗理解word2vec


1.2 神经语言模型
作为Word Embedding的背景,语言模型(Language Model)也是很有必要简要介绍一下.
统计语言模型就是用来计算一个句子的概率分布。

1.2.1 Ngram模型

简单来说,就是计算一个句子的概率, 语言模型用处很广泛。比如机器翻译中, 如何挑选一个概率尽可能大的句子也就是尽量靠谱的句子返回,通俗来说,就是整条语句看起来是一句人话。

假设一个长度为m的句子,包含词:[(w1,w2,w3,..,wm),那么这个句子的概率,也就是这m个词共现的概率:

如何通俗理解word2vec

一般情况, 语言模型都是为了使得条件概率:P(wt|w1,w2,..,wt−1)最大化,不过考虑到近因效应,当前词与距离它比较近的n个词更加相关(一般n不超过5),而非前面所有的词都有关。

因此上述公式可以近似为:

如何通俗理解word2vec

上述便是经典的n-gram模型的近似表示方式。

不过,Ngram模型仍有其局限性。首先,由于参数空间的爆炸式增长,它无法处理更长程的context(N>3N>3)。

其次,它没有考虑词与词之间内在的联系性。例如,考虑"the cat is walking in the bedroom"这句话。如果我们在训练语料中看到了很多类似“the dog is walking in the bedroom”或是“the cat is running in the bedroom”这样的句子,那么,即使我们没有见过这句话,也可以从“cat”和“dog”(“walking”和“running”)之间的相似性,推测出这句话的概率。

然而, Ngram模型做不到。这是因为,Ngram本质上是将词当做一个个孤立的原子单元(atomic unit)去处理的。这种处理方式对应到数学上的形式是一个个离散的one-hot向量(除了一个词典索引的下标对应的方向上是1,其余方向上都是0)。

例如,对于一个大小为5的词典:
{"I", "love", "nature", "luaguage", "processing"},
“nature”对应的one-hot向量为:
[0,0,1,0,0]。

显然,one-hot向量的维度等于词典的大小。这在动辄上万甚至百万词典的实际应用中,面临着巨大的维度灾难问题(the curse of dimensionality)。

1.2.2 NNLM模型

接下来,咱们来看一下什么是神经语言模型(NNLM),NNLM最初由Bengio提出的,是A Neural Probabilistic Language Mode,word2vec便是从其中简化训练而来。

Bengio通过下面的一个三层神经网络来计算P(wt|wt−1,wt−2...wt−n(+1)):

如何通俗理解word2vec

  1. 首先第一层输入就是前n−1个词wt−(n+1),...,wt−1wt−(n+1),...,wt−1 去预测第t个词是wt的概率. 这里面的矩阵C∈|V|×d维护着词汇表中所有词的词向量, 其中|V|是词汇表中词的个数, d是词向量的维度.
  2. 然后根据输入的前n−1个词, 在C中找到它们对应的词向量
  3. 最后直接串联起来成为一个维度为(n−1)d的向量x 作为接下来三层神经网络的输入, 后面就是普通神经网络了。

需要说明的是,因为我们那要预测概率最大的wt, 因此最后输出层的神经元应该与词汇表大小同样为|V|, 这里使用使用softmax函数归一化输出层的值到[0,1], 代表可能的每个词的概率。

此外在原文中, 存在一些直连边, 也就是上图中的虚线, 从输入层直接到输出层, 是一个线性变换, Bingo在文中表示, 直连边的存在大幅降低迭代次数, 但对语言模型效果无提升, 随着计算能力的提高, 后续的工作基本都去掉了直连边。

神经语言模型构建完成之后,就是训练参数了. 这里的参数包括

  • 词向量矩阵C;
  • 三层神经网络的权重;
  • 偏置等参数。

训练数据就是大堆大堆的预料库. 训练结束之后, 语言模型得到了, 词向量也得到了. 换言之, 词向量是这个语言模型的副产品。

当然,这个模型的缺点就是速度问题, 因为词汇表往往很大,几十万几百王, 训练起来就很耗时, Bengo仅仅训练5个epoch就花了3周, 这还是40个CPU并行训练的结果. 因此才会有了后续好多的优化工作, word2vec便是其中一个。

 

2 Word2Vec

word2vec是Google于2013年的Distributed Representations ofWords and Phrases and their Compositionality 以及后续的Distributed Representations ofWords and Phrases and their Compositionality 两篇文章中提出的一种高效训练词向量的模型,基本出发点是上下文相似的两个词,它们的词向量也应该相似, 比如香蕉和梨在句子中可能经常出现在相同的上下文中,因此这两个词的表示向量应该就比较相似。
word2vec模型中比较重要的概念是词汇的上下文, 说白了就是一个词周围的词, 比如wt的范围为1的上下文就是wt−1和wt+1. 在word2vec中提出两个模型(假设上下文窗口为3)

  • CBOW(Continuous Bag-of-Word):以上下文词汇预测当前词,即用wt−1,wt+1去预测 wt
  • SkipGram:以当前词预测其上下文词汇,即用wt 去预测wt−1,wt+1

如何通俗理解word2vec

待续..

相关文章: