NLP领域中,特征提取可谓是经历了显著的“变迁”与发展。回首过往,RNN曾以其独特的序列建模能力一度引领潮流,如今正如同明日黄花,逐步淡出历史舞台。紧接着,LSTM以解决长时依赖问题的独特设计展现出强大的生命力,虽已非最前沿,却仍老骥伏枥,若能进一步优化,其潜力不可小觑。
而今,Transformer架构如日中天,凭借自注意力机制彻底革新了特征提取的方法,已在NLP诸多任务中发挥着中流砥柱的作用。
本文笔者将深入浅出剖析RNN、LSTM以及Transformer的核心结构原理,一起见证算法是怎样做到一浪更比一浪强的。
RNN
为什么会出现RNN?
要搞明白这个问题,我们是不是可以先回想一下,在RNN之前的模型还有什么可改进点?
没错,从这里着手,问题就将会迎刃而解了。细想BP、CNN(卷积神经网络),可以当做能够拟合任意函数的黑盒子,只要训练数据足够,给定特定的x,就能得到期望的y。结构图如下:
但是不难发现,它们都只能单独的处理一个个的输入,前一个输入和后一个输入是完全没有关系的。而我们实际应用中肯定有需要处理序列信息的任务吧,即就是前面的输入和后面的输入是有关系的。
例如,当我们理解某句话意思时,孤立的理解每个词肯定是不够的,而是需要处理这些词连接起来的整个序列,“词本无意,意由境生”,也正是此意。还有,处理视频的时候,当前也不能只单独的分析每一帧,而是要分析这些帧连接起来的整个序列。
为了解决一些这样类似的问题,能够更好的处理序列的信息,RNN就诞生了。
RNN解释
我们通常所说的RNN实际上有两种,一种是Recurrent Neural Networks,即循环神经网络,一种是Recursive Neural Networks,即递归神经网络。
循环神经网络,是一种时间上进行线性递归的神经网络,用于处理序列数据。
相比于传统的神经网络,它可以处理序列变化的数据。比如某个词汇的含义根据上下文内容不同而有所不同,RNN则可以很好地解决这类问题。
递归神经网络(Recursive Neural Networks)被视为循环神经网络的推广,它是一种在结构上进行递归的神经网络,常用于NLP中的序列学习,它的输入数据本质不一定是时序的,但结构却往往更加复杂。
我们这里只说循环神经网络RNN。
首先来看一个简单的RNN,它由输入层、一个隐藏层和一个输出层组成:
如果将W的那个带箭头的圈去掉,它就变成了最普通的全连接神经网络。
- x是一个向量,它表示输入层的值。
- s是一个向量,它表示隐藏层的值(这里隐藏层面画了一个节点,你也可以想象这一层其实是多个节点,节点数与向量s的维度相同)。
- U是输入层到隐藏层的权重矩阵。
- o也是一个向量,它表示输出层的值。
- V是隐藏层到输出层的权重矩阵。
那么,现在我们来看看W是什么。循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s。而权重矩阵W就是隐藏层上一次的值作为这一次的输入的权重。
具体如下图所示。可以清楚的看到,上一时刻的隐藏层是如何影响当前时刻的隐藏层的。
当然我们也可以将上面的图按时间线展开,循环神经网络也可以画成下面的样子:
现在就可以清晰看出,该网络在 t t t时刻接收输入 x t x_t xt,隐藏层的值 s t s_t st由上一时刻的 s t − 1 s_{t-1} st−1和 x t x_t xt的权重矩阵W决定。
公式表示如下:
O t = g ( V ∗ S t ) O_t = g(V*S_t) Ot=g(V∗St)
S t = f ( U ∗ X t + W ∗ S t − 1 ) S_t = f(U*X_t+W*S_{t-1}) St=f(U∗