本文提出了一种简单有效的文本分类和表示学习方法。
实验表明fasttext在准确性方面与深度学习分类器保持一致,并且训练和评估的速度大大提高。可以在不到10分钟的时间内使用标准的多核CPU对超过10亿个单词进行快速文本训练,并在不到一分钟的时间内对312K类中的50万个句子进行分类。
良好的文本分类表示是许多应用程序的重要任务,如Web搜索,信息检索,排序和文档分类。
基于神经网络的模型在计算句子表示方面有很好的表现,但是训练和测试时间长,限制了它们在非常大的数据集上的使用。线性分类器通常被认为是文本分类问题的强baseline,尽管它们很简单,简单的线性模型有很好的性能,和非常高的计算效率。他们通常学习单词级别的表示,再组合起来形成句子表示。
我们提出了这些模型的扩展,以直接学习句子表示。通过引入其他统计数据(如使用n-gram包)来显示,减少了线性和深度模型之间精度的差距,同时速度提高了许多个数量级。
将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。这中间涉及到两个技巧:字符级n-gram特征的引入以及分层softmax分类
与word2vec里的CBOW结构一样,只不过输出结果由预测词变成了预测类别
模型的优化函数
霍夫曼树:权重高的叶子节点更靠近根节点,则高权重节点权重编码较短,低权重编码较长,保证树的带权路径最短。在信息论中,即为越常用的词编码越短。
为了避免要计算所有词的softmax概率,word2vec采样了霍夫曼树来代替从隐藏层到输出softmax层的映射。
在具体实现上,fasttext和word2vec类似,使用基于霍夫曼树的层级softmax,将计算复杂度从O(Kd)(K为类别数,d是隐层维度)下降为O(d log2(K)),叶子节点为最终的类别。
层级softmax在测试阶段寻找最有可能的那一类也很有优势,每一节点概率都和该节点到根节点目录上每一节点的概率相关,若某一节点的深度为L+1,他的父节点为n1,n2…nl,那么它的概率为:
这意味着当前节点的概率总是比其父节点概率小,使用深度优先策略遍历树并寻找拥有最大概率的叶节点,可以允许我们丢弃那些拥有较小概率的分支,从而节省很多时间。
word2vec直接采用bag-of-word思想:构造一个由文档关键词组成的词典,对照词典用向量表示各个文档中关键词的出现次数。缺点:
语义:仅仅将文档看成是一些关键词出现的概率的集合,不考虑词之间的上下文关系,只考虑词的权重。
稀疏问题:大部分文本只会使用词典的少部分词,导致词向量中会有大量的0。
词袋模型不考虑词序问题,若将词序信息添加进去又会造成过高的计算代价。文章取而代之使用bag of N-gram来将词序信息引入,并使用哈希算法高效的存储N-gram信息
N-gram features:构建词典时,将训练样本中所有不重复的词以及妹N个连续词构成的基本词放到袋子中,统计出现次数,对每个样本向量化。特点:
这里与word2vec不同,fasttext在训练时附加Bag-of-N-gram-Feature来捕获词序的部分信息,使得训练效果更好(使用hashing trick保持N-gram的快速和内存有效映射)。这带来两点好处:
参数设置:epoch=5 学习率{0.05, 0.1, 0.25, 0.5}
fasttext与其他神经网络相比,不需要加载预训练模型,而且在训练同时能生成词向量
可以看出fasttext在数据量较大的数据集上实验结果很好,同时相比于其他模型,速度非常快
主要是为了测试方法的可扩展性,可以看出明显的速度提高
fasttext能快速在海量文本数据上进行分类任务和表示学习,可以用一个普通的多线程cpu在十分钟内训练百万级的语料,一分钟将五十万文本分类到三十万个类别中。
近几年深度学习在nlp任务上虽取得了显著成就,但此类模型无论是训练还是测试阶段都因过长的时间消耗,很难应用在更大的语料数据上。与此同时一些简单的线性模型在保持速度效率的同时也有不俗的表现,如wrod2vec学习次级别的表示并进一步融合为语句表示。文章提出的方法就是在word2vec基础上加上bag of N-grams
fasttext文本分类的模型,相比于CBOW模型,不是预测中心词而是直接预测标签。