Bag of tricks for Efficient Text Classification 对于高效率文本分类的技巧
这是FaceBook的Armand Joulin 2017发表在EACL上的,四作是word2vec的作者。EACL和NAACL是ACL的两个分别在欧洲和北美洲办的子会议。已经开源在fasttext.cc上,更详细的介绍和使用可以去这儿查看。
文章目录
背景知识
之前的深度学习文本分类模型效果好,不需要特征工程,但是速度太慢,无法在大规模分类任务上使用。基于机器学习的则多数是线性分类模型,速度快,效果还可以,但效果和特征工程有很大关系。
fasttext模型效果与其他模型差不多,但是速度快了多个数量级,可以达到在多核CPU上10分钟内训练10亿词,在1分钟内训练312k类别的50万个句子。fasttext的分类任务基于CBOW,词训练任务则基于skipgram。
技巧方面主要是提出了快速的线性分类器和基于softmax和n-gram的fasttext模型。
hashing trick
1-gram 词表3万
2-gram 词表10万
3-gram 词表40万
总词表53万,前3万个一个词映射一个向量,后40万每6个词映射为1个向量,共将近7万个向量。
模型
(一) 分类模型
这是基于CBOW的,可以看到和CBOW很像。一句话,词表是V大小,每个词onehot后输入是1*V的,和V*D大小权重矩阵W相乘之后取平均得到1*D隐层向量,然后乘D*labels大小的权重矩阵W’得到1*labels大小的向量,做softmax得到预测句子标签的概率输出(当然也可以接SVM做分类)。
可以看到除了最后的W’维度和最前面的输入是句子所有词之外,其他的基本和CBOW是相同的。
相同点:
1、都是log-linear模型(对数线性模型),模型非常简单。当然softmax只是输出概率,所以说都是线性模型也完全ok。
2、都是对输入词向量做平均,然后预测输出。
3、模型结构完全一样。
不同点:
1、Fasttext提取句子特征,CBOW提取上下文特征。
2、Fasttext需要标注语料,是监督模型;CBOW是无监督模型。
Fasttext的问题和解决方法:
1、类别过多时,softrmax依旧很慢, 使用层次softmax解决。
2、使用词袋模型,没有词序信息,使用n-gram模型解决。n-gram的n大的时候也会慢,可使用hash去解决,但hash会导致不太准确。
(二)子词词向量训练模型
之前学习我们知道,用词向量会产生OOV词(尤其网络语料因为简写和拼写错误等),且可能考虑不到词内部信息。而用字符向量则会很慢。所以这里采用子词词向量(subword embedding)的方式,即使用字符的n-gram代替词,例如where的3-gram子词表示是由<wh,whe,her,ere,re>的词向量和where本身组合而来。<开头是词头,>结尾是词缀。
这时候的loss是对skip-gram的loss做了变形:
s
(
w
,
c
)
=
∑
g
∈
G
w
z
g
T
v
c
s(w,c)=\sum_{g\in{G_w}}z_g^Tv_c
s(w,c)=g∈Gw∑zgTvc
v
c
v_c
vc是中心子词向量,z是周围子词向量。
历史意义
1、提出使用子词训练词向量的方法,一定程度解决OOV词,且不需特征工程。
2、提出新的文本分类方法,快速高效。
3、开源fasttext,工业界、学术界应用大大加速。