人类不会每秒都从头开始思考!
循环神经网络会记忆之前的信息,并利用之前的信息影响后面结点的输出。也就是说,循环神经网络的隐藏层之间的结点是有连接的。

隐藏层的输入,不仅包括输入层的输出,
还包括上一时刻隐藏层的输出
需要特别注意的是,RNN的隐藏层并不和传统的前馈神经网络具有相同的含义,在上图中,A即为RNN的隐藏层。

循环神经网络的隐藏层可以看作是同一网络的多个副本,每个副本都将消息传递给后继者。在神经网络逻辑中,上图其实只有左侧部分,其展开可理解为在不同时间(time step)下同一隐层(cell)的状态,明显它们是参数共享的。
循环神经网络可以看作是同一神经网络结构在时间序列上被复制多次的结果,这个被复制多次的结构被称之为循环体。
如何设计循环体的网络结构是循环神经网络解决实际问题的关键。

在标准RNN中,此重复模块将具有非常简单的结构(tanh层)
有时,我们只需要查看最新信息即可执行当前任务。

但是在某些情况下,我们需要更多的上下文。不幸的是,随着差距的扩大,RNN变得无法学习连接信息。

Understanding-LSTMs
- σ:激活函数 Sigmoid(x)=1+e−x1
- tanh:激活函数 Tanh(x)=ex+e−xex−e−x
- ⊗:输入部分相乘
- ⊕:输入部分相加
长短期记忆网络(LSTM)是一种特殊的RNN,能够学习长期依赖关系。

graph LR
h1_t-1["h_(t-1)"]
x1_t["X_(t)"]
c1_t-1["C_(t-1)"]
stake11(("·"))
input11[input1]
input12[input2]
h1_t-1-->stake11
x1_t-->stake11
c1_t-1-->input12
stake11-->input11
subgraph Cell
f1_t["f_(t)"]
i1_t["i_(t)"]
cc1_t["C~_(t)"]
o1_t["o_(t)"]
c1_t["C_(t)"]
h1_t["h_(t)"]
input11--Sigmod-->f1_t
input11--Sigmod-->i1_t
input11--Tanh-->cc1_t
input11--Sigmod-->o1_t
mul11(("×"))
mul12(("×"))
mul13(("×"))
add11(("+"))
input12-->mul11
f1_t-->mul11
i1_t-->mul12
cc1_t-->mul12
mul11-->add11
mul12-->add11
add11-->c1_t
c1_t--Tanh-->mul13
o1_t-->mul13
mul13-->h1_t
end
h1_t-->output11["output1"]
c1_t-->output12["output2"]
graph TB
g1(("·"))---note1["属性合并"]
g2(("+"))---note2["矩阵加法"]
g3(("×"))---note3["矩阵乘法"]
即指h(t)的维数。
单元状态有点像传送带。它沿整个链条一直沿直线移动,只有一些较小的线性相互作用。信息非常容易就可以不加改变地流动。

LSTM有删除信息或将信息添加到单元状态的能力,这些信息由称为门的结构精心调节。

门状结构
闸门是一种选择性地让信息通过的方式。其有以下三种门。
LSTM的第一步是决定要从单元状态中丢弃哪些信息。

下一步是确定要在单元状态下存储哪些新信息。包含两部分,第一路(σ)决定更新哪些值,第二路(tanh)新建候选值向量并添加到状态中。

将单元旧状态与ft相乘,然后加上it×C~t生成新的候选值。

最后,我们需要决定要输出的内容。

由Gers & Schmidhuber (2000)提出,可以让Gate Layers查看单元状态。

使用耦合的忘记门和输入门。

由Cho, et al. (2014).提出的门控循环单元,将忘记门和输入门合并为更新门,此外还合并了单元状态和隐藏状态。
