用word2vec和fastText来生成word embedding

1. word2vec

原文链接:

Distributed Representations of Words and Phrases and their Compositionality

首先我们要知道Word2Vec包含了两种词训练模型:CBOW模型和Skip-gram模型。
在这里插入图片描述
那么word2vec到底是要做一件什么事情呢?

下面以CBOW为例进行讲解:
在这里插入图片描述
其实word2vec可以分为两部分:

  1. 模型训练
  2. 通过模型获得word embedding

训练过程如下:

  1. 输入层:上下文单词的onehot向量。 {假设单词向量空间dim为V,上下文单词个数为C}。
  2. 所有onehot分别乘以共享的输入权重矩阵W.{V*N矩阵,N为自己设定的数,初始化权重矩阵W}。
  3. 所得的向量 {因为是onehot所以为向量} 相加求平均作为隐层向量,size为1*N。
  4. 乘以输出权重矩阵W’ {NV} 得到向量 {1V} 激活函数处理。
  5. 得到V-dim概率分布 {PS:因为是onehot嘛,其中的每一维斗代表着一个单词},概率最大的index所指示的单词为预测出的中间词(target word)。
  6. 与true label的onehot做比较,然后反向传播调整参数。
  7. 上述过程迭代多次。

word2vec先基于训练数据训练一个神经网络(如上图所示,在训练的过程中通过梯度下降算法不断调整权重W和 W W{}' )。

当这个网络训练好以后,我们并不会利用这个训练好的网络处理新任务,我们真正需要的是这个模型通过训练数据所学到的参数(权重W)。训练完毕后,输入层的每个单词(one-hot向量)与矩阵W相乘得到的向量的就是我们想要的词向量(word embedding)

需要说明的一点:因为单词是one-hot编码,所以,所有单词的word embedding所组成的矩阵就是W本身,这个矩阵叫做look up table。具体原因自己好好想一下。

由于上面介绍的比较简单,想了解具体细节的看一下下面的几篇博客:

第一篇以Skip-Gram模型为例详细的讲解了word2vec的整体流程。

一文详解 Word2vec 之 Skip-Gram 模型(结构篇)

第二篇以CBOW为例,讲的比较通俗易懂,很透彻。

小白都能理解的通俗易懂word2vec详解

第三篇通过图示的方式介绍了CBOW模型流程,更加便于理解。

自然语言处理之word2vec原理词向量生成

原文中后面还有两种加速方法:Negative Sample和Hierarchical Softmax,感兴趣的可以看下面的博文:

不懂word2vec,还敢说自己是做NLP?

2. fastText

文章链接:

Enriching Word Vectors with Subword Information

代码链接:

https://github.com/facebookresearch/fastText

fastText是在word2vec基础上做的改进。

fastText的作者也就是word2vec的作者,所以两者是一脉相承的。

word2vec是把每一个单词作为单独的向量,并没有考虑词语的内部结构,那么FastText相比于word2vec的创新就是考虑了词语的形态构成,也就是加上了sub-word的信息,这样的好处在于对于词汇量很大的语言,通常有很多OOV,也可以通过sub-word去构成word进行词向量表示。

作者认为每一个词,都可以由n-gram的词袋特征来表示,具体的表示见下面这个例子,假设n取3,对于单词where,其可以表示为,

<wh, whe, her, ere, re> + < where >

因此,此时模型要去学的就是wh, whe…等的向量表征,再通过求和得到where的词向量表征,如下,
在这里插入图片描述
其中z_g表示n-gram的向量。

至此,fastText的模型结构部分就介绍完了。简单总结一下就是word2vec和字符级向量表达的结合版。

实验结果

用人工标记的单词相似度来衡量几个模型的效果。作为baseline的模型是skipgram和cbow,由于FastText相对于baseline的一大优势在于可以输出未登录词的词向量,所以增加了一个比对的模型,sisg-,这个模型也是FastText,只不过将所有未登录词输出变为NULL,这样可以比对在失去对未登录词的适应性这个优势的时候,FastText效果如何,从下表可以看出,即使将未登录词输出都变为NULL,结果也依然不弱于两个baseline,如果是正常的FastText,sisg优势就更加明显了。

在这里插入图片描述
论文模型分析

在模型的实施细节里,我注意到,对于英文数据的训练,本模型要比相对应的skipgram基线模型慢1.5倍。粗粗看了一下模型实验分析,大概能得出几个比较重要的结论如下,

  1. 对于不同的语言,采用n-gram的字符级向量信息,带来的收益并非都成正比。对于类似德文这样多复合词的,会取得更好的效果,但是对英文来说,则不一定适用。
  2. 对于语法学(syntactic)的问题,本文的模型表现的更优异,但是对于语意学(semantic)的问题,本文的模型则不会比基线模型表现的更好,有时候甚至表现的更糟糕。
  3. 对于训练数据来说,作者实验发现,本文提出的模型,对于小样本的数据量,同样有着优异的表现,并且对于生僻词也有很好的表达。而且,随着数据量样本的增多,对于本文的模型的收益的增加,是不如传统的word2vec模型的。
发布了52 篇原创文章 · 获赞 7 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_38937984/article/details/102491314