文本分类模型第一弹:关于Fasttext,看这一篇就够了

一、前言

最近手头上接到一个文本分类的任务,当前使用的Baseline是Fasttext模型。由于之前对Fasttext了解不是很多,所以在开始之初决定对Fasttext进行一番调研。但网上关于Fasttext的博客和提出Fasttext的两篇论文在一些细节上都写的不是很清楚,对其性能也缺乏实验数据的支撑说明,于是就有了今天这篇文章。

关于Fasttext,看这一篇就够了。

这里是文本分类系列:

文本分类模型第一弹:关于Fasttext,看这一篇就够了

文本分类模型第二弹:HAN(Hierarchy Attention Network)

文本分类第模型三弹:BoW(Bag of Words) + TF-IDF + LightGBM​​​​​​​


二、相关论文

废话不多说先给出 Facebook AI Research 提出 Fasttext 模型的两篇论文:

(1)Enriching Word Vectors with Subword Information

(2)Bag of Tricks for Efficient Text Classification

第一篇论文主要讲Word Vector,提出了字符级别向量的概念(Character level features for NLP),提出了类似 Word2Vec 中 Skip-gram 与 CBOW 的模型来训练字符向量。其中也是依靠条件概率公式表示预测词(Character)的出现概率,再通过最大似然估计将概率连乘转化为累加形式,最后使用SGD在最大化概率的同时,更新学习参数。

第二篇论文主要讲Text Classification,论文对CBOW模型做了一点改变,将模型的输出改为预测的Label而不是预测的单词,从而变成了一个分类模型。再输出层的优化方面,也跟CBOW的做法如出一辙,使用了多层Softmax(Hierarchical Softmax) 和 负采样(Negative Sampling)的方法。

其实就是这两篇论文分别提出了现在Fastext的主要两个功能的:训练字符向量和文本分类。

拿API来说也就是:Fasttext.train_unsupervised() 和 Fasttext.train_supervised()。


三、模型结构

这次用Fasttext主要是来做文本分类,所以Character Embedding的部分说的比较少,主要还是来讲Text Classification的部分。

整个Fasttext的模型结构图如下所示:

图3.1 Fasttext模型结构图

此图截取自论文Bag of Tricks for Efficient Text Classification,其实模型非常的简单,三层结构组成,输入层,隐藏层,输出层。

输入层的输入为文本中的单词和N-gram Feature的Embedding。其操作和Word2Vec的一样,实际上是使用一个one-hot向量乘以Embedding存放矩阵得到每个词的Embedding的过程,这里就不再赘述。

隐藏层,这里叫做Hidden Layer,在这一层进行的操作是将输出层输入的Embedding Vector进行求平均。注意!只是进行了求平均,并没有进行任何形如tanh(xW+b)的非线性变换过程!这是一部分博客里经常出现错误的地方。也正是由于这个原因,在Word2Vec的模型中也把这一层称之为投影层(Project Layer)而并不是隐藏层。

输出层,输出文本的类别。与Word2Vec一样,输出层有三种方法来输出最终的label,分别是:Softmax,Hierarchical Softmax和Negative Sampling。其中,Softmax通过Hidden Layer求平均得到的Vector,乘以反变换矩阵W{}',得到长度等于分类数的Vector,再使用Softmax得到概率最高的一类为最终分类结果。而后两种方法则是通过Huffman Tree和Negative Sampling两个trick来节省时间复杂度。

最后模型使用的Loss Function为Binary Logistic,二分类时其实和Cross-Entropy是一个东西。这里强行把Softmax的输出看作了每一类别的概率值。Optimizer使用SGD。


四、两种N-gram和Fasttext里的trick

这一章来说说Fasttext中使用到的两种N-gram。这两种N-gram使用在哪里,在具体的工程中如何实现,中文怎么算字符级别的Embedding,以及使用两种N-gram后有什么收益和好处,这是论文中没有仔细交代的地方,也是很多Fasttext的文章中没有介绍的地方,这里通过Fasttext的源码来讲讲这两种N-gram。

1. 两种N-gram

首先第一种N-gram,是字符级别的N-gram,论文 Enriching Word Vectors with Subword Information 中将其称为Subword n-gram feature。举一个例子,单词“universe”如果按照 bi-gram进行划分可分为<u,un,ni,iv,ve,er,rs,se>以此类推。

另一种N-gram是我们传统意义上的N-gram,也就是图3.1里提到的N-gram feature。

为了更好的区分两者,我们在这里把它们称为Character n-gram和Word n-gram。

这两种N-gram同时存在于Fasttext的训练中,其中第一种用于Character Embedding的计算(如果不加载预训练Embedding的话,分类任务也会训练一套Embedding)。第二种用于Classification的输入层。

2.两种N-gram的实现方式

Fasttext中的两种N-gram究竟如何来实现,我们来通过源码分析。

首先看Character n-gram。该段源码位于 src/dictionary.cc 中。

// 该函数仅被 Dictionary::getSubword(...)调用
// Dictionary::getSu
  • 16
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值