文本分类入门与实战

Classification NLP Tutorial

文本分类概述

定义:文本分类(Text Classification)任务是根据给定文档的内容或主题,自动分配预先定义的类别标签。

文本分类常见任务。情感分析Sentiment analysis、新闻分类News categorization、主题分类topic analysis、问答question answering(QA) 和自然语言推理Nature language inference。QA一般有两种类型:抽取式和生成式。抽取式给定一个问题和一组候选答案,我们需要将每个候选答案分类为正确或不正确。生成QA学习从头开始生成答案(例如使用seq2seq模型),这种本文不讨论。

文本分类发展历程。主要文本分类方法的示意图如图2所示。从1960年代到2010年代,基于浅层学习的文本分类模型占主导地位。浅层学习意味着基于统计的模型,例如朴素贝叶斯(NB),K近邻(KNN)和支持向量机(SVM)。与早期的基于规则的方法相比,该方法在准确性和稳定性方面具有明显的优势。但是,这些方法仍然需要进行人工特征工程设计,这既耗时又昂贵。此外,它们通常会忽略文本数据中的自然顺序结构或上下文信息,这使学习单词的语义信息变得困难。自2010年代以来,文本分类已逐渐从浅层学习模型变为深层学习模型。与基于浅层学习的方法相比,深度学习方法避免了人工设计规则和功能,并自动为文本挖掘提供了语义上有意义的表示形式。因此,大多数文本分类研究工作都基于DNN,DNN是数据驱动的方法,具有很高的计算复杂性。

「文本分类入门与实战」课程demo - 图1

文本分类流程。文本分类的主要流程:首先是预处理模型的文本数据。浅层学习模型通常需要通过人工方法获得良好的样本特征,然后使用经典的机器学习算法对其进行分类。因此,该方法的有效性在很大程度上受到特征提取的限制。但是,与浅层模型不同,深度学习通过学习一组非线性变换将特征工程直接集成到模型拟合过程中,这些非线性转换将特征直接映射到输出。

「文本分类入门与实战」课程demo - 图2

文本分类方法

(一)浅层分类模型

文本分类方法总结-CSDN

这个阶段的主要套路是人工特征工程+浅层分类模型。特征工程决定模型上限,分类器逼近模型上限。

训练文本分类器过程

抽象来讲,机器学习问题是把数据转换成信息再提炼到知识的过程,特征是“数据—>信息”的过程,决定了结果的上限,而分类器是“信息—>知识”的过程,则是去逼近这个上限。然而特征工程不同于分类器模型,不具备很强的通用性,往往需要结合对特征任务的理解。

上图蓝色虚线框内的即特征工程模块(最耗时耗力,也最为重要),目的是将文本表示为计算机可以理解的、能够代表该文档的特征矩阵的过程。通常将特征工程分为文本预处理、特征提取、文本表示三个部分:

1、文本预处理
中文文本由于比较复杂,不同词的先后顺序可能会有不同的含义,同时中文的字词界限模糊,无法只简单地通过空格就能区别出哪些是属于“字”,哪些是属于“词”。所以中文文本预处理一般包括文本分词、去停用词、数据清洗等流程;

2、特征提取
特征提取包括特征选择和特征权重计算两部分:

  • 特征选择的基本思路是根据某个评价指标独立的对原始特征项(词项)进行评分排序,从中选择得分最高的一些特征项,过滤掉其余的特征项。常用的评价有:文档频率、互信息、信息增益、χ²统计量等。
  • 特征权重计算主要是经典的TF-IDF方法及其扩展方法。TF-IDF的主要思想是一个词的重要度与在类别内的词频成正比,与所有类别出现的次数成反比。

3、文本表示
文本表示的目的是把预处理后的文本向量化,是决定文本分类质量最重要的部分。传统做法常用词袋模型(BOW, Bag Of Words)或向量空间模型(Vector Space Model),最大的不足是忽略文本上下文关系,每个词之间彼此独立,并且无法表征语义信息。词袋模型有个两个最大的问题:高纬度、高稀疏性;向量空间模型通过特征项选择降低维度,通过特征权重计算增加稠密性。

常用浅层文本表示有哪些方法?

一个文本表现为一个由文字和标点符号组成的字符串,由字或字符组成词,由词组成短语,进而形成句、段、节、章、篇的结构。要使计算机能够高效地处理真实文本,就必须找到一种理想的形式化表示方法。目前文本表示通常采用向量空间模型。

one-hot 表示

将每一个词表示成一个固定维度的向量,维度大小是词表大小,向量中单词所在位置为 1,其他位置为 0

one-hot 存在的两个明显问题:维度灾难语义鸿沟。所谓维度灾难就是词库越大,one-hot 表征的向量维度越大,使得数据样本稀疏,距离计算困难,造成维度灾难。所谓语义鸿沟的问题是因为 one-hot 生成的词向量都是彼此正交的,体现不出任何语义上的联系。

  1. # 输入句子
  2. 句⼦1:
  3. 句⼦2:
  4. # 对句子的字进行索引
  5. {'我': 1, '爱': 2, '北': 3, '京': 4, '天': 5, '安': 6, '⻔': 7, '喜': 8, '欢': 9, '上': 10, '海': 11}
  6. # 每个字映射为一个 11 维的稀疏向量
  7. 我:[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  8. 爱:[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  9. ...
  10. 海:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]

bag-of-words(词袋表示)

每个文档的字/词可以使用其出现次数来进行表示。

  1. # 输入句子
  2. 句⼦1:
  3. 句⼦2:
  4. # 统计每个字出现的次数,并赋值
  5. 句⼦1转换为 [1,1,1,1,1,1,1,0,0,0,0]
  6. 句⼦2转换为 [1,0,0,0,0,0,0,1,1,1,1]

N-gram
N-gram 模型,也称为N元语法模型,是一种基于统计语言模型的算法。它的算法思想:将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度N的字节片段序列,每个字节片段称为gram。对所有gram的出现频度进行统计,其他同词袋模型。

这里简单提下啥是语言模型?标准定义:对于语言序列 「文本分类入门与实战」课程demo - 图4,语言模型就是计算该序列出现的概率,即 「文本分类入门与实战」课程demo - 图5%3D%5Cprod%7Bi%3D1%7D%5Enp(w_i%7Cw%7B1%7D%2Cw%7B2%7D%2C…%2Cw%7Bi-1%7D)#card=math&code=p%28w1%2Cw2%2C…%2Cwn%29%3D%5Cprod%7Bi%3D1%7D%5Enp%28wi%7Cw%7B1%7D%2Cw%7B2%7D%2C…%2Cw%7Bi-1%7D%29&id=WIoKY)


N-gram 模型引入了马尔科夫假设,即当前词出现的概率只与其前 n-1 个词有关:

「文本分类入门与实战」课程demo - 图6%3D%5Cprod%7Bi%3D1%7D%5Enp(w_i%7Cw%7Bi-n%2B1%7D%2Cw%7Bi-n%2B2%7D%2C…%2Cw%7Bi-1%7D)%0A#card=math&code=p%28w1%2Cw2%2C…%2Cwn%29%3D%5Cprod%7Bi%3D1%7D%5Enp%28wi%7Cw%7Bi-n%2B1%7D%2Cw%7Bi-n%2B2%7D%2C…%2Cw%7Bi-1%7D%29%0A&id=U5AYK)

要计算出一个句子的概率,只要估计出概率 「文本分类入门与实战」课程demo - 图7#card=math&code=p%28wi%7Cw%7Bi-n%2B1%7D%2Cw%7Bi-n%2B2%7D%2C…%2Cw%7Bi-1%7D%29&id=KRZh4)就可以了。那如何计算这个共现词概率呢?利用概率统计里面的极大似然估计(maximum likelihood estimation, MLE),通过对大量样本进行统计,使用频率去逼近这个概率。即当语料足够大时,直接从语料中统计 n 个词同时出现的次数即可得到:

「文本分类入门与实战」课程demo - 图8%3D%5Cfrac%7Bp(w%7Bi-n%2B1%7D%5E%7Bi%7D)%7D%7Bp(w%7Bi-n%2B1%7D%5E%7Bi-1%7D)%7D%20%5Capprox%20%5Cfrac%7B%5Coperatorname%7BCount%7D%5Cleft(w%7Bi-n%2B1%7D%2Cw%7Bi-n%2B2%7D%2C…%2Cw%7Bi%7D%5Cright)%7D%7B%5Coperatorname%7BCount%7D%5Cleft(w%7Bi-n%2B1%7D%2Cw%7Bi-n%2B2%7D%2C…%2Cw%7Bi-1%7D%5Cright)%7D%0A#card=math&code=p%5Cleft%28w%7Bi%7D%20%5Cmid%20w%7Bi-n%2B1%7D%5E%7Bi-1%7D%5Cright%29%3D%5Cfrac%7Bp%28w%7Bi-n%2B1%7D%5E%7Bi%7D%29%7D%7Bp%28w%7Bi-n%2B1%7D%5E%7Bi-1%7D%29%7D%20%5Capprox%20%5Cfrac%7B%5Coperatorname%7BCount%7D%5Cleft%28w%7Bi-n%2B1%7D%2Cw%7Bi-n%2B2%7D%2C…%2Cw%7Bi%7D%5Cright%29%7D%7B%5Coperatorname%7BCount%7D%5Cleft%28w%7Bi-n%2B1%7D%2Cw%7Bi-n%2B2%7D%2C…%2Cw%7Bi-1%7D%5Cright%29%7D%0A&id=A4IzC)

「文本分类入门与实战」课程demo - 图9

N-gram 示例:

  1. # 输入句子
  2. 句⼦1:
  3. 句⼦2:
  4. # 2元
  5. 句⼦1: 我爱 爱北 北京 京天 天安 安⻔
  6. 句⼦2: 我喜 喜欢 欢上 上海
  7. # 统计每个字出现的次数,并赋值
  8. 句⼦1转换为 [0, 1, 1, 0, 1, 1, 0, 1, 0, 1]
  9. 句⼦2转换为 [1, 0, 0, 1, 0, 0, 1, 0, 1, 0]

TF-IDF
TF-IDF 分数由两部分组成:

  • 第一就分是词语频率(Term Frequency)。TF 背后的隐含的假设是,查询关键字中的单词应该相对于其他单词更重要;
  • 第二部分是逆文档频率(Inverse Docuent Frequency)。IDF是假设包含某词语的文档越少,IDF值越大,说明该词语具有很强的区分能力;
  1. TF(t) = 某个词在文档出现的次数 / 文档中词语的总数
  2. IDF(t) = Log_e(文档总数 / 出现该词语的文档总数+1 # +1的原因是避免分母为0
  3. TF-IDF = TF * IDF

浅层文本分类器有哪些?

浅层分类算法有很多,这里介绍几种常用的模型:朴素的贝叶斯分类法(naΪve Bayesian classifier, NB)、决策树(decision tree, DT)分类法、逻辑回归(Logistic Regression,LR)、支持向量机(support vector machines, SVM)、k-最近邻法(k-nearest neighbor, kNN)

朴素的贝叶斯分类法(naΪve Bayesian classifier, NB)

参考:用朴素贝叶斯分类算法做中文文本分类朴素贝叶斯算法-月来客栈 实战:Python机器学习笔记:朴素贝叶斯算法

贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。朴素贝叶斯分类器的基本思想是利用特征项和类别的联合概率来估计给定文档的类别概率,主要是使用先验概率来计算后验概率

先验概率P(X):先验概率是指根据历史经验得出来的概率
后验概率P(X|Y):事情已经发生,要求这件事情发生的原因是由某个因素引起的可能性的大小
贝叶斯公式「文本分类入门与实战」课程demo - 图10%3D%5Cfrac%7BP(X%20%5Cmid%20Y)%20P(Y)%7D%7BP(X)%7D%0A%5C%5C%0A(X%EF%BC%9A%E7%89%B9%E5%BE%81%E5%90%91%E9%87%8F%2C%20%20%5Cmathrm%7BY%7D%20%20%EF%BC%9A%20%E7%B1%BB%E5%88%AB)%0A#card=math&code=P%28Y%20%5Cmid%20X%29%3D%5Cfrac%7BP%28X%20%5Cmid%20Y%29%20P%28Y%29%7D%7BP%28X%29%7D%0A%5C%5C%0A%28X%EF%BC%9A%E7%89%B9%E5%BE%81%E5%90%91%E9%87%8F%2C%20%20%5Cmathrm%7BY%7D%20%20%EF%BC%9A%20%E7%B1%BB%E5%88%AB%29%0A&id=ZSSC5)
朴素贝叶斯公式:朴素贝叶斯算法是假设各个特征之间相互独立,也是朴素这词的意思 「文本分类入门与实战」课程demo - 图11%3D%5Cfrac%7BP%5Cleft(x%7B1%7D%20%5Cmid%20Y%5Cright)%20P%5Cleft(x%7B2%7D%20%5Cmid%20Y%5Cright)%20%5Ccdots%20P%5Cleft(x%7Bn%7D%20%5Cmid%20Y%5Cright)%20P(Y)%7D%7BP(X)%7D%0A#card=math&code=P%28Y%20%5Cmid%20X%29%3D%5Cfrac%7BP%5Cleft%28x%7B1%7D%20%5Cmid%20Y%5Cright%29%20P%5Cleft%28x%7B2%7D%20%5Cmid%20Y%5Cright%29%20%5Ccdots%20P%5Cleft%28x%7Bn%7D%20%5Cmid%20Y%5Cright%29%20P%28Y%29%7D%7BP%28X%29%7D%0A&id=rqXmZ)

举例:设待分类文档 Doc 的属性集为 「文本分类入门与实战」课程demo - 图12,其中包含「文本分类入门与实战」课程demo - 图13个属性,分别为「文本分类入门与实战」课程demo - 图14,类别集合为「文本分类入门与实战」课程demo - 图15,当前待判断类别为「文本分类入门与实战」课程demo - 图16,基于属性条件独立性假设。根据贝叶斯公式,T 属于c类的后验概率为:

「文本分类入门与实战」课程demo - 图17%3D%5Cfrac%7BP(c)P(T%7Cc)%7D%7BP(T)%7D%3D%5Cfrac%7BP(c)%7D%7BP(T)%7D%E2%88%8F%7Bi%3D1%7D%5EnP(t_i%7Cc)%0A#card=math&code=P%28c%7CT%29%3D%5Cfrac%7BP%28c%29P%28T%7Cc%29%7D%7BP%28T%29%7D%3D%5Cfrac%7BP%28c%29%7D%7BP%28T%29%7D%E2%88%8F%7Bi%3D1%7D%5EnP%28t_i%7Cc%29%0A&id=esLfa)

因为我们的目标是在当前的属性集 「文本分类入门与实战」课程demo - 图18 下,找到一个尽可能正确的类别,也就是说,使得后验概率「文本分类入门与实战」课程demo - 图19#card=math&code=P%28c%7CT%29&id=ovLu0)尽可能大。又因为对于所有类别来说「文本分类入门与实战」课程demo - 图20#card=math&code=P%28T%29&id=jTd9o)相同,所以朴素贝叶斯分类器的计算公式如下:

「文本分类入门与实战」课程demo - 图21%E2%88%8F%7Bi%3D1%7D%5EnP(t_i%7Cc)%0A#card=math&code=y%3Dargmax%7Bc%E2%88%88%CE%B3%7DP%28c%29%E2%88%8F_%7Bi%3D1%7D%5EnP%28t_i%7Cc%29%0A&id=BPKpA)

注意:「文本分类入门与实战」课程demo - 图22 的含义是,使得 y 取最大值时的取值.

可以看到上面的公式 「文本分类入门与实战」课程demo - 图23#card=math&code=%E2%88%8F%5En_%7Bi%3D1%7DP%28t_i%7Cc%29&id=SLCBQ) 中 「文本分类入门与实战」课程demo - 图24%E2%89%A41#card=math&code=0%E2%89%A4P%28t_i%7Cc%29%E2%89%A41&id=vRHP2),连乘运算很容易得到一个双精度都难以表示的极小的数值,不利于计算。因此一般情况下对上面的公式两边取对数,得到如下公式:

「文本分类入门与实战」课程demo - 图25%3Dargmax%7Bc%E2%88%88%CE%B3%7D(log(P(c)%2B%E2%88%91%7Bi%3D1%7D%5Enlog(P(ti%7Cc)))%0A#card=math&code=log%28y%29%3Dargmax%7Bc%E2%88%88%CE%B3%7D%28log%28P%28c%29%2B%E2%88%91_%7Bi%3D1%7D%5Enlog%28P%28t_i%7Cc%29%29%29%0A&id=PIgne)

另外 「文本分类入门与实战」课程demo - 图26#card=math&code=P%28c%29&id=xXJZK)和 「文本分类入门与实战」课程demo - 图27#card=math&code=P%28t_i%7Cc%29&id=RcbhJ) 可通过极大似然估计获得,即:

「文本分类入门与实战」课程demo - 图28%3D%5Cfrac%7B%7CDc%7C%7D%7B%7CD%7C%7D%20%5C%5C%0AP(t_i%7Cc)%3D%5Cfrac%7B%7CD%7Bc%2Cti%7D%7C%7D%7B%7CD_c%7C%7D%0A#card=math&code=P%28c%29%3D%5Cfrac%7B%7CD_c%7C%7D%7B%7CD%7C%7D%20%5C%5C%0AP%28t_i%7Cc%29%3D%5Cfrac%7B%7CD%7Bc%2Ct_i%7D%7C%7D%7B%7CD_c%7C%7D%0A&id=JyY75)

其中,|D|表示训练语料库中包含的文档总数,「文本分类入门与实战」课程demo - 图29 表示训练语料库中类别 c 包含的文档总数,「文本分类入门与实战」课程demo - 图30 表示训练语料库的类别 c 中含有的特征词 「文本分类入门与实战」课程demo - 图31 的文档总数,这些统计量都可以通过训练语料库分词后统计得到。

注意:「文本分类入门与实战」课程demo - 图32 可能等于 0,导致整个实例的概率结果是0。为了解决零概率的问题,引入Laplace校准(也即拉普拉斯平滑),它的思想非常简单,就是对每个类别下所有划分的计数加1,这样如果训练样本集数量充分大时,并不会对结果产生影响,并且解决了上述频率为0的尴尬局面。引入拉普拉斯平滑的公式如下:

「文本分类入门与实战」课程demo - 图33%3D%5Cfrac%7B%7CDc%7C%2B1%7D%7B%7CD%7C%2BK%7D%20%5C%5C%0AP(t_i%7Cc)%3D%5Cfrac%7B%7CD%7Bc%2Cti%7D%7C%2B1%7D%7B%7CD_c%7C%2BM%7D%0A#card=math&code=P%28c%29%3D%5Cfrac%7B%7CD_c%7C%2B1%7D%7B%7CD%7C%2BK%7D%20%5C%5C%0AP%28t_i%7Cc%29%3D%5Cfrac%7B%7CD%7Bc%2Ct_i%7D%7C%2B1%7D%7B%7CD_c%7C%2BM%7D%0A&id=xkfD2)

其中,「文本分类入门与实战」课程demo - 图34=1,K代表总类别个数,「文本分类入门与实战」课程demo - 图35代表 c 类文档中统计出来的特征词的个数。

决策树(Dicision Tree, DT)

参考: 《决策树之ID3和C4.5原理与实战-月来客栈》、《python机器学习笔记:深入学习决策树算法原理》 实战:如何用 Python 构建一个决策树


「文本分类入门与实战」课程demo - 图36

决策树分类器的出发点是:
大量复杂系统的组成普遍存在着等级分层现象,或者说复杂任务是可以通过等级分层分解完成的。

算法思想:
决策树是一种自上而下,对样本数据进行树形分类的过程,由结点和有向边组成。结点分为内部结点和叶结点,其中每个内部结点表示一个特征或属性,叶结点表示类别。从顶部根结点开始,所有样本聚在一起。经过根结点的划分,样本被分到不同的子结点中。再根据子结点的特征进一步划分,直至所有样本都被归到某一个类别(即叶结点)中。

决策树由三部分构成:

  1. 特征选择:从训练数据中众多的特征中选择一个特征作为当前节点的分裂标准,如何选择特征有着很多不同量化评估标准,从而衍生出不同的决策树算法
  2. 决策树生成:根据选择的特征评估标准,从上至下递归地生成子节点,直到数据集不可分则停止决策树停止生长;
  3. 决策树的剪枝:决策树容易过拟合,一般需要剪枝来缩小树结构规则,缓解过拟合,剪枝技术有预剪枝和后剪枝两种…

决策树中很重要的一点就是选择一个属性进行分枝,这里简单说一下几种经典的实现算法:ID3算法,C4.5算法和CART算法。这些算法的主要区别在于分类结点熵特征选择的选取标准不同:

数据集D的经验信息熵H(D)为:
「文本分类入门与实战」课程demo - 图37%3D-%5Csum%7B%5Cmathrm%7Bk%7D%3D1%7D%5E%7B%7C%5Cmathrm%7BK%7D%7C%7Dp(%C2%B7)log_2p(%C2%B7)%3D-%5Csum%7B%5Cmathrm%7Bk%7D%3D1%7D%5E%7B%7C%5Cmathrm%7BK%7D%7C%7D%20%5Cfrac%7B%5Cleft%7C%5Cmathrm%7BC%7D%7B%5Cmathrm%7Bk%7D%7D%5Cright%7C%7D%7B%7C%5Cmathrm%7BD%7D%7C%7D%20%5Clog%20%7B2%7D%20%5Cfrac%7B%5Cleft%7C%5Cmathrm%7BC%7D%7B%5Cmathrm%7Bk%7D%7D%5Cright%7C%7D%7B%7C%5Cmathrm%7BD%7D%7C%7D#card=math&code=%5Cmathrm%7BH%7D%28%5Cmathrm%7BD%7D%29%3D-%5Csum%7B%5Cmathrm%7Bk%7D%3D1%7D%5E%7B%7C%5Cmathrm%7BK%7D%7C%7Dp%28%C2%B7%29log2p%28%C2%B7%29%3D-%5Csum%7B%5Cmathrm%7Bk%7D%3D1%7D%5E%7B%7C%5Cmathrm%7BK%7D%7C%7D%20%5Cfrac%7B%5Cleft%7C%5Cmathrm%7BC%7D%7B%5Cmathrm%7Bk%7D%7D%5Cright%7C%7D%7B%7C%5Cmathrm%7BD%7D%7C%7D%20%5Clog%20%7B2%7D%20%5Cfrac%7B%5Cleft%7C%5Cmathrm%7BC%7D%7B%5Cmathrm%7Bk%7D%7D%5Cright%7C%7D%7B%7C%5Cmathrm%7BD%7D%7C%7D&id=ALQKV) 数据集D在特征值A下的经验条件熵H(D|A)为:「文本分类入门与实战」课程demo - 图38%3D%5Csum%7Bi%3D1%7D%5E%7Bn%7D%20%5Cfrac%7B%5Cleft%7CD%7Bi%7D%5Cright%7C%7D%7B%7CD%7C%7D%20H%5Cleft(D%7Bi%7D%5Cright)%3D-%5Csum%7Bi%3D1%7D%5E%7Bn%7D%20%5Cfrac%7B%5Cleft%7CD%7Bi%7D%5Cright%7C%7D%7B%7CD%7C%7D%20%5Csum%7Bk%3D1%7D%5E%7BK%7D%20%5Cfrac%7B%5Cleft%7CD%7Bi%20k%7D%5Cright%7C%7D%7B%5Cleft%7CD%7Bi%7D%5Cright%7C%7D%20%5Clog%20%7B2%7D%20%5Cfrac%7B%5Cleft%7CD%7Bi%20k%7D%5Cright%7C%7D%7B%5Cleft%7CD%7Bi%7D%5Cright%7C%7D#card=math&code=H%28D%20%5Cmid%20A%29%3D%5Csum%7Bi%3D1%7D%5E%7Bn%7D%20%5Cfrac%7B%5Cleft%7CD%7Bi%7D%5Cright%7C%7D%7B%7CD%7C%7D%20H%5Cleft%28D%7Bi%7D%5Cright%29%3D-%5Csum%7Bi%3D1%7D%5E%7Bn%7D%20%5Cfrac%7B%5Cleft%7CD%7Bi%7D%5Cright%7C%7D%7B%7CD%7C%7D%20%5Csum%7Bk%3D1%7D%5E%7BK%7D%20%5Cfrac%7B%5Cleft%7CD%7Bi%20k%7D%5Cright%7C%7D%7B%5Cleft%7CD%7Bi%7D%5Cright%7C%7D%20%5Clog%20%7B2%7D%20%5Cfrac%7B%5Cleft%7CD%7Bi%20k%7D%5Cright%7C%7D%7B%5Cleft%7CD_%7Bi%7D%5Cright%7C%7D&id=pq0Xo) 信息增益=信息熵-条件熵:
「文本分类入门与实战」课程demo - 图39%3D%5Cmathrm%7BH%7D(%5Cmathrm%7BD%7D)-%5Cmathrm%7BH%7D(%5Cmathrm%7BD%7D%20%5Cmid%20%5Cmathrm%7BA%7D)#card=math&code=%5Cmathrm%7BGain%7D%28%5Cmathrm%7BD%7D%2C%20%5Cmathrm%7BA%7D%29%3D%5Cmathrm%7BH%7D%28%5Cmathrm%7BD%7D%29-%5Cmathrm%7BH%7D%28%5Cmathrm%7BD%7D%20%5Cmid%20%5Cmathrm%7BA%7D%29&id=E3ASp) 信息增益率=信息增益 / 信息熵 「文本分类入门与实战」课程demo - 图40

  • ID3是采用信息增益作为特征选择的评价标准,信息增益越大,说明按此特征分类后信息的不确定性减少程度也越大。定义:设训练集为D,|D|表示所有训练样本总数;同时D有K个类别「文本分类入门与实战」课程demo - 图41「文本分类入门与实战」课程demo - 图42为属于类「文本分类入门与实战」课程demo - 图43的样本总数,即「文本分类入门与实战」课程demo - 图44;设特征A有n个不同的取值 「文本分类入门与实战」课程demo - 图45,根据特征A的取值将D划分为n个子集「文本分类入门与实战」课程demo - 图46「文本分类入门与实战」课程demo - 图47为子集 「文本分类入门与实战」课程demo - 图48 中的样本个数,即 「文本分类入门与实战」课程demo - 图49

  • C4.5是在ID3的算法基础上,采用信息增益率来做为标准,通过增加类别的惩罚因子,规避了类别越多信息增益越大的问题,提升决策树的泛化能力,同时也可以通过均值离散化的方式处理连续变量的问题。


    「文本分类入门与实战」课程demo - 图50%3D%5Cfrac%7BGain(D%2CA)%7D%7BHA(D)%7D%20%5C%5C%0AH_A(D)%3D-%5Csum%7Bi%3D1%7D%5E%7Bn%7D%20%5Cfrac%7B%5Cleft%7CD%7Bi%7D%5Cright%7C%7D%7B%7CD%7C%7D%20%5Clog%20%7B2%7D%20%5Cfrac%7B%5Cleft%7CD%7Bi%7D%5Cright%7C%7D%7B%7CD%7C%7D%0A#card=math&code=Gain-ratio%28D%2CA%29%3D%5Cfrac%7BGain%28D%2CA%29%7D%7BH_A%28D%29%7D%20%5C%5C%0AH_A%28D%29%3D-%5Csum%7Bi%3D1%7D%5E%7Bn%7D%20%5Cfrac%7B%5Cleft%7CD%7Bi%7D%5Cright%7C%7D%7B%7CD%7C%7D%20%5Clog%20%7B2%7D%20%5Cfrac%7B%5Cleft%7CD_%7Bi%7D%5Cright%7C%7D%7B%7CD%7C%7D%0A&id=OImwN)

  • CART不再通过信息熵的方式选取最优划分特征,而是采用基尼系数(Gini),也叫基尼不纯度,两者衡量信息量的作用相当,但是基尼系数由于没有对数运算,可大大减少计算开销。

「文本分类入门与实战」课程demo - 图51%3D1-%5Csum%7Bk%3D1%7D%5E%7BK%7D%5Cleft(%5Cfrac%7B%5Cleft%7CC%7Bk%7D%5Cright%7C%7D%7B%7CD%7C%7D%5Cright)%5E%7B2%7D%20%5C%5C%0A%5Coperatorname%7BGini%7D(%5Cmathrm%7BD%7D%2C%20%5Cmathrm%7BA%7D)%3D%5Csum%7Bi%3D1%7D%5E%7Bn%7D%20%5Cfrac%7B%5Cleft%7CD%7Bi%7D%5Cright%7C%7D%7B%7CD%7C%7D%20%5Coperatorname%7BGini%7D(D%20i)%0A%5Cend%7Barray%7D%0A#card=math&code=%5Cbegin%7Barray%7D%7Bc%7D%0A%5Coperatorname%7BGini%7D%28D%29%3D1-%5Csum%7Bk%3D1%7D%5E%7BK%7D%5Cleft%28%5Cfrac%7B%5Cleft%7CC%7Bk%7D%5Cright%7C%7D%7B%7CD%7C%7D%5Cright%29%5E%7B2%7D%20%5C%5C%0A%5Coperatorname%7BGini%7D%28%5Cmathrm%7BD%7D%2C%20%5Cmathrm%7BA%7D%29%3D%5Csum%7Bi%3D1%7D%5E%7Bn%7D%20%5Cfrac%7B%5Cleft%7CD%7Bi%7D%5Cright%7C%7D%7B%7CD%7C%7D%20%5Coperatorname%7BGini%7D%28D%20i%29%0A%5Cend%7Barray%7D%0A&id=sN5CU)

将决策树应用集成学习的思想可以得到随机森林、梯度提升决策树等模型,略…

逻辑回归(Logistic Regression,LR)

参考:用人话解释机器学习中的Logistic Regression(逻辑回归)、《百面机器学习》 实战:Python机器学习笔记:Logistic Regression

Logistic Regression 虽然被称为回归,但其实际上是分类模型,并常用于二分类。逻辑回归是利用线性模型加上一个Logistic函数(或者也称为 Sigmoid 函数),将线性模型得到的连续结果映射到离散型上,从而判断出这条数据应该被分到两个类别中的哪个中去。

给定一些数据点,他们分别属于两个不同的类,现在要找到一个线性分类器把这些数据分成两类。如果用 x 表示数据点,用 y表示类别(y可以取1或者-1,代表两个不同的类),一个线性分类器的学习目标便是要在 n 维的数据空间中找到一个决策边界(Decision Boundary)也称 超平面(hyper plane),这个超平面的方程可以表示为:
「文本分类入门与实战」课程demo - 图52

Logistic回归的目的是从特征学习出一个 0/1 分类模型,而这个模型是将特征的线性组合作为自变量,由于自变量的取值范围是负无穷到正无穷。因此,使用Logistic函数(Sigmoid)将自变量映射至[0,1]的范围,当 「文本分类入门与实战」课程demo - 图53#card=math&code=h%28x%29&id=fPWiw) 大于某个值(通常设为0.5)时,便可以认为样本 x 属于正类,反之则认为属于负类。logistic函数表达式为:

「文本分类入门与实战」课程demo - 图54%3Dg(%5Ctheta%5ETx)%3D%5Cfrac%7B1%7D%7B1%2Be%5E%7B-(%5Ctheta%5ETx)%7D%7D%0A#card=math&code=h_%7B%5Ctheta%7D%28x%29%3Dg%28%5Ctheta%5ETx%29%3D%5Cfrac%7B1%7D%7B1%2Be%5E%7B-%28%5Ctheta%5ETx%29%7D%7D%0A&id=usNJ5)

LR 的导数形式为:
「文本分类入门与实战」课程demo - 图55%20%26%3D%5Cfrac%7Bd%7D%7Bd%20z%7D%20%5Cfrac%7B1%7D%7B1%2Be%5E%7B-z%7D%7D%20%5C%5C%0A%26%3D%5Cfrac%7B1%7D%7B%5Cleft(1%2Be%5E%7B-z%7D%5Cright)%5E%7B2%7D%7D%5Cleft(e%5E%7B-z%7D%5Cright)%20%5C%5C%0A%26%3D%5Cfrac%7B1%7D%7B%5Cleft(1%2Be%5E%7B-z%7D%5Cright)%7D%20%5Ccdot%5Cleft(1-%5Cfrac%7B1%7D%7B%5Cleft(1%2Be%5E%7B-z%7D%5Cright)%7D%5Cright)%20%5C%5C%0A%26%3Dg(z)(1-g(z))%0A%5Cend%7Baligned%7D%0A#card=math&code=%5Cbegin%7Baligned%7D%0Ag%5E%7B%5Cprime%7D%28z%29%20%26%3D%5Cfrac%7Bd%7D%7Bd%20z%7D%20%5Cfrac%7B1%7D%7B1%2Be%5E%7B-z%7D%7D%20%5C%5C%0A%26%3D%5Cfrac%7B1%7D%7B%5Cleft%281%2Be%5E%7B-z%7D%5Cright%29%5E%7B2%7D%7D%5Cleft%28e%5E%7B-z%7D%5Cright%29%20%5C%5C%0A%26%3D%5Cfrac%7B1%7D%7B%5Cleft%281%2Be%5E%7B-z%7D%5Cright%29%7D%20%5Ccdot%5Cleft%281-%5Cfrac%7B1%7D%7B%5Cleft%281%2Be%5E%7B-z%7D%5Cright%29%7D%5Cright%29%20%5C%5C%0A%26%3Dg%28z%29%281-g%28z%29%29%0A%5Cend%7Baligned%7D%0A&id=qziEV)

logsitc回归方法主要是用最大似然估计来学习的,样本的后验概率为:

「文本分类入门与实战」课程demo - 图56%20%26%3Dp(%5Cvec%7By%7D%20%5Cmid%20X%20%3B%20%5Ctheta)%20%5C%5C%0A%26%3D%5Cprod%7Bi%3D1%7D%5E%7Bm%7D%20p%5Cleft(y%5E%7B(i)%7D%20%5Cmid%20x%5E%7B(i)%7D%20%3B%20%5Ctheta%5Cright)%20%5C%5C%0A%26%3D%5Cprod%7Bi%3D1%7D%5E%7Bm%7D%5Cleft(h%7B%5Ctheta%7D%5Cleft(x%5E%7B(i)%7D%5Cright)%5Cright)%5E%7By%5E%7B(i)%7D%7D%5Cleft(1-h%7B%5Ctheta%7D%5Cleft(x%5E%7B(i)%7D%5Cright)%5Cright)%5E%7B1-y%5E%7B(i)%7D%7D%0A%5Cend%7Baligned%7D%0A#card=math&code=%5Cbegin%7Baligned%7D%0AL%28%5Ctheta%29%20%26%3Dp%28%5Cvec%7By%7D%20%5Cmid%20X%20%3B%20%5Ctheta%29%20%5C%5C%0A%26%3D%5Cprod%7Bi%3D1%7D%5E%7Bm%7D%20p%5Cleft%28y%5E%7B%28i%29%7D%20%5Cmid%20x%5E%7B%28i%29%7D%20%3B%20%5Ctheta%5Cright%29%20%5C%5C%0A%26%3D%5Cprod%7Bi%3D1%7D%5E%7Bm%7D%5Cleft%28h%7B%5Ctheta%7D%5Cleft%28x%5E%7B%28i%29%7D%5Cright%29%5Cright%29%5E%7By%5E%7B%28i%29%7D%7D%5Cleft%281-h%7B%5Ctheta%7D%5Cleft%28x%5E%7B%28i%29%7D%5Cright%29%5Cright%29%5E%7B1-y%5E%7B%28i%29%7D%7D%0A%5Cend%7Baligned%7D%0A&id=DmROT)

当然,Logistic Regression也可以用于处理多分类问题,即所谓的“多分类逻辑回归”(Multiclass Logistic Regression)。在单标签多分类任务下,使用多项逻辑回归(Softmax Regression)来进行分类

「文本分类入门与实战」课程demo - 图57%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%0Ap(y%3D1%20%5Cmid%20x%20%3B%20%5Ctheta)%20%5C%5C%0Ap(y%3D2%20%5Cmid%20x%20%3B%20%5Ctheta)%20%5C%5C%0A%5Cvdots%20%5C%5C%0Ap(y%3Dk%20%5Cmid%20x%20%3B%20%5Ctheta)%0A%5Cend%7Barray%7D%5Cright%5D%3D%5Cfrac%7B1%7D%7B%5Csum%7Bj%3D1%7D%5E%7Bk%7D%20%5Cmathrm%7Be%7D%5E%7B%5Ctheta%7Bj%7D%5E%7B%5Cmathrm%7BT%7D%7D%20x%7D%7D%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%0A%5Cmathrm%7Be%7D%5E%7B%5Ctheta%7B1%7D%5E%7B%5Cmathrm%7BT%7D%7D%20x%7D%20%5C%5C%0A%5Cmathrm%7Be%7D%5E%7B%5Ctheta%7B2%7D%5E%7B%5Cmathrm%7BT%7D%7D%20x%7D%20%5C%5C%0A%5Cvdots%20%5C%5C%0A%5Cmathrm%7Be%7D%5E%7B%5Ctheta%7Bk%7D%5E%7B%5Cmathrm%7BT%7D%7D%20x%7D%0A%5Cend%7Barray%7D%5Cright%5D%0A#card=math&code=h%7B%5Ctheta%7D%28x%29%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%0Ap%28y%3D1%20%5Cmid%20x%20%3B%20%5Ctheta%29%20%5C%5C%0Ap%28y%3D2%20%5Cmid%20x%20%3B%20%5Ctheta%29%20%5C%5C%0A%5Cvdots%20%5C%5C%0Ap%28y%3Dk%20%5Cmid%20x%20%3B%20%5Ctheta%29%0A%5Cend%7Barray%7D%5Cright%5D%3D%5Cfrac%7B1%7D%7B%5Csum%7Bj%3D1%7D%5E%7Bk%7D%20%5Cmathrm%7Be%7D%5E%7B%5Ctheta%7Bj%7D%5E%7B%5Cmathrm%7BT%7D%7D%20x%7D%7D%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%0A%5Cmathrm%7Be%7D%5E%7B%5Ctheta%7B1%7D%5E%7B%5Cmathrm%7BT%7D%7D%20x%7D%20%5C%5C%0A%5Cmathrm%7Be%7D%5E%7B%5Ctheta%7B2%7D%5E%7B%5Cmathrm%7BT%7D%7D%20x%7D%20%5C%5C%0A%5Cvdots%20%5C%5C%0A%5Cmathrm%7Be%7D%5E%7B%5Ctheta_%7Bk%7D%5E%7B%5Cmathrm%7BT%7D%7D%20x%7D%0A%5Cend%7Barray%7D%5Cright%5D%0A&id=FDzAQ)

当存在样本可能属于多个标签的情况时,我们可以训练 k 个二分类的逻辑回归分类器。第 i 个分类器用以区分每个样本是否可以归为第i类,训练该分类器时,需要把标签重新整理为“第i类标签”与“非第i类标签”两类。通过这样的办法,我们就解决每个样本可能拥有多个标签的情况。

支持向量机 SVM

参考《看了这篇文章你还不懂SVM你就来打我》、《Python机器学习笔记:SVM概述 》 实战:支持向量机SVM②——文本分类实战


「文本分类入门与实战」课程demo - 图58

基于支持向量机(support vector machine, SVM)的分类方法主要用于解决二元模式分类问题。支持向量机分类法就是要在训练集中找到具有最大类间界限(margin)的决策平面,使超平面与两类训练集之间的距离最大化,其学习策略(分割原则)便是间隔最大化,最终可转换为一个凸二次规划问题的求解。支持向量机在分类方面具有良好的性能,它在模式识别、图像识别以及自然语言处理等相关技术研究中得到了广泛的应用。

假设上图中的超平面可以用分类函数 f(x) 表示如下:

「文本分类入门与实战」课程demo - 图59%3Dw%5ETx%2Bb%0A#card=math&code=f%28x%29%3Dw%5ETx%2Bb%0A&id=ZlGwR)

其中 w 为法向量,决定了超平面的方向,b为位移量,决定了超平面与原点的距离。

假设超平面能将训练样本正确的分类,即对训练样本(xi, yi),满足以下公式:

「文本分类入门与实战」课程demo - 图60

该公式称为最大间隔假设,「文本分类入门与实战」课程demo - 图61 表示样本为正样本,「文本分类入门与实战」课程demo - 图62 表示样本为负样本。当 f(x)=0 的时候,x便是位于超平面上的点,而 f(x) > m 的点对应 y=1 的数据点,f(x) < -m 的点对应 y = -1的点。

如何找到最大间隔超平面呢?我们可以先选择分离两类数据的两个平行超平面,使得它们之间的距离尽可能大。在这两个超平面范围内的区域称为“间隔(margin)”,最大间隔超平面是位于它们正中间的超平面。根据几何间隔,margin 的计算公式为:
「文本分类入门与实战」课程demo - 图63

我们的目标是使 「文本分类入门与实战」课程demo - 图64 最大, 等价于使 「文本分类入门与实战」课程demo - 图65 最大:

「文本分类入门与实战」课程demo - 图66

上式的 「文本分类入门与实战」课程demo - 图67 是为了后续求导后刚好能消去,没有其他特殊意义。
间隔最大化问题的数学表达就是:

「文本分类入门与实战」课程demo - 图68%3D%5Cmin%20%7BW%2C%20b%7D%20%5Cfrac%7B1%7D%7B2%7D%5C%7CW%5C%7C%5E%7B2%7D%20%5C%5C%0A%5Ctext%20%7B%20s.t.%20%7D%20%5Cquad%20y%7Bi%7D%5Cleft(X%7Bi%7D%5E%7BT%7D%20W%2Bb%5Cright)%20%5Cgeq%201%2C%20i%3D1%2C2%2C%20%5Cldots%20n%0A%5Cend%7Barray%7D%0A#card=math&code=%5Cbegin%7Barray%7D%7Bl%7D%0A%5Cmin%20%7BW%2C%20b%7D%20J%28W%29%3D%5Cmin%20%7BW%2C%20b%7D%20%5Cfrac%7B1%7D%7B2%7D%5C%7CW%5C%7C%5E%7B2%7D%20%5C%5C%0A%5Ctext%20%7B%20s.t.%20%7D%20%5Cquad%20y%7Bi%7D%5Cleft%28X_%7Bi%7D%5E%7BT%7D%20W%2Bb%5Cright%29%20%5Cgeq%201%2C%20i%3D1%2C2%2C%20%5Cldots%20n%0A%5Cend%7Barray%7D%0A&id=wzZjl)

通过求解上式即可得到最优超平面 W 和 b.

k-最近邻法(k-nearest neighbor, kNN)

参考《机器学习实战》 实战:Python机器学习笔记:K-近邻(KNN)算法

所谓k-最近邻 (k-Nearest Neighbor,KNN) ,就是K个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。

KNN基本思路:如果一个待分类样本在特征空间中的 k 个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别,简单理解即多数表决法knn.mp4 (35.38KB)在 K=3 的分类任务中,由于 3 个最相似的标记示例的多数票,未标记的数据点被标记为粉红色

KNN 所做的只是存储完整的数据集,无需对其进行任何计算或建模,即可测量新数据点与其最近数据点之间的距离。出于这个原因,并且由于没有真正发生学习过程,KNN 被称为“惰性”算法(与决策树等“急切”算法相反,它在对新数据点执行预测之前构建通用模型)。

K近邻的分类步骤:

  1. 首先确定一个K值(至关重要!):一种流行的方法是测试不同大小的“k”并测量产生的误差,找出“肘点”作为最佳K值(在该值处增加会导致误差和的减小非常小,而减小会急剧增加误差和)
  2. 然后选择一种度量距离:用来计算得到离自己最近的K个样本;(一般欧式距离或者曼哈顿距离)
  3. 最后确定一种决策规则:用来判定新样本所属类别(一般都是使用多数表决法或加权投票法);

image.png
KNN 优缺点

  • 优点:思想简单,理论成熟,既可以用来做分类也可以用来做回归;可用于非线性分类;训练时间复杂度为O(n);准确度高,对数据没有假设,对outlier不敏感;
  • 缺点:计算量大;样本不平衡问题;需要大量的内存;

浅层分类器总结

浅层模型学习学习预定义的特征表示,其中人工特征是问题难点;不过,浅层模型在小规模数据上表现要优于深度学习模型。

算法 优点 缺点
Bayes 贝叶斯分类 1) 所需估计的参数少,对于缺失数据不敏感
2)有着坚实的数学基础,以及稳定的分类效率
1)需要假设属性之间相互独立,这往往井不成立(喜欢吃番茄、鸡蛋,却不喜欢吃番茄炒蛋)
2)需要知道先验概率
3)分类决策存在错误率
Decision Tree 1)不需要任何领域知识或参数假设
2)适合高维数据
3)简单易于理解
4)短时间內处理大量数据,效果较好
5)能够同时处理数据型和常规性属性
1)对于各类别样本数量不一致数据,信息增益偏向于那些具有更多数值的特征
2)易于过拟合
3)忽略了属性之间的相关性
4)不支持在线学习
SVM支持向量机 1)可以解决小样本下机器学习的问题
2)提高泛化性能
3)可以解決高维、非线性问题。超高维文本分类仍受欢迎
4)避免神经网络结构选择和局部极小的问题
1)对缺失数据敏感
2)内存消耗大,难以解释
3)运行和调参略烦人
KNN K近邻 1)思想简单,理论成熟,既可以用来做分类也可以用来做回归;
2)可用于非线性分类
3)训练时间复杂度为O(n)
4)准确度高,对数据没有假设,对outler不敏感
1)计算量太大
2)对于样本分类不均衡的问题,会产生误判
3)需要大量的内存
4)输出的可解释性不强
Regression逻辑回归 1)速度快
2)简单易于理解,直接看到各个特征的权重
3)能容易地更新模型吸收新的数据
4)如果想要一个概率框架,动态调整分类阀值
特征处理复杂。需要归一化和较多的特征工程

(二)深度分类模型

「文本分类入门与实战」课程demo - 图71

深层文本表示有哪些方法?

Word2Vec

参考:重温Word2Vec及2种优化策略

基本思想是对出现在上下文环境里的词进行预测。对于每一条输入文本,我们选取一个上下文窗口和一个中心词,通过单词和上下文彼此进行预测,对应的两个算法分别为:

  • CBOW 在已知 context(w) 的情况下,预测中心词 w;
  • Skip-Gram 在已知中心词 w 的情况下,预测 context(w) ;

「文本分类入门与实战」课程demo - 图72

存在问题:
Word2vec 本质上是一个语言模型,它的输出节点数是 V 个,对应了 V 个词语,也是一个多分类问题。考虑到sofmax归一化需要遍历整个词汇表(时间复杂度为 O(|V|)),当词汇表较大时,计算量巨大!

如何优化和加速呢?
word2vec采用hierarchical softmax 和negative sampling进行优化(2 个加速训练的技巧):

  • Hierarchical Softmax是一种对输出层进行优化的策略,以词表中的全部词作为叶子节点,词频作为节点的权,构建Huffman树,从Huffman树的根节点随机游走到目标叶节点来计算概率值。通过哈夫曼编码来保证高频词的搜索路径短,低频词的路径长,这种编码方式很大程度减少了计算量。
  • Negative Sampling 是Noise-Contrastive Estimation(简写NCE,噪声对比估计)的简化版本:1、把语料中的一个词串的中心词替换为别的词,构造语料 D 中不存在的词串作为负样本;2、CBOW和Skip-Gram模型在输出端使用一个二分类器(即Logistic Regression),来区分目标词和词库中其他的 k个词(也就是把目标词作为一类,其他词作为另一类);3、在这种策略下,优化目标变为了:最大化正样本的概率,同时最小化负样本的概率。

FastText
FastText核心思想:将整篇文档的词向量及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。这中间涉及到两个技巧:字符级n-gram特征的引入以及分层Softmax分类。

「文本分类入门与实战」课程demo - 图73

深层文本分类器有哪些?

1)ReNN:将输入文本的每个单词作为模型结构的叶节点。然后使用权重矩阵将所有节点合并成父节点。权重矩阵在整个模型中共享。每个父节点与所有叶节点具有相同的维度。最后,所有节点递归地聚合成一个父节点来表示输入文本以预测标签。

「文本分类入门与实战」课程demo - 图74

2)MLP:这是一个三层MLP模型。它包含一个输入层、一个在所有节点中都有激活功能的隐藏层和一个输出层。每个节点连接一个特定的权重wi。

「文本分类入门与实战」课程demo - 图75

经典做法是:利用预训练的词向量,将句子中每个词的词向量进行求和或者取平均(一般都是取平均),然后经过FFN,然后用softmax或者其他分类器。代表作为Deep Average Networ(DAN),框架图如下:

「文本分类入门与实战」课程demo - 图76

3)CNN-based Models:① 将输入文本的词向量拼接成一个矩阵;② 将矩阵送入卷积层,卷积层包含几个不同维度的滤波器kernel来提取句子中的局部关键信息(类似于多窗口大小的n-gram);③ 卷积层的结果经过池化层,筛选出显著特征,然后拼接成文本的最终向量表示;④ 交由softmax或者其他分类器。

「文本分类入门与实战」课程demo - 图77

  1. Dynamic CNN (DCNN) 最早将CNN用于文本分类,模型采用了动态的k-max pooling,可以根据句子大小和卷积的层级进行动态选择kYoon Kim在论文(2014 EMNLP) 提出**TextCNN**,以其简单和有效而广泛流传。TextCNN只用到了一个卷积层,其结构如下图。此外,**字符级cnn**也被广泛用于文本分类。

「文本分类入门与实战」课程demo - 图78

TextCNN的详细过程原理图见下。第一层是图中最左边的7乘5的句子矩阵,每行是词向量,维度=5,这个可以类比为图像中的原始像素点了。然后经过有 filter_size=(2,3,4) 的一维卷积层,每个filter_size 有两个输出 channel。第三层是一个1-max pooling层,这样不同长度句子经过pooling层之后都能变成定长的表示了,最后接一层全连接的 softmax 层,输出每个类别的概率。

「文本分类入门与实战」课程demo - 图79

4)RNN-based Models:由于文本本身是一种序列,RNN 天生适合建模序列数据。Recurrent Neural Network for Text Classification with Multi-Task Learning文中介绍了RNN用于分类问题的设计,① 使用单词嵌入技术用特定的向量来表示每个输入单词;② 将嵌入的单词向量一个接一个地输入循环神经网络的 cell 单元,单元的输出与输入向量的维数相同,并被馈送到下一个隐藏层。RNN在模型的不同部分共享参数,并且每个输入单词的权重相同;③ 最后,文本的标签可以通过隐藏层的最后一个时间步输出来进行预测。

「文本分类入门与实战」课程demo - 图80

  1. RNN的反向传播过程中,权重通过梯度来调整,梯度通过导数的连续乘法来计算。如果导数极小,通过连续乘法可能会引起梯度消失问题。**长短期记忆(LSTM)** **有效地缓解了梯度消失问题**。LSTM通过引入一个记忆单元来记忆任意时间间隔内的值,以及三个门(输入门、输出门、遗忘门)来控制进出cell的信息流。LSTM分类方法能够更好地捕捉上下文特征词之间的联系,利用遗忘门结构过滤无用信息,有利于提高分类器的整体捕捉能力。至于为什么LSTM可以缓解梯度消失问题,可以移步 [https://weberna.github.io/blog/2017/11/15/LSTM-Vanishing-Gradients.html](https://link.zhihu.com/?target=https%3A//weberna.github.io/blog/2017/11/15/LSTM-Vanishing-Gradients.html) 或者 [https://zhuanlan.zhihu.com/p/109519044](https://zhuanlan.zhihu.com/p/109519044)
  2. Tai等人开发了一个Tree-LSTM模型,将LSTM推广到树形结构的网络类型,以学习丰富的语义表示。他们验证了Tree-LSTM在两个任务上的有效性:情感分类和两个句子的语义关联预测。Tree-LSTM 的局限性:运算效率低、受到树结构构建准确性的影响、不容易和其他模型进行结合+提升有限。

「文本分类入门与实战」课程demo - 图81

5)Attention机制TextRNN + Attention 模型→Hierarchical Attention Network for Document Classification(HAN) 基于层级注意力,在单词和句子级别分别编码并基于注意力获得文档的表示,最后经过Softmax进行分类,如图11所示。注意机制让模型能够对特定的输入给予不同的注意,从而了解每个单词和句子对分类判断的贡献大小,有利于应用和分析。

「文本分类入门与实战」课程demo - 图82

HAN细节如下:Self-attention在句子中构造K、Q和V矩阵来捕获单词在句子中的权重分布,这些矩阵可以捕获对文本分类的长期依赖。每个输入词向量ai可以表示为三个n维向量,包括qi、ki、vi。自我注意后,输出向量ai可以表示为:

「文本分类入门与实战」课程demo - 图83%20v%7Bj%7D%20%5C%5C%0Aa%7Bi%20j%7D%3Dq%7Bi%7D%20%5Ccdot%20k%7Bj%7D%20%2F%20%5Csqrt%7Bn%7D%0A#card=math&code=%5Csum%7Bj%7D%20%5Coperatorname%7Bsoftmax%7D%5Cleft%28a%7Bi%20j%7D%5Cright%29%20v%7Bj%7D%20%5C%5C%0Aa%7Bi%20j%7D%3Dq%7Bi%7D%20%5Ccdot%20k%7Bj%7D%20%2F%20%5Csqrt%7Bn%7D%0A&id=rIOmP)

所有的输出向量都可以并行计算:

「文本分类入门与实战」课程demo - 图84

7)GNN:尽管自然语言文本具有顺序性,但它们也包含内部的图形结构,如句法和语义分析树,它们定义了句子中单词之间的句法/语义关系。可以将文本分类转换为图形节点分类任务。

早期的是TextRank,将句子表示为图G(V,E),其中V是节点集合,E是节点之间的边,节点可以是不同类型的文本单元,包含词/词组/整句等,边可以表示不同类型的关系,包含词汇/语义关系。现在图卷积网络GCN以及其变种由于其有效和方便性,变得很流行。图卷积如下图:首先,GCN 将四个输入文本和文本中的单词定义为节点,构造成图形结构。图节点由黑色粗体边连接,黑色边表示文档-单词的边和单词-单词的边。单词边缘的权重通常表示单词在语料库中的共现频率。然后,通过隐藏层来表示单词和文本。最后,通过图来预测所有输入文本的标签。

「文本分类入门与实战」课程demo - 图85

8)Beyond Supervised Learning

  • 自编码器Autoencoder无监督学习

自编码器利用重构误差可以学到输入的表征的。但是自编码器有能什么也学不到,所以有人又提出了Denosing Autoencoder,即在输入时增加噪声,重构的时候还是与原始句子计算误差。另一个变种时Variational Autoencoder(VAE),其学习到的表征是均值和方差。

Kiros提出了一种无监督学习通用句子编码器的Skip-Thought模型。训练编码器-解码器模型来重建编码句子的周围句子,其输入是三元组 「文本分类入门与实战」课程demo - 图86 ,encode的是 「文本分类入门与实战」课程demo - 图87 ,decoder部分是两个,一个是 「文本分类入门与实战」课程demo - 图88 ,一个是 「文本分类入门与实战」课程demo - 图89 ,其结构如下:

Skip-Thought模型

A.M.Dai and Q.V.Le研究了在seq2seq框架下对句子进行自编码,该编码器将输入序列读入向量并再次预测输入。即,encode输入后,decode要得到相同的句子。他们表明,在一个大的无监督语料库上进行预训练的句子编码比只进行预训练的单词嵌入产生更好的准确性。其结构如下:

「文本分类入门与实战」课程demo - 图91

当自动编码器学习输入的压缩表示时,变分自动编码器(VAE)学习表示数据的分布,可以将其视为自动编码器的正则化版本。由于VAE学会了对数据进行建模,因此我们可以轻松地从分布中进行抽样,以生成新的输入数据样本(例如,新的句子)。

  • Adversarial Training对抗训练

对抗式训练是一种改进分类器泛化的正则化方法。它通过改进模型对对抗性例子的鲁棒性来实现这一点,而对抗性例子是通过对输入进行微小的扰动而产生的。对抗性训练需要使用标签,并应用于监督学习。虚拟对抗训练将对抗训练扩展到半监督学习。给定一个例子,该模型产生的输出分布与它在该例子的对抗性扰动下产生的输出分布相同。

  • Reinforcement Learning强化学习

强化学习(Reinforcement learning, RL)是一种训练agent根据策略执行离散动作的方法,训练agent以实现奖励最大化。

(三)预训练语言模型

参考博客《预训练语言模型小酌》《PTMs:史上最全面总结 NLP 预训练模型

文本分类使用基于预训练语言模型的深度词表示来为自己提供一个较好的初始化,在特定于任务的标签数据进行有监督微调,任务效果可以得到大幅提升。

自2018年以来,我们已经看到了一系列大规模基于Transformer的Pre-trained Language Models(PLM)的兴起。它们使用更深的网络架构,在大量文本上以无监督的方式自动挖掘语义知识,建模和学习上下文信息,进而解决传统静态词向量不能建模“一词多义”语言现象的问题。

所以,在这一节的开始必须要提一下目前NLP领域最火的模型,Transformer!Transformer是在”Atention is All You Need”中提出的,其self-attention可以捕获长距离依赖,还可以并行计算(由于这个特性,Transformer允许比CNNs和RNNs更多的并行化,这使得在GPU集群上有效地训练大量数据的非常大的模型成为可能),层数堆叠之后,每层可以学习到不同层次的信息,当然,最重要的是性能感人。最初transformer是用于机器翻译的encode-decoder框架,如今,基于Transformer的预训练模型各种霸榜,大大推动了NLP的发展。

对于Transformer的具体介绍以及自注意力的详细计算,欢迎大家参考Jay Alammar关于Transrarmer的博客,这里不作重点展开。

基于PLM的文本表示

image.png

最早提出的ELMo利用字符卷积(char-cnn)得到的初始词向量,采用两层的双向 LSTM,首先利用大量语料进行了语言模型的预训练,然后在做下游任务中,利用第一阶段产生的动态词向量乘以权重参数,作为下游任务的一种特征输入,将该特征与下游任务的词向量进行拼接,构成最终的词向量进行特定任务的训练。

GPT 来自 openAI,是一种生成式预训练模型。GPT和 ELMo 极其相似,都是先进行语言模型预训练,然后在下游任务微调模型参数。区别在于,GPT用Transformer代替了双向LSTM作为编码器,并且GPT是一种单向模型,采用基于自回归式的单向语言模型,即该语言模型只使用上文预测当前词,而不使用下文,因此难以建模上下文信息

Google在NAACL2018发表的论文中提出了BERT,与GPT类似,BERT也采用了「预训练-微调」这一两阶段模式。但在 模型结构方面,BERT采用了ELMO的范式,即使用双向语言模型代替GPT中的单向语言模型,但是BERT的作者认为ELMo使用两个单向语言模型拼接的方式太粗暴,因此在第一阶段的预训练过程中,BERT提出掩码言语模型 MLM, 即类似完形填空的方式,通过上下文来预测单词本身,而不是从右到左或从左到右建模,这允许模型能够自由地编码每个层中来自两个方向的信息。而为了学习句子的词序关系,BERT 将 Transformer 中的三角函数位置表示替换为可学习的参数,其次为了区别单句和双向输入,BERT还引入了句子类型表征。BERT的输入如图所示。此外,为了充分学习句子间的关系,BERT提出了下句预测任务NSP

BERT开启了NLP领域「预训练-微调」这种两阶段的全新范式。第一阶段首先在海量无标注文本上预训练一个双向语言模型,在第二阶段使用下游任务的数据Fine-tuning不同层数的BERT模型参数,或者把BERT当作特征提取器生成BERT Embedding,作为新特征引入下游任务。另外,关于改进BERT的工作有很多,可以参考论文《BERT 模型的主要优化改进方法研究综述.pdf》获取更多信息:

「文本分类入门与实战」课程demo - 图93

(1)改进 MLM 掩码语言模型以提高词级别语言模型学习能力

RoBERTa
1、对MLM的mask方式改进:相对于BERT的静态mask,换成动态mask,即每次数据被feed进模型时,重新做一遍随机mask,此举相当于扩大了训练数据的量级;
2、更大的batch_size,更多的数据量;
3、训练时取消BERT中10%短句的限定,全部采用512的长句预训练;
4、取消NSP任务,它对结果没提升。

MacBERT
该名字Mac的由来并非MacBook,也不是说这个BERT是用Mac训练的。它是“MLM as correction”的缩写。具体含义就是,对于原BERT而言,mask token的处理方式,是80%保留[MASK]样式,10%不变,10%从词表随机采样。而MacBERT,是使用了synonym同义词工具,对于被mask的word进行同义词的替换——当然了,替换就得找字数相同的,如若“天安门”被mask,则可以替换为“卢浮宫”而不是“红场”。这样一来,使用同义词替换被mask的词,一方面减少了句中[MASK] token老生常谈会带来的mis-match问题,还可以提升句意的完整性。

ERNIE1.0
1、knowledge unit mask。ERNIE1.0设计了三个维度的knowledge unit进行mask,分别是token层面、word层面和实体层面。这一点有点类似Google对BERT的改进——whole-word-mask思想了;
2、DLM。D指的是Dialog,DLM实际上就是MLM的部分升级版,由于DLM用的是论坛对话数据,是query-response形式的数据,所以天生有更强的上下文关联,更利于语义信息的学习。

SpanBERT
Mandar 等人提出的 SpanBERT[6]则将这一策略的改进进一步延伸,首先采用了几 何分布来随机采样被掩盖的短语片段,然后提出了新的预训练目标:短语边界预 测(Span Boundary Objective,SBO),通过Span边界词向量来预测掩盖词。通 过这两种方式 SpanBERT 在 BERT 基础上取得了显著的效果提升。

BART
FaceBook 提出的 BART[7]通过引入了降噪自编码器(Denoising Autoencoder,DAE) [8]丰富了文本的破坏方式。

「文本分类入门与实战」课程demo - 图94

BART 首先将原始文档进行破坏,例如随机掩盖(同 MLM 一致)某些词、 随机删掉某些词或片段、打乱文档顺序等,将文本输入到编码器中后,利用一个 解码器生成破坏之前的原始文档。相比于 MLM,DAE 模型具有更强大的语言学 习和生成的能力,因而 BART 在众多自然语言生成任务中也表现出不错的性能, 这弥补了 BERT 无法用于语言生成任务的短板。

ELECTRA
FaceBook 提出的 ELECTRA[10]模型引入了替代词检测(Replaced Token Detection,RTD)任务, 来预测一个由语言模型生成的句子中哪些词是原本句子中的词,哪些词是语言模型生成的且不属于原句子中的词。如下图所示,ELECTRA 使用一个小型的 MLM 模型作为生成器(Generator), 来对包含[MASK]的句子进行预测,另外训练一个基于二分类的判别器 (Discriminator)来对生成器生成的句子进行判断。

「文本分类入门与实战」课程demo - 图95

ELECTRA 的判别器(Discriminator)承担了一个“测谎仪”的功能,将一个句子中被错误生成的那个词识别出来,并且巧妙地运用了 MLM 来生成句子。此时 MLM 仅承担了一个语句生成的功能,因此仅使用一个小的模型即可,而判别器(Discriminator)也仅仅是一个简单的二分类模型。相比原始 BERT 模型, ELECTRA 大大提高了计算效率,加快了模型的收敛速度。在相同的算力、数据和模型参数的情况下,其效果不仅明显优于 BERT,且超越了当时效果更好的 RoBERTa[11]及 XLNet[12]等模型。

(2)改进相邻句预测(NSP)提高句子级别语言模型学习能力

NSP 仅仅考虑了两个句子是否相邻,而没有兼顾到句子在整个段落、篇章中的位置信息。于是有研究者提出句子顺序预测(Sentence Order Prediction, SOP) 任务,通过预测句子之间的顺序关系,从而学习其位置信息,这一方法在 ALBERT[15]、StructBERT[16]、ERNIE(Baidu)[5][17]等模型中均有体现。在百度提出的 ERNIE 模型中,这种关系得到进一步拓展,通过将句子关系扩展到文档 位置关系、修辞关系、检索相关性关系等,丰富了句子间关系的语义特征学习。

image.png

ALBERT
1、n-gram mask,假设n=3,则在mask时,按照一定的概率,分别选择连续mask3个、2个和1个token,增加模型在预测[MASK] token时的难度;
2、隐藏层之间参数共享。假设是base版本的ALBERT,那么12层参数共享,大大降低了显存占用。此外要说的是,之前让我倍感困扰的一个问题——ALBERT的12层参数,如何在反向传播时仍然保持一致?因为如果按照BERT来考虑,每一层的参数的梯度必然不同,在经过梯度更新后,原本一致的参数也不一致了,这就违背了ALBERT的初衷。所以说,ALBERT实际上可以被看做只有1层参数,但这一层参数在反向传播时被更新了12次;
3、拆解了embedding层。原本embedding的规模为VH,而ALBERT将其拆分成两个更小的矩阵,设embedding_size = E, 则是VE + E*H。E=128,128的size足够编码大量的字符信息了;
4、将NSP任务改为SOP任务:原本BERT的NSP任务中的两个句子,是随机选取的、可能来自不同文章的。SOP则是将两个连续的句子随机调换位置,让模型去预测顺序是否有误。

structBERT
1、word structural objective:在句子中引入词乱序(“乱序不改其义”的思想,增大理解难度)。原文设置K=3,即最大的乱序范围是3,一个字被打乱顺序后,最远被shuffle到小于3这个范围内的位置。此外,该乱序执行与非mask的tokens上,然后要模型对连续shuffle的3个token预测出其原本的顺序;
2、Sentence Structural Objective:这就相当于一个更难的SOP任务,和ERNIE2.0的Sentences Distance任务极像。对于两句话(S1, S2),同样是3分类问题,label-0代表S1在S2之前,label-1代表S2在S1之前,label-2代表二者不选自于一个document

ERNIE2.0
词层面:
1、Knowledge Masking:传统MLM + 短语mask & 实体mask;
2、Token-Document Relation:预测出现在当前segment中的某token,是否会出现在其他segment中。此任务意在判断当前token是否是该segment的关键词,因为关键词会较少多次地出现;
3、Capital Prediction:预测一个word的首字母是否大写,显然,这是个英文only的任务。
篇章结构(句)层面:
1、Sentences Reordering:将一个样本中的k个句子打乱顺序,按照全排列公式,它共有N = A(k, k)种可能的顺序(假设k=3,则共有N=6种顺序),所以相当于一个N分类的问题;
2、Sentences Distance:相当于ALBERT-SOP任务的强化版本,是一个3分类任务。label-0意味着两个句子相邻、label-1意味着两个句子来自同一个segment但非相邻、label-2意味着两个句子不来自同一个segment。
语义层面:
1、Discourse Relation:语篇关系任务:预测两个句子之间语义或修辞学上是否有关;
2、IR Relevance:从题目即可看出,这是个和IR有关的任务。该任务对query和待选文本的title的相关性进行预测,该title就是候选document的title,所以是短文本匹配的3分类任务。该数据发挥了百度搜索的优势,即来自百度搜索。label-0意味着,用户输入query,搜索到待选答案后并进行点击的样本,是强相关;label-1意味着用户query搜到的,但没有被用户点击的样本,是若相关;label-2是不相关样本,随机选取。
3、提出了个持续学习框架,可实践性不佳。

(3)通过融合外部知识库获取显性领域知识

K-BERT
Liu 等提出的 K-BERT[18]模型从 BERT 模 型输入层入手,将实体关系的三元组显式地嵌入到输入层中,如原始的文本输入 为:“Tim Cook is visiting Beijing now”,其被改造为“Tim Cook CEO Apple is visiting Beijing capital China is_a City now”,于是相关的知识便显式的嵌入到输入 的句子中了。

ERNIE(Tsinghua)
ERNIE(Tsinghua)[9] 以 DAE 的方式在 BERT 中引入了实体对齐训练目标。

(4)改进 Transformer 结构以适应更多应用场景

UniLM
Unified Language Model(UniLM)集成了OpenGPT等自回归模型和BERT的双向上下文建模思想两者优点,可以用于语言理解和生成任务。UniLM使用三种类型的语言建模任务进行了预训练:单向,双向和序列到序列的预测。通过使用共享的Transformer-Encoder结构,并利用特定的self-attention mask来控制预测条件所处的环境,可以实现统一建模。
「文本分类入门与实战」课程demo - 图97

MASS
MASS将 GPT 和 BERT 两种预训练模型的结构结合起来,提出了“序列到序列(Sequence to Sequence)”的预训练模型。
「文本分类入门与实战」课程demo - 图98

BART
Facebook 提出的 BART 模型[7]同样采用 Transformer-Encoder+Decoder 的结构, 借助 DAE 语言模型的训练方式,能够很好地预测和生成被“噪声”破坏的文本, 从而也得到具有文本生成能力的预训练语言模型。

T5
Google 所提出的 T5[39] 模型同样采用完整 Transformer 结构,借助更大规模的计算能力和训练语料发掘了这一模型结构的巨大优势,在 17 个 NLP 任务中达到最好效果。

(5)利用预训练模型压缩提升应用效率

image.png

DistilBERT[48] 在预训练阶段蒸馏,以原始的bert-base作为teacher,其学生模型具有与 BERT 一样的体系结构但层数减半(12→6)。 DistilBERT 使用了 6600 万参数,在 GLUE 基准测评[49]上实现了 BERT-base 97% 的性能,速度提升了 60%

TinyBERT[52] 在设计上较distillBert做了更多的工作,他对 BERT 的嵌入层、输出层、Transformer 中的隐藏层、注意力矩阵都设计了损失函数,来学习 BERT 中大量的语言知识。并使用了两段式学习框架,分别对 BERT 预训练阶段和微调阶段进行蒸馏。TinyBERT 在 GLUE 测评基准上可以达到 BERT-base 96%以上的效果,模型预测速度则是 BERT-BASE 的 9.4 倍。

ALBERT 对词嵌入矩阵使用了矩阵分解完成 BERT 模型的压缩,并共享了隐藏层间的参数。在不损 失模型性能的情况下,显著的减少了模型参数量。

分类算法常用损失函数

1 Hinge Loss

铰链损失 Hinge 主要用于支持向量机中,用来解决SVM中的间距最大化问题。它的称呼来源于损失的形状,定义为:
「文本分类入门与实战」课程demo - 图100%3D%5Cmax%20(0%2C1-y%20%5Chat%7By%7D)#card=math&code=l%28%5Chat%7By%7D%2C%20y%29%3D%5Cmax%20%280%2C1-y%20%5Chat%7By%7D%29&id=ULkl8)

其中 y 的标签为1或-1,「文本分类入门与实战」课程demo - 图101#card=math&code=%5Chat%7By%7D%3Df%28x%29&id=OBezn) 是分类器输出的预测值。如果分类正确,loss为0,否则为 「文本分类入门与实战」课程demo - 图102。其含义为,当 y 和 「文本分类入门与实战」课程demo - 图103#card=math&code=f%28x%29&id=NkJLX) 的符号相同时(表示预测正确)并且 「文本分类入门与实战」课程demo - 图104%7C#card=math&code=%7Cf%28x%29%7C&id=Rmmgl)≥1 时,hinge loss为0;当 y 和 「文本分类入门与实战」课程demo - 图105#card=math&code=f%28x%29&id=LOWCu) 的符号相反时,hinge loss随着 「文本分类入门与实战」课程demo - 图106#card=math&code=f%28x%29&id=TaBLf) 的增大线性增大。也即是,hinge损失不仅会惩罚错误的预测,也会惩罚那些正确预测但是置信度低的样本.

2 Categorical / multiclass hinge

hinge loss 仅适用于实际目标值为 +1 或 -1 的二元分类问题,但还有许多其他问题无法以二元方式解决。所以多类 hinge Loss 被提出,其公式如下:

「文本分类入门与实战」课程demo - 图107%3D%5Csum%7By%20%5Cneq%20t%7D%20%5Cmax%20%5Cleft(0%2C1%2B%5Cmathbf%7Bw%7D%7By%7D%20%5Cmathbf%7Bx%7D-%5Cmathbf%7Bw%7D%7Bt%7D%20%5Cmathbf%7Bx%7D%5Cright)#card=math&code=%5Cell%28y%29%3D%5Csum%7By%20%5Cneq%20t%7D%20%5Cmax%20%5Cleft%280%2C1%2B%5Cmathbf%7Bw%7D%7By%7D%20%5Cmathbf%7Bx%7D-%5Cmathbf%7Bw%7D%7Bt%7D%20%5Cmathbf%7Bx%7D%5Cright%29&id=hpMSt)

3 Binary crossentropy

我们知道信息熵的定义公式为 「文本分类入门与实战」课程demo - 图108。假设有两个概率分布 「文本分类入门与实战」课程demo - 图109#card=math&code=p%28x%29&id=DPi81) 和 「文本分类入门与实战」课程demo - 图110#card=math&code=q%28x%29&id=RT32s),其中 「文本分类入门与实战」课程demo - 图111 是已知的分布(ground truth),「文本分类入门与实战」课程demo - 图112 是未知的分布(预测分布),交叉熵函数则是两个分布的互信息,可以反应两分布的相关程度:「文本分类入门与实战」课程demo - 图113

二元交叉熵的公式表达如下:
「文本分类入门与实战」课程demo - 图114%3D-%5Cleft(y%7Bi%7D%20%5Clog%20%5Chat%7By%7D%7Bi%7D%2B%5Cleft(1-y%7Bi%7D%5Cright)%20%5Clog%20%5Cleft(1-%5Chat%7By%7D%7Bi%7D%5Cright)%5Cright)#card=math&code=BCE%5Cleft%28y%7Bi%7D%2C%20%5Chat%7By%7D%7Bi%7D%5Cright%29%3D-%5Cleft%28y%7Bi%7D%20%5Clog%20%5Chat%7By%7D%7Bi%7D%2B%5Cleft%281-y%7Bi%7D%5Cright%29%20%5Clog%20%5Cleft%281-%5Chat%7By%7D%7Bi%7D%5Cright%29%5Cright%29&id=PKS8p)

Loss的推导过程如下:(从极大似然出发得出二分类交叉熵损失形式)

「文本分类入门与实战」课程demo - 图115

4 Categorical crossentropy

categorical crossentropy (CE) 损失如下:
「文本分类入门与实战」课程demo - 图116%3D-%5Csum%7Bi%3D1%7D%5E%7BM%7D%20y%7Bi%7D%20%5Clog%20%5Chat%7By%7D%7Bi%7D%0A%5C%5C%0A%5Chat%7By%7D%7Bi%7D%3D%5Cfrac%7Be%5E%7Bz%7Bi%7D%7D%7D%7B%5Csum%7Bk%7D%20e%5E%7Bz%7Bk%7D%7D%7D%0A#card=math&code=CCE%5Cleft%28y%7Bi%7D%2C%20%5Chat%7By%7D%7Bi%7D%5Cright%29%3D-%5Csum%7Bi%3D1%7D%5E%7BM%7D%20y%7Bi%7D%20%5Clog%20%5Chat%7By%7D%7Bi%7D%0A%5C%5C%0A%5Chat%7By%7D%7Bi%7D%3D%5Cfrac%7Be%5E%7Bz%7Bi%7D%7D%7D%7B%5Csum%7Bk%7D%20e%5E%7Bz%7Bk%7D%7D%7D%0A&id=jcdFF)

原始的 softmax 函数非常优雅、简洁,广泛应用于分类问题。它的特点就是优化类间的距离非常棒,但是优化类内距离时比较弱。Softmax Loss 在 TensorFlow 中的实现可以如下:

  1. # 得到句子表示 e
  2. e = tf.reshape(newe_final.stack(), [-1, self.n_hidden])
  3. # 将句子表示转换为一个 T 维向量(T 为类别数)
  4. self.predict = tf.matmul(e, weights['softmax']) + biases['softmax']
  5. # 计算总损失
  6. self.total_loss = tf.nn.softmax_cross_entropy_with_logits(logits = self.predict, labels = self.labels))
  7. # 计算平均损失
  8. self.loss = tf.reduce_mean(self.total_loss)

5 Sparse categorical crossentropy

当 label 是整数目标而非分类格式时,可使用Sparse categorical crossentropy!它的执行方式与常规分类交叉熵损失非常相似,但允许使用整数目标!

6 Kullback-Leibler divergence

KL散度用来衡量两个分布之间的相似性,定义公式为:

「文本分类入门与实战」课程demo - 图117%3D%5Csum%7Bi%7D%20p%7Bi%7D%20%5Clog%20%5Cleft(%5Cfrac%7Bp%7Bi%7D%7D%7Bq%7Bi%7D%7D%5Cright)#card=math&code=K%20L%28p%20%5Cmid%20q%29%3D%5Csum%7Bi%7D%20p%7Bi%7D%20%5Clog%20%5Cleft%28%5Cfrac%7Bp%7Bi%7D%7D%7Bq%7Bi%7D%7D%5Cright%29&id=A0Aba)

KL 散度是非负的,只有当 p 与 q 处处相等时,才会等于0。KL 散度也可以写成:

「文本分类入门与实战」课程demo - 图118%3D%5Csum%7Bi%7D%20p%7Bi%7D%20%5Clog%20p%7Bi%7D-p%7Bi%7D%20%5Clog%20q%7Bi%7D%3D-l(p%2C%20p)%2Bl(p%2C%20q)#card=math&code=K%20L%28p%20%5Cmid%20q%29%3D%5Csum%7Bi%7D%20p%7Bi%7D%20%5Clog%20p%7Bi%7D-p%7Bi%7D%20%5Clog%20q%7Bi%7D%3D-l%28p%2C%20p%29%2Bl%28p%2C%20q%29&id=gcuhz)

因此 「文本分类入门与实战」课程demo - 图119#card=math&code=KL%28p%7Cq%29&id=G2SbD)的散度也可以说是p与q的交叉熵和p信息熵的和。同时需要注意的时,KL散度对p、q是非对称的。

分类算法评价指标

详解机器学习中的Precision-Recall曲线

几个常用术语介绍:

TP(True Positives)意思是“预测为正样本,并且预测对了”(真阳性)
TN(True Negatives)意思是“预测为负样本,而且预测对了”(真阴性)
FP(False Positives)意思是“预测为正样本,但是预测错了”(假阳性)
FN(False Negatives)意思是“预测为负样本,但是预测错了”(假阴性)

针对不同的目的,人们提出了多种文本分类器性能评价方法,包括召回率、正确率、F1 score、微平均和宏平均、平衡点(break-even point)等,以下介绍其中的几种。

Accuracy and Error Rate

正确率是被分对的样本数在所有样本数中的占比,错误率则与正确率相反,描述被分类器错分的比例

「文本分类入门与实战」课程demo - 图120%7D%7BN%7D%2C%5Cquad%20Error%5C%20rate%3D%5Cfrac%7B(FP%2BFN)%7D%7BN%7D%0A#card=math&code=Accuracy%3D%5Cfrac%7B%28TP%2BTN%29%7D%7BN%7D%2C%5Cquad%20Error%5C%20rate%3D%5Cfrac%7B%28FP%2BFN%29%7D%7BN%7D%0A&id=sNRoa)

Precision / Recall / F1 score

  • 查准率是精确性的度量,表示被分为正例的示例中实际为正例的占比
  • 查全率是覆盖面的度量,度量有多少个正例被分为正例
  • F1 score 用于综合查准率和查全率,可分为微平均 F1和宏平均 F1,通常采用微平均
    • 微平均是平等的对待每个样本,直接根据计算公式计算出总的查准率和查全率
    • 宏平均是首先计算出每个类别的P和R,然后对P和R分别取平均得到总的查准率和查全率

「文本分类入门与实战」课程demo - 图121

ps: 对于多分类问题,可以对每一类计算,然后求平均值。

ROC 曲线和 PR 曲线

ROC 曲线。平面的横坐标是false positive rate(FPR),纵坐标是true positive rate(TPR)。对某个分类器而言,我们可以根据其在测试样本上的表现得到一个TPR和FPR点对。这样,此分类器就可以映射成ROC平面上的一个点。调整这个分类器分类时候使用的阈值,我们就可以得到一个经过(0, 0),(1, 1)的曲线,这就是此分类器的ROC曲线。

「文本分类入门与实战」课程demo - 图122

PR曲线是Procision Recall Curve的简称,描述的是precision和recall之间的关系, 以recall为横坐标,Precision为纵坐标绘制的曲线。随着召回率的增大,那么精确率整体上可能会呈下降趋势,如下图所示。因此,Precision-Recall曲线很好地展示了在不同阈值取值下精确率和召回率的平衡情况。同时,从上面的分析可知,最理想的情况便是随着召回率的提升,精确率也逐步保持提升或保持不变。

在基于PR曲线的基础上,可以通过计算曲线下面积(Area Under the Curve, AUC)来得到一个整体的评估值,高AUC也就意味着高精确率和高召回率,AUC的值越大也就意味着模型的效果越好。

「文本分类入门与实战」课程demo - 图123

Mean Reciprocal Rank (MRR)

MRR常被用于评估NLP任务中排序Ranking的性能,如查询文档排序和QA。其中Q是所有可能答案的集合,「文本分类入门与实战」课程demo - 图124是真实答案的排名位置。
「文本分类入门与实战」课程demo - 图125

文本分类目前面临的挑战

现有的DNN模型已经显示出它们在文本分类中的有用性,但是仍有许多可能的改进需要探索。尽管一些新的文本分类模型反复刷新了大多数分类任务的准确性指标,但它无法指示模型是否像人类一样从语义层面“理解”文本。此外,随着噪声样本的出现,小的样本噪声可能导致决策置信度发生实质性变化,甚至导致决策逆转。因此,需要在实践中证明该模型的语义表示能力和鲁棒性。此外,关于上下文无关词向量的传输策略的现有研究仍是相对初步的。因此,我们从数据,模型和性能的角度得出结论,文本分类主要面临以下挑战:

数据层面:对于文本分类任务,无论是浅层学习还是深度学习方法,数据对于模型性能都是必不可少的。研究的文本数据主要包括短文本,跨语言,多标签,少样本文本。对于这些数据的特征,现有的技术挑战如下:

  • Zero-shot/Few-shot learning。当前的深度学习模型过于依赖大量标记数据。这些模型的性能在零样本或少样本学习中受到显着影响。
  • 外部知识。我们都知道,输入的有益信息越多,DNN的性能就越好。因此,认为添加外部知识(知识库或知识图)是提高模型性能的有效途径。然而,如何添加以及添加什么仍然是一个挑战。
  • 多标签文本分类任务。多标签文本分类需要充分考虑标签之间的语义关系,并且模型的嵌入和编码是有损压缩的过程。因此,如何减少训练过程中层次语义的丢失以及如何保留丰富而复杂的文档语义信息仍然是一个亟待解决的问题。
  • 具有许多术语词汇的特殊领域。特定领域的文本(例如金融和医学文本)包含许多特定的单词或领域专家才可理解的术语、缩写等,这使现有的预训练词向量难以使用。

模型层面:现有的浅层和深度学习模型的大部分结构都被尝试用于文本分类,包括集成方法。BERT学习了一种语言表示法,可以用来对许多NLP任务进行微调。主要的方法是增加数据,提高计算能力和设计训练程序,以获得更好的结果如何在数据和计算资源和预测性能之间权衡是值得研究的。

性能评估层面:浅层模型和深层模型可以在大多数文本分类任务中取得良好的性能,但是需要提高其结果的抗干扰能力。如何实现对深度模型的解释也是一个技术挑战。

  • 模型的语义鲁棒性。近年来,研究人员设计了许多模型来增强文本分类模型的准确性。但是,如果数据集中有一些对抗性样本,则模型的性能会大大降低。因此,如何提高模型的鲁棒性是当前研究的热点和挑战。
  • 模型的可解释性。DNN在特征提取和语义挖掘方面具有独特的优势,并且已经完成了出色的文本分类任务。但是,深度学习是一个黑盒模型,训练过程难以重现,隐式语义和输出可解释性很差。它对模型进行了改进和优化,丢失了明确的准则。此外,我们无法准确解释为什么该模型可以提高性能。

文本分类模型优化方法

如何你已经掌握了基本的文本分类理论和实战技巧,那么接下来你可能会需要一些方法来让你的分类模型更优,这些用于提升的方法被称为 trick,可能适用也可能不适用,需要你自己结合实际的情况来使用。

本文给你推荐两个调参炼丹常见技巧的总结手册:

参考

【文本分类大综述:从浅层到深度学习】A Survey on Text Classification: From Shallow to Deep Learning

【文本分类 DL 方法综述】Deep Learning Based Text Classification: A Comprehensive Review

邱锡鹏老师关于NLP预训练模型的综述《Pre-trained Models for Natural Language Processing: A Survey》

Python机器学习笔记:常用评估模型指标的用法
《PRML》 的第四节-分类的线性模型
《统计自然语言处理》第 13 章