Fasttext模型结构
左图是Fasttext,右图是CBOW,可以看出Fasttext模型与CBOW的模型结构有点像,都有输入层、隐藏层、输出层,但二者还是有挺大区别的,二者的区别如下:
-
输入层:
- CBOW:输入的是每个词的One-hot向量;
- Fasttext:输入的是每个词的词嵌入向量。
-
隐藏层:
- CBOW:先将输入层的每个One-hot向量乘以词嵌入矩阵,得到每个词的词嵌入向量,再求和取平均;
- Fasttext:直接对输入层的词向量求和取平均。
-
输出层:
- CBOW:原始的CBOW使用Softmax方法,输出的类别是词表中的每个词;
- Fasttext:使用Hiererachical softmax方法简化softmax计算,提升训练速度;另外Fasttext的输出是文章的类别。
Fasttext的特点
-
fastText引入了subword n-gram的概念,解决了词形变化(morphology)的问题、低频词、未登录词的问题。
-
fastText更适用于样本数量大、类别标签多的任务,一般能够得到很好的效果,大多数情况下强于传统的BOW + LR/SVM分类器。更重要的是,训练效率非常之高。
Fasttext的缺点
subword n-gram信息的加入,不但解决了低频词未登录词的表达的问题,而且对于最终任务精度一般会有几个百分点的提升。唯一的问题就是由于需要估计的参数多,模型可能会比较膨胀。不过,Facebook也提供了几点压缩模型的建议:
-
采用hash-trick。由于n-gram原始的空间太大,可以用某种hash函数将其映射到固定大小的buckets中去,从而实现内存可控;
-
采用quantize命令,对生成的模型进行参数量化和压缩;
-
减小最终向量的维度。
需要注意的是以上几种方法都会以一定的精度损失为代价,尤其是维度的压缩,具体可以实践中再权衡。