摘要: "如果你愿意一层一层的剥开我的心·································那么你会坐牢的我跟你说"。自然语言就是这么神奇,句子中的长距离特征对于理解语义也非常关键,本文基于Tranformer、RNN、CNN、TCN分别概述近期学界对长句表示学习的诸多方法。
1.长文本表示学习挑战
NLP任务的特点和图像有极大的不同,上图展示了一个例子,NLP的输入往往是一句话或者一篇文章,所以它有几个特点:首先,输入是个一维线性序列,这个好理解;其次,输入是不定长的,有的长有的短,而这点其实对于模型处理起来也会增加一些小麻烦;再者,单词或者子句的相对位置关系很重要,两个单词位置互换可能导致完全不同的意思。如果你听到我对你说:“你欠我那一千万不用还了”和“我欠你那一千万不用还了”,你听到后分别是什么心情?两者区别了解一下。最后,句子中的长距离特征对于理解语义也非常关键,征抽取器能否具备长距离特征捕获能力这一点对于解决NLP任务来说也是很关键的。针对长文本表示学习,现阶段主要有Transformer、RNN、CNN、TCN四种流派,下面分别概述。
2.学界研究
2.1Transformer 流派
近期基于Tranformer的模型在NLP诸多领域取得了不错的效果,针对长句表示学习,谷歌和OpenAI分别提出了相应的改进方案。
2.1.1 Transformer-XL
以往的 Transformer 网络由于受到上下文长度固定的限制,学习长期以来关系的潜力有限。谷歌的Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context提出的新神经架构 Transformer-XL 可以在不引起时间混乱的前提下,可以超越固定长度去学习依赖性,同时还能解决上下文碎片化问题。具体地说,此方法在 Transformer 架构中引入了循环机制。在训练过程中,为之前的片段计算的隐藏状态序列是固定的,将其缓存起来,并在模型处理后面的新片段时作为扩展上下文重复使用,如下图所示:
Transformer-XL 学习到的依赖性比 RNN 学习到的长 80%,比标准 Transformer 学到的长 450%,无论在长序列还是短序列中都得到了更好的结果,而且在评估时比标准 Transformer 快 1800+ 倍。
2.1.2 Sparse Transformer
OpenAl 的论文Generating Long Sequences with Sparse Transformers提出了一种适用于文本、图像和语音的稀疏Transformer,将先前基于注意力机制的算法处理序列的长度提高了三十倍。OpenAI的研究人员在最新的论文中为注意力矩阵引入了多种稀疏的分解方式,通过将完全注意力计算分解为多个更快的注意力操作,通过稀疏组合来进行稠密注意力操作,在不牺牲性能的情况下大幅降低了对于内存和算力的需求。
稀疏Transformer将先前Transformer的平方复杂度O(N^2)降低为O(NN^1/2),通过一些额外的改进使得自注意力机制可以直接用于长程的语音、文本和图像数据。
上图中间是第一种步进注意力的版本,可以粗略的理解为每一个位置需要注意它所在的行和列;另一种固定注意力的方式则尝试着从固定的列和元素中进行处理,这种方式对于非二维结构的数据有着很好的效果。
2.1.3 小结
尽管新兴的Tranformer在NLP各个领域都取得了不错的效果,针对长文本表示学习也有诸多优化技术,然而Tranformer本质上无法编码位置(只能基于位置编码), Why Self-Attention? A Targeted Evaluation of Neural Machine Translation Architectures对Transformer进行了深入的实证分析,在建模长距离主谓一致任务上的实验结果并没有表明,Transformer 在这方面优于 RNN, Transformer 是强大的语义特征提取器,但是在某些NLP任务上RNN仍然有一席空间。
2.2 RNN流派
因为RNN的结构天然适配解决NLP的问题,NLP的输入往往是个不定长的线性序列句子,而RNN本身结构就是个可以接纳不定长输入的由前向后进行信息线性传导的网络结构,而在LSTM引入三个门后,对于捕获长距离特征也是非常有效的。然而对于长句表示学习,RNN的并行计算能力极差。因为T时刻的计算依赖T-1时刻的隐层计算结果,而T-1时刻的计算依赖T-2时刻的隐层计算结果……..这样就形成了所谓的序列依赖关系。自从深度学习在NLP领域火爆以来,出现了很多针对RNN方法。
2.2.1 稀疏注意力回溯
本方法出自Bengio组的论文Sparse Attentive Backtracking (SAB): Temporal Credit Assignment Through Reminding。先举个例子,当你在高速公路上开车时,你听到了一种异常的爆炸声。但是仍然不以为意,直到你停下来加油时发现轮胎瘪了。然后你突然想起了在开车时听到的爆炸声。这样的回想能够帮助你确定爆胎的原因,并可能导致突触变化。而由于这种变化,在以后开车时听到这种爆炸声,你的处理方式可能会不一样。
在稀疏性限制最大的条件下(不利用过去的经验),SAB 将退化为使用常规的静态神经网络。在稀疏性限制最小的条件下(利用过去所有的经验),SAB 将退化为完全使用自注意力机制。为了达到目的,他们通过特定种类的增强 LSTM 模型探究前面二者之间的差距。
SAB分为两个阶段:
- 在前馈传播过程中,管理一个内存单元,并在每个时间步中最多选择过去记忆中的一个稀疏子集。这个过程称之为稀疏检索。
- 在反向传播过程中,将梯度仅仅传播到记忆的稀疏子集及其局部环境中。这个过程称之为稀疏回放。
2.2.2 QRNN
论文Quasi-Recurrent Neural NetworksQuasi 提出QRNN,其结合了RNN和CNN的特性。在使用卷积结构替代循环结构上,QRNN 没有纯 CNN 模型(e.g. WaveNet)那么激进,依然保留了一些循环结构。
2.2.3 IndRNN
论文Independently Recurrent Neural Network (IndRNN): Building A Longer and Deeper RNN, 提出了 IndRNN,亮点在于:1) 将 RNN 层内神经元解耦,使它们相互独立,提高神经元的可解释性。2) 有序列表能够使用 Relu 等非饱和激活函数,解决层内和层间梯度消失/爆炸问题,同时模型也具有鲁棒性。3) 有序列表比 LSTM 能处理更长的序列信息。
对比原始的RNN隐层计算:
$\mathbf{h}_{t}=\sigma\left(\mathbf{W} \mathbf{x}_{t}+\mathbf{U h}_{t-1}+\mathbf{b}\right)$
IndRNN 引入了 Relu 作为激活函数,并且将层内的神经元独立开来。对 RNN 的式子稍加改进,就变成了 IndRNN:
$\mathbf{h}_{t}=\sigma\left(\mathbf{W} \mathbf{x}_{t}+\mathbf{u} \odot \mathbf{h}_{t-1}+\mathbf{b}\right)$
2.2.4 SRU
论文Simple Recurrent Units for Highly Parallelizable Recurrence中提出的SRU方法,它最本质的改进是把隐层之间的神经元依赖由全连接改成了哈达马乘积,这样T时刻隐层单元本来对T-1时刻所有隐层单元的依赖,改成了只是对T-1时刻对应单元的依赖,于是可以在隐层单元之间进行并行计算,但是收集信息仍然是按照时间序列来进行的。所以其并行性是在隐层单元之间发生的,而不是在不同时间步之间发生的。SRU的测试速度为:在文本分类上和原始TextCNN的速度相当。
2.2.5 SRNN
论文Sliced Recurrent Neural Networks提出打断隐层之间的连接,比如每隔2个时间步打断一次,并通过层深来建立远距离特征之间的联系。SRNN速度比GRU模型快5到15倍。
2.2.6小结
对于原生的RNN,目前很多实验已经证明效果比起Transformer有较大差距,只有少数NLP任务RNN仍占有一席之地。然而RNN并行计算能力受限制太严重,RNN的发展目前处于进退维谷的阶段,也许未来的发展方向是RNN和其他模块如Transformer相结合,提高并行性。
2.4 CNN流派
最早将CNN引入NLP的是Kim在2014年做的工作。CNN捕获到的特征关键在于卷积核覆盖的那个滑动窗口。大小为k的滑动窗口轻轻的穿过句子的一个个单词,捕获到的是单词的k-gram片段信息,这些k-gram片段就是CNN捕获到的特征,k的大小决定了能捕获多远距离的特征,对于长句而言,暴力的取很大的k是无法解决长句依赖的特征提取问题的,针对长句表示学习挑战,针对CNN有以下两个方向的改进。
2.4.1 Dilated CNN
空洞卷积主要通过跳跃的方式实现扩大感受野,在论文An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling中,作者利用Dilated CNN拓展单层卷积层的输入覆盖长度,利用全卷积层堆叠层深,使用Skip Connection辅助优化,引入Casual CNN让网络结构看不到T时间步后的数据。
不过TCN的论文有两个明显问题:一个问题是任务除了语言模型外都不是典型的NLP任务,而是合成数据任务,所以论文结论很难直接说就适合NLP领域;另外一点,它用来进行效果比较的对比方法,没有用当时效果很好的模型来对比,比较基准低。所以TCN的模型效果说服力不太够。不过本人认为精调过的TCN对长句表示学习还是会优于传统的CNN。
2.4.2 Deep CNN
针对CNN改进的第二个方向是加深层数。第一层卷积层,假设滑动窗口大小k是3,如果再往上叠一层卷积层,假设滑动窗口大小也是3,但是第二层窗口覆盖的是第一层窗口的输出特征,所以它其实能覆盖输入的距离达到了5。如果继续往上叠加卷积层,可以继续增大卷积核覆盖输入的长度。
在论文Do Convolutional Networks need to be Deep for Text Classification出现之前,卷积神经网络进行文本分类都是用的很浅层的CNN,基本是一个词嵌入层、一个卷积一个池化然后两个全连接层,文章利用了29个卷积层,提升文本分类的准去率。
2.4.2 小结
以上是两种典型的解决CNN远距离特征捕获能力的方案,Dilated CNN偏技巧一些,而且叠加卷积层时超参如何设置有些学问,因为连续跳接可能会错过一些特征组合,所以需要精心调节参数搭配,保证所有可能组合都被覆盖到。相对而言,把CNN作深是主流发展方向,似乎BERT中叠加了n层的Transformer也是做深的一个例子。总的来说,CNN本身具有并行优势,在NLP也占有一席之地,不过近期不断被Transformer蚕食。
3 总结
1.不同的句子表征方法都有不同的特色,在具体业务问题上需要根据具体问题选择模型。
2.Tranformer和做深,高度并行是未来的一个趋势。
3.集合各种模型的优势如Transformer+CNN+RNN也是未来的一个趋势。
4.模拟人思考的方式进行模型的改进也是一个趋势,如Sparse Attentive Backtracking
5.RNN不管怎么改进并行化还是很差,实际使用先用CNN或Transformer。
参考文献:
1.Sparse Attentive Backtracking: Temporal Credit Assignment Through Reminding
2.Generating Long Sequences with Sparse Transformers
3.Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context
4.Why Self-Attention? A Targeted Evaluation of Neural Machine Translation Architectures
5.Independently Recurrent Neural Network (IndRNN): Building A Longer and Deeper RNN
6.Simple Recurrent Units for Highly Parallelizable Recurrence
7.Sliced Recurrent Neural Networks
8.Quasi-Recurrent Neural Networks
9.An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling
10.Do Convolutional Networks need to be Deep for Text Classification ?