Word2vec之CBOW 模型

什么是 Word2vec?

在NLP中,如果你需要对语料库进行预处理,比如,英文语料库你可能需要大小写转换检查拼写错误等操作,如果是中文日语语料库你需要增加分词处理。在得到你想要的语料之后,将他们的one-hot向量作为word2vec的输入,通过word2vec训练低维词向量(word embedding)就可以了。本文旨在阐述word2vec如何将语料库的one-hot向量(模型的输入)转换成低维词向量(模型的中间产物,更具体来说是输入权重矩阵)

word2vec有两种训练模型:CBOW模型和Skip-gram模型。
如果是用一个词语作为输入,来预测它周围的上下文,那这个模型叫做Skip-gram 模型
而如果是拿一个词语的上下文作为输入,来预测这个词语本身,则是 CBOW 模型

CBOW模型的流程

先来看着这个结构图,用自然语言描述一下CBOW模型的流程:
Word2vec之CBOW 模型
下面看图说下整体步骤是怎么样的:
1.输入层:上下文单词被转化为one-hot向量. (假设单词向量空间dim为V,上下文单词个数为C)
2.隐藏层:所有one-hot分别乘以共享的输入权重矩阵W. (VN矩阵,N为自己设定的数,初始化权重矩阵W)所得的向量相加求平均作为隐藏层向量. 乘以输出权重矩阵W’ . (NV矩阵)
3.输出层:将softmax作用于输出向量,得到每个词的概率分布.(PS: 因为是one-hot嘛,其中的每一维都代表着一个单词),概率最大的index所指示的单词为预测出的中间词(target word)

CBOW模型流程举例

假设我们现在的Corpus是这一个简单的只有四个单词的document:
Word2vec之CBOW 模型
Step 1. 得到上下文词的one-hot向量作为输入,同时得到预期的输出one-hot向量(这个用来最后计算损失函数)。 Word2vec之CBOW 模型

Step 2. 输入层每个词的one-hot与权重矩阵WVN相乘,得到对应的向量。(其实这就是对应词的词向量,矩阵的参数是网络通过训练得到的)。
V表示语料库中词的个数,即one-hot向量的维数是V。
N表示隐藏层神经元的数量,即希望最后得到的词向量维数为N。
Word2vec之CBOW 模型
得到每个词的词向量
Word2vec之CBOW 模型
Word2vec之CBOW 模型
Word2vec之CBOW 模型

Step 3. 将得到的三个向量相加求平均,作为输出层的输入。
Word2vec之CBOW 模型
Step 4. 将向量与输出层的权重矩阵U相乘,得到输出向量。
Word2vec之CBOW 模型
Word2vec之CBOW 模型

Step 5. 将softmax作用于输出向量,得到每个词的概率分布。
Word2vec之CBOW 模型
Step 6. 通过损失度量函数(如交叉熵),计算网络的输出概率分布与预期输出onehot向量的之间损失值。通过这个损失值进行反向传播,更新网络参数。

经过上述步骤的多次迭代后,矩阵W就是词向量矩阵,每个词通过one-hot查询词向量矩阵就能得到其对应的词向量。

总结

one-hot编码,就是有多少个不同的词,我就会创建多少维的向量。这样可能会造成维数爆炸,计算上受不了,于是就出来了连续向量表示,比如用100维的实数向量来表示一个字,这样就大大降低了维度,wors2vec的字、词向量,能够包涵语义信息,向量的夹角余弦能够在某种程度上表示字、词的相似度。

上一篇:Webpack 常用Plugin


下一篇:leetcode hot 100 - 287. 寻找重复数