RNN 的 output 和 state 的区别

RNN 的 output 和 state 的区别

问题记录

学习模型验证,要提取RNN的隐藏状态的时候遇到了一个难题,就是RNN的output 和 state 的区别。也就是说,model.predict()输出的是不是我想要的s呢

简单RNN

最简单的RNN单元,它每次接受一个当前输入 x_t 和前一步的隐层状态 s_{t-1},然后产生一个新的隐层状态 s_t,也即:s_t = f(x_t, s_{t-1}),其中 f 代表某个函数,对应于 RNN 内部的运算过程。
RNN 的 output 和 state 的区别

RNN 的 output 和 state 的区别

这种情况下,s_t = y_t = h_t。

LSTM

对于 LSTM,s_t = y_t = h_t? 分情况讨论
LSTM的循环部件其实有两部分,一个是内部 cell 的值,另一个是根据 cell 和 output gate 计算出的 hidden state,输出层只利用 hidden state 的信息,而不直接利用 cell。李宏毅老师的LSTM模型:
RNN 的 output 和 state 的区别

RNN 的 output 和 state 的区别
在不考虑Ct 作为下一个神经元的输入的情况下:s_t = y_t = h_t

RNN 的 output 和 state 的区别

有时候,我们输入的时候需要把c_t加入输入层,来控制整个神经网络,这个时候其中真正用于循环的状态 s_t 其实是 (c_t, h_t) 组成的 tuple(LSTMStateTuple是一种特殊的 “二元组数据类型” ,它专门用来存储LSTM单元的state_size/zero_state/output_state.)
这里是一个多层 LSTM,可以把它 看成一个整体,这个整体进行循环所依赖的状态则是每一层状态组合成的 tuple,而每一层状态本身又是一个 (c, h) tuple,所以最后结果就是一个 tuple 的 tuple。RNN 的 output 和 state 的区别
总结
outputs, state 并不一定相等,要根据实际情况讨论: