循环神经网络RNN部分原理
RNN
什么是RNN?
隐藏层的输出会被保留在记忆元中,在处理下一次的输入时,记忆元中的值也会被考虑。它会考虑序列的顺序,输入序列的顺序不同输出也不同。下图为权重为1,偏置为0,激活函数为线性的RNN架构处理输入序列$[1,1]^T,[1,1]^T,[2,2]^T$的情况
其他RNN
循环神经网络的架构是可以任意设计的,之前提到的RNN只有一个隐藏层,但RNN也可以是深层的。
Elman 网络 &Jordan 网络
Jordan 网络存的是整个网络输出的值,它把输出值在下一个时间点在读进来,把输出存到记忆元里。Elman网络没有目标,很难控制说它能学到什么隐藏层信息(学到什么放到记忆元里),但是Jordan网络是有目标,比较很清楚记忆元存储的东西。
双向循环神经网络Bi-RNN
同时训练一个正向的循环神经网络,训练一个逆向的循环神经网络,然后把这两个循环神经网络的隐藏层拿出来,都接给一个输出层得到最后的$y_t$。它的好处是神经元产生输出的时候,考虑的范围是比较广的
LSTM
LSTM有三个门,负责控制是否输入、清除记忆和输出
**输入门:**输入门被打开时,才能把输入值写入记忆元
**输出门:**输出门被打开时,外界的神经元才能把记忆元的内容读取出来
**遗忘门:**遗忘门决定什么时候将记忆元的东西遗忘。当遗忘门被打开时,将输入与记忆元内容进行计算后存入记忆元。当遗忘门被关闭时,清除记忆元的内容。记忆元对应的计算公式为$c\prime = g(z)f(z_i)+cf(z_f)$
假设要被存到单元的输入为$z$,操控输入门的信号为$z_i$,操控遗忘门的信号为$z_f$,操控输出门为$z_o$,综合这些会得到一个输出记为$a$。
$z$通过激活函数得到$g(z)$,$z_i$通过激活函数f得到$f(z_i)$,f通常会选择sigmoid函数,因为其值介于0~1之间,可以表示门被打开的程度,如果f的输出是1,表示门被打开的状态,反之这个门是关起来的。接下来把$g(z)$乘$f(z_i)$得到$g(z)f(z_i)$。对于遗忘门的$z_f$,也是通过sigmoid函数得到$f(z_f)$,接下来把记忆元里的值$c$乘$f(z_f)$得到$cf(z_f)$,相加得到$c’=g(z)f(z_i)+cf(z_f)$存入记忆元中。
LSTM原理
原来的神经网络里会有很多神经元,可以直接把LSTM当作一个神经元
假设用的神经元的数量跟LSTM是一样的,则LSTM需要的参数量是一般神经网络的四倍。
如图,假设有一排LSTM,将所有LSTM的值连接起来就变成了向量,记作$c^{t-1}$,现在在时间节点$t$,输入向量$x_t$,这个向量首先会乘上一矩阵变成一个向量$z$。向量$z$就代表了每个LSTM的输入,z的维度刚好是LSTM的数量。将$x_t$进行另外一次变换得到$z_i$,$z_i$的维度也和LSTM单元的数量一样,$z_i$的每一个维度都会去操控输入门。输出门与遗忘门也是相同的道理。所以我们把$x_t$进行四次不同的变换得到四个不同的向量,四个向量的维度与LSTM的数量一样,把这些向量合起来就会去操控这些记忆元的运作。
完成该时间点的操作后,继续进行下一个时间点的运算。真正的LSTM还会把上个时间点输出值$h^t$接入当作下一个时间点的输入,并添加peephole连接,即把记忆元的值也拉过来。操控LSTM四个门的时候,同时考虑$x_{t+1},h^t,c^t$,把这三个向量并在一起经过变换得到四个不同的向量再去操控LSTM
LSTM 通常不会只有一层














