聊聊fasttext和word2vec(附源码简析)

在介绍fasttext之前,首先介绍下背景知识,即word2vec中的skip-gram模型和cbow模型。

word2vec是在2013年由谷歌提出的一种将词语转变成向量的算法。

相关论文和链接如下

【1】Efficient Estimation of Word Representations in Vector Space

https://arxiv.org/pdf/1301.3781.pdf

【2】Distributed Representations of Words and Phrases and their

Compositionality

https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf

下面是CBOW以及skip-gram示例

640?wx_fmt=png

图片来自【1】


skip-gram模型

在skip-gram模型中,目的在于预测某个词的上下文中会出现哪个词。

640?wx_fmt=png

其中

640?wx_fmt=png

是词向量,k是该词附近的近邻词的个数。

skip-gram的目标函数如下

640?wx_fmt=png

其目标在于最小化负对数似然度。为了对上述目标函数进行近似,可以将其利用多个二分类的损失函数来代替。基于负采样方法可以得到

640?wx_fmt=png

为了进行分类还需要借助hierarchical softmax方法,每个类都用一个编码集合来表示,这里的编码可以通过霍夫曼树来生成,出现频次较多的类对应的编码就越短。


cbow模型

在cbow(continuous bag of words)模型中,目标在于给定上下文,预测某个词出现的概率。

640?wx_fmt=png

其中

640?wx_fmt=png

是上下文特征向量。

初步了解了skip-gram和cbow,下面来介绍下fasttext。


fasttext

fasttext是由Facebook提出的一种能够高效的进行文本分类和词语表示的库。

相关论文及链接如下

【3】Bag of Tricks for Efficient Text Classification

https://arxiv.org/pdf/1607.01759.pdf

【4】Enriching Word Vectors with Subword Information

https://arxiv.org/pdf/1607.04606.pdf

该工具的作者有以下四位

640?wx_fmt=png

早在2013年,Mikolov et al. 就提出了用向量来表示词语,即word2vec。利用词向量来表示词语这种方法具有一定的缺陷,比如不能表示句子。一种比较粗暴的方式是对单词的向量表示取平均作为句子的表示,但是这种做法通常效果不好。虽然word2vec这种方法具有一定的缺陷,但由于其简单高效,所以得以广泛应用。

fasttext提供了文本表示以及文本分类的框架,其本质在于给定一个索引集合,来预测某个索引。基于cbow,skip-gram或者bow的文本分类都是该库的示例。

640?wx_fmt=png

在fasttext中,目标在于给定一个段落,可以预测某个标签的概率。公式如下

640?wx_fmt=png

其中段落特征如下

640?wx_fmt=png

通过n-gram可以添加高阶特征。另外,可以利用hash编码来代替n-gram,这样可以缩减空间。

640?wx_fmt=png

fasttext可以用于情感分类,其效果如下

640?wx_fmt=png

图来自【3】

下面是情感分类的各种方法在运行时间上的对比,可以看出fasttext运行效率最高,而且相比其他算法快很多倍。

640?wx_fmt=png

图来自【3】

fasttext也可以用于标签预测。以Flickr为例,给定一个图片的描述,预测最可能的标签。数据示例如下

640?wx_fmt=png

图片来自【3】

实验结果如下

640?wx_fmt=png

图片来自【3】

测试时间比训练时间长是因为训练时线程数是测试时的20倍。

为了丰富词向量,可以通过子词的n-gram来扩充。此时可以通过子词的n-gram模型求和来表示词。具体模型如下,对于给定的词来预测上下文的词,

640?wx_fmt=png

词特征利用n-gram来表示,

640?wx_fmt=png

n-gram仍然利用hash编码来表示。

加入子词n-gram可以比较好的处理OOV(out-of-vocabulary)词。


相似词

词语之间的相似度计算方式如下

640?wx_fmt=png

下面是几种在相似词计算中的效果对比

640?wx_fmt=png

图片来自【4】


词语推理

问题描述如下,给定三个词,推理第四个词语。

640?wx_fmt=png

几种方法在词语推理问题中的结果对比如下

640?wx_fmt=png

图片来自【4】

640?wx_fmt=png

图片来自【4】,fasttext效果最好,并且可以较好地处理OOV问题。

下面是寻找比较少见的词的最近邻的效果示例。其中sg是skip-gram的简写,sisg是Subword Information Skip Gram的简写,sisg即考虑了子词的skip-gram。

640?wx_fmt=png

该表格来自【4】


附录

spark中的word2vec源码解读

640?wx_fmt=png

默认将单词映射到100维的向量

窗口大小

640?wx_fmt=png

单边上下文单词个数为5

640?wx_fmt=png

句子的最大长度为1000,超过1000会被分成每个句子最大长度为1000的子句。

640?wx_fmt=png

参数主要有学习率、迭代次数、向量大小、窗口大小、句子最大长度等。

640?wx_fmt=png

返回单词和对应的向量。

640?wx_fmt=png

查找给定单词最相近的若干单词

640?wx_fmt=png

返回给定向量最相近的若干单词

fasttext源码解读

640?wx_fmt=png

这是训练过程,该过程是多线程的。

640?wx_fmt=png

这是各个训练线程,其中有一个细节,即学习率衰减。

640?wx_fmt=png

这是分类的代码。

640?wx_fmt=png

这是cbow关键代码。

640?wx_fmt=png

这是skip-gram的关键代码。

640?wx_fmt=png

这是预测的关键代码。

640?wx_fmt=png

这是更新模型的关键代码

640?wx_fmt=png

这是逻辑回归的关键代码

640?wx_fmt=png

这是负采样的关键代码

640?wx_fmt=png

这是分层softmax的关键代码

640?wx_fmt=png

这是softmax的关键代码

640?wx_fmt=png

这是预测的关键代码

640?wx_fmt=png

这是寻找k个最优的代码

640?wx_fmt=png

这是深度优先搜索的关键代码。

640?wx_fmt=png

这是构建霍夫曼编码树的关键代码


参考资料

https://github.com/apache/spark/blob/master/mllib/src/main/scala/org/apache/spark/ml/feature/Word2Vec.scala

https://github.com/facebookresearch/fastText/blob/master/src/model.cc

https://github.com/facebookresearch/fastText/blob/master/src/fasttext.cc

【1】Efficient Estimation of Word Representations in Vector Space

https://arxiv.org/pdf/1301.3781.pdf

【2】Distributed Representations of Words and Phrases and their

Compositionality

https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf

【3】Bag of Tricks for Efficient Text Classification

https://arxiv.org/pdf/1607.01759.pdf

【4】Enriching Word Vectors with Subword Information

https://arxiv.org/pdf/1607.04606.pdf

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值