TensorFlow循环神经网络

为什么有RNN

CNN(卷积神经网络)我们会发现, 他们的输出都是只考虑前一个输入的影响而不考虑其它时刻输入的影响, 比如简单的猫,狗,手写数字等单个物体的识别具有较好的效果. 但是, 对于一些与时间先后有关的, 比如视频的下一时刻的预测,文档前后文内容的预测等, 这些算法的表现就不尽如人意了.因此, RNN就应运而生了

什么是RNN

RNN是一种特殊的神经网络结构, 它是根据"人的认知是基于过往的经验和记忆"这一观点提出的. 它与DNN,CNN不同的是: 它不仅考虑前一时刻的输入,而且赋予了网络对前面的内容的一种’记忆’功能

RNN之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出

RNN主要应用领域

  • 自然语言处理(NLP): 主要有视频处理, 文本生成, 语言模型, 图像处理
  • 机器翻译,机器写小说
  • 语音识别
  • 图像描述生成
  • 文本相似度计算
  • 音乐推荐,商品推荐,视频推荐

RNN模型结构

前面我们说了RNN具有时间"记忆"的功能, 那么它是怎么实现所谓的"记忆"的呢

如图所示, 我们可以看到RNN层级结构较之于CNN来说比较简单, 它主要有输入层,Hidden Layer, 输出层组成.
并且会发现在Hidden Layer 有一个箭头表示数据的循环更新, 这个就是实现时间记忆功能的方法
TensorFlow(三)循环神经网络

RNN展开讨论

TensorFlow(三)循环神经网络
如图2所示为Hidden Layer的层级展开图. t-1, t, t+1表示时间序列. X表示输入的样本. St表示样本在时间t处的的记忆,St = f(WSt-1 +UXt). W表示输入的权重, U表示此刻输入的样本的权重, V表示输出的样本权重

在t =1时刻, 一般初始化输入S0=0, 随机初始化W,U,V, 进行下面的公式计算
TensorFlow(三)循环神经网络
其中,f和g均为**函数. 其中f可以是tanh,relu,sigmoid等**函数,g通常是softmax也可以是其他

时间就向前推进,此时的状态s1作为时刻1的记忆状态将参与下一个时刻的预测活动
TensorFlow(三)循环神经网络
以此类推, 可以得到最终的输出值为
TensorFlow(三)循环神经网络

  1. 这里的W,U,V在每个时刻都是相等的(权重共享).
  2. 隐藏状态可以理解为: S=f(现有的输入+过去记忆总结)

RNN算例

TensorFlow(三)循环神经网络
我们来看输入,共分为两个时刻,其中t0=1,t1=2,输入是如何转换为输出的呢,下面逐步进行分解。

初始时刻,没有上一个隐层的输出,因此初始化为[0,0]。

将上一个隐层的输出与当前时刻输入进行拼接,得到第一个隐藏计算的输入为[0,0,1]。

隐层内计算,将拼接后的输入值与初始权重W进行相乘,同时加上偏置b,得到一个基础值,值得注意的是这个W和b是一个更新的过程,需要不断迭代计算。

第一次**,这次**是对s(t)进行**,采用的**函数为tanh函数,将上一步得到的基础值代入到tanh函数中,得到的输出即为s(t),这个s(t)将作为下一层的s(t-1)参与下一个隐层的计算。

当前层输出基础值计算,将s(t)和新的权重V相乘加上偏置b,得到当前层输出基础值。

当前层最终输出,加上**函数以后就是当前层的输出啦,此时采用的**函数一般为softmax()。