当前位置: 首页 > 科技观察

使用深度学习(CNNRNNAttention)解决大规模文本分类问题——回顾与实践

时间:2023-03-18 15:30:03 科技观察

作者目前正在做一个应用深度学习解决淘宝商品品类预测问题的项目。分类问题,借此机会总结一下文本分类领域的相关思想、方法和一些实践经验,特别是应用深度学习解决文本分类问题。业务问题描述:典型的淘宝商品示例如下图所示。图片商品标题为“夏季雪纺条纹短袖T恤女春季半袖衣服夏季中长款大码胖mm瘦上衣夏季”。淘宝网后台通过树状多层类目体系管理商品,涵盖数万叶类目,商品体量也在10亿量级。我们的任务是根据产品的标题来预测它所在的叶子类别。示例中的商品类别为“女装/女装精品>>蕾丝衫/雪纺衫”。显然,这是一个非常典型的短文本多分类问题。接下来介绍文本分类的传统和深度学习方法,最后简单总结一下实践经验。1.传统的文本分类方法文本分类问题是自然语言处理领域一个非常经典的问题。相关研究可以追溯到1950年代,当时是按专家规则(Pattern)进行分类,甚至在80年代初期发展到利用知识工程建立专家系统,其优点是可以快速快速地解决顶级问题,但显然天花板很低,不仅费时费力,而且覆盖面和准确性也很有限。后来,随着统计学习方法的发展,特别是20世纪90年代后互联网在线文本数量的增加和机器学习学科的兴起,逐渐形成了一套解决大规模文本分类问题的经典方法。这个阶段的主要套路是人工特征工程。+浅层分类模型。训练一个文本分类器的过程如下图所示:整个文本分类问题分为特征工程和分类器两部分,玩机器学习的同学自然不会陌生。1.1特征工程特征工程往往是机器学习中最费时费力的,但却是极其重要的。抽象地讲,机器学习的问题就是将数据转化为信息,再提炼为知识的过程。特征是“数据->信息”的过程,决定了结果的上限,分类器是“信息->知识”的过程。就是逼近这个上限。但特征工程不同于分类器模型,其通用性不强,往往需要结合对特征任务的理解。文本分类问题所在的自然语言领域自然有其独特的特征处理逻辑,大部分传统的分类任务都是在这里完成的。文本特征工程包括三个部分:文本预处理、特征提取和文本表示。最终目的是将文本转换成计算机可理解的格式,并封装足够的信息用于分类,即强大的特征表达能力。文本预处理文本预处理过程是从文本中提取关键词来表示文本的过程。中文文本处理主要包括两个阶段:文本分割和停用词去除。分词的原因很多研究表明,特征粒度是词的粒度比词的粒度好很多。其实很好理解,因为大部分的分类算法都没有考虑词序信息,明显丢失了太多基于词粒度的“n-gram”信息。.具体到中文分词,不像英文有自然的空间间隔,需要设计复杂的分词算法。传统算法主要有基于字符串匹配的正向/反向/双向最大匹配;基于理解的句法语义分析消歧;基于统计的互信息/CRF方法。近年来,随着深度学习的应用,WordEmbedding+Bi-LSTM+CRF的方法逐渐成为主流。本文主要关注文本分类,就不展开了。停用词是一些高频出现的代词、连词、介词等对文本分类没有意义的词。通常,会维护一个停用词列表。出现在停止列表中的词在特征提取过程中被删除,这本质上是特征选择的一部分。.经过文本切分和去停用词后,淘宝商品的样本标题变成下图中以“/”分隔的关键词形式:夏装/雪纺/条纹/短袖/T恤/女/春/半袖/clothes/Summer/medium-length/bigsize/fatmm/slim/tops/summerTextrepresentationandfeatureextractionTextrepresentation:textrepresentation的目的是将预处理后的文本转换成计算机可以理解的方式,这决定了质量文本分类最重要的部分。传统方法常用词袋模型(BOW,BagOfWords)或向量空间模型(VectorSpaceModel),最大的缺点是忽略了文本的上下文关系,每个词都是相互独立的,并且不能表示语义信息。词袋模型的一个例子如下:(0,0,0,0,....,1,...0,0,0,0)一般来说,词库的大小是至少有一百万,所以bag-of-words模型有两个最大的问题:高纬度和高稀疏性。词袋模型是向量空间模型的基础,因此向量空间模型通过特征项选择来降维,通过特征权重计算来增加密度。特征提取:向量空间模型的文本表示方法的特征提取对应于特征项的选择和特征权重的计算。特征选择的基本思想是对原始特征项(terms)按照一定的评价指标独立打分排序,选择得分最高的部分特征项,过滤掉其余的特征项。常用的评估包括文档频率、互信息、信息增益和χ2统计。特征权重主要是经典的TF-IDF方法及其扩展方法。其主要思想是,一个词的重要性与词在类别中出现的频率成正比,与所有类别的出现次数成反比。基于语义的文本表示除了向量空间模型,在文本表示方面还有基于语义的文本表示方法,如LDA主题模型、LSI/PLSI概率隐语义索引等方法。一般认为,通过这些方法得到的文本表示可以看作是文档的深度表示,而wordembedding文本分布式表示方法是深度学习方法的重要基础,下面将进行展示。1.2分类器分类器基本上是统计分类方法。基本上大部分机器学习方法都应用在文本分类领域,例如朴素贝叶斯分类算法(Na?veBayes)、KNN、SVM、最大熵和神经网络等,传统的分类模型不是本文的重点,所以这里就不展开了。2.深度学习文本分类方法上面介绍了传统的文本分类方法。传统方法主要问题的文本表示高纬度稀疏,特征表达能力很弱,神经网络不擅长处理此类数据;此外,还需要人工进行特征工程,成本非常高。深度学习最初在图像和语音上取得巨大成功的一个很重要的原因是图像和语音的原始数据是连续和密集的,具有局部相关性。应用深度学习解决大规模文本分类问题,最重要的是解决文本表示,然后利用CNN/RNN等网络结构自动获取特征表达能力,去掉复杂的人工特征工程,解决问题端到端。接下来分别介绍:2.1文本的分布式表示:wordembedding分布式表示(DistributedRepresentation)其实是Hinton在1986年首先提出的,其基本思想是将每个单词表示为n维稠密、连续的实数向量,相对于one-hotencodingvectorspace,只有一维为1,其余均为0。分布式表示的最大优势在于具有非常强大的特征表达能力。比如一个n维向量,每个维度有k个值,可以表示kn个概念。事实上,无论是神经网络的隐藏层,还是具有多个潜在变量的概率主题模型,都应用了分布式表示。下图是2003年Bengio在ANeuralProbabilisticLanguageModel中的网络结构:本文提出的神经网络语言模型(NNLM,NeuralProbabilisticLanguageModel)采用文本分布式表示,即每个词表示为一个稠密实数向量。NNLM模型的目标是建立一个语言模型:词的分布式表示,或者词嵌入,是训练语言模型的附加产物,即图中的MatrixC。虽然Hinton在1986年提出了词的分布式表示,Bengio在2003年提出了NNLM,但是词向量真正火起来还是因为13年GoogleMikolov发表的两篇word2vec文章EfficientEstimationofWordRepresentationsinVectorSpace和DistributedRepresentationsofWordsandPhrases以及他们的Compositionality,更重要的是,发布了简单易用的word2vec工具包,在语义维度上得到了很好的验证,极大地推动了文本分析的进程。下图是文中提出的CBOW和Skip-Gram模型的结构,与NNLM基本相似。不同之处在于模型去除了非线性隐藏层,预测目标不同。CBOW是预测当前词的上下文词,而Skip-Gram则相反。.此外,提出了HierarchicalSoftmax和NegativeSample两种方法,很好地解决了计算效率问题。其实这两种方法都没有严格的理论证明,都有一些小技巧,非常实用。详细过程不再赘述。如果你有兴趣深入了解word2vec,推荐阅读这篇非常好的论文:word2vecParameterLearningExplained。补充一点,其实word2vec学习到的向量和真正的语义还是有差距的。学习了更多具有相似上下文的词,例如“好”和“坏”。有监督语义可以学习到更好的语义表示,有机会分享给后续系统。至此,通过词向量的表示来表示文本,将文本数据从高纬度、高稀疏的神经网络难处理的方法转化为类似于图像和语音的连续密集数据。深度学习算法本身具有很强的数据可迁移性。很多以前适用于图像领域的深度学习算法,比如CNN,也可以很好的迁移到文本领域。下一节将详细阐述深度学习在文本分类领域的方法。.2.2深度学习文本分类模型词向量解决的是文本表示问题。本部分介绍的文本分类模型使用CNN/RNN等深度学习网络及其变体来解决自动特征提取(即特征表达)的问题。fastTextfastText是一篇论文BagofTricksforEfficientTextClassification,是上述word2vec的作者Mikolov转战Facebook后,于2016年7月刚刚发表的一篇论文。把fastText放在这里并不是因为它是文本分类的主流方法,而是极其简单。模型图如下图:原理是对句子中的所有词向量进行平均(某种意义上可以理解为只有一个avgpoolingspecialCNN),然后直接接softmax层。事实上,文章还添加了一些n-gram特征tricks来捕获局部序列信息。文章没有太多信息,算是“水文”。带来的思考是,文本分类问题是带有一些“线性”问题的一部分[来自向亮],也就是说不需要做太多的非线性变换和特征,可以捕获很多分类信息结合起来,所以有些任务即使是简单的模型也可以处理。这篇文章在TextCNN的题图使用了这篇文章在2014年提出的TextCNN的结构(见下图)。fastText中的网络结果根本没有考虑词序信息,它使用的n-gram特征技巧恰恰说明了局部序列信息的重要性。卷积神经网络(CNNConvolutionalNeuralNetwork)最初在图像领域取得了巨大的成功。CNN的原理就不讲了。核心点是它可以捕获局部相关性。具体来说,在文本分类任务中,CNN可以用来提取类似于n-gram关键信息的句子。TextCNN详细流程示意图如下:TextCNN详细流程:第一层是图中最左边的7×5句子矩阵,每一行是一个词向量,维度=5,这可以类比图像中的原始像素。然后在一个filter_size=(2,3,4)的一维卷积层之后,每个filter_size有两个输出通道。第三层是1-maxpooling层,这样不同长度的句子经过pooling层后都可以变成固定长度的表示。最后连接一个全连接的softmax层输出每个类别的概率。Features:这里的特征就是词向量,有静态(static)和非静态(non-static)两种方式。静态方法使用预训练的词向量,例如word2vec。训练过程中不更新词向量,本质上是迁移学习。尤其是当数据量比较小的时候,使用静态词向量往往效果很好。非静态是在训练过程中更新词向量。推荐的方法是non-static中的fine-tunning方法。它使用预训练的word2vec向量初始化词向量。在训练过程中调整词向量可以加快收敛速度??。当然,如果训练数据充足并且直接随机初始化词向量效果也是可以的。Channels:(R,G,B)可以作为图像中的不同通道,文本的输入通道通常是不同的embedding方式(比如word2vec或者Glove)。在实践中,静态词向量和fine-Tunning词向量被用作不同的通道。一维卷积(conv-1d):图像是二维数据,而词向量表达的文本是一维数据,所以TextCNN卷积采用的是一维卷积。一维卷积带来的问题是需要设计不同filter_sizes的滤波器来获得不同的视野宽度。池化层:还有很多文章用CNN来解决文本分类问题。比如这个AConvolutionalNeuralNetworkforModelingSentences最有意思的输入就是把pooling改成(dynamic)k-maxpooling,在pooling阶段保留k最大的信息,保留全局序列信息。比如在情感分析场景中,比如:“我觉得这个地方的风景还不错,就是人太多了。”尽管上半年的情绪是积极的,但全球文本表达了负面情绪。使用k-maxPooling可以很好的捕捉到这种信息。TextRNN虽然TextCNN在很多任务上都能表现的很好,但是CNN最大的问题就是filter_size的视野是固定的。一方面,它不能对更长的序列信息进行建模。另一方面,filter_size的超参数调整也很繁琐。CNN的本质是表达文本的特征,而自然语言处理中比较常用的是递归神经网络(RNN,RecurrentNeuralNetwork),它可以更好地表达上下文信息。具体在文本分类任务中,Bi-directionalRNN(实际上是使用双向LSTM)在某种意义上可以理解为能够捕获可变长度和双向的“n-gram”信息。Bi-directionalLSTM被认为是自然语言处理领域非常标准的网络。在序列标注/名字识别/seq2seq模型等很多场景都有应用。下图是Bi-LSTM针对分类问题的网络结构原理示意图,黄色节点分别是前向和后向RNN的输出。在例子中,最后一个词的结果直接连接到全连接层的softmax输出。虽然TextRNN+AttentionCNN和RNN被用在文本分类任务上,虽然效果显着,但是它们都有一个缺点,就是不够直观,可解释性不好,尤其是在分析badcase的时候。注意力(Attention)机制是自然语言处理领域常用的建模长时记忆机制,可以直观地给出每个词对结果的贡献,基本已经成为Seq2Seq模型的标配。其实文本分类在某种意义上也可以理解为一种特殊的Seq2Seq,所以最近考虑引入Attention机制,研究了一下,学术界确实有类似的做法。Attention机制介绍:详细介绍Attention可能需要一篇小文章。有兴趣的可以参考2014年的论文NEURALMACHINETRANSLATIONBYJOINTLYLEARNINGTOALIGNANDTRANSLATE,以机器翻译为例简单介绍。在下图中,xt是源语言中的一个词,yt是目标语言中的一个词。机器翻译的任务是在给定源序列的情况下得到目标序列。翻译t的过程依赖于前一个词yt-1和该词在源语言中的表示hj(xj的bi-RNN模型的表示),每个词的权重不同。比如源语言是中文“我/是/中国人”,目标语言是“i/am/Chinese”,那么“Chinese”的翻译显然依赖于“Chinese”,基本上与“我/是”。下图中的公式,αij是中文第j个词在翻译第i个英文词时的贡献,即attention。显然,在翻译“Chinese”时,“Chinese”的注意力值非常大。Attention的核心点在于翻译每个目标词(或预测产品标题文本的类别)所用的上下文是不同的。这样的考虑显然更加合理。TextRNN+Attentionmodel:我们参考这篇文章HierarchicalAttentionNetworksforDocumentClassification。下图是该模型的网络结构图。一方面,它保留了具有层次结构的文档结构。另一方面,它使用词级和句子级。淘宝标题场景只需要word级的Attention。加入Attention后最大的好处,自然是可以直观的说明每个句子和词对分类类别的重要性。TextRCNN(TextRNN+CNN)我们参考15年AAAI上中科院发表的这篇文章RecurrentConvolutionalNeuralNetworksforTextClassification的结构:利用前向和后向RNN得到每个词的前向和后向上下文表示:这样的话,词的表示就变成了词向量和前向后向上下文向量的concat形式,即:最后和TextCNN一样的卷积层,pooling层就够了,唯一不同的是卷积层layerfilter_size=1就够了,不再需要更大的filter_size来获得更大的视野,这里的词的表示只能由双向RNN输出。3.一点经验理论和实践之间的差距往往是天壤之别。学术论文更注重模型架构设计等方面的新颖性,更重要的是新思想;而实践中最重要的是落地场景中的效果,注意点和方法不同。这部分只是简单梳理了实际项目过程中的一些经验教训。模型显然不是最重要的:不可否认,好的模型设计对于取得好的结果至关重要,也是学术界关注的热点。但在实际使用中,模型的工作量占用的时间相对较少。虽然第二部分介绍了CNN/RNN的5种模型及其变体,但在实践中,简单地使用CNN进行文本分类任务就足以取得非常好的效果。我们的实验测试RCNN提高了大约1%的准确率,并且不是很明显。最佳实践是使用TextCNN模型将整体任务调试到最佳效果,然后尝试改进模型。理解你的数据:虽然应用深度学习的一大优势是不再需要繁琐低效的人工特征工程,但如果你只是把他当成一个黑盒子,难免会时常怀疑人生。一定要理解你的数据,记住无论是传统方法还是深度学习方法,数据感知总是非常重要的。关注badcase分析,了解你的数据是否合适,为什么对,为什么错。关注迭代质量——记录并分析你的每一次实验:迭代速度是算法项目成败的关键,学过概率论的同学很容易认同。算法项目不仅关乎迭代速度,更关乎迭代质量。如果不建立快速实验分析的例程,无论迭代速度多快,也只会伤害到贵公司宝贵的计算资源。建议记录每一次实验,实验分析至少要回答这三个问题:为什么要做实验?结论是什么?接下来怎么实验?超级调参:超级调参是每个调音师的日常。我推荐一个文本分类实践论文ASensitivityAnalysisof(andPractitioners'Guideto)ConvolutionalNeuralNetworksforSentenceClassification包含一些超参数的对比实验。如果你刚开始文本分析任务,不妨根据文章的结果设置超参数。快速获得超参数调整实际上是一个非常重要的问题。可以看小色的文章深度学习网络调参技巧-知乎专栏。一定要用dropout:有两种情况不能用:数据量极小,或者你用了更好的正则化方法,比如bn。在实践中,我们尝试过不同参数的dropout,最好的是0.5,所以如果你的计算资源有限,默认的0.5是一个不错的选择。fine-tuningismandatory:如前所述,如果你只是使用word2vec训练出来的词向量作为特征表示,我敢打赌你会失去很多效果。不一定需要Softmax损失:这取决于您的数据。如果你的任务是多个类别互不排斥,你可以尝试训练多个二元分类器。经过我们的调整,准确率仍然提高了>1%。类别不平衡问题:基本上是一个在很多场景下都验证过的结论:如果你的loss被某些类别支配,那么对整体来说多半是负的。建议可以尝试类似booststrap的方法调整loss中的样本权重。避免训练冲击:默认情况下必须增加随机抽样因子,使数据分布尽可能iid,默认的shuffle机制可以使训练结果更稳定。如果训练好的模型还在震荡,可以考虑调整学习率或者mini_batch_size。收敛前不要妄下结论:最好是玩到最后,尤其是一些新的角度测试,不要轻易否定,至少要等到收敛。4.写到几年前学校招阿里的时候,一边和一边讲一个文本分类项目(新浪微博话题分类的一个学校学科分类项目),用的是文章介绍的传统方法.面试过程中,对特征项和各种分类器的处理可谓耳熟能详。我被要求在白板上写几个特征选择公式。短短几年,传统方法已经被远远超越,不得不感慨深度学习的发展。一方面值得感慨的是,如今的科技发展非常迅速,绝对不可沾沾自喜。我知道还有很多理论没看懂,需要继续看论文;另一方面,理解理论原理,做好项目。其实差距很大,尤其是对业内同仁来说。学术圈值得探索,但一定要慎重。如果只追求技术深度,很容易落入空中阁楼。