fastText原理及实践-我爱自然语言处理
fastText原理-csdn
softmax回归
- Softmax回归(Softmax Regression)又被称作多项逻辑回归(multinomial logistic regression),它是逻辑回归在处理多类别任务上的推广
- 代价函数上推导出它们的一致性
- 代价函数上推导出它们的一致性
- softmax函数常在神经网络输出层充当激活函数,目的就是将输出层的值归一化到0-1区间,将神经元输出构造成概率分布,主要就是起到将神经元输出值进行归一化的作用
FastText特点:分层softmax
- 背景:标准的Softmax回归中,要计算y=j时的Softmax概率,我们需要对所有的K个概率做归一化,这在|y|很大时非常耗时。于是,分层Softmax诞生了,它的基本思想是使用树的层级结构替代扁平化的标准Softmax。这样大大节省了时间空间
- 霍夫曼树理解
- 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为霍夫曼树
- 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为霍夫曼树
- 构造霍夫曼树方法:根据类标的频数构造的霍夫曼树
- 表示出现最频繁的类,路径最短
- 表示出现最频繁的类,路径最短
- 使用:当我们知道了目标类别(或者单词)x,之后,我们只需要计算root节点,到该词的路径累乘,即可. 不需要去遍历所有的节点信息,时间复杂度变为O(log2(V))
- 单词预测举例
FastText特点:n-gram特征
- 在文本特征提取中,常常能看到n-gram的身影。它是一种基于语言模型的算法,基本思想是将文本内容按照字节顺序进行大小为N的滑动窗口操作,最终形成长度为N的字节片段序列
- 分字粒度和词粒度
- n-gram产生的特征只是作为文本特征的候选集,你后面可能会采用信息熵、卡方统计、IDF等文本特征选择方式筛选出比较重要特征
- 优势:
- 对于低频词生成的词向量效果会更好。因为它们的n-gram可以和其它词共享。
- 对于训练词库之外的单词,仍然可以构建它们的词向量。我们可以叠加它们的字符级n-gram向量。
word2vec:cbow
- 背景:word2vec主要有两种模型:skip-gram 模型和CBOW模型,CBOW模型架构和fastText模型非常相似
- CBOW:
- CBOW模型的基本思路是:用上下文预测目标词汇
- 架构图如下所示:
- 神经网络模型:
重点就是学习输入层到隐藏层,隐藏层到输出层的权重矩阵- 输入层:输入层由目标词汇y的上下文单词{${x_1,x_2…x_c}$}组成,$x_i$是被onehot编码过的V维向量,其中V是词汇量
- 隐含层:隐含层是N维向量h
- 输出层:输出层是被onehot编码过的目标词y
因为词库V往往非常大,使用标准的softmax计算相当耗时,于是CBOW的输出层采用的正是上文提到过的分层Softmax
FastText
- 使用fastText进行文本分类的同时也会产生词的embedding,即embedding是fastText分类的产物。除非你决定使用预训练的embedding来训练fastText分类模型
对word2vec的改进
- 背景:
word2vec把语料库中的每个单词当成原子的,它会为每个单词生成一个向量。这忽略了单词内部的形态特征,比如:“apple” 和“apples”,“达观数据”和“达观”,这两个例子中,两个单词都有较多公共字符,即它们的内部形态类似,但是在传统的word2vec中,这种单词内部形态信息因为它们被转换成不同的id丢失了 - fasttext方法不同与word2vec方法,引入了两类特征并进行embedding。其中n-gram颗粒度是词与词之间,n-char是单个词之间
- n-char:
对于单词“apple”,假设n的取值为3,则它的trigram有:
“<ap”, “app”, “ppl”, “ple”, “le>”
其中,<表示前缀,>表示后缀。于是,我们可以用这些trigram来表示“apple”这个单词,进一步 - 我们可以用这5个trigram的向量叠加来表示“apple”的词向量
- n-char:
模型架构

- 不同点1:输入
- CBOW的输入是目标单词的上下文,fastText的输入是多个单词及其n-gram或者n-char特征,这些特征用来表示单个文档
- CBOW的输入单词被onehot编码过,fastText的输入特征是被embedding过
- 不同点2:输出
- CBOW的输出是目标词汇,fastText的输出是文档对应的类标
- fastText采用了分层Softmax,大大降低了模型训练时间
核心思想:
- 仔细观察模型的后半部分,即从隐含层输出到输出层输出,会发现它就是一个softmax线性多类别分类器,分类器的输入是一个用来表征当前文档的向量;模型的前半部分,即从输入层输入到隐含层输出部分,主要在做一件事情:生成用来表征文档的向量。那么它是如何做的呢?叠加构成这篇文档的所有词及n-gram的词向量,然后取平均。叠加词向量背后的思想就是传统的词袋法,即将文档看成一个由词构成的集合
- 将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类
- 这中间涉及到两个技巧:字符级n-gram特征的引入以及分层Softmax分类
- 将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类