声明 | 本文为AI前线独家稿件,未经许可不得转载!
视频时长约1小时,wifi用户及流量土豪请随意,图文版回顾见下文:
大家晚上好,我是百分点科技的苏海波,非常高兴今天晚上能跟大家做这样一次技术分享。
今天我和大家分享的内容是《深度学习在文本分析中的应用》。主要包括:模型的原理,模型的调优技巧,以及在各种实际当中的应用。
我相信在座的同学有很多是从传统机器学习转到深度学习来的,另外有些同学也许接触机器学习时间比较短,刚开始上手就学习了深度学习方面的内容。这两方面的人,我都见过有不少。
我自己在 2011 年博士刚毕业的时候,做的是广告流量变现方面的工作。我记得那时候流量广告、计算广告、推荐算法,以及用户画像这些都是特别热门的话题。在这些领域的有很多场景都可以用到机器学习,比如广告的推荐、推荐的商品排序,以及用户画像的各种人口统计学特征的预测等等。
那个时候,遇到这些问题我们使用的最多的就是传统的各种机器学习模型,工业界很常见的逻辑回归模型:SVM、GBDT 等等。这种传统机器学习模型工作量最大的地方,有百分之六七十的都在特征工程,要根据业务的特点设计大量的 Feature,去帮助提升预测的泛化能力,尤其是像广告的点击率预估这种问题当中,特征的好坏直接决定了最终的效果。
有些公司可能专门做特征的团队就有上百人,因为这部分的工作量是非常大的,那么在面临这种工作量如此巨大的特征工程时,有没有办法去改善甚至解决这方面的问题呢?
深度学习在这方面就做得特别好,它能够从原始的数据当中能够实现这种特征的各种结果,它通过 pre-training 就可以将数据里面的特征自动提取出来,再直接基于原始的数据,就能训练出一个模型,而且它的效果相比传统的机器学习甚至有显著的改善,这就是为什么我们说深度学习在这些年得到了这么火热的欢迎,以及在工业界得到了大量的使用。
大家都知道,其实深度学习采用的神经网络,尤其是神经网络呈现的问题很复杂的时候,训练的时间特别长,有时候甚至几天、一个月都是常见的。这么长的时间显然会影响神经网络在实际问题当中的应用,那么有什么办法呢?
随着最近几年,大数据技术的各种发展,以及 GPU 计算能力的大幅度提升,使得神经网络的计算效率得到了显著的提升,因此深度学习也取得了很大的成功。
最开始是在图像,然后慢慢应用在语音领域,但最近几年在 NLP 的很多问题上也取得了显著的成功。今天和大家分享深度学习如何在自然语言处理当中如何去使用。
我们看一下百分点的整个 NLP 算法体系,它可以分为三层:
底层是机器学习平台,里面包括各种传统的统计模型类的方法:逻辑回归、最大熵、HMM 和 CRF,这些都是在 NLP 里面用的很多的。同时还包括 Deep Learning,其中有 CNN,LSTM 等等,还有 GRU;
中间层是 NLP 常见的基础的任务,包括分词词性标注、命名实体、情感分析、文本分类等等,这一层会用到底层的机器学习平台的各种模型,来解决这些基本的问题;
最上面一层是 NLP 的各种应用的场景,比如说智能审核、智能采编、自动问答,以及文本的自动生成、知识图谱等等,他们也会用到中间层的各种基本的 NLP 模块。
今天给大家分享的是重点是,深度学习如何在一些基本的 NLP 任务当中使用,包括分词、命名实体、以及情感分析这三块。
我们首先看一下,分词 NER 这两个基本任务。
如果对 NLP 有些了解的人都知道,这方面的传统方法主要包括两大类:
一大类是字典规则的匹配,比如分词的最大增强匹配、反向匹配、方向匹配等等,这些都是用了字典规则的方法;
另一大类是传统的机器学习方法,比如说常见的隐马尔可夫(HMM)、条件随机场(CRF)、最大熵马尔可夫模型(MEMM)等等。
这些方法有什么问题?
首先它们有大量的特征工作要做,就是我刚说的传统的机器学习方法存在一个非常大的问题,就是它需要大量的人工来做;
第二是领域的移植性问题,比如说在金融领域,我做了一个分词模型,可能依靠了大量的辞典和规则,但是可能转移到一个新的领域,比如说媒体这个领域时候,又要做很多词库化规则,移植性很差;
第三就是一些未登录词的识别效果也很差,因此我们希望能够用深度学习来做。
首先第一个方面,它能够解决特征工程的问题,避免了大量的人力工作;同时它的领域移植性要好的多,整个工作量能得到显著的降低;此外,在为新词的识别这块它的效果也好很多。
那么我们具体采用的是什么模型呢?
在我们的实际工作中,我们采用的是 LSTM+CRF 的组合。这样的组合在这方面已经得到了非常成功的使用,它把一个分词和命名实体识别问题转化为了一个序列标注问题。
可以看一下左边这张图,拿命名实体来说,序列标注前,我们首先建立一个标准,B代表实体的首字、I代表实体的非首字,比如说我们看一下:B-PER 和 I-PER,代表的就是人名的首字,和人名的非首字,同样地点和组织机构也是这么来表示的。
我们看一下左边这张图,“中国很大”这样四个字,我们用模型来给它做标注。“中”是什么?中国首先是一个地点名,那么把“中”就标识为地名的一个首字,B-LOC;“国”就是代表域名的一个非首字,代表中间的这个字,I-LOC; “很”和“大”这两个字都代表它们不属于任何一个词体,一部分,因此我们都标示为 O。
在上面整个图中,就是我们看到 LSTM 上面加了一个 CRF 层,CRF 就是条件随机场,相信学过自然语言处理的同学对 CRF 已经非常熟悉了。今天的重点内容是给大家介绍 LSTM 的技术原理,这是大家在学深度学习当然中会觉得比较费劲的地方,今天会给大家重点做个介绍。
在整个深度学习领域当中,一类问题是分类问题,比如说物体的识别、目标的识别等等,用传统的前馈神经网络就能做得很好;还有另外一类问题,就是它特别依赖于序列之间的关系,这种依赖关系对于整个任务的结果有很大的影响,这时候就需要用到循环神经网络——RNN。
RNN 在求解的过程中会有什么样的问题?就是它会有遇到一个梯度消失的问题,经过了多年的研究,最后出来了 LSTM 模型,它很好的解决了这个问题,它在应用这种基于序列的问题上,对序列的问题有很好的表现,同时应用场景非常广泛。
根据输入和输出的情况,我们可以分为下面四种:
首先是一对一的,对中文的分词,比如输入了一个词,要给它一个唯一的标注,同时还包括其他命名实体、文本生成,这些都是一对一的问题。
第二类是多对一,比如说情感分析,输入的是一段文字,但你输出的是情感,比如某件事是好还是坏,或者正面还是负面,其他的还有文本分类、视频主题分类等等。
第三个是多对多,比如机器翻译,输入一段文字,输入是一段中文出来的是一段英文,还有聊天机器人等等。
最后一种是一对多,输入的是一张图片,给它输入一张文字序列,LSTM 应用的就是这种情况。
接下来给大家介绍 LSTM 的技术原理。
我们刚说过它解决的是序列的问题,我们看图中的这样一个网络,看的出来,对于传统的神经网络模型,输出的 Ht,只依赖于输入的 Xt,它跟前一个单元是没有什么依赖关系的。但是在 LSTM 中输出每一个单元 t 时刻的输出,与前一个时刻 t-1 之间的状态,是有一个比较强的依赖关系。
可能大家在学习经常会比较费解什么叫 t 时刻,什么叫 t-1 时刻,就拿我们刚才的这个例子来说,“中国很大”这四个字,“中”它就是 t=1 这个时刻,它的输出就是 B-LOC 这样一个标注;“国”就是 t=2 时刻,它的前一个时刻就是“中”,“国”的输出是 I-LOC;那么“很”就是 t= 3 时刻,“大”就是 t=4 时刻。
这样一个有点类比的时间序列关系,大家碰到时刻这个概念的时候一定要理解,它是跟一句话能够对应起来的。这个时刻就代表了这个字在一句话当中的位置,做了这样一个类比,大家一定要首先理解这一点。
在 LSTM 当中,t 时刻是依赖于 t-1 的,具体是个什么样的依赖?
首先看一下,在这个结构当中有个非常重要的元素,单元状态 C。
Ct-1 是 t-1 时刻神经网络单元的输出,我们看到整个单元它的传递是 LSTM 具备长短期记忆能力的关键,它就像一个链一样,在不断的传输,不断会有信息的衰减,也会有信息的新增加,不断的从 t-1 时刻不断的往右边传递到最后一个时刻。
在整个长期状态的传播当中会有三个控制开关,去决定状态 C 是怎么传递的。
从 t 时刻传递到最后一个时刻,经过了这样三个门,就是遗忘门、输入门和输出门。
我们首先看一下遗忘门 ft。
ft 它是个向量,向量中的每个元素取值是 0 到 1 之间,那么 ft 的取值决定了 Ct-1 的状态过滤多少信息,会过滤到第 t 个状态。比如说如果 ft=0,表示所有的信息都被卡住了,一点都传不过去;如果 t=1,表示 t-1 时刻的状态信息,全部都传到 Ct 那边去了,它表示的是这样一个物理含义。
第二个门叫输入门。
也就是个这里的 It,It 它是由 Xt 和 Ht 共同决定的,它也是一个向量,每个元素也是在 0 到 1 之间。那么它和输入 Xt 一起决定了从输入当中要提取什么样的信息,来传播给单元状态的 Ct,它决定了从输入 Xt 当中要输入一个什么样的信息往下个时刻去传。
再看一下输出门。
输出门的 Ot,取值也是个向量,取值 0 到 1 之间。那么它是决定了 t 时刻的输出和状态 C 之间是个什么样的关系。可以看到 T 时刻的状态 Ct,它是用两部分组成的,一部就是 Ct-1 传递过来的,过滤出来的一部分信息,另外一部分信息是从输入 Xt 里面直接抽取出来一部分信息,它是两部分信息合成的一个结果。那么有了 Ct 之后,再结合输出门 Ot,我就能直接计算出 t 时刻的输出 Xt。
刚才的解释就是对输入门、输出门、遗忘门的一个解释。整个的网络单元看起来比较复杂,其实它都是有一个明确的物理的含义,整个的核心就是:去解释每个神经网络的单元状态 CT 是如何传递到下一个时刻、如何进行信息的筛检,以及如何从输入状态 t 时刻的时候去提取新的信息让 Ct 得到更新,理解神经网络当中的物理含义是非常重要的。
我们再看一下,LSTM 结合 CRF 的数学原理。
好多同学一看到这个数学公式,可能脑袋就大了,其实你真正理解它的物理含义以后,它们并没有那么复杂。
图中的下方的输入 X,它代表了每个自向量,这个自向量我们可以通过语义,通过大量的语料,通过无监督的方式,先把所有的自向量去训练出来。然后在我们看上面这一层,就是 Y。Y 对应是输入的每个字,它输出的标注是什么,标注的标准刚刚都已经介绍过。
那么有了对应的输入输出,甚至有了大规模的训练语料以后,那么如何来求解这个模型的参数?
我们可以看的出来,整个这一层这里面有个非常关键的字:s(x,y),可以看的出来它有两部分组成:一部分是加 Ay,y+1,它代表的是说,Y 输出的标注从第 I 个状态转移到 I+1 的状态,所转移得这样一个分数;
另外一部分就是 Piy,这里代表的是什么?这里代表的是整个 LSTM 的输出。这个公式可能还是很好的体现出来了 LSTM,那 CRF 怎么结合起来得?这两个模型是怎么结合起来用的?
当 LSTM 输出的 Piy,再加上了 CRF 这个状态之间的转移分数,通分进行求和,这样将两个模型的特性都比较好的融合在一起,这样输出的 s(x,y) 这样一个分数之后,这样传输 max 函数,进行这样一个规划,就得到 P(Y|X),有了这样的公式之后,我相信学过统计的同学应该很快就知道我接下来怎么求解,同时,每个输入对应着这样一个对应标注得概念,通过方向梯度求解,整个反向传播,以及梯度计算这种方式,最后可以将所有模型参数都计算出来。
可能也有同学在想:直接采用 LSTM 就能对输出的训练进行标注了,为什么后面还要接个 CRF 模型,计算复杂度反而提高了,那么它到底带来什么样的好处?
这里我给大家解释一下:首先你采用 单个 LSTM 预测出来标签是有问题的,因为每个字在标签当中是独立的分类,没有去利用上文已经预测出来的标签结果,进而导致预测出来的标签有可能是非法的。
这句话怎么来理解呢?
我们可以看一下中间这个例子:我们看得出来这里面是做了个分词,把分词转换为一个序列标签的概念。B 代表什么意思?代表一个词的开始,E 代表一个词的结束,S 代表一个字可以单独的作为一个词。
那么我们看一下这个real output,就是实际输出的是什么。我们看到它的后面,E 又接了一个 E,E 后面是实际的输出。真正的输出是什么,其实应该是 B,再接一个 E。
我们这里看出来,他犯了这样一个错误:一个结束符后面,再跟着一个结束符显然是不合理的,说明 LSTM 出了对应的问题。要解决这个问题,我们把 CRF 接在后面,因为 CRF 的特征还是比较好的学习到输入状态这样的转移关系,它可以学习到这样的一种关系,比如说:前面的一个词的结束,后面应该是接一个新的词开始,或者后面接单独的一个词,所以是不可能出现 E 的。
通过这样的限定特征,我们就保证这个上面这种例子错误不会再出现,我们的 LSTM 后面接入一个 CRF 以后,它能够取得比之前更好的效果。
刚我们讲述了 LSTM+CRF 整个模型的原理网络结构,那么我们实际在开发的过程当中,在做项目的过程当中,我们同时使用了一些模型调优的技巧,这些技巧是非常重要,是大家在实际去做深度学习这块工作的时候需要去掌握的。
第一个是如何选取我们训练的时候的 batch_size。
batch_size 指的是什么?就是训练的时候,比如要去计算梯度的时候,或者要去更新参数的时候,拿多少的训练数据去这样一次更新,batch_size 等于 1,就是我们传统说的 SGD 更新方法,所有的数据就是全量数据这样一次更新方法。
这两种极端都会有它对应的问题,如果 batch_size 取的太小,就导致你整个的收敛速度很慢,甚至收敛会出现问题,而且没有比较好的去利用机器的内存;如果 batch_size 取得非常的大,可能内存就爆了,我们需要选取一个合理的 batch_size 数字,既能够让它将我们内存利用起来,同时又能让它比较稳定的去收敛这样一个目标值。
实际情况当中我们经常采用的是 batch_size 要尽量取 2 的幂指数,比如 32,64,128 都可以,可以提高内存中的计算效率。同时要根据时间的分配的内存和显存来估计 batch_size ,尽量保证你的内存不要爆掉,我们实际当中采用的 batch_size 经常是 128 指标比较多的,这是第一个技巧。
第二个是如何初始化权重参数,就是整个神经网络里面的结构参数。如果这些参数全都取 0 的话,整个传递下来,所有的取值都是一样的,显然这样是不行的。所以经常采用的是随机初始化的策略,包括高斯分布,均匀分布。TensorFlow 这个框架里面是自带了一系列初始化的函数,以上是第二点。
第三个技巧是 dropout 超参数,这也是很重要的。在神经网络里经常会面临这样一个问题:过拟合,那么 dropout 这样一个参数能够提升整个网络的泛化能力,在上面提到的项目当中,我们采用字向量输入到双向 LSTM 之前去加入 dropout,进一步提升了效果,我们这里取值就是 0.5,那么在实际表现当中,准确率会有几个百分点的显著提升。
我这里跟大家分享了三个比较重要的技巧,其他的还有包括比如说输入 embedding下面的 Size 到底应该怎么去选,中间的隐藏层的维度应该怎么去选,还包括 learning rate 要怎么去选,到底采用什么样训练的方式,是传统 SGD,还是说加动量法等等,都是要选择的,这些也是大家在学习深度学习时候需要的基本功。
刚刚我们讲述了很多的技巧以及原理,那么实际当中取得了什么样的效果?
这里我们看下分词命名在一个准确度方面的指标以及性能方面的指标,v1.3、v1.4 是我们文本分析产品的两个阶段的版本。
在 1.3 版本我们采用的是传统的方法,在 1.4 版本我们采用了深度学习的方法,可以看得出来: 1.4 会有效果上的一个显著提升,无论是准确度,还是 F1 值都有一个提升。同时我们与业界的 NLP 方面的一些开放的 API 做得很好的企业,包括玻森、文智等等都进行了对比。
这里我们选了玻森作为代表,因为我们做了对比之后,发现它是比较具有代表性的。我们跟他们对比之后,我们效果甚至比他们还要略微好一点点。
经过这样一个 1.4 的版本,我们非常有自信对外说:我们在分词与命名实体这两个任务上面的效果,现在应该是非常领先的水平。在这几个方面,我们也跟国内的一些企业经过了三到四轮的 PK,之后都赢了下来,在这一领域,我们还是做了很多比较扎实的工作,也取得了很好的成绩。
刚刚说到是效果问题,另外还有一块是性能问题。第一版产品我们采用了 TensorFlow 框架,当时做预测时候,我们发现它的分析速度只有几十 K,非常的慢,这样应用起来非常受限。在很多场景里面,比如说如果客户对分词速度有显著的要求,数据量非常大的时候,这样一个速度肯定是不能满足客户需求的。我们进行了性能瓶颈的分析,这里面核心的是一个维特比解码,这里的 TensorFlow 仍然采用的是 CPU 去执行工作,导致它的效率特别低,维特比解码占了整个预测模块之间的 70%,所以这部分是整个性能的瓶颈。
要解决这个问题,我们从 TensorFlow 转移到了 PyTorch 框架,有不少同学对这个框架比较熟,它的上手会更快,如果大家对深度学习网络里面的一些网络结构,怎么求梯度,怎么做优化,等等这些东西原理都比较了解的话,其实使用 PyTorch 会更快。
PyTorch 将整个维特比解码的过程,全部用张量计算,然后在 GPU 中实现,因此整个效率得到了显著的提升,这就是为什么我们的分词命名实体速度仍然达到了几百 K。
这是整个我们项目迭代开发当中遇到的一个非常大的挑战,最后我们在这个问题上取得了一个很好的解决结果。
接下来看一下,基于 PyTorch 的分词性能。
实际使用当中,我们取了两种不同的参数得到了另外一个更高的模型,我们看的出来,比如说中间隐藏的 size 越大,我们分别一个是两百,一个是六百,对于六百来说它的准确率肯定更高,它的效率明显就比另外一个差了两百多 K。如果我们在中间的隐藏 size 中取 250 的话,它的速率会更高,它的效果精度会差几个百分点。
但我们看的出来,在维特比解码这块,它们都采用了 GPU,因此它的速率都有几百 K 的水平,随着 batch_size 在增长,它的性能也是在不断的增加的,同时当我们发现 batch_size 超过两千的时候,因为这时候直接内存就爆了,会发现内存溢出,这时候整个值立马就降下来,这是基于分词的性能。
下面我们看下命名实体的性能。
我们看的出来,随着 batch_size 的增加,在 batch_size 等于四百之前,命名实体的效率在不断的提升,从一百多 K 涨到了三百多 K;batch_size 在四百到两千左右的时候的,中间的性能是比较稳定的,而超过两千的时候它的内存溢出来,整个性能就降了下来,我们这是基于命名实体和分词的结果。
前面介绍了深度学习如何在分词的命名当中的使用。接下来跟大家分析情感分析当中我们如何使用深度学习。
我在 2014 年的时候做了一个项目,客户当时需要的就是情感分析。那时候我们都是用传统的方法做得,具体来说首先第一步,肯定要将文本中的词向量化,我们经常用 one hot representation 来表示,比如这个词表里面有一万个词,那么这个向量长度就是一万,对于每个词都会有个固定的位置,这个位置上取 1,其他的位置上取 0,我相信很多同学对这块比较了解。将其中的词向量化之后,那么接下来再结合这种传统的逻辑回归,特别是 SVM,我就能去结合标注数据进行模型的训练,就能进行情感分析的预测,这是用传统方法来做。
那么用这种方法存在什么样的问题?第一个问题就是词序的信息。
因为刚刚说了,在每个词做特征的时候都是比较独立的,因此词序的信息被忽略了,整个效果明显有个上限;第二个是,只考虑了字面上的特征,没有考虑词和词之间语义上的一个特征;第三个是训练应该覆盖全部序列,就是说在做特征的时候,可能有些值就直接被筛掉了,有些词根本在你的训练集里面都没有,这样很明显会影响最终的效果。
为了解决这些问题,我们将传统模型升级成为深度学习模型,那么深度学习是怎样解决这些问题的?
首先在离线的时候,直接用训练好的语义向量模型输入,这样能够解决好训练集词的覆盖不全面的问题。第二点,我们用 CNN 卷积神经网络能够保留大部分的词序信息,比如说从 2-gram,我们甚至能保留到 5-gram,这样的词序信息能够使它的学习能力更强,而且效果的上限就进一步的提升。
它具体的这样一个网络结构,整个网络结构是用来学习语义向量的。
这里面有几个比较关键的问题:第一个就是它有个鸿沟的问题,词和词之间,找不到它的相关性,比如苹果和香蕉这两个词语,它们有一定语义上的相似性的,但是 one hot representation 完全体现不出来。
第二个就是维度灾难的问题,比如库的大小为几万的量级,那么特征维度就会特别长,对于语言模型当中的有些问题,就会存在一个维度灾难的问题。
第三个问题,使用 one hot representation 的表示,应用到深度学习当中,训练的复杂度非常高,整体效果会非常差。
基于这三点方面的原因,通常将 one hot representation 改为 distributed representation,分布式的向量来进行表示,每个词都用一个向量来表示,这样就可用 cos 和欧斯距离表示任意两个词之间的语义长度和语义距离。一般来说用深度学习都是用 embedding 向量,而不是用 one hot representation。
那么这些值向量是如何计算出来的?
大家都应该知道 Google 推出的 gensim,在方面做了非常出色的工作。它采用了两种比较经典的模型:连续词袋模型和 Gram 的跳跃模型。
这两种网络结构能够将词最后结合大规模的语料,训练出所有词的语义向量,每个向量之后,对应的每个词都能将它最相似的向量计算出来。比如上图中的“好看”、“很漂亮”、“难看”、“喜欢”,这些都是跟“漂亮”在语义上特别近似的。
语义向量计算出来之后,在情感分析当中,我们具体采用的是 CNN 的模型。大家可能会问,为什么会采用 CNN 模型?在以前的传统深度学习网络当中,其实有一个问题:当采用全连接的方式,整个网络中的参数是非常多的,几十万、几百万,网络参数一旦数量过多,导致网络模型的求解会非常的慢,甚至会训练一个月,我相信这么长的训练时间是不能忍受的。
另一个问题就是参数越多,模型越复杂,就更容易发生问题。以至于整个模型预测的性能非常差,那么 CNN 能做哪些工作?首先它的结构包含以下几层:输入层、卷积层、池化层、云连接层、输出层,这里有几个关键的概念:
一、卷积层,大家应该在信号处理里面之间学过,它能够去计算相应元素之间的加权求和,能够起到一个作用就是全体参数共享。什么叫参数共享?就是很多相同位置上的网络中的参数取同样的值,这样就能大大降低神经网络中参数的数量。实现参数的共享,用卷积层。
二、池化层,能够实现空间的样采样,之前一个小格子,可能包括四个元素,直接对这四个元素求个平均值,一方面能够避免噪声带来的影响,另外一方面也能降低模型需要用到的参数。
通过这样两种方式就能够将网络当中的参数大幅度的降低,而且 CNN 也被证明在工业界能够取得非常不错的效果。最早 CNN 被应用在图像当中,现在我们将它应用在文本中的情感分析。
CNN 模型当中我们看到 W2V 向量下面,好像画着两个矩阵,这就是一个双通道向量,这也是一个比较重要的一个技术。以前经常用的传统方法就是采用一种向量的方式,这里面有几种:
一种就是 CNN-rand,所谓的 word vector 随机初始化,同时在训练过程中进行优化。
第二种叫 CNN-static,这是我们用的最多的,直接使用无监督学习的结果,通过 gensim 训练,通过大规模的语料训练,同时用了大量语句当中的信息,比 CNN-rand 效果好很多。
第三种,就是 CNN-non-static,它直接使用无监督学习 pre-training 的结果,但是在训练的过程当中,会进行一个细致的微调,这样效果会更好一些。这样一个微调会保证你的原始的 word vector 不会太远,同时它能够针对实际的对业务问题做一个更好的优化。
最后是 CNN-2Channel,就是我们这个项目当中采用的方式,它是将 CNN-static 和 CNN-non-static 作了一个混合版,这样保证它结合的两者之间的优点。
我们再看一下这两种词向量,它们在语义和情感上他们之间有什么样的差别。
我们看到首先是 static channel,这种直接训练时候 W2V 向量,在语义上是很相似的,但是他们在情感上没有相似度,相似度体验的很差。比如 Bad 这个词,你通过 static channel 训练出来,它的相似词我们看的出来有:good,terrible 等等,Bad 首先找的相似词是 Good,显然这两个词性是相反的。
对于这种 non-static channel 这种动态的向量,它能够在训练过程当中微调,结合情感分析的标注数据进行微调,它能够区别正面或者负面的情感。还是对这个词, Bad,经过 non-static channel 动态向量训练,最后首先匹配的相似词是 terrible,horrible 等等,这些都是负面相关的词语。通过这种动态的调整,模型甚至能够把这种情感学习到,因此,它在情感中取得更好的效果。
为了帮助大家去更好的运用 CNN 的时候,我列出了一些在实际模型开发的过程中会存在一些问题:
第一个,过拟合仍然会比较严重。我们采用的具体解决方法,这种停用词性就全部去掉了,偶尔有些动名词很重要,我们设置了白名单,这里我将 F1 值提升了两个点。
第二个,我无法对词的重要程度进行模拟。比如说一句话:你很好,但是你没有耐性。这个“但是”后面表达意思比前面的表达意思要更加重要,因为我们将转折词后面的词语乘以 1.5 的加权,这是一个经验的取值,然后我们在程度副词下,要加一个形容词乘以系数,比如:你非常的美,或者:你非常的勤奋,“非常”这样一个程度副词它要进行一定的加权,它的情感会更加强烈。对于否定词,譬如:不好或者不努力等等,在训练过程当中你要乘负的系数。通过这种方式,去模拟这些词表达一种语义和情感的程度,我们的 F1 值提升了 1%。
第三,卷积能识别连续若干个词的特征,但是 maxpooling 抹煞了部分语义信息。我们尝试 LSTM 的 RNN 模型其实效果感觉不明显,这个也可理解,情感分析当中,现在这种短小的 n-gram 基本上可以满足,不需要那么长的依赖关系,这就是使用 LSTM,相比 CNN 也没有特别显著的效果。
最后一块是模型本身,通常会使用 dropout 的一些技巧,F1 值可以提升两个百分点。
我们看一下实际的结果。
我们在 COAE 和 NLPCC 这两个情感分析测试集上进行了测试,传统模型就采用 SVM,同时也采用了 CNN 和 LSTM,我们看得出来,在 COAE 数据集上我们提升了四到五个百分点,在 NLPCC 上我们大约是提升了六个百分点,效果比传统的模型是有显著的提升的。
刚刚提到 CNN 模型,那么我们采用一些其他的模型,是个什么样的效果?
我们当时在内部采用了不少其他的模型,比如 character-CNN、LSTM,还有递归神经网络,我们在测试集上发现跟目前采用的 2channel-CNN 相比没有明显的差别,另外还有其他的一些网络结构,比如 GRU 等等,本质上都是为不同的网络结构提取带有情感提升的句子向量,利用这些向量进行情感分类,并没有本质的差别。因此,我们后续更多优化的精力是获取更多的标注数据,以及在我们的情感应用产品上,结合用户的反馈数据进一步的发力。
前面我们讲述了深度学习在情感分析当中的一些应用,现在我们已经在 NLP 陆续更多地使用深度学习的技术,包括文本分类、句法分析、文本生成、知识图谱、自动问答等等,我们都去采用深度学习的技术。
前面介绍都是偏基本的任务方面的如何去采用深度学习的内容,我们再来介绍一下具体使用的几个案例。
第一个案例是 AI 李白。
我不知道大家有多少同学接触了这个应用,这是百分点公司和人民日报推出的一个 AI 春节送祝福的应用,相信不少同学都已经用过。它结合了唐诗宋词的韵律和写词的技巧,自动写出带有春节味道的诗词,它就是个写词的机器人。
大家知道对于文本生成来说肯定用到语言模型的,提到语言模型很多人就会说,用 n-gram 这种语言模型,但是它的问题在于无法捕获比较长的语句之间的字词依赖关系,因此我们这里采用 LSTM 的语言模型,大概使用了 70 多万诗词的训练语料,最终也取得非常不错的效果,整个 AI 李白上线六天的时间,获得了超过一千万的访问量,如果大家有兴趣的话,可以去体验一下。
第二个案例是团中央自动问答机器人。
现在团中央有七千万的团员,他们有个青年之声的论坛,每天上面有好几百万的问题,其中有很多的问题其实是得不到及时回答的,我们做这样一个机器人问答是希望能够对青年之声上,青年们关注的就业的问题、情感的问题等等进行自动问答,帮助青少年能够更好的成长。
自动问答里面有几个关键的技术问题,比如如何实现问题的匹配,如何自动去计算出问题和答案之间的相似程度,目前都可以采用深度学习去解决这方面的问题,现在我们的内测版已经上线了,接下来我们会对外推出这款自动问答机器人。
第三个案例是某媒体客户的智能采编系统。
这是一套智能采编系统,传统的都是靠人工,比如要产出一篇稿子,需要花大量的力气在关键词提取、摘要等等方面,各种任务是要靠人做得。我们直接将百分点这套中文语义引擎内嵌到智能采编系统中,使用深度学习来做,这样极大提升了采编稿件的效率。
最后我再给大家对今天的分享内容做个小结。
首先我们介绍了深度学习和机器学习的差异,为什么深度学习现在越来越热,为什么它能够在工业界取得了成功;
第二点,我们介绍了包括底层机器学习平台,各种 NLP 的基本任务,以及上面用到各种业务场景上的应用,其中我们对一些基本的分词命名,情感分析,介绍了我们经常用到的 LSTM 中的各种模型的一些实际的原理,调优的技巧,以及实现项目当中取得的效果;
最终我们给大家分享了我们实际三个案例,包括自动生成诗词,智能问答机器人,以及智能采编系统。
通过这些内容实际上是想告诉大家深度学习、自然语言处理现在在业界有越来越多的实现场景,这也是非常有前途的方向,希望大家一起参与到这个方向,将 NLP 这块的人工智能的技术用起来,去提升每一个行业的业务和运营效率。这是我今天想跟大家分享的内容。谢谢大家。
深度学习也是机器学习中的一种技术而已,这个问题应该更具体,应该说这种深度学习模型和传统的模型有什么样的差别。对于这个问题而言,我刚刚第一页里面就讲到,传统模型很重要的一块工作是设计这些模型的特征,而且是靠人去设计的,对业务有准确的理解,才能设计出好的特征,这也是一门手艺活,这块的工作量是特别大的。为了解决人工去设计这样一个分析特征工程的工作,我们采用深度学习的技术,就是从数据当中去挖掘出对应的特征,直接得到一个结果,它是从端到端的一套技术,而且它的效果相比传统机器学习能够有显著的提升。
基于 TensorFlow 的时候,用集群训练,可以用好几个 GPU 来训练;基于 PyTroch 的时候是单机的。
batch_size 越小,优化路线在走的时候,随机性特别强,可能最后优化到最终目标中间可能会有些问题,会影响准确度;batch_size 过大的时候,内存可能撑不住,内存会直接爆了, batch_size 到了一定的程度,再往上面走的时候,它可能对准确度影响没有那么大,比如 batch_size 取 180,或者取 150,最后都能达到一个近似的最优的结果,影响不会特别大。
自动问答首先需要建立一个非常优质的问题答案资源库,有这个库之后,要在库里找到答案,还涉及几个问题:
第一个是问题与问题之间的等价计算,你问一个问题的时候,你能不能从这个库里面找到等价的问题,这是很关键的,涉及到深度学习;另外一点,比如说我问了一个问题,但是这个库里面有一堆的答案,如何从这个答案里面当中给出最好的,这里涉及到问题和答案匹配问题。用传统的模型也能做,如果采用深度学习也能做,但是对于数据的数量和质量会要求更高。
第二,阅读理解的问题,什么叫阅读理解?答案是存在一个文档中,而不是存在一个QA库当中的,在文档中要去挑选出最合适的片段,能够去回答这样一个问题,这时候要找到这个答案的位置,就需要有一个标准的训练数据。有这样的标注数据之后,再去训练这样一个深度学习模型,来了一个新的问题以后,才能去预测出它在哪篇文章当中。
我看有一些同学在问,没有 AI 方面一些工作经验,对于学生来说,怎么找这方面的工作?
相信很多人有这方面的困境,这个时候我给大家分享的是说,第一个,现在有很多的机会,互联网上的资源比我当时读书的时候那个资源要丰富的多。我可以分享一些自己的经验,当时我在学校,可能接触没那么多,但是可以加入学校的协会,比如学校的开源软件协会,当时把基础技术都学会了。
至于 AI,第一个,大家可以去上这种培训质量比较高的培训课程,国内 AI 方面的培训课程很多,因为这些培训课程不仅仅是这方面知识的讲解,还会帮助大家进行实践;
第二个方面,我是建议大家有机会可以加入开源的项目,现在 AI 方面,基于机器学习,或者相关的开源项目有很多,针对这些项目,加入一个进去,贡献自己部分的代码。
第三,我建议大家可以把基础打好之后,从找一份实习开始,你如果还是在校生,因为公司对实习生的要求没有那么高,它更多要求你的编程功底扎实,有一定的了解,可能要求没有那么高,你再通过实习当中的历练去积攒这方面的经验,这也是一个比较好的方式。这是给大家的一些建议。
我觉得是要学的。因为这就像基本功,传统机器学习算法里面的很多的模型基本理论、一些泛化理论、一些特征设计的理论、一些模型它为什么效果好,为什么效果不好?它整个模型的一些内在的思想是什么,这些基本功都是要学会的。不然的话,你真的直接上深度学习,你就也只会用一些工具。一旦碰到一些问题的时候,就像如何调参,碰到效果不好的时候,我该怎么办?你如果没有这些理论基础,你就只能去瞎试,试出来是运气好,试不出来也不明白为什么,我建议大家还是要学习机器传统模型理论,这个东西都是要掌握的。这些理论的好处是在你实际项目当中遇到瓶颈、遇到问题的时候,这些理论会指导你,你该去朝什么样的方向去努力,你该怎么去定位问题,这些基础理论还是非常重要的,我建议大家要学一学,直接上来学深度学习,基本功是不扎实的。
苏海波,清华大学电子工程系博士,百分点集团首席算法科学家,擅长人工智能领域的自然语言理解、动态知识图谱、深度学习、个性化推荐以及计算广告学技术;多篇论文发表于 GLOBECOM、ICC、IEICE Transactions 等国外顶尖学术会议和期刊;曾就职于新浪微博,负责广告系统的算法效果优化,以及信息流产品整体算法策略的设计及研发;现负责百分点大数据与人工智能核心算法。
本周四我们不见不散~
点击下方图片即可阅读
Uber自动驾驶“杀人”,我们可以判算法死刑吗?
【限时福利】深入浅出区块链——36节课,5大模块,上手写出你的第一个区块链项目
福利时间:即日起-3 月 25 日
福利一:原价¥58,限时优惠¥45
福利二:每邀请一位好友购买,你可获得 18 元现金返现,多邀多得,上不封顶,立即提现(提现流程:极客时间公众号 - 我的 - 现金奖励提现)
订阅方式:点击下图,微信支付,立即成功订阅。
有问题,欢迎咨询小助手微信:geektime001
想看更多这类文章, 请给我们点个赞吧!