Word Embedding理解

一直以来感觉好多地方都吧Word Embeddingword2vec混起来一起说,所以导致对这俩的区别不是很清楚。

其实简单说来就是word embedding包含了word2vec,word2vec是word embedding的一种,将词用向量表示。

1.最简单的word embedding是把词进行基于词袋(BOW)的One-Hot表示。这种方法,没有语义上的理解。把词汇表中的词排成一列,对于某个单词 A,如果它出现在上述词汇序列中的位置为 k,那么它的向量表示就是“第 k 位为1,其他位置都为0 ”的一个向量。但是这种表示方法学习不到单词之间的关系(位置、语义),并且如果文档中有很多词,词向量可能会很长。对于这两个问题,第一个问题的解决方式是ngram,但是计算量很大,第二个问题可以通过共现矩阵(Cocurrence matrix)解决,但还是面临维度灾难,所以还需降维。

2.现在较常用的方法就是通过word2vec训练词汇,将词汇用向量表示。该模型涉及两种算法:CBOW和Skip-Gram。

这种方法我们可以发现在语义理解上效果比较好,可以将我们语义上相似的词用相似的向量表示,但是有个缺点,同一个词只有一种语义,如:我喜欢吃苹果   很多人觉得苹果手机很好用   这两个句子中的苹果是不同的语义,表示不同的对象,但是word2vec没有办法表示出来。和传统的词向量相比,使用语言模型预训练(如ELMo[1],OpenAI GPT [2] 和 BERT [3]对该定义的理解及相关论文解释可以参考 https://mp.weixin.qq.com/s/A-PKyZcXwOz-2lL-hBmjsA)其实可以看成是一个句子级别的上下文的词表示它可以充分利用大规模的单语语料,并且可以对一词多义进行建模

cbow是给定上下文来预测中心词,skip-gram是通过中心词预测上下文,两者所用的神经网络都只需要一层hidden layer.

他们的做法是:

cbow:

将一个词所在的上下文中的词作为输入,而那个词本身作为输出,也就是说,看到一个上下文,希望大概能猜出这个词和它的意思。通过在一个大的语料库训练,得到一个从输入层到隐含层的权重模型。如下图所示,第l个词的上下文词是i,j,k,那么i,j,k作为输入,它们所在的词汇表中的位置的值置为1。然后,输出是l,把它所在的词汇表中的位置的值置为1。训练完成后,就得到了每个词到隐含层的每个维度的权重,就是每个词的向量。

skip-gram

将一个词所在的上下文中的词作为输出,而那个词本身作为输入,也就是说,给出一个词,希望预测可能出现的上下文的词。通过在一个大的语料库训练,得到一个从输入层到隐含层的权重模型。如下图所示,第l个词的上下文词是i,j,k,那么i,j,k作为输出,它们所在的词汇表中的位置的值置为1。然后,输入是l,把它所在的词汇表中的位置的值置为1。训练完成后,就得到了每个词到隐含层的每个维度的权重,就是每个词的向量。

cbow与skip-gram的区别:

cbow在学习过程中,类似k个学生(周围词)同时由一位老师(中心词)授课,如果下次学习的时候还在该老师的课上(窗口内)则可以继续学习,否则不会继续。

而skip-gram类似一个学生(中心词)多个老师(周围词),学生通过向多位老师学习学到最终的知识能力,所以比cbow学习的时间长,即时间复杂度高,数据量少或有生僻字时适用,另外,直接训练Skip-Gram类型的算法,很容易使得高曝光词汇得到过多的权重。同样地,cbow效率较高,速度快,数据量大时适用。(https://www.cnblogs.com/june0507/p/9412989.html解释得不错)另外,cbow与skip-gram在最后的softmax层一般适用层次softmax,即层次softmax是先根据语料计算出词典中每个词的词频,然后根据词频构建霍夫曼树,得到霍夫曼树之后就可以得到根节点到每一个叶节点的路径(叶节点代表的就是词典中的每个词,一颗霍夫曼树中有词典大小个叶节点),得到路径之后再根据路径计算词典中每个词的概率,计算这个概率的时间复杂度是O(logD),比直接计算打分的O(D)的时间复杂度低很多。 后来一般会用负采样代替霍夫曼树。.

fasttext的模型结构与cbow类似,但是两者区别很大:

fastText的模型和CBOW的模型结构一样,虽然结构一样,但是仍有不同
一、目的不一样,fastText是用来做文本分类的,虽然中间也会产生词向量,但词向量是一个副产物,而CBOW就是专门用来训练词向量的工具。
fastText的输出层是预测句子的类别标签,而CBOW的输出层是预测中间词;
fastText的输入层是一个句子的每个词以及句子的ngram特征,而CBOW的输入层只是中间词的上下文,与完整句子没有关系;
fastText是一个文本分类算法,是一个有监督模型,有额外标注的标签
CBOW是一个训练词向量的算法,是一个无监督模型,没有额外的标签,其标准是语料本身,无需额外标注。
用fastText做文本分类的关键点是极大地提高了训练速度(在要分类的文本类别很多的情况下,比如500类),原因是在输出层采用了层级softmax,层级softmax如何提高训练速度在上面CBOW的层级softmax中已经介绍了,在这里就是将叶节点有词频变成文本分类数据集中每种类别的样本数量,霍夫曼树的结构也可以处理类别不均衡的问题(每种类别的样本数目不同),频繁出现类别的树形结构的深度要比不频繁出现类别的树形结构的深度要小,这也使得进一步的计算效率更高(意思是数目多的样本深度小,那很多样本都只需乘一次就把概率计算出来了(构建树的过程中记录了大多数路径的值),自然就快)。这段话的原文:https://blog.csdn.net/sun_brother/article/details/80327070

具体的细节在学习过程中感觉这位用户的博客https://www.cnblogs.com/pinard/p/7243513.html 写的挺好的。

对于我上面的理解如果觉得有帮助,点个赞咯~~~~~~

[1] Peters, M. E. et al. Deep contextualized word representations. naacl (2018).

[2] Radford, A. & Salimans, T. Improving Language Understanding by Generative Pre-Training. (2018).

[3] Devlin, J., Chang, M.-W., Lee, K. & Toutanova, K. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. (2018).

上一篇:spring boot 错误,求大神帮解决


下一篇:sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇(十五)