前言
现在RNN已经没有以前那么流行了。在数据量大的情况下不如Transformer,但是在小数据的情况下仍然表现良好。
How to model sequential data?
1. one to one模型
像MLP和CNN,还有前面两节课讲到的二分类问题,都是基于one to one模型,也就是把数据一股脑输入进去,然后得到一个输出。one to one 模型的特点(局限)如下:
- 整段地处理数据
- 固定大小的输入(如图片)
- 固定大小的输出(如每个类别的概率)
2. many to one or many to many
在处理不固定长度的输入和输出的问题(即sequential data)的时候,显然one to one模型并不适合。而RNN就是可以处理sequential data的模型。RNN很适合文本,语音和时间序列等数据。
3. RNN
RNN和人的阅读习惯很类似,人在阅读时会一边看一边在大脑里面积累信息,而RNN则每次用一个状态向量
h
t
h_t
ht 来记录阅读过的信息。每向RNN输入一个word embedding信息,RNN就会更新自身的状态向量。
如下所示:
h
0
h_0
h0 包含了the的信息,而
h
2
h_2
h2 包含了the, cat, sat的信息,最后一个状态
h
t
h_t
ht 包含了整句话的信息,其中:
- RNN从始至终只有一个参数矩阵A,每次通过这个矩阵A来更新状态向量
- 对A进行随机初始化,然后用训练数据来训练A
Simple RNN
1. Simple 如何把输入的向量 x t x_t xt 结合到状态向量 h t h_t ht 里面?
- 我们把上一个状态记作 h t − 1 h_{t-1} ht−1,把输入的 x t x_t xt 和 h t − 1 h_{t-1} ht−1 做一个concatenation
- 把concatenation后的向量与参数矩阵A相乘
- 对相乘后得到的向量的每一个元素输入到一个激活函数(双曲正切函数tanh,输出范围为-1到1),把激活函数的输出作为新的状态向量
我们这样来理解下面的结构图:对于 t 状态的特征向量,其取决于:①当前输入 x t x_t xt ②上一个状态的特征向量 h t − 1 h_{t-1} ht−1 ③模型的参数矩阵A
2. Question : Why do we need tanh function?
我们假设输入的词向量为0:那么A矩阵蓝色部分都会和0相乘,结果得到的就是 A ⋅ h t − 1 A·h_{t-1} A⋅ht−1 ,若经过多次输入,则结果就会如下图所示: h 100 = A 100 h 0 h_{100}=A^{100}h_0 h100=A100h0,这样:
- 如果参数矩阵A里面的最大值为0.9(小于1),那么经过多次方,会使特征向量最后接近0,
- 而若是最大值为1.2(大于1),则经过多次方后会变为一个很大的数,若轮数再多则会接近无穷,也就是NaN(爆炸)
- 所以考虑到输入的多样性,我们会在每一个更新状态向量后做一个normalization,使其范围回到
[
−
1
,
1
]
[-1,1]
[−1,1]。
3. 矩阵A的维度(即需要训练的参数数量)
- 行:特征向量h的维度+输入向量的维度
- 列:特征向量h的维度
- 固总参数量为:(特征向量h的维度+输入向量的维度)* 特征向量h的维度
4. 用RNN对前两节课的数据集IMDS进行处理
- 特征向量的维度和词嵌入的维度都需要自己确定,需要使用交叉验证
- 最后只使用 h t h_t ht 即可,因为 h t h_t ht 包含了整句话的信息
- 把
h
t
h_t
ht 输入一个分类器,这个分类器就会输出一个从0到1的数值,0代表负面评价,1代表正面评价
代码: 其中变量的含义和上节课类似
参数总览:
最终结果:
如果我们不只是想用最后一个向量,而希望把每个状态向量都用到: 只需要把return_sequences改为True,然后加一个Flatten层展平就好了。
改动后的参数总览:
改动后的结果: 跟之前比并没有提升
5. Simple RNN的缺点
- Simple RNN在短时的效果比较好,在下面那句话中,RNN只需要关注 clouds are in the 即可,并不需要关注很长的上文,因此可以做出比较好的预测
- Simple RNN在长时的效果较差,
h
t
h_t
ht 和前面的
t
t
t 个输入都有函数依赖关系。按道理说改动某一个前面的输入,后面的所有
h
t
h_t
ht 都会受到影响,但是Simple RNN并没有这种性质,所以很不合理。例如:
h
100
h_{100}
h100 对
x
1
x_1
x1 求导,其导数几乎等于0!这表明改动
x
1
x_1
x1 几乎不会对
h
100
h_{100}
h100 产生影响。所以
h
100
h_{100}
h100 会遗忘很多以前的信息。
- 如下图所示,Simple RNN几乎很难做到对Chinese这个单词的准确预测,因为它很“健忘”