Fasttext (Bag of Tricks for Efficient Text Classification) 阅读笔记

论文原文 Bag of Tricks for Efficient Text Classification
论文信息 EACL2017
论文解读 Hytn Chen
更新时间 2020-02-23

文本分类相关方法

用作文本分类的卷积神经网络,有多个使用流程示意图如下

1维卷积

在这里插入图片描述

堆卷积(Goldberg Book)

在这里插入图片描述

延迟CNN(Kalchbrenner et al. 2016)

在这里插入图片描述

动态CNN

详见这篇文章解读

总结一下,CNN在文本分类中担任的主要角色就是encoding文本,之后可以用分类器解决分类的问题。CNN主要问题就是训练相对较慢,从而就限制了CNN不能在非常大的数据集上使用。

论文提出的模型

模型结构图如下

在这里插入图片描述

简单来讲就是文本表征+线性模型,这里的文本表征由n-gram,词查找表以及CBOW组成,线性模型由多层softmax和rank constraint组成(实现参数共享的效果)。

输入层:先看n-gram表征,很简单理解,假设一句话有N个词,1-gram就是单个词为一组,一共可以有N组;2-gram就是两个词为一组的排列组合,一共可以有 N ( N 1 ) 2 \frac{N(N-1)}{2} 组,如果再多那字典(要索引到具体组别,一个组别一个序号)的维度就呈指数增长了,因此文中使用了哈希字典的方式来避免这样的情况发生(把所有的n-gram都哈希到buckets个桶中,哈希到同一个桶的所有n-gram共享一个embedding vector)。之所以使用n-gram就是为了保留一定的词序信息,或者抓取局部的信息。

隐层:图中的每个输入x都表示一个文本中的n-gram向量,隐层是输入词向量的平均值再乘以权重矩阵A所得,所以也就相当于将各个输入的向量加权求和作为句向量。

输出层:由隐层的输出结果再乘以权重矩阵B(线性变换)得到输出。

分类器:多层softmax分类器加cross entropy交叉熵损失函数。

整个模型的结构描述就是:词向量经过隐藏层再经过多层softmax得到预测值。最后的损失函数就是最小化负对数似然函数(交叉熵损失函数):
1 D i = 1 D y i log ( softmax ( W x i ) ) -\frac{1}{|D|} \sum_{i=1}^{|D|} y_{i} \log \left(\operatorname{softmax}\left(W * x_{i}\right)\right)
原文的损失函数如下
1 N n = 1 N y n log ( f ( B A x n ) ) -\frac{1}{N} \sum_{n=1}^{N} y_{n} \log \left(f\left(B A x_{n}\right)\right)
可是上面的函数没有体现出多层softmax的性质,多层softmax究竟好在哪里?这个问题就可以由skip-gram模型来引出,假设当前词 w w 的词向量是 x w x_w ,对于待预测的上下文词 c c 的分类结果是 v c v_c ,那么预测正确的概率表达式如下
p ( c w ) = e x w v c k = 1 K e x w v k p(c | w)=\frac{e^{x_{w}^{\top} v_{c}}}{\sum_{k=1}^{K} e^{x_{w}^{\top} v_{k}}}
其中k代表词汇表中词的个数。那么对于一句话中的每个当前词都能预测对上下文词的概率也就可以用公式表述如下
min x , v t = 1 T c C t log e x w t v c k = 1 K e x w t v k \min _{x, v}-\sum_{t=1}^{T} \sum_{c \in \mathcal{C}_{t}} \log \frac{e^{x_{w_{t}}^{\top} v_{c}}}{\sum_{k=1}^{K} e^{x_{w_{t}}^{\top} v_{k}}}
其中T代表窗口(也就是上下文)中词的个数,t代表当前词在该句话中的位置。这个式子有什么问题呢?首先,上面式子的分母其实计算了太多次共现的词了,当前词t预测上下文词c,而上下文词c在t+1时刻也会作为当前词来预测其上下文词t,所以没有必要把分母上所有的东西都计算一遍。由此就引入了多层softmax,把多分类问题转换为一个个二分类逻辑回归问题:
log ( 1 + e x w t T v c ) + n N c log ( 1 + e x w t T v n ) \log \left(1+e^{-x_{w_{t}}^{T} v_{c}}\right)+\sum_{n \in N_{c}} \log \left(1+e^{x_{w_{t}}^{T} v_{n}}\right)
第一项衡量了预测正确词时的得分值,第二项衡量了预测每个不正确词时候的得分值之和。采用霍夫曼树来生成节点,频繁出现的类会出现在浅层节点上(负采样)。上面公式就变为
k K c log ( 1 + e y c k x w t T v n ) \sum_{k \in K_{c}} \log \left(1+e^{y_{c k} x_{w_{t}}^{T} v_{n}}\right)
其中 y c k y_ck 就代表c这个类别在霍夫曼树上的路径。这样达成一个效果,就是预测一个不常用的类别时,会把存在于这个类别前(霍夫曼树节点深度比该类别浅)的点都训练一遍,也就是负采样。通俗理解就是,是该类的样本可以训练模型,不是该类的样本也可以作为一种矫正信息来训练模型。

实验结果

用2015年Zhang(Text understanding from scratch)的情感分类的文章里面使用的八个数据集,在速度上有了很大提升,还有标签预测数据集上准确率也有所提升,速度有大幅提升。

具体实验结果可见原文

参考资料

http://phontron.com/class/nn4nlp2019/assets/slides/nn4nlp-04-cnn.pdf

发布了33 篇原创文章 · 获赞 45 · 访问量 2507

猜你喜欢

转载自blog.csdn.net/nstarLDS/article/details/104620630