论文阅读笔记:Bag of Tricks for Efficient Text Classification(FastText模型)

159 阅读3分钟

FastText一直在用,但原论文还真没从头到尾正经看过一遍,走起。

简介

文章开头就提出目前在自然语言领域已经有很多性能表现很好的深度学习模型,但这些模型为了取得一个比较好的性能,普遍的训练和推理过程都是较慢的,在规模很大的数据集上不好使用。本文认为线性模型分类是文本分类任务的一个强baseline——并不清楚是为什么,也许我需要看看这句话对应的那两篇——于是提出了一种语料和输出空间都被扩展到极大规模的线性模型,拥有秩约束和一个近似损失函数的这一模型能够在10分钟内训练十亿字。

模型架构

用词袋表达句子并训练分类器是一种简单有效的方案,但这种模型并不在特征与目标类之间共享参数,这限制了在上下文的泛化——这一句没太看懂,可能是指线性分类器对每个词的参数都是独立而不共享导致不能区分出相同参数下上下文不同词汇的含义区分吧。为了解决这个问题,常见方案有把词袋矩阵分解为低秩矩阵,或者用多层神经网络。

image.png

于是就是这张图,一个采用秩约束的简单线性模型,不过秩约束具体是什么我也没有弄清楚,找时间问问。

首先有一个权重矩阵A对单词索引取得词表示,然后再将词表示计算均值得到text句子表示,再然后将其输入分类器,在这个过程中,词表示是会被反复使用的隐藏层。分类器最终使用f输出,则对一组N个文档,需要最小化的负对数目标函数如下:

image.png

原文这里逻辑多少有点乱,很突兀的引用了一堆和上图没什么关系的东西,不过总之就是先用A索引得到权重,再pool进入分类器然后对输出结果计算负对数损失函数,挺简单一件事给说成这样。

层次Softmax

当分类器要区分的目标类别过多,线性分类器的复杂度就会达到O(kh),k为类别数,h为词表示维度,为了降低复杂度使用了霍夫曼树,把复杂度下降到O(hlog2(k))O(hlog_2(k))。层次softmax在测试过程中寻找最优类别时也很有用:每一个node的概率都与从根节点走到当前node的概率相关,即:

image.png

这说明子节点的概率永远低于其父母中的一个,这样一来,采用深度优先搜索就可以有效抛弃掉那些概率相对低的节点。

话虽如此这里也没有讲明白是怎么存储的,回头找别的资料看看。

N-gram特征

词袋模型不考虑词语顺序,为了能够用相对少的计算完成模型,采用基于单词的N-gram Bags进行表示进而增强上下文信息,这也是模型训练速度很快的一个原因。

总结

挺不喜欢这篇文章的,感觉啥啥啥都没太说明白,雀实模型结构也很简单就是了,感觉作者写的时候逻辑不是很紧密。 有很多东西文章没有交代,之后要找别的资料看一看。