Keras - 有状态与无状态LSTM

vgo*_*ani 19 deep-learning lstm keras tensorflow

我很难概念化Keras中有状态和无状态LSTM之间的区别.我的理解是,在每个批处理结束时,在无状态情况下"重置网络状态",而对于有状态情况,每个批处理都保留网络状态,然后必须在每个时代的结束.

我的问题如下:1.在无状态的情况下,如果状态未在批次之间保留,网络如何学习?2.何时使用LSTM的无状态与有状态模式?

小智 21

我建议您首先学习BPTT(通过时间反向传播)和小批量SGD(随机梯度下降)的概念,然后您将对LSTM的训练程序有进一步的了解.

对于你的问题,

Q1.在无状态情况下,LSTM更新batch1上的参数,然后启动batch2的隐藏状态和单元状态(通常全部为零),而在有状态情况下,它使用batch1的最后输出隐藏状态和单元格状态作为batch2的初始状态.

Q2.如上所示,当两个批次中的两个序列具有连接(例如一个股票的价格)时,您最好使用有状态模式,否则(例如,一个序列代表一个完整的句子)您应该使用无状态模式.

BTW,@ vu.pham说if we use stateful RNN, then in production, the network is forced to deal with infinite long sequences.这似乎不正确,实际上,正如你在Q1中看到的那样,LSTM 不会学习整个序列,它首先在batch1中学习序列,更新参数,然后在batch2上学习序列.

  • 关于@ vu.pham所说的注释...如果LSTM是有状态的,则有关先前批次的信息以隐藏状态存储,因此batch2上的更新应取决于batch1,不是吗?(这被认为是香草RNN的截断BPTT,我认为,反向传播仅使用了几个时间步长,但RNN仍然可以学习到较长的依赖性,比计算梯度的序列的长度还要长) (2认同)

小智 6

  1. 网络仍然在每批中从项目i和项目i + 1学习连接.因此,如果您决定使用无状态RNN,通常会将系列分成多个段,每个段的长度为N.如果您将这些段提供给网络,它仍然会学习预测下一个元素,因为它知道所有以前的元素元素.

  2. 我相信大多数人在实践中使用无状态RNN,因为如果我们使用有状态RNN,那么在生产中,网络被迫处理无限长序列,这可能是麻烦的.