# fasttext

﻿﻿

## （1）Softmax回归

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

&lt;img src="https://pic4.zhimg.com/v2-dcd58c1784f47654d4713b942f045b3f_b.jpg" data-caption="" data-size="normal" data-rawwidth="442" data-rawheight="59" class="origin_image zh-lightbox-thumb" width="442" data-original="https://pic4.zhimg.com/v2-dcd58c1784f47654d4713b942f045b3f_r.jpg"&gt;

&lt;img src="https://pic3.zhimg.com/v2-1dfdd8b84d08418d77d5d0cc526a209b_b.jpg" data-caption="" data-size="normal" data-rawwidth="362" data-rawheight="111" class="content_image" width="362"&gt;

&lt;img src="https://pic3.zhimg.com/v2-4cb79560dcab6a2a8efafa4c23cae74c_b.jpg" data-caption="" data-size="normal" data-rawwidth="332" data-rawheight="68" class="content_image" width="332"&gt;

&lt;img src="https://pic2.zhimg.com/v2-bb919929ec2d7ac77b02409c552ca354_b.jpg" data-caption="" data-size="normal" data-rawwidth="419" data-rawheight="164" class="content_image" width="419"&gt;

## （2）分层Softmax

&lt;img src="https://pic4.zhimg.com/v2-8d39835b632df40d170e9f67b89c8c8e_b.jpg" data-caption="" data-size="normal" data-rawwidth="624" data-rawheight="205" class="origin_image zh-lightbox-thumb" width="624" data-original="https://pic4.zhimg.com/v2-8d39835b632df40d170e9f67b89c8c8e_r.jpg"&gt;

&lt;img src="https://pic3.zhimg.com/v2-0497a59a153966762760085ffae3da24_b.jpg" data-caption="" data-size="normal" data-rawwidth="426" data-rawheight="79" class="origin_image zh-lightbox-thumb" width="426" data-original="https://pic3.zhimg.com/v2-0497a59a153966762760085ffae3da24_r.jpg"&gt;

&lt;img src="https://pic3.zhimg.com/v2-dfd620fa995afdcedf623272020f6f8e_b.jpg" data-caption="" data-size="normal" data-rawwidth="201" data-rawheight="46" class="content_image" width="201"&gt;

X是Softmax层的输入

&lt;img src="https://pic1.zhimg.com/v2-0fb52b561592db29c7299156df5366ed_b.jpg" data-caption="" data-size="normal" data-rawwidth="440" data-rawheight="58" class="origin_image zh-lightbox-thumb" width="440" data-original="https://pic1.zhimg.com/v2-0fb52b561592db29c7299156df5366ed_r.jpg"&gt;

## （3）n-gram特征

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

## （1）模型架构

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

&lt;img src="https://pic2.zhimg.com/v2-73089aa56a1ae39117e1a03e874487c9_b.jpg" data-caption="" data-size="normal" data-rawwidth="624" data-rawheight="752" class="origin_image zh-lightbox-thumb" width="624" data-original="https://pic2.zhimg.com/v2-73089aa56a1ae39117e1a03e874487c9_r.jpg"&gt;

## （2）前向传播

&lt;img src="https://pic2.zhimg.com/v2-d1243483273bea012fd58e2fec126ecb_b.jpg" data-caption="" data-size="normal" data-rawwidth="143" data-rawheight="58" class="content_image" width="143"&gt;

&lt;img src="https://pic4.zhimg.com/v2-02886d8738ffd27ca264657811ac3b0d_b.jpg" data-caption="" data-size="normal" data-rawwidth="292" data-rawheight="58" class="content_image" width="292"&gt;

## （3）反向传播学习权重矩阵

&lt;img src="https://pic4.zhimg.com/v2-4acd7f9b15df76636a80879de101b49c_b.jpg" data-caption="" data-size="normal" data-rawwidth="303" data-rawheight="148" class="content_image" width="303"&gt;

&lt;img src="https://pic3.zhimg.com/v2-a0e0ebc0dfac09fcb113d366ab8b721d_b.jpg" data-caption="" data-size="normal" data-rawwidth="232" data-rawheight="91" class="content_image" width="232"&gt;

&lt;img src="https://pic1.zhimg.com/v2-8b33c6c1eb0afc0ef478c3f8a745ffda_b.jpg" data-caption="" data-size="normal" data-rawwidth="248" data-rawheight="46" class="content_image" width="248"&gt;

&lt;img src="https://pic4.zhimg.com/v2-52aa0cef9013e97509fc27b24f416c9d_b.jpg" data-caption="" data-size="normal" data-rawwidth="315" data-rawheight="52" class="content_image" width="315"&gt;

&lt;img src="https://pic4.zhimg.com/v2-22810bc792fe02445eb646ff8e21e8d9_b.jpg" data-caption="" data-size="normal" data-rawwidth="331" data-rawheight="58" class="content_image" width="331"&gt;

&lt;img src="https://pic3.zhimg.com/v2-2976c668cd16c76e939f95ac37b86d6c_b.jpg" data-caption="" data-size="normal" data-rawwidth="303" data-rawheight="111" class="content_image" width="303"&gt;

&lt;img src="https://pic3.zhimg.com/v2-49fda9603222e839d9bcf3264bd09598_b.jpg" data-caption="" data-size="normal" data-rawwidth="392" data-rawheight="69" class="content_image" width="392"&gt;

## （1）字符级别的n-gram

word2vec把语料库中的每个单词当成原子的，它会为每个单词生成一个向量。这忽略了单词内部的形态特征，比如：“apple” 和“apples”，“达观数据”和“达观”，这两个例子中，两个单词都有较多公共字符，即它们的内部形态类似，但是在传统的word2vec中，这种单词内部形态信息因为它们被转换成不同的id丢失了。

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

1. 对于低频词生成的词向量效果会更好。因为它们的n-gram可以和其它词共享。

2. 对于训练词库之外的单词，仍然可以构建它们的词向量。我们可以叠加它们的字符级n-gram向量。

## （2）模型架构

&lt;img src="https://pic4.zhimg.com/v2-7f38f23e98ee89d21fd16e34d5f07d69_b.jpg" data-caption="" data-size="normal" data-rawwidth="624" data-rawheight="428" class="origin_image zh-lightbox-thumb" width="624" data-original="https://pic4.zhimg.com/v2-7f38f23e98ee89d21fd16e34d5f07d69_r.jpg"&gt;

fastText相关公式的推导和CBOW非常类似，这里也不展开了。

## 4. 手写一个fastText

1. 训练词向量时，我们使用正常的word2vec方法，而真实的fastText还附加了字符级别的n-gram作为特征输入；

2. 我们的输出层使用简单的softmax分类，而真实的fastText使用的是Hierarchical Softmax。

VOCAB_SIZE = 2000

EMBEDDING_DIM =100

MAX_WORDS = 500

CLASS_NUM = 5

VOCAB_SIZE表示词汇表大小，这里简单设置为2000；

EMBEDDING_DIM表示经过embedding层输出，每个词被分布式表示的向量的维度，这里设置为100。比如对于“达观”这个词，会被一个长度为100的类似于[ 0.97860014, 5.93589592, 0.22342691, -3.83102846, -0.23053935, …]的实值向量来表示；

MAX_WORDS表示一篇文档最多使用的词个数，因为文档可能长短不一（即词数不同），为了能feed到一个固定维度的神经网络，我们需要设置一个最大词数，对于词数少于这个阈值的文档，我们需要用“未知词”去填充。比如可以设置词汇表中索引为0的词为“未知词”，用0去填充少于阈值的部分；

CLASS_NUM表示类别数，多分类问题，这里简单设置为5。

1. 添加输入层（embedding层）。Embedding层的输入是一批文档，每个文档由一个词汇索引序列构成。例如：[10, 30, 80, 1000] 可能表示“我 昨天 来到 达观数据”这个短文本，其中“我”、“昨天”、“来到”、“达观数据”在词汇表中的索引分别是10、30、80、1000；Embedding层将每个单词映射成EMBEDDING_DIM维的向量。于是：input_shape=(BATCH_SIZE, MAX_WORDS), output_shape=(BATCH_SIZE,
MAX_WORDS, EMBEDDING_DIM)；

2. 添加隐含层（投影层）。投影层对一个文档中所有单词的向量进行叠加平均。keras提供的GlobalAveragePooling1D类可以帮我们实现这个功能。这层的input_shape是Embedding层的output_shape，这层的output_shape=( BATCH_SIZE, EMBEDDING_DIM)；

3. 添加输出层（softmax层）。真实的fastText这层是Hierarchical Softmax，因为keras原生并没有支持Hierarchical Softmax，所以这里用Softmax代替。这层指定了CLASS_NUM，对于一篇文档，输出层会产生CLASS_NUM个概率值，分别表示此文档属于当前类的可能性。这层的output_shape=(BATCH_SIZE, CLASS_NUM)

4. 指定损失函数、优化器类型、评价指标，编译模型。损失函数我们设置为categorical_crossentropy，它就是我们上面所说的softmax回归的损失函数；优化器我们设置为SGD，表示随机梯度下降优化器；评价指标选择accuracy，表示精度。

1. 将文档分好词，构建词汇表。词汇表中每个词用一个整数（索引）来代替，并预留“未知词”索引，假设为0；

2. 对类标进行onehot化。假设我们文本数据总共有3个类别，对应的类标分别是1、2、3，那么这三个类标对应的onehot向量分别是[1, 0,
0]、[0, 1, 0]、[0, 0, 1]；

3. 对一批文本，将每个文本转化为词索引序列，每个类标转化为onehot向量。就像之前的例子，“我 昨天 来到 达观数据”可能被转化为[10, 30,
80, 1000]；它属于类别1，它的类标就是[1, 0, 0]。由于我们设置了MAX_WORDS=500，这个短文本向量后面就需要补496个0，即[10, 30, 80, 1000, 0, 0, 0, …, 0]。因此，batch_xs的 维度为( BATCH_SIZE,MAX_WORDS)，batch_ys的维度为（BATCH_SIZE, CLASS_NUM）。

&lt;img src="https://pic2.zhimg.com/v2-19d325f8c60f98cba2fcebb3a9c8a845_b.jpg" data-caption="" data-size="normal" data-rawwidth="624" data-rawheight="499" class="origin_image zh-lightbox-thumb" width="624" data-original="https://pic2.zhimg.com/v2-19d325f8c60f98cba2fcebb3a9c8a845_r.jpg"&gt;

## 5. fastText在达观数据的应用

fastText作为诞生不久的词向量训练、文本分类工具，在达观得到了比较深入的应用。主要被用在以下两个系统：

2. 文本分类系统。在类标数、数据量都比较大时，达观会选择fastText 来做文本分类，以实现快速训练预测、节省内存的目的。

## 编者注：

【本文版权归达观数据（http://www.datagrand.com）所有，如需转载请注明出处。】