Fasttext是继word2vec词向量模型提出之后提出的模型(或者说算法),因为训练速度非常快而比较受工业界关注。Fastext本身也和word2vec模型有很多相似之处,这篇博文将会简单梳理一下fasttext相关知识,关于word2vec那部分就不细讲了。
Fasttext涉及两篇论文,也分别代表了它的两个应用方向
- Bag of Tricks for Efficient Text Classification(201607) - 文本分类
- Enriching Word Vectors with Subword Information(201607)- 训练词向量
正如其名,两个方向的目标都是快,而且不损失太多质量。
Fasttext-文本分类
Fasttext应用到文本分类中,使用的CBOW的变种,和CBOW有如下区别:
- 使用类别标签替换中心词做预测
- 使用句子中所有单词作为输出,而不是滑动窗口
这两个改变都是为了做分类,第一个不需要解释,第二个做文本分类只需要考虑一次整个句子的特征就行,所以不使用滑动窗口,这也是为了降低计算复杂度。
使用霍夫曼树作为输出层(即Hierarcial Softmax),非叶子节点上的向量为二分类提供计算,叶子节点对应的是所有类别(而不是词汇表所有词的向量)。
模型开始训练时,词向量(参数)随机初始化,结束后保存起来用于预测就行,我们目的是分类,而不是词向量。
Fasttext模型的输入不仅仅是针对每个单词,并且加入了词序信息,词序信息通过n-gram的形式加入。n-gram对应的单位是word,而不是char。
Fasttext-获取词向量
使用负采样的skip-gram,将每个中心词看作子词的集合,并学习这些子词的词向量。
子词(subword)是论文核心,以中心词为where为例,设定子词大小为3,那么子词集合分为两部分,整词和子词。
整词即<where
>
子词<wh
, whe
, her
,ere
,re
>
最终<wh
, whe
, her
,ere
,re
, where
>
背景词则直接使用整词。
输入层使用子词(子词 整词),输出层使用整词。
如果OOV,则使用子词的向量和表示该词,这也是subword的一个优势所在。
fasttext在做文本分类的时候,一般使用CBOW;在训练词向量的时候,一般使用skip-gram。