NLP经典论文:FastText 笔记
论文
原论文:《Bag of Tricks for Efficient Text Classification》
介绍
2016-07发表的文章,特点就是快,精度还不错,使用了简单的模型结构,并使用n-gram 特征作为额外输入以表征词序信息,优化上用分层softmax减少了计算量,加速了训练。
模型结构
整体结构
整体流程
输入层
x 1 , x 2 , . . . , x N , x ∈ R h × 1 \boldsymbol{x}_1, \boldsymbol{x}_2, ..., \boldsymbol{x}_N, \boldsymbol{x} \in R^{h\times 1} x1,x2,...,xN,x∈Rh×1,为一个embedding vector, h h h为一个embedding vector的维度。
n-gram包含uni-gram、bi-gram、tri-gram等。假如文本划分最小的单位token是词,uni-gram就是一个词、bi-gram就是两个词连到一起组成一个bi-gram词、tri-gram就是三个词连到一起组成一个tri-gram词,这些统称为n-gram词。
lookup table W \boldsymbol{W} W中包含了n-gram词的embedding vector, W ∈ R h × V \boldsymbol{W} \in R^{h\times V} W∈Rh×V, V V V为 W \boldsymbol{W} W中embedding vector的个数, V 1 V_1 V1个对应uni-gram词, V 2 V_2 V2个对应bi-gram词, V 3 V_3 V3个对应tri-gram词, V m V_m Vm个对应m-gram词… V = V 1 + . . . + V m V=V_1+...+V_m V=V1+...+Vm。但 V 2 ≠ V 1 2 , V 3 ≠ V 1 3 , . . . , V m ≠ V 1 m V_2 \neq V_1^2, V_3 \neq V_1^3, ...,V_m \neq V_1^m V2=V12,V3=V13,...,Vm=V1m,因为这样会导致 W \boldsymbol{W} W变得非常大,中文常用uni-gram词就有6w个。
使 W \boldsymbol{W} W变得小的方法:
- 低频词舍弃
- 多个词n-gram词映射到同一个embedding vector
这样既可以保存词序信息,又不会使embedding空间变得太大。关于除uni-gram的n-gram词从one-hot空间映射到word embedding空间的过程中, f a s t T e x t fastText fastText使用的是hashing function,保持了n-gram的快速和内存效率映射。
隐藏层
c = x 1 + x 2 + . . . + x N , c ∈ R h × 1 \boldsymbol{c}=\boldsymbol{x}_1+ \boldsymbol{x}_2+ ...+\boldsymbol{x}_N, \boldsymbol{c} \in R^{h\times 1} c=x1+x2+...+xN,c∈Rh×1
将输入的N个n-gram特征进行叠加,包含了所有的文本信息。
输出层
隐藏层的输出 c \boldsymbol{c} c,之后经过:
-
方式1:分层softmax
-
方式2:负采样Negative Sampling
就可得到每个预定义类别的预测概率。
分层softmax和负采样Negative Sampling具体参考:NLP经典论文:Word2vec、CBOW、Skip-gram 笔记
作者原文:《Distributed Representations of Words and Phrases and their Compositionality》
文章部分翻译
Abstract
本文探讨了一种简单有效的文本分类基本方法。我们的实验表明,我们的快速文本分类法 f a s t T e x t fastText fastText在精度上与深度学习分类往往是一致的,并且在训练和测试速度上要快好几个数量级。 我们可以使用标准的多核CPU在不到十分钟的时间内对超过10亿个单词样本上对 f a s t T e x t fastText fastText模型进行训练,并在不到一分钟的时间内对312K类中的50万个句子进行分类。
2 Model architecture
句子分类的一个简单而有效的基线是将句子表示为词袋(BoW)并训练线性分类器,例如逻辑回归或支持向量机(Joachims,1998;Fan等人,2008)。然而,线性分类器不在特征和类之间共享参数,这可能会限制泛化。该问题的常见解决方案是将线性分类器分解为低秩矩阵(Schutze,1992;Mikolov等人,2013)或使用多层神经网络(Collobert和Weston,2008;Zhang等人,2015)。对于神经网络,信息通过隐藏层共享。
图1显示了一个带有秩约束的简单线性模型。第一个权重矩阵A是单词的查找表。然后将单词表示式平均化为文本表示式,再将文本表示式输入线性分类器。文本表示是一个隐藏变量,可能会被再次使用。该架构类似于Mikolov等人(2013年)的CBOW模型,其中中间的单词由标签代替。我们使用softmax函数
f
f
f来计算预先定义的类的概率分布。对于一组N个文档,这将使类上的负对数似然最小化:
−
1
N
∑
n
=
1
N
y
n
log
(
f
(
B
A
x
n
)
)
,
-\frac{1}{N}\sum\limits_{n=1}^Ny_n\log (f(BAx_n)),
−N1n=1∑Nynlog(f(BAxn)),
(注:感觉这里的N和图中的N不是指代同一个东西,图1中指的是输入n-gram词的个数,文本中的词分别以n-gram划分,即以Uni-gram、Bi-gram、Tri-gram等进行划分,都作为输入;而公式中的N指的是文本的数量,一共有多少篇文本)
其中 x n x_n xn是第n个文档的标准化特征袋, y n y_n yn是标签,A和B是权重矩阵。该模型使用随机梯度下降和线性衰减学习率在多个CPU上异步训练。
2.1 Hierarchical softmax
当目标数量较大时,计算线性分类器的计算成本较高。更精确地说,计算复杂度是 O ( k h ) O(kh) O(kh),其中 k k k是目标数, h h h是隐藏层的维数(一层有多少个神经元)。为了改善运行时间,我们使用了基于哈夫曼编码树的分层softmax(Goodman,2001)(Mikolov等人,2013)。在训练过程中,计算复杂度下降到 O ( h log 2 ( k ) ) O(h\log_2(k)) O(hlog2(k))。在这棵树中,目标是叶节点。
当搜索最可能的类时,分层softmax在测试时也是有优势的。每个节点都与一个概率相关联,该概率是从根到该节点的路径的概率。如果节点位于深度
l
+
1
l+1
l+1处,父节点为
n
1
,
.
.
.
,
n
l
n_1,...,n_l
n1,...,nl,它的概率是
P
(
n
l
+
1
)
=
∏
i
=
1
l
P
(
n
i
)
.
P(n_{l+1})=\prod\limits_{i=1}^lP(n_i).
P(nl+1)=i=1∏lP(ni).
这意味着节点的概率总是低于其父节点的概率。通过深度优先搜索和追踪树叶中的最大概率来探索树,使得我们可以丢弃概率较小的树枝。在实践中,我们观察到在测试时复杂性降低到
O
(
h
log
2
(
k
)
)
O(h\log_2(k))
O(hlog2(k))。该方法可进一步扩展为计算前
T
T
T个目标,以
O
(
log
(
T
)
)
O(\log(T))
O(log(T))为代价,通过使用二进制堆的方法。
2.2 N-gram features
词袋模型是不考虑单词顺序的,但是明确地考虑到这个顺序通常在计算上非常昂贵。取而代之的是,我们使用n-gram包作为附加特征来捕获关于局部词序的部分信息。这在实践中非常有效,同时实现了与明确使用顺序的方法相当的结果(Wang和Manning,2012)。
通过使用 hashing trick(Weinberger et al.,2009),我们保持了n-gram的快速和内存效率映射,其 hashing function 与Mikolov et al.(2011)中的相同且只需要10M个bin来储存如果我们只使用Bigram,不使用 hashing trick则需要100M个bin。
相关的视频
相关的笔记
玩转Fasttext
word2vec原理(三) 基于Negative Sampling的模型
读FastText文章
fastText原理及实践
fastText原理和文本分类实战,看这一篇就够了
FastText:快速的文本分类器
NLP︱高级词向量表达(二)——FastText(简述、学习笔记)
Hierarchical Softmax(层次Softmax)
翻译:(36)[EACL] Bag of Tricks for Efficient Text Classification
相关代码
pytorch
https://github.com/649453932/Chinese-Text-Classification-Pytorch
tensorflow
keras
pytorch API:
-
把数据准备为需要的格式,数据准备最终需要的形式如下:
特征值\t__label__目标值
机器学习 应 补充 哪些 数学 基础 ? __label__QA -
进行模型的训练、保存和加载、预测
#1. 训练
model = fastText.train_supervised("classify.txt",wordNgrams=1,epoch=20)
#2. 保存
model.save_model("classify.model")
#3. 加载
model = fastText.load_model("classify.model")
textlist = [句子1,句子2]
#4. 预测,传入句子列表
result = model.predict(textlist)