读FastText文章
这篇博客主要针对Bag of Tricks for Efficient Text Classification文章的一些理解。主要是介绍FastText算法是速度多块,通过标签预测和情感分析两个任务来说明。
1. 模型的结构,文章中给出了这样的图
上图注解中提到,x1,x2,,xN都是一个词向量,那么hidden是对N个词的词向量求平均,那么具体怎么计算呢?
这个图不是非常直观能看出如何计算的,文章中提到了结构和cbow很类似,于是找到了介绍word2vec的文章,见下图
这里说明几点:
- V表示词典的大小,即一个词的embedding的长度
- C表示词序列的长度
- W对每个词是共享的,这点要注意
Hidden layer怎么算呢? 文章中也给出公式了
x1,x2,xC均为词向量, V*1 , W是V*N维,N表示隐藏层的神经元的个数,所以h的结构为N*V*V*1=N*1
对于FastText算法而言,隐藏层的平均同这里是一致的;
2. 损失函数
- 最小化损失函数
- A就是input layer 到hidden layer的矩阵,也就是word2vec中的W
- B就是hidden layer 到 output layer的矩阵,也就是word2vec中的W‘
- 训练中采用SGD ,学习率是线性衰减的
- 这里的xn表示的第n个document的特征集 ,N表示文档的数量,yn表示标签
3.层次SoftMax
如果要分的类是非常非常多的,比如cbow中,需要根据上下文的词预测中间词,中间词的类别是巨大的,等同于词典的数量,
所以word2vec中用到了softmax,那么fasttext中也用到该技术
- 将所有的类别作为二叉树的叶子节点,共有V个类,那么二叉树的内部节点就有V-1个;(这种说法应该针对的是完全二叉树)
- 对于每个叶子节点,都有唯一的从根节点到该叶子节点的路径
- 叶子节点可以用路径来替代
目标函数转变为:
- 要求的参数是
,这个参数对于每个叶子节点也是共享的,其中n(w,j) 中 j表示到w叶子节点要走的第j步
-
这个东西看上去很复杂,实际意思就是走左边的时候,取值为1,走右边,取值为-1
- L(w) 就是走到w的长度,例如L(w2)为4,实际走了三步,所以目标函数中 L(w) 需要 -1 =>>> L(w)-1
- 拿w2举例,目标函数为
- 采用对数似然,那么目标函数就转变为
- 经过一些列推导,得到参数的更新
- 好处:训练的时候,对于每个文本的分类,复杂度从O(V) 降低到O(logV),参数量由V个变为V-1个
4. 一些实验的结果
基于情感分析8个数据集
- 准确度上
fasttext 用了5个epoch,学习率的集合为 0.05,0.1,0.2,0.5,如果用bigram,那么准确率有1%-4%的提升,如果用trigrams,准确率可以达到97.1%
- 训练时间上,下面是每个epoch的耗费的时间
参考:
https://arxiv.org/pdf/1607.01759.pdf Bag of Tricks for Efficient Text Classification
https://arxiv.org/pdf/1411.2738.pdf word2vec Parameter Learning Explained