fasttext实际上分为两部分
- 分类模型 (跟CBOW比较像)
- 词向量学习(跟SG比较像)
FastText分类模型
Bag of Tricks for Efficient Text Classification Abstract
“本文探索了一种简单有效的 基准文本分类模型,我们的实验显示,我们的快速文本分类器fastText和深度学习分类器 在准确度上旗鼓相当,在训练和评估速度上还比深度学习分类器 快上几个数量级,我们使用标准多核CPU在不到10分钟的时间内用fastText训练超过10亿个单词,并且一分钟之内可以对50万个句子31.2万个类别的数据做分类。“
与CBOW的异同
This architecture is similar to the cbow model of Mikolov et al. (2013), where the middle word is replaced by a label.
fasttext在模型结构上和CBOW几乎是一样的,只是把预测中心词换成了预测类别,具体来说:
- CBOW是将window_size的上下文词的向量做平均,提取的是上下文词特征;fasttext是将一个句子所有词做平均,提取的是句子的特征;
- 根据1,CBOW提取上下文词特征去预测中心词,fasttext提取句子特征预测句子分类
- 根据2,CBOW是无监督学习,无需标注语料,fasttext是监督学习,需要标注语料
另外还有几点CBOW和fasttext无区别,但是容易误解的点:
- CBOW和fastText都是用平均值来预测的。(CBOW不是求和,是求平均)
- N-gram对于CBOW和fastText都是锦上添花的元素,不是标配。
- 词向量初始化都是随机的,fastText并没有在word2vec预训练词嵌入的基础上再训练。
这段来自:https://zhuanlan.zhihu.com/p/138019676
模型结构
即一个句子的N个n-gram特征
, 经过embedded和averaged,送到隐层,再到输出层就完事了
原文损失函数:
其中是
句子的特征,AB分别是embedding层和Linear层参数,
是类别,f是softmax函数.
问题和优化
有两个问题:
- 可以看到最后还是用的softmax,那必然就会有速度慢的问题,
- 这里
就是一个词袋思想把所有词塞一起,必然就忽略了词序的信息,BTW,CBOW连续词袋模型和传统BOW模型区别的这个continuous就体现在,CBOW没有用词频,而是连续的分布式表示(有点跑题,就是记录一下)
根据论文中的小标题:
- Model architecture
2.1 Hierarchical softmax
2.2 N-gram features
作者做了两步优化解决上述两个问题:
- 层次softmax:原本计算复杂度
,k是类别数,h是文本表示的维度,经过基于哈弗曼树的层次Softmax,复杂度降到;
- N-gram 特征:完全词袋特征忽略词序肯定不行,考虑词序又是个很费计算的事,怎么办,作者是在原来词袋里再附加一些n-grams词,这样可以捕捉到一些局部的词序信息。词太多又影响了效率和内存,作者这里用了一个hashing trick,对n-grams词,可以多个词用一个向量,优化内存。