对word2vec skip-gram模型的理解

版权声明: https://blog.csdn.net/Dorothy_Xue/article/details/84666696

1. 概念简介

word2vec是从大量文本语料中,用无监督学习的方式来学习语义知识的一种模型,广泛用于NLP。其实就是通过学习文本来用词向量的方式表征词的语义信息

embedding其实就是一个映射,将单词从一个空间映射到另一个新的空间中。

直观理解:

cat(猫)这个单词与kitten(小猫)在语义上很相近,而dog(狗)和kitten就不是那么相近了,iphone就和kitten在语义上差得更远了。通过对词汇表中的单词进行这种数值表示方式的学习(也就是将单词转换为词向量),能够让我们基于这种数值,进行向量化的操作,从得到一些有趣的结论。eg: 对词向量kitten、cat、dog执行这样的操作:kitten(小猫) - cat(猫) + dog(狗),最终得到的嵌入向量(embedded vector)与puppy(小狗) 这个词向量非常相近。

2. 模型

word2vec中主要有skip-gram和CBOW两种模型,直观的理解:

  • skip-gram:给定输入单词(input word)来预测上下文

  • CBOW:给定上下文来预测输入单词(input word)

3. skip-gram模型

skip-gram模型主要分成两部分:

  1. 建立模型
  2. 通过模型获取嵌入词向量

skip-gram整个建模过程与自编码器(auto-encoder)的思想类似,即:先基于训练数据构建一个神经网络,当这个模型训练好之后,不用它处理新的任务,而是获取这个模型通过训练数据得到的参数,比如隐层的权重矩阵(这些权重在skip-gram中实际上就是要学习的word vectors词向量)。

这种基于训练数据建模的过程,给他命名为“Fake Task”。也就意味着,建模并不是最终目的。

The Fake Task:

上面有提到过,训练模型的目的不是得到这个模型,而是获得模型基于训练数据学到的隐层权重参数。为获得这些隐层权重参数,首先要构建一个完整的神经网络作为“Fake Task”,然后间接获得这些词向量。

接下来介绍如何训练神经网络:

假设有一个句子:The dog barked at the mailman.

  1. 首先,选择句子中的一个单词作为输入词,比如我们选“dog”作为输入词(input word)
  2. 选定input word之后,定义参数skip_window,用来:在当前选定的输入词input word的一侧(左或右)选取单词的数量。eg: skip_window=2,则获得的窗口中的词(包括input word在内)就是:['The','dog','barked','at']。skip_window=2,也就是在输入词“dog”两侧各选两个词进入窗口。
  3. 另一个参数num_skips,代表从整个窗口中选择多少不同的词作为输出单词out word。
  4. 当skip_window=1,num_skips=2时,将得到两组(input word, output word)形式的训练数据,即:('dog', 'barked'),('dog', 'the')

神经网络基于这些训练数据,会输出一个概率分布,代表词典中每个单词是output word的可能性。eg: 上面那个例子中,训练数据('dog', 'barked')经过训练后,会得到词汇表中每个单词是'barked'的概率大小。

模型的输出概率代表着到我们词典中每个词有多大可能性跟input word同时出现。举个栗子,如果我们向神经网络模型中输入一个单词“Soviet“,那么最终模型的输出概率中,像“Union”, ”Russia“这种相关词的概率将远高于像”watermelon“,”kangaroo“非相关词的概率。因为”Union“,”Russia“在文本中更大可能在”Soviet“的窗口中出现。我们将通过给神经网络输入文本中成对的单词来训练它完成上面所说的概率计算。下面的图中给出了一些我们的训练样本的例子。我们选定句子“The quick brown fox jumps over lazy dog”,设定我们的窗口大小为2(window_size=2),也就是说我们仅选输入词前后各两个词和输入词进行组合。下图中,蓝色代表input word,方框内代表位于窗口内的单词。

模型细节:https://www.jianshu.com/p/da235893e4a5

猜你喜欢

转载自blog.csdn.net/Dorothy_Xue/article/details/84666696