2.文本分类——fastText模型


一、fastText简介

fastText算法是一种有监督的模型,与《前篇》中的CBOW架构很相似。《前篇》中的CBOW,通过上下文预测中间词,而fastText则是通过上下文预测标签(这个标签就是文本的类别,是训练模型之前通过人工标注等方法事先确定下来的)。从模型架构上来说,沿用了CBOW的单层神经网络的模式,不过fastText的处理速度才是这个算法的创新之处。

fastText模型的输入是一个词的序列(一段文本或者一句话),输出是这个词序列属于不同类别的概率。在序列中的词和词组构成特征向量,特征向量通过线性变换映射到中间层,再由中间层映射到标签。fastText在预测标签时使用了非线性激活函数,但在中间层不使用非线性激活函数。

fastText是一个快速文本分类算法,与基于神经网络的分类算法相比有两大优点:
1、fastText在保持高精度的情况下加快了训练速度和测试速度
2、fastText不需要预训练好的词向量,fastText会自己训练词向量
3、fastText两个重要的优化:Hierarchical Softmax、N-gram

fastText方法包含三部分,模型架构层次SoftmaxN-gram特征

二、fastText模型架构

FastText的一个功能是做文本分类。主要的原理在论文Bag of Tricks for Efficient Text Classification中有所阐述。其模型结构简单来说,就是一层word embedding的隐层+输出层。结构如下图所示:
在这里插入图片描述
上图中左边的图就是FastText的网络结构,其中 W ( 1 ) W(1) W(1) W ( n ) W(n) W(n)表示document中每个词的word embedding表示。文章则可以用所有词的embedding累加后的均值表示,即
在这里插入图片描述
最后从隐层再经过一次的非线性变换得到输出层的label。通过对比word2vec中的cbow模型(continuous bag of word),可以发现两个模型其实非常地相似。不同之处在于,FastText模型最后预测的是文章的 l a b e l label label,而cbow模型预测的是窗口中间的词 w ( t ) w(t) w(t),一个是有监督的学习,一个是无监督的学习。另外cbow模型中输入层只包括当前窗口内除中心词的所有词的Embeddings,而FastText模型的输入层则是文章全部词的Embeddings。

和word2vec类似,FastText本质上也可以看成是一个浅层的神经网络,因此其forward-propogation过程可描述如下:
在这里插入图片描述
其中z是最后输出层的输入向量, W o W_o Wo表示从隐层到输出层的权重。因为模型的最后我们要预测文章属于某个类别的概率,所以很自然的选择就是softmax层了,于是损失函数可以定义为:
在这里插入图片描述
当类别数较少时,直接套用softmax层并没有效率问题,但是当类别很多时,softmax层的计算就比较费时了。为了加快训练过程,FastText同样也采用了和word2vec类似的方法。一种方法是使用hierarchical softmax,当类别数为 K K K,word embedding大小为 d d d时,计算复杂度可以从 O ( K d ) O(Kd) O(Kd)降到 O ( d l o g ( K ) ) O(dlog(K)) O(dlog(K))。另一种方法是采用negative sampling,即每次从除当前label外的其他label中选择几个作为负样本,并计算出现负样本的概率加到损失函数中,用公式可表示为:
在这里插入图片描述
其中 h i h_i hi是第 i i i个样本的隐层, u j u_j uj表示 W o W_o Wo中第 j j j行向量。

三、层次softmax

首先,回顾一下 s o f t m a x softmax softmax函数,实际是一个归一化的指数函数, s o f t m a x softmax softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类。假设我们有一个数组 V V V V i V_i Vi表示 V V V中的第 i i i个元素,那么这个元素的 s o f t m a x softmax softmax值就是:
在这里插入图片描述
形象化表示为:
在这里插入图片描述
可见,在标准的softmax中,计算一个类别的softmax概率时,我们需要对所有类别概率做归一化,在这类别很大情况下非常耗时。

下面进入正题,分层softmax的目的是降低softmax层的计算复杂度。思想是根据类别的频率构造霍夫曼树来代替标准softmax,通过分层softmax可以将复杂度从N降低到logN,下图给出分层softmax示例:
在这里插入图片描述
在层次softmax模型中,叶子结点的词没有直接输出的向量,而非叶子节点都有相应的输出。在模型的训练过程中,通过Huffman编码,构造了一颗庞大的Huffman树,同时会给非叶子结点赋予向量。我们要计算的是目标词 w w w的概率,这个概率的具体含义,是指从root结点开始随机走,走到目标词 w w w的概率。因此在途中路过非叶子结点(包括root)时,需要分别知道往左走和往右走的概率。例如到达非叶子节点 n n n的时候往左边走和往右边走的概率分别是:

p ( n , l e f t ) = σ ( θ n T ⋅ h ) p ( n , r i g h t ) = 1 − σ ( θ n T ⋅ h ) = σ ( − θ n T ⋅ h ) \begin{array}{l} p(n,left) = \sigma (\theta _n^T \cdot h)\\\\ p(n,right) = 1 - \sigma (\theta _n^T \cdot h) = \sigma ( - \theta _n^T \cdot h)\\ \end{array} p(n,left)=σ(θnTh)p(n,right)=1σ(θnTh)=σ(θnTh)

以上图中的 w 2 w_2 w2为例,

p ( w 2 ) = p ( n ( w 2 , 1 ) , l e f t ) ⋅ p ( n ( w 2 , 2 ) , l e f t ) ⋅ p ( n ( w 2 , 3 ) , r i g h t ) = σ ( θ n ( w 2 , 1 ) T ⋅ h ) ⋅ σ ( θ n ( w 2 , 2 ) T ⋅ h ) ⋅ σ ( − θ n ( w 2 , 3 ) T ⋅ h ) \begin{array}{l} p({w_2}) = p(n({w_2},1),left) \cdot p(n({w_2},2),left) \cdot p(n({w_2},3),right)\\\\ = \sigma (\theta _{n({w_2},1)}^T \cdot h) \cdot \sigma (\theta _{n({w_2},2)}^T \cdot h) \cdot \sigma ( - \theta _{n({w_2},3)}^T \cdot h) \end{array} p(w2)=p(n(w2,1),left)p(n(w2,2),left)p(n(w2,3),right)=σ(θn(w2,1)Th)σ(θn(w2,2)Th)σ(θn(w2,3)Th)

到这里可以看出目标词为 w w w的概率可以表示为:

p ( w ) = ∏ j = 1 L ( w ) − 1 σ ( s i g n ( w , j ) ⋅ θ n ( w , j ) T h ) p(w) = \prod\limits_{j = 1}^{L(w) - 1} {\sigma (sign(w,j) \cdot \theta _{n(w,j)}^Th)} p(w)=j=1L(w)1σ(sign(w,j)θn(w,j)Th)

其中 θ n ( w , j ) θ_{n(w,j)} θn(w,j)是非叶子结点 n ( w , j ) n(w,j) n(w,j)的向量表示(即输出向量); h h h是隐藏层的输出值,从输入词的向量中计算得来; s i g n ( x , j ) sign(x,j) sign(x,j)是一个特殊函数定义。

s i g n ( w , j ) = { 1 , 若 n ( w , j + 1 ) 是 n ( w , j ) 的 左 孩 子 − 1 , 若 n ( w , j + 1 ) 是 n ( w , j ) 的 右 孩 子 sign(w,j) = \left\{ {\begin{array}{c} {1, 若n(w,j+1)是n(w,j)的左孩子}\\ { -1,若n(w,j+1)是n(w,j)的右孩子} \end{array}} \right. sign(w,j)={1,n(w,j+1)n(w,j)1,n(w,j+1)n(w,j)

此外,所有词的概率和为1,即: ∑ j = 1 n p ( w ) = 1 \sum\limits_{j = 1}^n {p(w) = 1} j=1np(w)=1

最终得到参数更新公式为:

θ j ( n e w ) = θ j ( o l d ) − η ( σ ( θ j T h ) − t j ) h , 其 中 j = 1 , 2 , . . . , L ( w ) − 1 \begin{array}{l} \theta _j^{(new)} = \theta _j^{(old)} - \eta (\sigma (\theta _j^Th) - {t_j})h,其中j = 1,2,...,L(w) - 1 \end{array} θj(new)=θj(old)η(σ(θjTh)tj)hj=1,2,...,L(w)1

四、 N-Gram特征

n-gram是基于语言模型的算法,基本思想是将文本内容按照子节顺序进行大小为N的窗口滑动操作,最终形成窗口为N的字节片段序列。而且需要额外注意一点是n-gram可以根据粒度不同有不同的含义,有字粒度的n-gram和词粒度的n-gram,下面分别给出了字粒度和词粒度的例子:

我爱中国
相应的bi-gram特征为:我爱 爱中 中国
相应的tri-gram特征为:我爱中 爱中国

我 爱 中国
相应的bi-gram特征为:我/爱 爱/中国
相应的tri-gram特征为:我//中国

对于文本句子的n-gram来说,如上面所说可以是字粒度或者是词粒度,同时n-gram也可以在字符级别工作,例如对单个单词matter来说,假设采用3-gram特征,那么matter可以表示成图中五个3-gram特征,这五个特征都有各自的词向量,五个特征的词向量和即为matter这个词的向其中“<”和“>”是作为边界符号被添加,来将一个单词的ngrams与单词本身区分开来:
在这里插入图片描述
从上面来看,使用n-gram有如下优点
1、为罕见的单词生成更好的单词向量:根据上面的字符级别的n-gram来说,即是这个单词出现的次数很少,但是组成单词的字符和其他单词有共享的部分,因此这一点可以优化生成的单词向量
2、在词汇单词中,即使单词没有出现在训练语料库中,仍然可以从字符级n-gram中构造单词的词向量
3、n-gram可以让模型学习到局部单词顺序的部分信息, 如果不考虑n-gram则便是取每个单词,这样无法考虑到词序所包含的信息,即也可理解为上下文信息,因此通过n-gram的方式关联相邻的几个词,这样会让模型在训练的时候保持词序信息

但正如上面提到过,随着语料库的增加,内存需求也会不断增加,严重影响模型构建速度,针对这个有以下几种解决方案
1、过滤掉出现次数少的单词
2、使用hash存储
3、由采用字粒度变化为采用词粒度

在fastText 中一个低维度向量与每个单词都相关。隐藏表征在不同类别所有分类器中进行共享,使得文本信息在不同类别中能够共同使用。这类表征被称为词袋(bag of words)(此处忽视词序)。在 fastText中也使用向量表征单词 n-gram来将局部词序考虑在内,这对很多文本分类问题来说十分重要。

五、 使用fastText进行文本分类实践

详见博客:https://blog.csdn.net/ling620/article/details/97008739

六、 参考

  1. https://blog.csdn.net/feilong_csdn/article/details/88655927
  2. https://blog.csdn.net/ling620/article/details/97008739
  3. https://www.jianshu.com/p/e828f02e41c8
  4. https://blog.csdn.net/qq_43019117/article/details/82761673
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值