当前位置:   article > 正文

《文本上的算法——深入浅出自然语言处理》读书笔记:第3章 让机器人可以像人一样学习

文本上的算法

目录

第3章 让机器人可以像人一样学习

3.1 何谓机器学习

3.2 逻辑回归/因子分解机

3.3 最大熵模型/条件随机场

3.4 主题模型

3.5 深度学习

3.5.1 基本概述

3.5.2 文本表示

3.5.3 词表示

3.5.4 句子表示

3.5.5 深度学习模型及其一些应用

3.6 其他模型

3.6.1 kNN

3.6.2 k-means

3.6.3 树模型/集成学习

3.6.4 SVM


第3章 让机器人可以像人一样学习

3.1 何谓机器学习

机器学习的核心就是特征、模型和训练样本(标注数据或未标注数据)。线下训练模型的时候,首先要对训练样本抽取特征,然后训练出一个机器学习模型(模型的结构和参数)来,线上预测的时候也是提取特征,然后用训练好的模型预测输出值。训练样本趋于无穷多时,模型训练得虽好,但是现实中拿到更多的训练样本代价太大,再加上特征表示和模型本身都不会是最优的,所以机器学习一般得到的都是近似解。

不同的机器学习任务需要不同的特征和模型,有的问题模型是可以通用的(比如分类问题),但是特征却不能通用,需要根据不同的问题来选取,深度学习的一个目标就是能自动学习出特征(针对某些单一任务),而不用再专门提取特征。

特征工程大致有这么几个步骤:

(1)特征选取。一般都是选取最有用、最能区分样本的特征,并不是特征越多越好,特征过多会导致稀疏性更严重。

(2)特征离散化。离散化的目的是为了特征在区间上有更好的区分性。

(3)特征交叉。一维特征有时候会很奇怪,将不同特征组合起来更有意义。

(4)特征修正。这个更多是为了平滑。

监督学习通常分为两个模型:生成式模型和判别式模型。

判别式模型(它的概率图是无向图)是求解条件概率的,然后直接进行预测,例如,逻辑回归、SVM、神经网络、CRF都是判别式模型,所以判别式模型求解的是条件概率。

生成式模型(它的概率图是有向图)首先求解两个概率,然后根据贝叶斯法则求出后验概率,再进行预测。

判别式模型只需要关注类的边界就可以了,并不需要知道每一类到底是什么分布,这样它只需要有限样本就可以确定;而生成式模型要得到每类的具体分布,然后根据每个分布去判断类别,它的训练集自然需要无限样本,学习复杂度也高。造成两个模型样本空间不同的原因在于计算条件概率的时候我们已经“知道”了一部分信息,这部分已经知道的信息缩小了可能取值的范围,即缩小了它的样本空间。

由生成式模型可以得到判别式模型,但由判别式模型得不到生成式模型。

3.2 逻辑回归/因子分解机

逻辑回归在线性回归的输出y上引入了一个函数

该函数(称为sigmoid函数)的作用就是可以把某个值映射到(0,1)区间:

这样,整个逻辑回归公式就为:

如果我们选用和线性回归模型一样的平方损失作为目标函数(没有正则化) ,即:

那么就会有个问题,由于是sigmoid函数,导致目标函数不是凸函数,那么就没有最优解,所以我们就需要做些工作使得目标函数是凸函数。

在书中接下来是通过最大似然估计来求解最优解,略去,直接给出最后的推导结果。

3.3 最大熵模型/条件随机场

最大熵模型背后的原理其实非常简单:当我们对一个随机变量的分布预测时,对已知条件一定要满足,对未知数据一无所知时,不要做任何主观假设,要同等对待。这时,它们的概率分布最均匀,风险就越小。概率分布最均匀就意味着信息熵最大,所以就叫最大熵模型。

假设样本集为,X为输入,Y为输出,比如对于文本分类问题,X就为输入文本,Y就是类别号;对于词性标注问题,X就为词,Y就是词性。可以看出,在不同的问题中,输入X和输出Y比较多样化,为了模型表示方便,我们需要输入X和输出Y表示为一些特征。对于某个,定义特征函数:

那么特征函数的样本期望就可以表示为:

而特征函数的模型期望表示为:

 样本期望是从样本数据中计算的,模型期望是从我们希望要求解的最优模型中计算的,而且,模型期望最终简化为条件概率,它就是我们要求解的模型。

机器学习就是从样本中学习到真实模型,也就是说模型期望应该可能地等于从数据中观察到的样本期望,这样就出现了一个约束条件:

目标函数是要使熵(条件熵)最大,,所以最大熵模型就是(是变量):

模型求解过程略。

总结一下,最大熵模型的条件概率分布为:

IIS算法的流程: 

 条件随机场(CRF)

CRF的条件概率分布是

它的概率图如图所示

CRF利用了上下文信息,而且最后的条件概率也是全局最优(无标记偏置问题),所以它对标注问题(分词、词性标注、实体识别等) 效果更好一点。

3.4 主题模型

主题模型是自然语言处理(NLP)中非常有影响力的模型之一,因为它的初衷就是解决NLP中的语义问题,尽管这距离真正意义上的语义有很大距离。计算机用一些最能反映中心思想的词来表示(这就产生了一个假设:bag of words。这个假设是指一个文档被表示为一堆单词的无序组合,不考虑语法、词序等)。对于一篇文档,我们希望能得到它的主题(一些词),以及这些词属于哪些主题的概率,这样我们就可以进一步分析文档了。

主题模型最经典的模型有2个:PLSA和LDA。

首先来看一下PLSA模型。表示文档,表示词语,z表示隐含的主题。表示单词在文档中出现的概率,表示主题在给定文档中出现的概率,表示单词在给定主题下出现的概率。PLSA是个典型的生成模型。

 由于词和词之间是互相独立的,文档和文档间也是相互独立的,那么整个样本集的分布为

样本集的log似然函数为

其中,表示单词w在文档d中出现的次数,n(d)表示文档d中词的个数。对这个函数求导解出参数要使用EM算法。

EM算法就是根据已经观察到的变量对隐藏变量进行学习的方法。既然没办法最大化,那么就优化的下限,不断迭代提高这个下限,就可以得到近似最优解了。这个下限其实就是似然函数的期望。通常,EM算法得到的是局部近似解。

推导过程省略,直接给出推导结果如下

在这儿总结一下经典的EM算法。假设log似然函数为,那么EM算法步骤为:

LAD对参数增加了先验分布(所以理论上LDA比PLSA不容易过拟合),也就是说参数也是一个分布,这个分布的参数(参数的参数)叫做超参数。

LDA的图模型

同样,可以写出LDA的似然函数,然后使用最大似然估计求解参数,但是似然函数参数耦合太大,无法求解出来,而且包括隐藏变量,所以就像PLSA一样,想到了EM算法,但是LDA相比PLSA还有一个困难:后验概率无法求解出来(EM算法中E-step要求解后验概率),那么这时就又要近似计算了,即使用变分-EM算法。

变分推理是一种近似计算后验概率的方法,首先寻找一个和原来不能直接求解的后验概率等价或者近似的函数Q,然后就通过求解最优近似函数Q的参数来近似得到后验概率的参数。

变分-EM算法迭代的流程如下:

求解LDA的参数还有一种方法:Gibbs Sampling。

Gibbs Sampling算法是MCMC的一个特例,如果某个概率P(X)不易求得,那么可以交替地固定某一维度,然后通过其他维度(去除的其他所有值)的值来抽样近似求解,也就是说,Gibbs采样就是用条件分布的采样来替代全概率分布的采样。

整个基于Gibbs Sampling的LDA算法流程为:

训练模型后就可以得到P(w|t)和P(t|d)。

3.5 深度学习

传统的机器学习需要提取特征,然后建立模型学习,但是特征是人工提取。深度学习就可以这样,所以也叫无监督特征学习。

3.5.1 基本概述

机器学习的过程是受人的学习机制的启发,神经网络就是模拟人脑中的神经元的工作方式。1957年提出的感知机模型,是最简单的人工神经网络。

20世纪80年代,人们提出的神经网络是比感知机稍微复杂的非线性模型,最经典的就是BP神经网络,它由三层网络模型(输入层、隐藏层、输出层)。

这些浅层网络有很多缺点:初始值的选取是随机的,很容易收敛到局部最优解,导致过拟合;如果增加隐藏层的话,就会使传递到前面的梯度越来越稀疏,收敛速度很慢;它没有利用海量的未标注数据,所以很难有大的突破。

为了克服浅层神经网络的训练缺陷,早期的深度学习是在海量数据中采用贪婪式的逐层学习方法:首先是无监督训练,单独训练一层,然后把该层的输出作为下一层的输入,使用相同的方法一直向上训练;然后到最上层是一个有监督的从上到下的微调。所以深度学习相比神经网络最大特点是深层网络的训练算法和训练技巧以及大规模的数据集,一般来说使用深度学习有两个框架。

(1)无监督学习 + 有监督学习:首先从大量未标注数据中无监督逐层学习特征,然后把学习到的特征放到传统的监督学习方法来学习模型。

(2)有监督学习:首先逐层学习,到网络最上层是一个分类器(例如,softmax分类器),整个是一套深层网络模型。

从深度学习到现在,已经有学者逐步提出了不少模型,目前使用较多的有:

DNN(深度神经网络);

CNN(卷积神经网络);

RNN(递归神经网络);

GAN(生成对抗网络);

Seq2Seq(端对端模型框架)。

深度学习的优势在于海量训练数据和好的训练模型,既然有海量训练数据,那么对计算性能就会有很高的要求,一般都是使用GPU来训练深度学习模型。

3.5.2 文本表示

在自然语言处理中有个假设:bag of words。一篇文档由很多词组成,如果把字典中所有词按照字母顺序排成一个很长的向量,那么每篇文档就可以使用这个长向量来表示了。某个词出现了,就标记为1,没有出现的词标记为0。可以想象,每个文档将会是一个稀疏向量,把文档表示成向量就会有很多缺点。例如,“电脑”和“计算机”有很大的语义相似性,但是表示成向量它们就没有语义关系了,因为它们在词典中的不同位置,不管用什么方法都没法计算出很好的相似性,也就是说把词表示成一个槽位是不合理的。

深度学习在文本上的应用,也都是把句子通过深度学习模型表示成向量,然后再对得到的向量进行各种任务。

把词或者句子表示成向量的意义:

(1)变换。就像在信号处理中,当信号在时域不好处理的时候,就通过傅里叶变换或者小波变换把它映射到频域中处理,处理完后再映射回时域中。把句子表示成向量也可以认为是同一个思路。

(2)量化。自然语言很难量化,所以表示成向量可以认为是一种新的量化方式。

3.5.3 词表示

词表示(Word Embedding)是一个很好的模型,它相当于把词“表示”出了更丰富的信息,这样就有可能看到bag of words看不到的信息。

对于词的表示就是想办法把词表示成了一个向量。既然表示成向量了,那么两个词之间就可以计算相似性了。词表示是通过神经语言模型来训练得到的(是语言模型的一个副产品,语言模型训练完了,词表示也有了)。目前大致有两种框架:NNLM和RNNLM。

NNLM是一个三层语言模型。

它根据已知的前n-1个词来预测下一个词,整个网络的输出计算公式为

可以看出,这个模型的计算复杂度很高,尤其是隐藏层到输出层的那个大矩阵相乘,为了降低计算复杂度,就提出了一些改进的模型,例如LBL。

RNNLM很上面的方法原理一样,但是思路有些许不同。

 它的计算公式为

评价词向量靠不靠谱主要还是要看它应用到具体任务的指标。既然将词表示成了向量,那么向量之间就可以计算内积、加减等运算,如果两个词有语义关系,那么它们就可以体现在向量上表示出来,就是计算内积。语料越大,那么词向量就越好,数据越多,对统计方法来说越有利,而且如果在同一领域内的话,数据就相对不会太稀疏,效果又会更好。所以一般我们处理任务的方法就是,先在通用的领域上完成某个任务,要想达到更好的效果,就要细分领域来处理(所以分类问题是任何领域都会涉及的问题)。

词表示只能给一个词训练出一个向量,然而在实际应用中,一些词会有多个意思,那么一个向量就表示不了多个语义,所以我们设计了一个很简单的模型,我们把它称之为Word Multi-Embedding,它可以训练出一个词的多个语义向量。

有以下几种方法可以将词的丰富含义融合到词表示模型中:
(1)使用Topic model可以得到每个词在每个类别的概率,然后可以融合到词表示模型中,但是该方法对长尾词效果并不好。

(2)使用词聚类可以将词类别聚出来,而且可以得到聚类中心点,然后对每一个词都可以根据上下文归入某一类,然后融合到词表示模型中。该方法训练速度很慢,而且同方法(1)都有一个缺点,就是长尾类别没法聚出来。

(3)如果能实现挖掘出各个词属于某些类别的先验概率,那么也可以融合到词表示中。

目前词向量一般也有两种用法:

(1)把词向量当做一个特征,加入到现有的NLP任务中。我们曾经尝试将词向量作为命名实体识别的一个额外特征,效果虽然有提升,但是并不像在图像和语音应用中那么明显,还需进一步探索。

(2)直接把词向量作为神经网络的输入完成一些NLP任务。

3.5.4 句子表示

句子表示自然就是把句子表示成一个向量。当把词表示成向量之后,自然会有一种想法:句子由词组成,那么句子向量也可以用词的向量组合起来,于是就有了两种方法:第一种是直接将词向量累加去平均来表示句子向量;第二种其实是2-gram的方法。

将词向量组合成句子向量,直观上应该不能表示句子含义,所以加一些结构进去应该会能更好地表示句子,所以就有了ReNN模型。

3.5.5 深度学习模型及其一些应用

3.5.5.1 损失函数和学习方法

在RNN模型中,一般使用交叉熵作为损失函数。

学习算法有很多种,前面讲的梯度下降法或者mini-batch梯度下降法就是较常用的算法。然而梯度下降法速度太慢,所以有一些优化算法,如下所示。

动量法:它对当前迭代的更新中加入上一次迭代的更新。 

AdaGrad是自适应地为各个参数分配不同学习率的算法。

AdaDelta是用一阶的方法近似模拟二阶牛顿法的算法。

Rmsprop是Hinton提出的一种也可用于mini-batch learning上而且效果很不错的训练算法。

3.5.5.2 RNN 

BP神经网络每层之间的节点没有任何连接,这样对很多需要依赖上下文信息的问题就束手无策,比如在语言模型中,要预测下一个词是什么,必须依赖于前面的词。RNN模型能较好地利用上下文信息,它的隐藏层之间是之间连接的,也就是说当前隐藏层的输入不仅包括当前输入层,而且还包括先前的隐藏层。

RNN的训练一般使用BPTT算法,但在误差计算的过程中会出现梯度爆炸和梯度消失问题。

3.5.5.3 RNN变种模型 

LSTM网络是专门设计用来避免长期依赖的,它可以说是一种优化的RNN,它和RNN的区别就是在隐藏层的设计。

LSTM在隐藏层引入了一些新的概念:细胞单元(Cell)和门(Gate),细胞单元是利用先前的状态和当前的输入产生的新的信息;门其实就是一个开关,它决定哪些信息通过或者通过多少,就像我们日常生活中门的作用一样,门开了可以通过,门关了不能通过。

GRU是一种更简单的变种模型,它不但可以有效避免梯度消失,而且有着比LSTM更加简单的网络结构。

 CW-RNN是一种改进的RNN模型,它在隐藏层引入了时钟频率来解决长期依赖问题。CW-RNN也是由输入层、隐藏层和输出层组成,不同于RNN的是,隐藏层的神经元被划分为若干个组,设为g。每一组中的神经元个数相同,并且给每一个组分配了一个时钟周期,每一个组中的所有神经元都是全连接,但是组j到组i的循环连接要满足,假设时钟频率是递增的从左到右,那么组间连接便是从右到左。

 LSTM是RNN的很重要的优化,在文本的应用总,最终都通过LSTM把输入转化为一个state向量(encoder),然后对这个state向量进行生成或者其他处理(decoder)。但是这就有一个很明显的缺点:context越大,表示成固定的向量后损失的信息就越多。而事实上,在decoder的时候,完全可以利用state向量和已经知道的context信息,而且并不是所有context信息都有用,只有部分context信息会对下一状态产生影响,这就是attention,选择合适的context生成下一状态。实现中,attention就是一个和context长度一样的向量,它的权重代表该context对于当前时刻的重要程度。这就是attention-based思想。也就是在预测新的词的时候不仅需要前一时刻的词,还需要权重结合的输入序列的信息。

深度学习框架简单清楚,但是要想得到好的模型(避免过拟合,训练速度快等),在实际操作的时候就会需要很多的技巧,这需要读者结合自己的任务来具体操作。

(1)正则化,比如L1或者L2正则。

(2)Dropout,也就是说每次随机把一些神经元剔除掉,不对它们进行更新。

(3)增加验证集,如果验证集上效果变差,就停止训练。

(4)增加并仔细筛选训练数据。

(5)权重初始化,一般用高斯分布或者均匀分布。

(6)各种调参。Batch的大小、各层神经元的数量、dropout的比例以及学习速率等等。

(7)激励函数的选择,比如ReLU等。

(8)在做文本任务的时候,如果词汇量太大,最后一层计算Softmax的分母时计算量太大,所以对Softmax有一些优化方法,如Hierarchical softmax,Noise Contrastive Estimation、Approximate softmax。

3.5.5.4 CNN

CNN是一个在图像领域很成功的一个模型,不同于BP这种全连接神经网络,CNN通过卷积层来替代全连接,这样的好处是可以感知局部区域和权重共享,在卷积层之后是一个下采样层(subsampling或者叫pooling),下采样层可以降低特征维数,避免过拟合,在经过一系列的卷积层和下采样层交替后,相当于提取出了样本的抽象特征,然后是全连接层输出最终的结果。

 3.5.5.5 GAN

 GAN需要同时训练两个网络:G(Generator,生成网络)和D(Discriminator,判别网络)。G网络输入一个随机噪声z,生成一个伪图片,记为;D网络它对输入的图片x判别真伪,记为,在训练过程中,G的目标就是尽量生成真实的图片去欺骗D,而D的目标就是尽量把G生成的图片和真实的图片区分开来。其实,G和D就构成了一个动态的“博弈过程”。不断调整D和G,直到G可以生成足以“以假乱真”的图片,D难以判定G生成的图片究竟是不是真实的,也就是说首先要极大化D的判别能力,然后极小化将G的输出判别为伪图片的概率。这样我们得到了一个生成式的模型G,它可以用来生成图片。

3.5.5.6 深度学习模型的一些应用 

LSTM模型可以很好地利用上下文,所以它在语音识别、图像处理等领域都有一些不错的效果,在NLP领域最多的是在机器翻译、摘要提取、阅读理解和对话系统等这几个领域的尝试,这几个领域其实都是自然语言生成问题,最终结果都是输出一句话(这是深度学习和传统模型思想有很大差异的地方);当然还有在分类任务和序列标注以及搜索引擎和推荐系统中的尝试。

1.对话模型 

 机器翻译的任务就是给定一句话,然后生成另一句话,这样就可以使用LSTM模型,首先使用一个RNN模型把输入句子“ABC”表示成一个向量,然后把这个向量作为另一个RNN模型的输入,最后使用语言模型生成目标句子“WXYZ”。

 以上这些端对端的方法模拟对话时有一些缺陷,例如前后回答不一致、只能学习到一些泛泛的高频回复(“我不知道”“呵呵”等)。为了提高回复的多样性,有些人就开始优化。

 机器翻译问题是由明确的目标,也就是翻译的句子几乎是确定的;QA问题(更多的是知识性问答)也是有明确的答案;而对话问题则不同,回复不但取决于对方说的话,还依赖于语境以及回复人的知识、经验、性格等,同一句话可以有许多种回复,也就是说目标函数不清晰,所以这种端对端的方法模拟对话必然有缺陷。

2.阅读理解模型

阅读理解式的QA问题是给定一些事实和一个问题,输出正确答案,目前能用模型回答的问题比较简单,大多答案都是一个词,例如,“为什么”类型需要总结和推理的机器还是很难解决。现在主流的解决方案是利用IR技术,例如IBM Watson,先从大量文档里面使用IR技术检索出候选集,然后使用一些NLP技术抽选出最终答案。

Facebook提出了一种简单数据集上的解决思路,它的核心思路和主流解决方案是一样的,先找到候选集,然后使用模型训练出最佳答案,不同的是使用神经网络表示候选集并抽取答案。

3.匹配模型

在问答系统中,我们要找到最精确的答案,所以需要计算问题和答案的匹配程度,因为深度学习还有一类探索方向是使用深度学习对候选答案做匹配。

这三类方法是深度学习很典型的尝试,从效果上看,完全使用深度学习模型的方法在不同的任务中有不同的效果,还有很多值得进一步去探索的地方。

总之,深度学习也是机器学习模型,凡是能使用机器学习的地方都能尝试深度学习。深度学习有很多的模型,从最开始的Auto-Encoders、SparseCoding、RBMs、DBNs等模型,到现在使用较多的DNN、CNN、RNN、GAN、Seq2Seq等模型,它们在图像和语音取得了不错的成绩,在自然语言处理的应用上也在积极尝试。

3.6 其他模型

3.6.1 kNN

kNN(k最近邻)算法的思想比较简单:如果一个样本在特征空间中的k个最相似(即特征空间中“距离”最近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。这是一种监督学习的分类算法。

3.6.2 k-means

k-means(k均值)聚类算法是假定在欧氏空间下,并且k是事先确定的。首先随机选取k个质心(一般会选择尽可能相互远的点),然后将各个数据项分配给“距离”最近的质心点,分配后,该类下的质心就会要更新。该分配过程一直下去,直到聚类结果不再变化。

3.6.3 树模型/集成学习

DT(Decision Tree,决策树)

决策树是一个树结构。其每个非叶子节点表示一个特征属性上的判断,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,判断待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。其实就是从根节点开始,进行if-else判断,一直到叶子节点,就得到了分类结果。

决策树的构造,也就是如何根据特征属性确定每个分支,指导思想就是:这个分支一定要能最大化地区分不同类。为了确定哪个属性最适合用来拆分,ID3算法会计算相应的信息增益,所谓某个特征的信息增益,就是指该特征对数据样本的分类的不确定性的减少的程度,也就是说信息增益越大的特征具有更强的区分能力。ID3算法会针对每个特征属性计算相应的信息增益,然后从中选出信息增益最大的特征属性来划分子树。C4.5算法则使用的是信息增益比,信息增益比是在信息增益的基础上除了一项拆分信息,这样可以有效控制增益过大的问题。

Bagging

Bagging和Boosting是典型的集成学习模型。Bagging算法的思想非常简单,它从训练集中有放回地采样N个新训练集,然后训练出N个弱分类器,然后用多数投票的方法来决定最终的类别。随机森林是Bagging算法的升级版,它首先使用了决策树作为弱分类器,其次在训练决策树的时候并不是在所有的M个特征中选择一个最优的特征来做决策树的左右子树划分,而是随机选择节点上的一部分特征m(m<M),然后在这m个特征中,选择一个最优的特征来做决策树的左右子树划分。也就是说随机森林在训练集和特征上都做了随机选择,所以相比Bagging算法更不容易过拟合。

Boosting

Boosting算法的思想也非常简单,它也将若干个弱分类器(或者叫弱模型)组合起来,形成一个强大的强分类器(或者叫强模型)。和Bagging算法不同的是,Bagging的弱分类器的生成是并行的,而Boosting是串行的,后一个分类器取决于前一个分类器分错的样本,所以效果更好一点,其中最流行的一种就是AdaBoost算法。

GBDT

要想理解GBDT算法,就要知道两个概念Gradient Boosting和Boosting Decision Tree。Gradient Boosting与传统Boosting的区别是,每一次的计算是为了减少上一次弱模型的残差,而为了消除残差,我们可以在残差减少的梯度方向上建立一个新的弱模型。也就是说,Gradient Boosting中,每个新的弱模型的建立是为了使得之前弱模型的残差往梯度方向减少,这与传统Boosting对样本直接进行加权有着很大的区别。Boosting Decision Tree和传统Boosting的最大区别是其中的弱分类器(或者叫弱模型)是一个决策树,在GBDT中这个决策树是回归树,而不是分类树。

GBDT模型一方面可以作为单独的模型来解决一些分类或者回归问题;一方面可以把GBDT模型学习到的树当做特征融合到其他模型中来使用。具体做法就是,先用已有特征训练一个GBDT模型,然后利用GBDT模型学习到的树来构造新特征,最后把这些新特征加入原有特征一起训练模型(比如LR模型)。其中构造的新特征向量是二值的,它的长度等于GBDT模型里所有树包含的叶子节点数之和。向量中的每个元素对应于GBDT模型中树的叶子节点。当一个样本点通过某棵树最终落在这棵树的一个叶子节点上,那么在新特征向量中这个叶子节点对应的元素值为1,而这棵树的其他叶子节点对应的元素值为0。

3.6.4 SVM

由于SVM完备的理论背景,可以从线性可分扩展到线性不可分的情况,效果也很不错,它逐渐流行起来了。SVM是一个很经典的有监督分类模型。

如果线性方法无法区分则将问题映射到高维空间,然后在高维空间可以线性区分的话,那就可以同样使用之前的线性方法了。

用核函数可以把两个低维空间的向量映射到高维空间,而且同时把它们在高维空间里的向量内积值都算好了,也就是核函数。一个函数干了两件事,先映射到高维空间然后计算好了内积,使得我们不用关心高维空间到底是什么了,因为我们直接通过核函数拿到了结果。这样,在核函数给定的条件下,可以利用求解线性分类问题的方法求解非线性分类问题。

机器学习从解决问题的角度可以分为分类问题、聚类问题和回归问题。

分类就是把数据分到某一类,常用的模型有贝叶斯模型、kNN、SVM、最大熵模型等。

聚类问题是将数据根据相似性划归到不同的类,类内相似性大,类间相似性小,相当于从数据中发现这些潜在的关系,常用的算法有k-means、Topic model等。

回归是用来描述输入和输出之间的函数关系,是一个连续值,有线性回归和逻辑回归等,有时候把回归模型卡个阈值也就可以做分类问题了。

在NLP还有一类任务:序列标注问题,例如词性标注、专名识别等,它就是要给一个序列中的每个单元(词)都要赋予一个类别标签,相当于要对每个单元做一个分类,一般使用CRF等模型。

机器学习按照学习风格来分,可以分为监督学习、无监督学习和半监督学习。监督学习是需要有标注的数据来训练模型的,比如分类问题或者序列标注任务;无监督学习是不需要标注数据就可以训练模型的,例如聚类问题。半监督学习是利用少量标注数据和大量未标注数据进行训练模型的。

还有一些其他机器学习方法,强化学习会根据不同的动作给予不同的奖励,使得向更优的方向前进;主动学习更多的是一个思想,我们知道训练语料对机器学习的效果有很大的影响,所以如何挑选更有价值的训练语料是很重要的,那些模型解决错误的数据纠正过来加到训练语料中必将非常有效,这就构成了更新模型的一个循环流程,这也是模型优化很重要的一个点。

机器学习在文本任务上有个很重要的应用就是文本分类。传统的文本分类框架:

最重要的两步就是特征选择和模型训练。首先是特征选择,在前面提到过特征工程的方法(特征选择、特征离散化、特征交叉和特征修正) ,但是对于文本分类这种单一任务,只需要特征选择就够了,即找到哪些词可以代表该文本(因为词典太大,要降低特征向量的维数)。一般有文档频率、卡方公式、信息增益、互信息等方法,也就是根据这些计算值,对词进行排序,把阈值以下的词去掉,只剩下阈值以上的词用来表示文本。当选出词之后,要为每个词赋予一个值,来代表它对该文本的重要程度,一般有tf、tf*idf、熵权重等方法。在实际使用的时候,尤其是短文本,只用文本中的单个词来提取特征太稀疏,会对效果有很大影响,所以根据任务需要更多的特征,例如,2-gram、3-gram等等,之后就把提好的特征向量输入到机器学习模型中,例如:SVM、最大熵等这些都可以。

可以看出,传统的文本分类影响效果的主要是特征选取和分类器这两个模块,然而在深度学习的时候,没有了人工特征提取,取而代之的用深度学习模型训练的向量来代表文本,而且这个向量也是自动学习出来的,不需要人工来专门提取。

首先对使用one hot表示的原始句子中的每个词Embedding成一个向量表示,然后用深度学习模型表示成句子向量,然后来个softmax,这也是深度学习应用的一个通用框架。

 评价机器学习模型

真正类TP:被模型标为正的正样本;

假正类FP:被模型标为正的负样本;

假负类FN:被模型标为负的正样本;

真负类TN:被模型标为负的负样本。

真正类率TPR=TP/(TP+FN)

假正类率FPR=FP/(FP+TN)

常用的评价指标:

准确率P=TP/(TP+FP),反映了被模型判定的正类中真正的正类样本的比重;

召回率R=TP/(TP+FN),反映了被模型正确判定的正类占总的正类的比重;

F1值F=2*P*R/(P+R)。

常用的评价曲线有两种:PR曲线和ROC曲线。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/604269
推荐阅读
相关标签
  

闽ICP备14008679号