从RNN讲到Transformer
1990年,RNN雏形与BP网络结合出现,但是由于梯度消失和梯度爆炸的问题,训练比较困难。1997年,LSTM和双向RNN同年被提出来,解决了这个问题,并开始被广泛使用也出现了很多变体。pytorch tutorial的intermediate部分就是复现RNN相关网络,在pytorch框架上实现RNN网络比较简单,跟着教程走就行,但是有必要在这里也记录一下理论学习(理论学习资料:油管StatQuest with Josh Starmer的三个视频:RNN、LSTM、Transformer,当然也可以读李沐的动手学深度学习然后完成课后练习,这样可以更深入地巩固理论和实践知识,我有时间也要看一下并练习!!!)。
一、RNN(Recurrent Neural Network)
首先,在RNN被提出来之前,我们已经有很多神经网络可以很好地训练图像数据和语言数据等,对于这类数据输入时固定的,比如固定为一张图片,一句话等,如果我们还希望能在时序数据上也训练得比较好,能完美满足我的预测任务。
那为什么我要单独指出时序数据这种类型呢?
因为时间序列信息是连续输入的,不同于其他数据类型的固定状态。比如说,我要预测明天的天气,那我可以用过去五天的天气来进行预测,也可以用过去50天的天气来预测,时序数据预测模型必须满足我可以任意改历史数据数量,只要输出明天的预测值即可,只不过预测值可能更准确或者更模糊。另外,由于时间的连续性,我要预测明天的天气,就必须知道今天的天气,在今天的天气的基础上再继续预测明天的天气。诸如此类的差异性,让我们明显感觉到,我们需要一种新的网络针对性地完成时间序列数据集上的任务,现存的网络已经行不通了!
于是RNN诞生了
故名思意,循环神经网络中有循环结构,但是为了更好地理解,这里将循环结构铺平展开,展开后的网络结构如下:
便于理解,这里就举一个比较简单的例子——用前天的数据预测明天的数据。对上述图像进行概括如下:
- 首先,用前天数据预测昨天的数据,放进网络计算 y 1 = w 1 ∗ x 1 + b 1 y_1=w_1*x_1+b_1 y1=w1∗x1+b1,这时如果我们的预测目标是昨天的预测值,则我们可以直接用 y 1 y_1 y1输出,再把它扔进一个网络 p r e d y e s