RNN:
循环神经网络(Recurrent Neural Networks),可以实现不同类型的输入/输出
如:
1 to 1:固定输入得到固定输出
1 to many: 比如输入固定size的图片,输出的是可变长度的序列,比如一段描述文本,长度随着单词数而变
many to 1: 比如输入一段可变长度的文本,输出其情感分类向量
many to many: 比如翻译任务
many to many(一一对应): 输入是可变序列,输出是针对输入的每个元素作出判断,比如帧数级别的视频分类任务,输入是帧数可变的视频,输出对每一帧进行决策判断
循环核心单元:
RNN有一个反复出现的小循环核心单元,通过输入x给RNN,计算得到内部隐藏状态h,h会在每次读取新的内容时进行更新,模式如下:
读取输入x->更新隐藏状态h->基于隐藏状态计算得到输出y
隐藏状态h的更新公式如下:
在每一个时间戳都是相同的
例子:
比如vanilla RNN的更新公式:
RNN的计算图:
多对多(x与y一一对应):
注意到每个时间戳应用的W都相同,因此在反向传播的时候,需要将每一个时刻的梯度累加起来,才得到W最终的梯度(因为Loss是每一个时刻的loss加起来)
多对一:
在最后一个隐藏状态包含了之前所有文本的信息
一对多:
一对多的情况会接受固定长度的输入项,输出不定长的输出项,固定长度的输入项会用来初始化隐藏状态,然后RNN对输出的单元逐个处理,最终得到不定长的输出序列
多对多(均不定长):
如翻译任务,可以看作是多对一+一对多的组合,首先输入一个不定长的x到多对一的模型中,得到一个最终隐藏h,这个h被称为上下文向量,被认为包含了x的所有文意信息,然后将h作为输入,输入到一对多的模型中,得到输出序列,那么就可能是用另一种语言表述相同意思的句子
语言模型:
我们训练语言模型,读取大量的语句语料,让其能够学会字词的组合规律并生成自然语言
在语言模型的训练阶段,我们将训练序列作为输入项,每一个时间步的输入都是一个字符
字符在输入中被表示成one-hot编码的向量,即字符对应的维度为1,其余维度为0的向量,这样可以避免直接使用数字编码而导致的偏差,我们输入RNN单元得到的输出y就是其预测的下一个可能的字母,(这里取softmax概率最高的)
在测试阶段,我们输入文本的前缀,然后RNN会产生下一个预测字母的概率分布,我们根据这个概率分布进行采样得到下一个字母(不是取概率最高的,而是进行采样),直到把单词输出完毕为止
截断反向传播(truncated backpropagation):
由于实际使用模型的时候,输入的文本序列可能很长,从而导致时间戳很长,这样反向传播就难以进行,于是我们采用截断反向传播,也就是说每隔一段时间就进行一次反向传播,这次反向传播只对这段时间涉及到的输入数据点进行权重的更新
其实这样有点类似遗忘机制,因为文本和前面好多段的内容联系会很少,但这种是没有选择性的遗忘
不截断的loss组成:
截断的loss组成:
图片描述:
图片描述模型,即输入一张图片,得到其自然语言语义描述,那么自然会想到用RNN实现
训练阶段:
先通过卷积神经网络处理图像,生成图片向量(取全连接层前的输出向量),作为图像内容的表征,然后作为全局特征向量输入到RNN中生成文本,其中第一个时间戳输入的x是一个特殊的start标记
测试阶段:
同样是先对图像卷积,取全连接层前的输出向量,第一个时间戳的输入x是特殊的start标记,隐藏状态更新公式如下:
其中v是图像的全局特征向量
第二个时间戳之后的输入x是由上一个时间戳输出的y采样得来的
基于全局注意力机制的图片描述模型:
该模型的RNN在生成单词时,会将注意力放在图像的不同部分
CNN处理图像后,不再返回一个单独的向量,而是得到图像不同位置的特征向量,比如L个位置,每个位置的特征有D维,最终返回一个 的矩阵
这样一来,在RNN的每一个时间戳,除了得到词汇的采样,还会得到基于图片位置的分布,它代表了RNN想要观察图片的哪个部分,即注意力
软注意力机制如图:
首先在第一个时间戳,会计算出基于图片位置的分布,
会与特征图运算得到
特征向量,则
是包含了特定图片位置的信息特征向量,并作为下一个时间戳的额外输入,且之后的时间戳都会得到两个输出,一个是注意力的分布,另一个是词汇的分布,如此循环如下:
上述z的计算公式可以如下:
其中就是每个位置的概率,即位置的分布,
是L个特征向量中的第i个
硬注意力:
硬注意力每次只产生一个单独的特征向量,它不是所有特征的组合,但它反向传播比较复杂,因为区域的选择过程不是一个可微的函数
多层RNN:
在多层RNN中,隐藏状态不止1个,而是有3层,一次运行得到RNN的第1层隐藏状态的序列,然后作为第2层隐藏序列的输入,如图:
普通RNN的梯度流:
由于RNN从头到尾循环的时候,输出要多次乘权重矩阵,那么反向传播的时候也是同理,梯度要多次乘权重,则很容易出现梯度消失或者梯度爆炸
LSTM:
LSTM(long short term memory),用于解决梯度消失和梯度爆炸
LSTM在每一个时间戳都会维持两个隐藏状态:
: 与RNN中的意义一致
:单元状态向量,是保留在LSTM中的隐藏状态,不会完全暴露到外部
LSTM有四个门:
输入门(i):表示有多少内容被写到单元状态
遗忘门(f):表示对之前的单元状态的遗忘程度
输出门(o):表示单元状态输出多少给隐藏状态
门值门(g):控制写入到单元状态的信息
模型公式如下:
对于的更新公式,f与
做点积的意思是,当f为1时,表示记住上一个状态,为0时表示忘记
i和g共同控制写入到单元状态的信息,每个时间戳,单元状态向量的每个元素最大自增1或最小自减1