关于RNN的介绍有非常多,但是一直看的有些云里雾里的,特别是RNN做deep的结构是怎么样,即rnnLayer的结构,然后明白rnnLayer前向计算的方法。至于backward,特别是BPTT,暂时就不讲了,因为确实没看懂。
RNN简介
![](https://img.haomeiwen.com/i8896290/b1c9a0c2a26fb3f4.png)
rnn的计算公式如下:
![](https://img.haomeiwen.com/i8896290/48ead2cfdddeeccb.png)
直接看图,左侧是一个rnn的示意图,右侧是将rnn展开,展开可以理解为右侧这三个“圈”是一个rnncell,这三个rnncell是用的同一个权重的,即U和W是一样的,只不过是做一个rnn在三个时间步的输入不同的。
此外,如果熟悉tensrflow的会知道,tf里面有动态rnn和静态rnn,静态rnn就如图片所示,先按照一个固定长度将rnn展开,动态rnn则是用tf.while循环来实现。
如果觉得这里对单个rnn讲的不清楚的话可以参考这篇文章,写的非常详细。
RNN如何deep
深度学习自然是要做deep的,那么rnn的deep是什么样的结构呢,直接看图:
![](https://img.haomeiwen.com/i8896290/1217dc2a0adcbf10.png)
上图是一个两个时间步3个rnn的展开示意图,其中每一个“圈”代表一个RNN单元,不同的颜色的“圈”代表不同的RNN单元,每一根连线代表隐状态计算的权重,此处颜色相同也是不同的权重。
假设输入,对应线性变化的权重矩阵
;rnn单元的隐藏层输出的都是一个标量,初始化一个隐状态的矩阵
,权重矩阵
。
在时间:
,
在时间:
。
注意两个时间步的权重矩阵是不变的。
最后,如果结合图还是不能理解的话,可以结合推荐的文章,再看一下rnn前向计算的代码:
def forward(self, input_array):
self.times += 1
state = (np.dot(self.U, input_array) +
np.dot(self.W, self.state_list[-1]))
element_wise_op(state, self.activator.forward)
self.state_list.append(state)
LSTM, GRU的deep结构
理解了rnn的前向计算,那么lstm的前向计算也就很简单了,只不过是每个rnncell变成了lstmcell,每一个cell的输出多了cell state和hidden state,但是大致的结构还是相似的。
参考
关于rnn的理解,非常建议观看李宏毅老师的视频,深入浅出:
https://www.bilibili.com/video/BV17A411j7SF/?spm_id_from=333.788.videocard.0
网友评论