FastText

  • 一、预备知识
  • 1.1 Softmax 回归
  • 1.2 分层Softmax
  • 1.3 n-gram特征
  • 二、word2vec
  • 三、FastText 原理
  • 四、FastText 实战



fastText是Facebook于2016年开源的一个词向量计算和文本分类工具,在学术上并没有太大创新。但是它的优点也非常明显,在文本分类任务中,fastText(浅层网络)往往能取得和深度网络相媲美的精度,却在训练时间上比深度网络快许多数量级。在标准的多核CPU上, 能够训练10亿词级别语料库的词向量在10分钟之内,能够分类有着30万多类别的50多万句子在1分钟之内。

本文首先会介绍一些预备知识,比如softmax、ngram等,然后简单介绍word2vec原理,之后来讲解fastText的原理,并着手使用keras搭建一个简单的fastText分类器,最后,讲一下应用。

一、预备知识

1.1 Softmax 回归

Softmax回归(Softmax Regression)又被称作多项逻辑回归(multinomial logistic regression),它是逻辑回归在处理多类别任务上的推广。

在逻辑回归中, 我们有m个被标注的样本:{(nlp语义分析返回结果是什么_代价函数,nlp语义分析返回结果是什么_代价函数_02),…,(nlp语义分析返回结果是什么_Soft_03,nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_04)},其中nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_05。因为类标是二元的,所以我们有nlp语义分析返回结果是什么_深度网络_06。我们的假设(hypothesis)有如下形式:

nlp语义分析返回结果是什么_代价函数_07

代价函数(cost function)如下:

nlp语义分析返回结果是什么_深度网络_08

在Softmax回归中,类标是大于2的,因此在我们的训练集{(nlp语义分析返回结果是什么_代价函数,nlp语义分析返回结果是什么_代价函数_02),…,(nlp语义分析返回结果是什么_Soft_03,nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_04)}中,nlp语义分析返回结果是什么_深度网络_13。给定一个测试输入nlp语义分析返回结果是什么_Soft_14,我们的假设应该输出一个nlp语义分析返回结果是什么_代价函数_15维的向量,向量内每个元素的值表示nlp语义分析返回结果是什么_Soft_14属于当前类别的概率。具体地,假设nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_17形式如下:

nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_18


代价函数如下:

nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_19


其中nlp语义分析返回结果是什么_Soft_20是指示函数,即nlp语义分析返回结果是什么_深度网络_21

既然我们说Softmax回归是逻辑回归的推广,那我们是否能够在代价函数上推导出它们的一致性呢?当然可以,于是:

nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_22


可以看到,逻辑回归是softmax回归在K=2时的特例。

1.2 分层Softmax

标准的Softmax回归中,要计算nlp语义分析返回结果是什么_深度网络_23时的Softmax概率: nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_24, 我们需要对所有的K个概率做归一化,这在|y|很大时非常耗时。于是,分层Softmax诞生了,它的基本思想是使用树的层级结构替代扁平化的标准Softmax,使得在计算 nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_24, 时,只需计算一条路径上的所有节点的概率值,无需在意其它的节点。

下图是一个分层Softmax示例:

nlp语义分析返回结果是什么_代价函数_26


树的结构是根据类标的频数构造的霍夫曼树。K个不同的类标组成所有的叶子节点,K-1个内部节点作为内部参数,从根节点到某个叶子节点经过的节点和边形成一条路径,路径长度被表示为 nlp语义分析返回结果是什么_代价函数_27。于是, nlp语义分析返回结果是什么_代价函数_28 就可以被写成:

nlp语义分析返回结果是什么_深度网络_29


其中:

nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_30

nlp语义分析返回结果是什么_代价函数_31表示n节点的左孩子;

nlp语义分析返回结果是什么_Soft_32 是一个特殊的函数,被定义为:

nlp语义分析返回结果是什么_深度网络_33


nlp语义分析返回结果是什么_深度网络_34 是中间节点 nlp语义分析返回结果是什么_Soft_35

nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_36是Softmax层的输入

上图中,高亮的节点和边是从根节点到 nlp语义分析返回结果是什么_Soft_37 的路径,路径长度 nlp语义分析返回结果是什么_深度网络_38 可以被表示为:

nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_39


于是,从根节点走到叶子节点 nlp语义分析返回结果是什么_Soft_37

通过分层的Softmax,计算复杂度一下从nlp语义分析返回结果是什么_深度网络_41降低到nlp语义分析返回结果是什么_深度网络_42

1.3 n-gram特征

在文本特征提取中,常常能看到n-gram的身影。它是一种基于语言模型的算法,基本思想是将文本内容按照字节顺序进行大小为N的滑动窗口操作,最终形成长度为N的字节片段序列。看下面的例子:

我来到达观数据参观

相应的bigram特征为:我来 来到 到达 达观 观数 数据 据参 参观

相应的trigram特征为:我来到 来到达 到达观 达观数 观数据 数据参 据参观

注意一点:n-gram中的gram根据粒度不同,有不同的含义。它可以是字粒度,也可以是词粒度的。上面所举的例子属于字粒度的n-gram,词粒度的n-gram看下面例子:

我 来到 达观数据 参观

相应的bigram特征为:我/来到 来到/达观数据 达观数据/参观

相应的trigram特征为:我/来到/达观数据 来到/达观数据/参观

n-gram产生的特征只是作为文本特征的候选集,你后面可能会采用信息熵、卡方统计、IDF等文本特征选择方式筛选出比较重要特征。

二、word2vec

你可能要问,这篇文章不是介绍fastText的么,怎么开始介绍起了word2vec?最主要的原因是word2vec的CBOW模型架构和fastText模型非常相似。于是,你看到facebook开源的fastText工具不仅实现了fastText文本分类工具,还实现了快速词向量训练工具。word2vec主要有两种模型:skip-gram 模型和CBOW模型,这里只介绍CBOW模型,有关skip-gram模型的内容请参考达观另一篇技术文章:

漫谈Word2vec之skip-gram模型1、框架结构

CBOW模型的基本思路是:用上下文预测目标词汇。架构图如下所示:

nlp语义分析返回结果是什么_深度网络_43


输入层由目标词汇nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_44的上下文单词 nlp语义分析返回结果是什么_代价函数_45 组成, nlp语义分析返回结果是什么_代价函数_46 是被onehot编码过的nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_47维向量,其中nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_47是词汇量;隐含层是nlp语义分析返回结果是什么_深度网络_49维向量nlp语义分析返回结果是什么_代价函数_50;输出层是被onehot编码过的目标词nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_44。输入向量通过 nlp语义分析返回结果是什么_Soft_52 维的权重矩阵nlp语义分析返回结果是什么_Soft_53连接到隐含层;隐含层通过 nlp语义分析返回结果是什么_Soft_54 维的权重矩阵 nlp语义分析返回结果是什么_代价函数_55 连接到输出层。因为词库nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_47往往非常大,使用标准的softmax计算相当耗时,于是CBOW的输出层采用的正是上文提到过的分层Softmax。

2、前向传播

输入是如何计算而获得输出呢?先假设我们已经获得了权重矩阵 nlp语义分析返回结果是什么_Soft_53nlp语义分析返回结果是什么_Soft_58 ,隐含层nlp语义分析返回结果是什么_代价函数_50的输出的计算公式:

nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_60


即:隐含层的输出是nlp语义分析返回结果是什么_代价函数_61个上下文单词向量的加权平均,权重为nlp语义分析返回结果是什么_Soft_53

接着我们计算输出层的每个节点: nlp语义分析返回结果是什么_深度网络_63

这里 nlp语义分析返回结果是什么_深度网络_64 是矩阵 nlp语义分析返回结果是什么_代价函数_55 的第nlp语义分析返回结果是什么_深度网络_66列,最后,将 nlp语义分析返回结果是什么_Soft_67 作为softmax函数的输入,得到 nlp语义分析返回结果是什么_代价函数_68

nlp语义分析返回结果是什么_Soft_69


3、反向传播学习权重矩阵

在学习权重矩阵和过程中,我们首先随机产生初始值,然后feed训练样本到我们的模型,并观测我们期望输出和真实输出的误差。接着,我们计算误差关于权重矩阵的梯度,并在梯度的方向纠正它们。首先定义损失函数,objective是最大化给定输入上下文,target单词的条件概率。因此,损失函数为:

nlp语义分析返回结果是什么_深度网络_70


这里, nlp语义分析返回结果是什么_深度网络_71 表示目标单词在词库nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_47中的索引。

如何更新权重 nlp语义分析返回结果是什么_代价函数_55我们先对nlp语义分析返回结果是什么_代价函数_74关于 nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_75 求导:

nlp语义分析返回结果是什么_代价函数_76


nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_77 函数表示:

nlp语义分析返回结果是什么_Soft_78


于是, nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_75 的更新公式:

nlp语义分析返回结果是什么_代价函数_80


如何更新权重nlp语义分析返回结果是什么_深度网络_81

我们首先计算nlp语义分析返回结果是什么_代价函数_74关于隐含层节点的导数:

nlp语义分析返回结果是什么_nlp语义分析返回结果是什么_83


然后,E关于权重的导数为:

nlp语义分析返回结果是什么_深度网络_84


于是, nlp语义分析返回结果是什么_深度网络_85 的更新公式:

nlp语义分析返回结果是什么_Soft_86

三、FastText 原理

终于到我们的fastText出场了。这里有一点需要特别注意,一般情况下,使用fastText进行文本分类的同时也会产生词的embedding,即embedding是fastText分类的产物。除非你决定使用预训练的embedding来训练fastText分类模型,这另当别论。
1、字符级别的n-gram
word2vec把语料库中的每个单词当成原子的,它会为每个单词生成一个向量。这忽略了单词内部的形态特征,比如:“apple” 和“apples”,“达观数据”和“达观”,这两个例子中,两个单词都有较多公共字符,即它们的内部形态类似,但是在传统的word2vec中,这种单词内部形态信息因为它们被转换成不同的id丢失了。

为了克服这个问题,fastText使用了字符级别的n-grams来表示一个单词。对于单词“apple”,假设n的取值为3,则它的trigram有

“<ap”, “app”, “ppl”, “ple”, “le>”

其中,<表示前缀,>表示后缀。于是,我们可以用这些 trigram 来表示“apple”这个单词,进一步,我们可以用这5个trigram的向量叠加来表示“apple”的词向量。

这带来两点好处:

  1. 对于低频词生成的词向量效果会更好。因为它们的n-gram可以和其它词共享。
  2. 对于训练词库之外的单词,仍然可以构建它们的词向量。我们可以叠加它们的字符级n-gram向量。

2、模型架构

之前提到过,fastText模型架构和word2vec的CBOW模型架构非常相似。下面是fastText模型架构图:

nlp语义分析返回结果是什么_Soft_87


注意:此架构图没有展示词向量的训练过程。可以看到,和CBOW一样,fastText模型也只有三层:输入层、隐含层、输出层(Hierarchical Softmax),输入都是多个经向量表示的单词,输出都是一个特定的target,隐含层都是对多个词向量的叠加平均。不同的是,CBOW的输入是目标单词的上下文,fastText的输入是多个单词及其n-gram特征,这些特征用来表示单个文档;CBOW的输入单词被onehot编码过,fastText的输入特征是被embedding过;CBOW的输出是目标词汇,fastText的输出是文档对应的类标。

值得注意的是,fastText在输入时,将单词的字符级别的n-gram向量作为额外的特征;在输出时,fastText采用了分层Softmax,大大降低了模型训练时间。这两个知识点在前文中已经讲过,这里不再赘述。

fastText相关公式的推导和CBOW非常类似,这里也不展开了。
3、核心思想
那 fastText 文本分类的核心思想是什么?

仔细观察模型的后半部分,即从隐含层输出到输出层输出,会发现它就是一个softmax线性多类别分类器,分类器的输入是一个用来表征当前文档的向量;模型的前半部分,即从输入层输入到隐含层输出部分,主要在做一件事情:生成用来表征文档的向量。那么它是如何做的呢?叠加构成这篇文档的所有词及n-gram的词向量,然后取平均。叠加词向量背后的思想就是传统的词袋法,即将文档看成一个由词构成的集合。

于是fastText的核心思想就是:将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。这中间涉及到两个技巧:字符级n-gram特征的引入以及分层Softmax分类。