之前学习了seq2seq、attention、transformer等等模型,它们都可以针对序列建模,现在我们再来看回最初学习的RNN,从公式的角度去分析,为什么即使现在出现了那么多新模型,它依然有重要的存在意义。
RNN的循环,就是指同一个结构的不断循环,RNN可以处理序列数据,但并不意味着它有着和输入序列同样长度的神经元数量,先来回顾一下RNN的公式:
$$h_t = f(W_1x_t + W_2h_{t-1})$$
可以看到,RNN在t时刻的输出,其实就是隐层在t时刻的输出经过线性变换和非线性变换得到的,这是很普通的神经网络的操作,重点就在于,隐层的输出,不仅仅取决于输入x,还取决于上一时刻t-1的隐层输出,这才是RNN的核心。
RNN的这种循环结构,既是它的优点,也造成他最发的缺点,通过把过去时刻的隐层输出传到下一个时刻,这样就能使得某一时刻的输出能够利用到过去所有时刻的隐层输出,可是在反向传播的过程中,我们需要调整上一时刻的隐层输出的参数,而且这个参数是不共享的,这就导致了在不断传播求偏导的过程中,对于历史久远的隐层输出,参数调整的幅度非常小,或者说这些时刻的数据其实并没有有效地参与到模型的学习。
虽然现在提出了注意力机制、transformer模型,注意力计算使得他们能够并行对各个时刻的数据进行分析,避免了RNN的这种短期记忆的缺点,可是位置编码并不像RNN的循环结构,能够使他们有效地利用位置、顺序信息进行学习,如何改善短期记忆的同时又能有效利用位置信息,是目前的一个主要研究问题。