RNN
RNN之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。
使用RNN,可以实现1对1、1对多,多对一,多对多模型
每个RNN网络都有一个小小的循环核心单元,它把x作为输入,将其传入RNN,RNN有一个内部隐藏态,这一隐藏态会在RNN每次读取新的输入时更新,然后当模型下一次读取输入时,这一内部隐藏态会将结果反馈至模型。
这个循环过程的计算公式:在RNN模块中对某种循环关系用f函数进行了计算,这一f函数依赖权重W,它接收隐藏态ht-1和当前态Xt,然后会输出下一个隐藏态或者更新后的隐藏态,称为ht。ht还可以用tanh来变成非线性
当读取下一个输入时,这个新的隐藏态将作为输入传入同一个函数,同时读取下一个输入,如果想要在网络的每一步产生输出,那么可以增加全连接层,每一步将作为输入,根据,每一步的隐藏态来做出决策。
全过程
这个块每次在接收不同的h和不同的x,但都在使用相同的w权重;
如果将反向传播的原理应用到这个模型中,会得到在每一个时步下计算出的梯度,最终的w梯度是所有时步下独立计算出的梯度之和;
可以计算每个时步对应的损失值,得到每个时步的损失值后将它们加起来得到最终损失。
语言模型
该输入进入一个RNN单元内,之后输出,即网路对组成单词的每个字母的预测,也就是认为接下来最可能出现的字母。
不断重复上述的过程,如果用不同的字母序列去训练这个模型,最终它会学习如何基于之前出现过的字符来预测接下来出现的字符。
测试阶段
我们可能会用该模型测试一下样本,并使用这个训练好的神经网络模型去生成新的文本;采用的方法是通过输入一些文本的前缀来测试这个模型,在这个实例中,这些前缀只是一个字母h,在递归神经网络的第一步输入字母h,它会产生一个基于词库中所有的字母得分的分布,在训练阶段,使用这些得分去输出一个结果,所以使用一个softmax函数,把这些得分转换为一个概率分布,然后从这些概率分布中得到样本输出去生成序列中的第二个字母。
沿时间截断反向传播方法
即使输入序列很长,甚至趋近于无限,采用的方法是在训练模型时前向计算若干步,也就是会计算机若干子序列的损失值,然后沿着这个子序列反向传播误差,并计算梯度更新参数,重复此过程;
图像标注
公式中多了 添加图像信息
把图像输入通过卷积神经网络,用末尾的4096维的向量作为第一个初始化输入,得到词汇表中的所有分数的分布,从分布中采样并在下一次时间步时当作输入传回,最后就能生成完整的句子。
注意力模型
上述有缺陷,这是另一个高级点模型
产生两个输出:一个是词汇表上的分布;一个是图像位置的分布;
当训练完模型后,可以看到它会在图像中转移注意力,在生成每个图片标题的单词时,可以看到它生成标题:A bird flying over a body of water.但是可以看到它的注意力在图片中的不同地方变换。
视觉问答
模型准备将两个东西输入:图像和输入自然语言描述的问题;如下图:
以设想针对输入问题的每个元素建立递归神经网络,从而将输入的问题概括为一个向量,然后可以用CNN将图像也概括(为一个向量),现在CNN把得出的向量和输入问题的向量结合,通过RNN编程预测答案的概率分布,有时候会把soft attention也结合到视觉问答之中。
经常会见到的是多层递归神经网络,但层数不会太多,一般3,4层循环神经网络结构
Vanilla的基本函数形式,及反向传播
每次反向传播经过一个单元时都要使用其中某一个W的转置,这意味着最终的表达式对的梯度的表达式将会包含很多权重矩阵因子,可能会梯度爆炸/梯度消失
这里有一个常用的方法来解决梯度爆炸的问题,称为梯度截断;在计算梯度后,如果梯度L2范式大于某个阈值,就将它剪断并做除法,这样梯度就有最大阈值;
而对于梯度消失的问题,常用的方法是改变为更加复杂的RNN结构,如 LSTM;
LSTM
LSTM,即长短期记忆网络;它是递归神经网络的一种更高级的递归结构,LSTM常被设计用来缓解梯度消失和梯度爆炸的问题。
每个时间步中都维持两个隐藏状态:一个是ht,另一个是叫做单元状态ct,这个叫单元状态的向量相当于保留在LSTM内部的隐藏状态并且不会完全暴露到外部去。
f :用于遗忘的门叫做"遗忘门",
i: 用于信息增加的叫做"信息增加门",
o:用于输出的"输出门".
g:保留多少信息的门
前3个门都用了sigmoid,g用了tanh
LSTM进行反向传播,通过单元状态的路径是一种梯度高速公路,解决了梯度消失问题
这里只计算了c的梯度,w的梯度可以在每个中单独计算
参考:https://blog.csdn.net/qq_34611579/article/details/81264108