美文网首页
一文读懂rnn如何做deep

一文读懂rnn如何做deep

作者: 打杂算法工程师 | 来源:发表于2020-12-01 23:37 被阅读0次

关于RNN的介绍有非常多,但是一直看的有些云里雾里的,特别是RNN做deep的结构是怎么样,即rnnLayer的结构,然后明白rnnLayer前向计算的方法。至于backward,特别是BPTT,暂时就不讲了,因为确实没看懂。

RNN简介


rnn的计算公式如下:


直接看图,左侧是一个rnn的示意图,右侧是将rnn展开,展开可以理解为右侧这三个“圈”是一个rnncell,这三个rnncell是用的同一个权重的,即U和W是一样的,只不过是做一个rnn在三个时间步的输入不同的x_{t-1}, x_t, x_{t+1}
此外,如果熟悉tensrflow的会知道,tf里面有动态rnn和静态rnn,静态rnn就如图片所示,先按照一个固定长度将rnn展开,动态rnn则是用tf.while循环来实现。
如果觉得这里对单个rnn讲的不清楚的话可以参考这篇文章,写的非常详细。

RNN如何deep

深度学习自然是要做deep的,那么rnn的deep是什么样的结构呢,直接看图:


结构示意图

上图是一个两个时间步x_t, x_{t+1}3个rnn的展开示意图,其中每一个“圈”代表一个RNN单元,不同的颜色的“圈”代表不同的RNN单元,每一根连线代表隐状态计算的权重,此处颜色相同也是不同的权重。
假设输入X_t=[x_1, x_2, x_3],对应线性变化的权重矩阵W=[[w_{11},w_{12},w_{13}],[w_{21},w_{22},w_{23}], [w_{31},w_{32},w_{33}]];rnn单元的隐藏层输出的都是一个标量,初始化一个隐状态的矩阵[h_0, h_1, h_2],权重矩阵U=[[u_{11},u_{12},u_{13}],[u_{21},u_{22},u_{23}], [u_{31},u_{32},u_{33}]]
在时间tH_t = f(WX_t^T+UH_{t-1}^T),
在时间t+1H_{t+1} = f(WX_{t+1}^T+UH_{t}^T)
注意两个时间步的权重矩阵是不变的。
最后,如果结合图还是不能理解的话,可以结合推荐的文章,再看一下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

相关文章

网友评论

      本文标题:一文读懂rnn如何做deep

      本文链接:https://www.haomeiwen.com/subject/fagjwktx.html