RNN网络就是处理大小可变的有序数据的一类模型
1 Vanilla Neural Networks
2 Image Captioning image -> sequence of words
3 action prediction sequence of video frames -> action class
4 Video Captioning Sequence of video frames -> caption
5 Video classification on frame level
Vanilla RNN
RNN有一个隐藏态,在读入输入后更新并返回给模型自己,和下一个tIme step读入的数据输出新的隐藏态。这大概就是RNN中循环recurrent的含义
如果想让模型在每一个时间步产生输出,就用全连接层 根据每一步的隐藏态做出决策。注意,在每一时步用的是同一函数f和同一权重w。
many to many: 由于使用的是同一个节点,所以在反向传播过程中,每一时步计算出来的权重梯度会累加在w上。L是损失。在每一时步下都有一个和输入序列对应的真实标签,最终的损失值就是所有单独损失之和
many to one: 根据网络最终的隐藏状态做决策
one to many: 接受固定长的输入项,输出不定长的输出项
Sequence to Sequence: 输入不定长,输出不定长
左边把不定长序列编码为单独的向量,右边解码
例子
训练阶段: 将输入字母变成one ho向量,根据每一个输入的字母,预测下一个字母,可以使用Softmax来度量预测的损失
预测阶段:输入只是前缀h,之后下一个时间步的输入是上一个时间步的输出。下图中,h输入后并没有选择得分的o,而是选择了e。视频的解释是根据输出结果的概率分布而不是得分,让输出结果多元化。理解:根据一个h来预测整个单词还是太勉强了。这地方可以参考beam search集束搜索的概念,不是输出可能性最大的结果,而是固定记录几个选项,随着时间步的增长,从中挑优
反向传播
如果序列很长,那么反向传播要遍历整个序列,时间长,占内存,难收敛
训练的时候向前计算若干步(比如100),然后沿着这个子序列反向传播
RNN优缺点
Image Captioning
结构
CNN的输出不是softmax向量,而是直接把4096维的向量输出,作为图片的信息输入RNN。计算隐藏层的时候增加一个矩阵,以便在每一个时间步添加图片信息
和前面讲的一样,RNN把上一个时间步得到的结果作为下一个时间步的输入
(实在是要看崩溃了,放弃了)