CNN, RNN, Transformer关于特征提取的对比分析

在自然语言领域,不论是什么问题,首先都会有一种比较主流的操作,就是先对输入基于预训练的词向量做embedding,再用一个结构(特征提取器)结合上下文去做多一次embedding,这样得到的词向量,就可以有效地反映出自身的含义,以及在句子中与其他词之间的联系了。

即使特征提取器五花八门,但总的来说可以认为都是基于CNN、RNN、transformer的改进版本,所以他们或多或少都有着这几个模型的优点和缺点,这里就来分析对比一下这几个模型在embedding过程中的优缺点。其实主要是缺点,因为我个人觉得模型的上限受到很多因素的影响,但是一些模型的结构会导致一些根本的缺点,这才是目前我们需要关注的。

首先是RNN,为什么先分析RNN,主要是因为它是最早在NLP领域爆红的深度学习模型,同时也是现在越来越不受重用的模型。一开始,RNN应用到NLP是因为它本身的循环结构,使得它天生就具备分析位置信息的能力,同时,也可以处理不定长度的序列,这些都是它独一无二的优点。

可是随着其他模型的发展,越来越多的模型拥有和他相仿的优点,反倒是他的缺点慢慢被放大。第一,是它的短期记忆,在反向传播过程中,模型一层一层地沿着各个时刻的隐层输出传播,从而调整各个参数,当序列过长,梯度更新过程中衰减较大,就会导致梯度消失,或者说过去太久远的信息无法有效参与到模型学习。虽然也有改进版本的LSTM和GRU,但只要不改变它的循环结构,就终究只能缓和这个缺点,并没有彻底解决。

第二点是因为RNN必须按顺序计算,如果没有计算出上一时刻的隐层输出,就无法计算下一时刻的隐层输出,所以无法并行计算,在目前模型都偏向于更深、更多参数的趋势下,RNN的这个缺点更使得它无法成为主流,除非改变RNN的这种循环结构,可是改变了这种循环结构它也不能算是RNN了,所以这就是RNN的根本问题。

然后我们来看一下CNN,虽然之前一直说它更多被用来做图像处理,但自从2014年首次引入到NLP领域后,也慢慢火了起来。一般来说,一段句子经过embedding后,就会变成一个尺寸为len(sentence)*len(emb)的矩阵,也就是句子的长度乘以词向量的长度,因此CNN就可以把文本看成图像那样处理了。

和图像处理一样,CNN通过卷积核从文本向量中提取特征,一个dk大小的卷积核从第一个词开始,从前往后从上往下遍历。可以看出,卷积核能捕获到多少特征,和卷积核的大小有关,本质上就是一个n-gram片段信息,n的大小就决定了能捕获间隔多远的距离,那么是不是卷积核越大越好,事实上实验证明了,卷积核相对小一点,卷积层深一点,模型的效果会更好。这里我再详细解释一下,比如说现在有一个距离为5的特征,如果我们采用大小为33的卷积核,那么单层卷积层是无法分析出这个特征的,可是我们来看看多层的卷积层会怎样:

在这里插入图片描述

所以说,CNN如果能做到足够深,那么理论上它是可以捕获远距离的特征,同时也可以高效地进行并行计算。可是现实并没有那么美好,不然就没有transformer的事了,实验结果显示,似乎更深的层数并没有带来显著的效果改善,一方面是因为目前深层网络参数优化手段依然不足,另一方面是池化层的问题,我们可以想象一下,如果我们使用了池化层,比如最大池化,选择最大的值抛弃其他值,这就丢失了位置信息,这又是一个严重的问题,所以目前如果没有特别的需求,CNN在NLP中是不采用池化层的。

综上所述,CNN和RNN相比,并行计算能力更强,对于改进版本的CNN也能有效地保留位置信息,可是对远距离的特征捕获能力相对较弱,但这是可以慢慢改善的,所以目前CNN的各种改进版本越来越多,和RNN相比越来越火。

最后要介绍的就是目前最流行的Transformer,首先,它有很多优点,并行计算能力强,通过自注意力提取不同词之间的特征,计算效率十分高,也解决了短期记忆的问题。看起来,他好像已经具备了RNN和CNN的所有优点了。当然,transformer也有他的缺点,那就是注意力机制带来的运算量,特别是处理长序列的时候,如果要对每个词都进行一次自注意力运算,那么计算复杂度就会非常大,所以也看到最近提出了一些动态自注意力模型等等的新模型,就是针对计算复杂度这个问题提出的改进方案。

总的来说,这三个模型并不是各有优劣,而是transformer目前在各方面来说都是较优的选择,CNN通过改进有可能进一步和transformer相抗衡,当然只是有可能,而RNN,就目前来看,估计是很难翻身了。而对我来说,我目前是更希望能够在transformer中融入CNN或者RNN,作为encoder中的一个模块,一方面目前已经有这类研究,且实验证明了确实有一定的改善,另一方面,在还没有提出突破性的模型之前,或许这是少数有可能有成效的研究方向。

最近本人在github写了一个自然语言处理的入门教程,包括模型的代码和模型的分析介绍,欢迎交流:NLPBeginner

想浏览更多关于数学、机器学习、深度学习的内容,可浏览本人博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值