快捷搜索:  汽车  科技

从FacebookAIResearch开源fastText谈文本分类(从FacebookAIResearch开源fastText谈文本分类)

从FacebookAIResearch开源fastText谈文本分类(从FacebookAIResearch开源fastText谈文本分类)如果你有仔细注意过Kaggle比赛中一些获胜方案的话,你会发现复杂的集成类方法占据主导地位。比如最近的 Quora Question Pairs competition和DeepHack.Turing,其中顶级的方案总是由不同的模型组成:梯度提升方法,RNNs和CNNs。第二篇论文中的更轻量级的模型fastText不需要GPU加速,在单颗CPU上运算更快。与“深层”的CNN模型相比,fastText的模型结构是“浅层”的。它由一个联合向量层(joint embedding layer)和一个softmax分类器组成,原理是把句子中所有的词向量进行平均(某种意义上可以理解为只有一个avg pooling特殊CNN),然后直接接入softmax 层。图1. 论文1模型架构图2. 论文2模型架构图3. CBOW架构

更多深度文章,请关注:https://yq.aliyun.com/cloud

从FacebookAIResearch开源fastText谈文本分类(从FacebookAIResearch开源fastText谈文本分类)(1)

文本分类(text classification)是机器学习的一个主要任务,通常用作垃圾邮件检测、新闻/文章主题生成、多义词正确词义选择等。之前,Statsbot团队已经分享了《如何检测垃圾邮件/信息/用户评论》。本文主要介绍少数几个广义上的文本分类算法及相关案例,同时也提供了一些有用的教程和工具。

文本分类基准(Benchmarks)

目前,搞文本挖掘的人通常会使用很多小技巧和工具,比如TF-IDF特征,线性SVM(Linear SVMs)和词向量模型(如word2vec),然后在一些有名的数据集上,就同一问题,比较自己的方法和别的方法孰优孰劣。比如下面这些有名的用于文本分类的语料库:

1. AG’s news articles

图1. 论文1模型架构

从FacebookAIResearch开源fastText谈文本分类(从FacebookAIResearch开源fastText谈文本分类)(2)

图2. 论文2模型架构

从FacebookAIResearch开源fastText谈文本分类(从FacebookAIResearch开源fastText谈文本分类)(3)

图3. CBOW架构

第二篇论文中的更轻量级的模型fastText不需要GPU加速,在单颗CPU上运算更快。与“深层”的CNN模型相比,fastText的模型结构是“浅层”的。它由一个联合向量层(joint embedding layer)和一个softmax分类器组成,原理是把句子中所有的词向量进行平均(某种意义上可以理解为只有一个avg pooling特殊CNN),然后直接接入softmax 层。

如果你有仔细注意过Kaggle比赛中一些获胜方案的话,你会发现复杂的集成类方法占据主导地位。比如最近的 Quora Question Pairs competition和DeepHack.Turing,其中顶级的方案总是由不同的模型组成:梯度提升方法,RNNs和CNNs。

基于神经网络的文本分类器通常包含相同的线性元结构:词向量模型(Embedding)、深度表征(Deep representation)和全连接(Fully connected part)。

词向量模型

词向量层(Embedding layers)以词序列为输入,输出对应的词向量。这个函数很简单,本文并不关心这些向量的实际语义,剩下的问题就是初始化这些权重的最好方法是什么,如图4所示。

从FacebookAIResearch开源fastText谈文本分类(从FacebookAIResearch开源fastText谈文本分类)(4)

图4. 如何训练词向量

在这个问题中,答案可能和直觉思维“先人工生成标签,然后用word2vec训练,再用来初始化词向量层”相反。但是考虑到实际目标,你可以在具体的模型中使用预训练(pre-trained)的词向量集合并不断调整(fine-tune)它。很可能最后的词向量并不会表现出和普通的word2vec模型同样的效果:

从FacebookAIResearch开源fastText谈文本分类(从FacebookAIResearch开源fastText谈文本分类)(5)

图5. 根据词向量得到的词之间的关系

但在这个案例中这并不是重点,关键在于使用预训练的word2vec词嵌入模型,并且在嵌入层使用更低的学习率(一般的学习率乘以0.1)。

深度表征

深度表征(deep representation)部分的主要目的是在输出中压缩(condense)所有相关信息,同时禁止(suppressing)导致识别出单个样本的部分。因为大容量的网络有可能会在某些样本上过拟合,在测试集上表现很差。

循环神经网络(Recurrent neural network,RNN)

当问题变成预测给定文档是否是垃圾文档时,最简单可靠的架构是应用于循环网络隐状态的多层全连接文本分类器(multilayer fully connected text classifier)。这个状态的语义被认为是不相关的,且整个向量被看作是文本的一种压缩描述。

下面是一些有用的资源:

1. how to use LSTMs for text classification

2. LSTM Tutorial for PyTorch

3. Understanding LSTM Networks by Chris Olah

从FacebookAIResearch开源fastText谈文本分类(从FacebookAIResearch开源fastText谈文本分类)(6)

图6. 基于RNN的分类器基础结构

如图6所示,其原理在于:每个word经过词向量表示之后,进入LSTM层,这里LSTM是标准的LSTM,然后经过一个时间序列得到的n个隐藏LSTM神经单元的向量,这些向量经过mean pooling层之后,可以得到一个向量h,然后紧接着是一个简单的logistic回归层(或者一个softmax层)得到一个类别分布向量。

由于主要工作都是在在循环层(recurrent layer)进行,确保它仅捕获到相关信息相当重要。在高层要做两件事情:

1. 使用双向LSTM(Bidirectional LSTMs)。这是一个很好的主意,因为他可以捕获每个词的上下文,而不只是按顺序“阅读”;

2.为词向量使用过渡层(transitional layer)。LSTMs学会区分一个序列重要和不重要的部分,但我们并不能确定来自词向量层的表征是否是最好的输入,特别是当我们并没有调整词向量的时候。给每个词向量添加独立的一层可以提高你的结果,就像一个简单的attention 层。

卷积神经网络(Convolutional neural network,CNN)

一种可替代的方法是使用卷积网络训练深度文本分类器。通常,给定一个足够大的感受野(卷积神经网络的每一层输出的特征图(Feature map)上的像素点在原图像上映射的区域大小),你可以得到和使用attention层相同的结果。如图7所示,开始会保持大量的feature map,然后按指数级减少他们的数量,这将有助于避免学到不相关的模式。

你可以在查看一个基于PyTorch的CNN分类器的简单实现,其中展示了如何用他自己的词向量层训练和评估一个卷积分类器。

从FacebookAIResearch开源fastText谈文本分类(从FacebookAIResearch开源fastText谈文本分类)(7)

图7. 基于CNN的分类器架构

稠密训练器(Dense Classifier)

全连接部分(fully-connected part)在深度表征上进行一系列变化,最后输出每个类的分数。最好的实现就是应用如下变化:

1. 全连接层

2. 批量归一化(Batch normalization)

3. 非线性变化(可选)

4. Dropout

文中的文本分类算法也可以通过一些复杂的方法增强,这将帮助你构建更好的模型和更快达到收敛。另外下面还有些分类和表征学习的工具。

1.A collection of tools and implemented ready-to-train text classifiers (PyTorch)

2.FastText a library for efficient text classification and building word representations

3.Skip-gram tutorial: part 1 part 2

4.CNN text classifier in TensorFlow

5.RNN Sentence classification tutorial in Keras

【作者信息】

Roman Trusov,Machine Learning Guy @ Skoltech

本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。

文章原标题《Text Classifier Algorithms in Machine Learning》,作者:Roman Trusov,译者:李烽

猜您喜欢: