1 背景说明
文本分类的方法有很多,从传统的线性模型到现在大热的深度学习模型,都有其应用之地。但是,就我目前所知,自从FB开源了fasttext之后,国内各大厂基本上都投入了其怀抱!目前包括百度的信息流部门、达观数据、搜狐、新浪等,都在不同的业务线上使用了fasttext。究其原因,个人认为不外乎以下几点:(1)快:是相当的快,私底下训练相同规模的数据集,word2vector花了5个小时,fasttext只用了30几分钟;(2)精度高:fasttext分类的性能能够与深度学习相媲美,但是在训练时间上要比深度学习快上几个数量级。
我在我们自己的业务中,我用<广告主购买的关键词,广告主所在的行业>作为训练集,训练上亿规模的预料集,时间大概在24分钟左右(单机多CPU),只经过简单的调参,就取得了89%的分类精度。可以说,有了fasttext,基本上就不需要自己再重复造轮子啦!下面我们就来一探fasttext的原理。
2 fasttext原理解读
fasttext源自于这篇文章,是2016年由facebook团队开源,作者就是Word2Vector作者之一的Tmikolov。
2.1 所需先验知识
在理解本文之前,还需要先掌握以下几个基本知识:Softmax和层次Softmax(Hierarchical Softmax)、基本的语言模型知识(n-gram)、word2vector原理等,限于篇幅,本文不再细述。这里推荐word2vector中的数学原理,文章有点儿长也有些枯燥乏味,但我相信,认认真真看完,一定会收获不少!
2.2 fasttext模型结构
fasttext模型结构基本上同word2vector一样:
同w2v不同的是最后一层的output,fasttext输出是经过softmax之后的类别,w2v输出是对应的词。
模型的输入是一个句子的向量,句子的向量是由句子中的词向量加权求和得到,输出是类别的概率分布,通过softmax计算得到。
2.3 层次softmax - Hierarchical Softmax
当目标的类别非常多时,使用传统的softmax方法计算量会特别大,这里的思路和w2v中是一样的,使用层次softmax方法来求概率。关于层次softmax,参见2.1节中的内容,这里不做细述。总之,使用层次softmax能将计算复杂度从$O(Kd)$降到$O(dlog_2K)$。
2.4 n-gram特征
同w2v的另一个差别就是,fasttext使用了n-gram特征。
word2vec把语料库中的每个单词当成原子的,它会为每个单词生成一个向量。这忽略了单词内部的形态特征,比如:“apple”和“apples”,“移动互联网”和“互联网”,这两个例子中,两个单词都有较多公共字符,即它们的内部形态类似,但是在传统的word2vec中,这种单词内部形态信息因为它们被转换成不同的id丢失了。
为了克服这个问题,fastText使用了字符级别的n-grams来表示一个单词。对于单词“apple”,假设n的取值为3,则它的trigram有:
“#ap”, “app”, “ppl”, “ple”, “le#”
其中,#表示在单词首尾插入的分隔符。于是,我们可以用这些trigram来表示“apple”这个单词,进一步,我们可以用这5个trigram的向量叠加来表示“apple”的词向量。
这带来两点好处:
- 对于低频词生成的词向量效果会更好:因为它们的n-gram可以和其它词共享;
- 对于训练词库之外的单词,仍然可以构建它们的词向量,我们可以叠加它们的字符级n-gram向量;
2.5 fasttext核心思想
讲完了层次softmax和n-gram特征之后,再回过头来看下fasttext的核心思想。
仔细观察模型的后半部分,即从隐含层输出到输出层输出,会发现它就是一个softmax线性多类别分类器,分类器的输入是一个用来表征当前文档的向量;模型的前半部分,即从输入层输入到隐含层输出部分,主要在做一件事情:生成用来表征文档的向量。那么它是如何做的呢?叠加构成这篇文档的所有词及n-gram的词向量,然后取平均。叠加词向量背后的思想就是传统的词袋法,即将文档看成一个由词构成的集合。
于是fastText的核心思想就是:将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。这中间涉及到两个技巧:字符级n-gram特征的引入以及分层Softmax分类。
3 总结
本质上,fasttext并没有引入什么创新点,层次softmax和n-gram思想早就有被提出并被广告应用,个人认为fasttext可以借鉴的一点就是:对于大规模文本分类,就计算softmax的过程转化为计算层次softmax的过程,从而大大节约了计算量。因此,分类的规模越大,fasttext优势会越明显。