RNN、CNN和Transformer是目前在NLP中最常用的三个特征抽取器,本篇博客将对它们三个做一下全面对比。
RNN
1、为何RNN能够成为解决NLP问题的主流特征抽取器
主要原因还是因为RNN的结构天然适配解决NLP的问题:
(1)NLP的输入往往是个不定长的线性序列句子,而RNN本身结构就是个可以接纳不定长输入的由前向后进行信息线性传导的网络结构;
(2)而在LSTM引入三个门后,对于捕获长距离特征也是非常有效的。
2、RNN在新时代面临的两个严重问题
(1)RNN很难具备高效的并行计算能力。
(2)新的更优秀的模型出现;
3、为什么RNN并行计算能力差?
T时刻隐层状态的计算,不仅依赖当前时刻的输入,还依赖上一时刻的输出。
CNN
1、卷积层本质上是个特征抽取层,应用在NLP问题中,它捕获到的是单词的n-gram片段信息。
2、CNN存在的问题:
(1)单卷积层无法捕获远距离特征;可以通过加深网络的层数获得更大的感受野,然而实际情况是CNN做NLP问题就是做不深,做到2到3层卷积层就做不上去了;
(2)还有一个问题,就是Max Pooling层,无法保持输入句子中单词的位置信息。
why?
1)RNN因为是线性序列结构,所以很自然它天然就会把位置信息编码进去;
2)CNN的卷积核是能保留特征之间的相对位置的,滑动窗口从左到右滑动,捕获到的特征也是如此顺序排列,所以它在结构上已经记录了相对位置信息了;
3)但是如果卷积层后面立即接上Pooling层的话,Max Pooling的操作逻辑是:从一个卷积核获得的特征向量里只选中并保留最强的那一个特征,所以到了Pooling层,位置信息就被扔掉了。
目前的趋势是抛弃Pooling层。
3、CNN的并行度是非常自由也非常高的,这是CNN的一个优点。
Transformer
1、关于NLP中输入不定长的问题
(1)RNN可以输入不定长序列;
(2)Transformer做法跟CNN类似,用Padding填充到定长。
2、关于NLP句子中单词之间的相对位置信息
(1)RNN因为结构就是线性序列的,天然会将位置信息编码进模型;
(2)CNN的卷积层其实也是保留了位置相对信息的;
(3)Transformer来说,为了能够保留输入句子单词之间的相对位置信息,在输入端引入了位置编码。
3、关于NLP句子中长距离依赖特征的问题
(1)Self attention天然就能解决这个问题,因为在集成信息的时候,当前单词和句子中任意单词都发生了联系,一步到位。
(2)RNN需要通过隐层节点序列往后传;
(3)CNN需要通过增加网络深度来捕获远距离特征。
对比结果
1、语义特征提取能力
Transformer >> 原生CNN == 原生RNN
2、长距离特征捕获能力
Transformer > 原生RNN >> 原生CNN
3、任务综合特征抽取能力
Transformer > 原生CNN == 原生RNN
4、并行计算能力及运算效率
如果句子平均长度n大于embedding size,那么意味着Self attention的计算量要大于RNN和CNN;
如果反过来,就是说如果embedding size大于句子平均长度,那么明显RNN和CNN的计算量要大于self attention操作。
实际情况:一般正常的句子长度,平均起来也就几十个单词,embedding size从128到512都常见。
结论
1、单从任务综合效果方面来说,Transformer明显优于CNN和RNN,CNN略微优于RNN;
2、速度方面Transformer和CNN明显占优,RNN在这方面劣势非常明显。
两者再综合起来,Transformer > CNN > RNN