Bag of Tricks for Efficient Text Classification (fastText) 学习笔记

模型原理分析

虽然神经网络在实践中效果不错,然而训练和测试需要大量的时间,但是有rank constraint和fast loss approximation的线性模型却可以在十亿级别的单词量下十分钟完成分析。fastText是可以应用在带监督的文本分类问题的语言模型,准确率可以与深度学习相提并论,且速度更快。它有两个突出的优点:

  • 因为调用了简单的线性模型而不是神经网络模型,所以它在保持了高精度的情况下,大大加快了训练速度和测试速度
  • fastText不需要预训练好的词向量,它会在模型训练过程中训练词向量(对于这一点的介绍在后面会提到)

fastText基本结构如下:
Bag of Tricks for Efficient Text Classification (fastText) 学习笔记_第1张图片
模型的输入是多个单词以及其N-gram模型和对应的特征,输出是文本所对应的label。这个模型有三个要点:

1 基本结构与CBOW相似

上次是同组的大佬讲了word2vec中的skip-gram模型,CBOW模型与skip-gram模型几乎是镜像的,应用场景是,用一群词来预测一个词。fastText的结构与CBOW的结构基本是一毛一样的,区别在于输入输出有改变,作用不同。

CBOW模型 fastText模型
输入 one-hot编码的文本,单位:单词 文本中的n-gram向量,特征为词向量平均值,单位:n字符
输出 预测的词 label
应用 预测中间词 预测标签

下面是关于为什么fastText会顺便训练词向量的解释:
CBOW模型的基本结构(此图截取自博客 https://blog.csdn.net/u010665216/article/details/78724856 ,侵删)如下:Bag of Tricks for Efficient Text Classification (fastText) 学习笔记_第2张图片
可以看到,虽然CBOW模型要解决的是给定一串词预测一个词的问题,但是它还十分顺便地训练了词嵌入矩阵 W V ∗ N W_{V*N} WVN,当然这个副产品十分有用。所以对于有相同结构的fastText有这样的功能也就不奇怪了,但是由于fastText采用的是字符级别的n-gram模型,所以可能这个副产品也许应该叫做n-字节嵌入矩阵?

2 N-gram模型

N-gram是基于语言模型的算法,基本思想就是将文本内容按照字节的顺序按照n的窗口滑动截取,并用得到的文本进行之后的计算。
这篇论文的n-gram模型有以下优点:

  • 用 a bag of N-grams 模型会抓住词序之间的关系,比如一个n为2的单词级模型,Tom loves Rose就会被分成"Tom-love", “love-Rose”,这样很容易就可以抓住"Tom ->love-> Rose" 而不是 "Tom <- love <- Rose"的句意。
  • 此篇论文采用Hashing trick构建了n-gram模型,更快而且更节省空间。
  • 论文采用字符级n-gram模型,这会为出现次数较少的单词生成更准确的词向量。即使此单词出现次数较少,但是组成单词的字符和其他单词显然有相同的部分,那么就可以使得次数较少的词向量向相似的出现频率高的词向量优化。对没有在词库中出现的但是在测试集出现的单词,同理

3 分层softmax

softmax作为很常用的输出层激活函数,可以将输出的值归整到0-1。但是如果采用标准的softmax函数,则需要对所有类别的概率都列入计算并做归一化,这个操作在单词量大的时候非常耗时,所以论文使用分层softmax来减少计算的复杂度。这种基于Huffman编码树的分层softmax将复杂度从O(kh)降到了O(hlogk).(k为label的总数,h为词向量维度)
分层softmax的结构中,通过文本(或者字节)的出现次序构成Huffman编码,非叶子节点中包含向左走向右走的概率,叶子节点包含选择的文本。这样计算出从根节点到 w 2 w_2 w2的复杂度就简化成 l o g n logn logn数量级的了。
Bag of Tricks for Efficient Text Classification (fastText) 学习笔记_第3张图片

fastText使用方法

fastText是运行在Mac OS或者linux上的,所以贫穷如我先切换到了linux然后安装了一通,安装命令如下:

$ git clone https://github.com/facebookresearch/fastText.git
$ cd fastText
$ make

这三行分别是从github中下载文件,解压并编译安装

  • 注意由于fastText使用了C++11的特性,所以它需要一个版本在gcc-4.6.3或者clang-3.3以上的C++编译器
  • 如果你还想用fastText计算单词相似度,那么你还需要一个安装有python2.6或者更高版本的python的环境和numpy还有scipy模块

然后我们就可以用命令开始训练了:
./fasttext supervised -input inputfile.txt -output model -dim 2
Bag of Tricks for Efficient Text Classification (fastText) 学习笔记_第4张图片

  • -input后面跟的是我们要喂入模型的训练文本,建立本次训练文本的代码如下:
    Bag of Tricks for Efficient Text Classification (fastText) 学习笔记_第5张图片
  • -output选项指示在何处保存模型,在训练结束的时候,fasttext会将model.bin在当前目录中创建包含训练分类器的文件。
  • -dim 指的是维度,它控制向量大小,维度越大,可捕获的信息就越多,就越难训练。
  • -loss hs选项是让模型使用分层softmax而不是常规softmax,这个选项会让你在较大数据量的情况下依旧有很短的训练时间,但是显然我们当前样例并不需要。

训练之后,导入测试集,然后命令行会直接输出测试结果:
在这里插入图片描述

  • 这只是针对常用命令的一个简单说明,如果想知道更多更详细的fastText使用方法,请阅读官方文档:https://fasttext.cc/docs/en/supervised-tutorial.html

共勉

你可能感兴趣的:(fastText)