fastText
Fasttext是一个专门用于文本分类和文本表示的模型,由于它模型结构非常的简单,训练效率很高,分类效果也非常好,因此是一个非常热门的模型。
Background
这是一篇2017年的文章,所以作者首先提到了当时神经网络已经在NLP领域流行了,但是神经网络训练起来太慢,因此很难使用庞大的数据集。接着作者提到文本分类中的一个非常实用的baseline就是线性分类器。举例来说,用Bag-of-Words + LR / SVM 训练一个线性模型往往已经能得到一个不错的效果,同时训练速度是非常快的。但是线性模型有一个缺点就是不能参数共享,因此泛化能力受到了限制。解决这一问题的两种方案是:使用低秩矩阵或使用多层神经网络。
本文作者提出了一个线性模型,该模型速度非常快,同时能够在文本分类和情感分析任务上达到SOTA。他们把这个模型叫做fastText
Model Architecture
fasttext模型的结构十分简单,Embedding之后就只有一个线性层得到结果,非常像CBOW模型,只不过CBOW是用上下文预测中心词,而fasttext是用句子表示预测标签。
首先我们得到每一个单词的词向量表示,然后取平均作为整个句子的向量化表示。将句向量输入线性分类器得到输出,用softmax将模型输出结果转化为各类别的概率分布,然后用CrossEntropy作为损失函数。
−
1
N
∑
n
=
1
N
y
n
l
o
g
(
f
(
B
A
x
n
)
)
-\frac{1}{N}\sum_{n=1}^{N}y_nlog(f(BAx_n))
−N1n=1∑Nynlog(f(BAxn))
为了使模型效果更好,作者加入了两个trick
Hierarchical Softmax
这篇文章的作者之一就是Word2vec的作者***Mikolov***,因此fasttext也借鉴了SkipGram中的Hierarchical Softmax。朴素的softmax计算方法时间复杂度是 O ( k h ) O(kh) O(kh), k k k是类别数量, h h h是文本向量的维度。而使用基于Huffman coding tree的Hierarchical Softmax能将复杂度降到 O ( h l o g 2 k ) O(hlog_2{k}) O(hlog2k),这对于类别数量很多的情况帮助很大。
n-gram feature
Bag-of-word会忽视单词的顺序,对效果有影响,因此作者提出加入n-gram特征来学习到局部单词的顺序关系。但是一旦加入n-gram特征,就会导致极大的内存开销。举例来说,假设unigram有2万个,那么bi-gram就有4万个,tri-gram就有8万个,加起来有将近15万,语料库太大。因此作者又使用了一种hashing trick来节省内存开销。具体做法是,unigram该怎么存怎么存,bi-gram及以上用取模的方式在剩下的位置进行存储
Experiment
从Table 2也可以看出fastText的训练效率是非常高的
同样,对于标签预测任务,fastText也表现优异
Reflection
这篇文章主要提出了一个非常轻量化的文本分类模型并达到了SOTA的效果。对于这篇文章,我的反思感悟如下:
- 文章中的加入n-gram特征来学习局部单词顺序值得参考借鉴
- 在词向量取平均的部分是否可以加以改进?比如使用加权平均来突出部分单词对整个句子结果的重要性。
- Hierarchical softmax是一个常用的提升模型速度的手段
- 如此简单的模型结构就能取得这么好的分类效果,证明模型不是越复杂越好,轻量化是一个值得研究的方向。