英语单词一般有其内部结构和造成⽅式。例如,咱们能够从“dog”“dogs”和“dogcatcher”的字⾯上推测它们的关系。这些词都有同⼀个词根“dog”,但使⽤不一样的后缀来改变词的含义。并且,这个关联能够推⼴⾄其余词汇。git
在word2vec中,咱们并无直接利⽤构词学中的信息。⽆论是在跳字模型仍是连续词袋模型中,咱们都将形态不一样的单词⽤不一样的向量来表⽰。例如,“dog”和“dogs”分别⽤两个不一样的向量表⽰,而模型中并未直接表达这两个向量之间的关系。鉴于此,fastText提出了⼦词嵌⼊(subword embedding)的⽅法,从而试图将构词信息引⼊word2vec中的CBOW。github
这里有一点须要特别注意,通常状况下,使用fastText进行文本分类的同时也会产生词的embedding,即embedding是fastText分类的产物。除非你决定使用预训练的embedding来训练fastText分类模型,这另当别论。面试
word2vec把语料库中的每一个单词当成原子的,它会为每一个单词生成一个向量。这忽略了单词内部的形态特征,好比:“book” 和“books”,“阿里巴巴”和“阿里”,这两个例子中,两个单词都有较多公共字符,即它们的内部形态相似,可是在传统的word2vec中,这种单词内部形态信息由于它们被转换成不一样的id丢失了。架构
**为了克服这个问题,fastText使用了字符级别的n-grams来表示一个单词。**对于单词“book”,假设n的取值为3,则它的trigram有:app
“<bo”, “boo”, “ook”, “ok>”机器学习
其中,<表示前缀,>表示后缀。因而,咱们能够用这些trigram来表示“book”这个单词,进一步,咱们能够用这4个trigram的向量叠加来表示“apple”的词向量。工具
这带来两点好处:性能
以前提到过,fastText模型架构和word2vec的CBOW模型架构很是类似。下面是fastText模型架构图:学习
注意:此架构图没有展现词向量的训练过程。能够看到,和CBOW同样,fastText模型也只有三层:输入层、隐含层、输出层(Hierarchical Softmax),输入都是多个经向量表示的单词,输出都是一个特定的target,隐含层都是对多个词向量的叠加平均。优化
不一样的是,
**值得注意的是,fastText在输入时,将单词的字符级别的n-gram向量做为额外的特征;在输出时,fastText采用了分层Softmax,大大下降了模型训练时间。**这两个知识点在前文中已经讲过,这里再也不赘述。
fastText相关公式的推导和CBOW很是相似,这里也不展开了。
如今抛开那些不是很讨人喜欢的公式推导,来想想fastText文本分类的核心思想是什么?
仔细观察模型的后半部分,即从隐含层输出到输出层输出,会发现它就是一个softmax线性多类别分类器,分类器的输入是一个用来表征当前文档的向量;
模型的前半部分,即从输入层输入到隐含层输出部分,主要在作一件事情:生成用来表征文档的向量。那么它是如何作的呢?**叠加构成这篇文档的全部词及n-gram的词向量,而后取平均。**叠加词向量背后的思想就是传统的词袋法,即将文档当作一个由词构成的集合。
**因而fastText的核心思想就是:将整篇文档的词及n-gram向量叠加平均获得文档向量,而后使用文档向量作softmax多分类。**这中间涉及到两个技巧:字符级n-gram特征的引入以及分层Softmax分类。
还有个问题,就是为什么fastText的分类效果经常不输于传统的非线性分类器?
假设咱们有两段文本:
肚子 饿了 我 要 吃饭
肚子 饿了 我 要 吃东西
这两段文本意思几乎如出一辙,若是要分类,确定要分到同一个类中去。但在传统的分类器中,用来表征这两段文本的向量可能差距很是大。传统的文本分类中,你须要计算出每一个词的权重,好比TF-IDF值, “吃饭”和“吃东西” 算出的TF-IDF值相差可能会比较大,其它词相似,因而,VSM(向量空间模型)中用来表征这两段文本的文本向量差异可能比较大。
可是fastText就不同了,它是用单词的embedding叠加得到的文档向量,词向量的重要特色就是向量的距离能够用来衡量单词间的语义类似程度,因而,在fastText模型中,这两段文本的向量应该是很是类似的,因而,它们很大几率会被分到同一个类中。
使用词embedding而非词自己做为特征,这是fastText效果好的一个缘由;另外一个缘由就是字符级n-gram特征的引入对分类效果会有一些提高 。
有意思的是,fastText和Word2Vec的做者是同一我的。
相同点:
以前一直不明白fasttext用层次softmax时叶子节点是啥,CBOW很清楚,它的叶子节点是词和词频,后来看了源码才知道,其实fasttext叶子节点里是类标和类标的频数。
Word2Vec | fastText | |
---|---|---|
输入 | one-hot形式的单词的向量 | embedding过的单词的词向量和n-gram向量 |
输出 | 对应的是每个term,计算某term几率最大 | 对应的是分类的标签。 |
本质不一样,体如今softmax的使用:
word2vec的目的是获得词向量,该词向量最终是在输入层获得的,输出层对应的h-softmax也会生成一系列的向量,可是最终都被抛弃,不会使用。
fastText则充分利用了h-softmax的分类功能,遍历分类树的全部叶节点,找到几率最大的label
fastText优势:
清华文本分类数据集下载:thunlp.oss-cn-qingdao.aliyuncs.com/THUCNews.zi…
做者:@mantchs
GitHub:github.com/NLP-LOVE/ML…