Day 26 长短期记忆网路 LSTM

介绍

我们昨天提到,RNN 虽然是一个可以很好处理序列资料的神经网路,它能够将前面所学到的部分资讯一步一步向下传递下去,但是随着输入的资料变多变长,就有可能引发梯度消失梯度爆炸的问题,怎麽办呢?

这个时候我们就可以采用一种特殊的 RNN 结构,我们将它称呼为长短期记忆网路 LSTM (Long short-term memory network)。而相较於传统的普通 RNN ,LSTM 改善了以前 RNN 的一些问题,并且能够在更长的序列中有更好的表现。

比较

相较於 RNN 只有一个传递状态 https://chart.googleapis.com/chart?cht=tx&chl=%24h_t%24,LSTM 则有两个传递状态,分别是 https://chart.googleapis.com/chart?cht=tx&chl=%24c_t%24https://chart.googleapis.com/chart?cht=tx&chl=%24h_t%24
(RNN 的 https://chart.googleapis.com/chart?cht=tx&chl=%24h_t%24 相当於 LSTM 的 https://chart.googleapis.com/chart?cht=tx&chl=%24c_t%24 )

结构

下图是个简单的 LSTM 结构:

  • https://chart.googleapis.com/chart?cht=tx&chl=%24X_t%24:LSTM 的输入
  • https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20f_%7Bt%7D%7D%24:LSTM 的 forget gate(遗忘阀)
  • https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20i_%7Bt%7D%7D%24:LSTM 的 input gate(输入阀)
  • https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20o_%7Bt%7D%7D%24:LSTM 的 output gate(输出阀)
  • https://chart.googleapis.com/chart?cht=tx&chl=%24h_t%24:LSTM 的 hidden state(隐藏状态)
  • https://chart.googleapis.com/chart?cht=tx&chl=%24C_t%24:LSTM 的 cell state(单元状态)

公式:
https://chart.googleapis.com/chart?cht=tx&chl=%24f_%7Bt%7D%3D%5Csigma%20_%7Bg%7D(W_%7Bf%7Dx_%7Bt%7D%2BU_%7Bf%7Dh_%7Bt-1%7D%2Bb_%7Bf%7D)%24
https://chart.googleapis.com/chart?cht=tx&chl=%24i_%7Bt%7D%3D%5Csigma%20_%7Bg%7D(W_%7Bi%7Dx_%7Bt%7D%2BU_%7Bi%7Dh_%7Bt-1%7D%2Bb_%7Bi%7D)%24
https://chart.googleapis.com/chart?cht=tx&chl=%24o_%7Bt%7D%3D%5Csigma%20_%7Bg%7D(W_%7Bo%7Dx_%7Bt%7D%2BU_%7Bo%7Dh_%7Bt-1%7D%2Bb_%7Bo%7D)%24
https://chart.googleapis.com/chart?cht=tx&chl=%24c_%7Bt%7D%3Df_%7Bt%7D%5Ccirc%20c_%7Bt-1%7D%2Bi_%7Bt%7D%5Ccirc%20%5Csigma%20_%7Bc%7D(W_%7Bc%7Dx_%7Bt%7D%2BU_%7Bc%7Dh_%7Bt-1%7D%2Bb_%7Bc%7D)%24
https://chart.googleapis.com/chart?cht=tx&chl=%24%7Bh_%7Bt%7D%3Do_%7Bt%7D%5Ccirc%20%5Csigma%20_%7Bh%7D(c_%7Bt%7D)%7D%24

看不懂吗?没关系我也看不懂
反正我们只要知道,LSTM 会透过三个控制阀(输入阀、遗忘阀、输出阀)来决定将什麽资料保存(记忆)下来,而什麽记忆又该舍弃(遗忘)。

首先 https://chart.googleapis.com/chart?cht=tx&chl=%24f_t%24 遗忘闸门会先统整 https://chart.googleapis.com/chart?cht=tx&chl=%24X_t%24https://chart.googleapis.com/chart?cht=tx&chl=%24h_%7Bt-1%7D%24 ,也就是与前一个细胞状态 进行元素相乘运算,决定细胞状态需遗忘或保留哪些资讯;https://chart.googleapis.com/chart?cht=tx&chl=%24i_t%24 输入闸门 和 https://chart.googleapis.com/chart?cht=tx&chl=%24%5Ctilde%7BC%7D_t%24 细胞候选单位,将共同决定现有细胞状态中,哪部份资讯需要进行更新,再使用相加运算更新至细胞状态中;最後 https://chart.googleapis.com/chart?cht=tx&chl=%24O_t%24 输出闸门,使用相加运算结合细胞状态,并决定哪些资讯该输出至下一阶段。

结论

简单来说就是,LSTM 能透过阀门来控制传输状态,记住重要的资讯并忘记不重要的讯息。但也因为引入了很多内容导致参数变多,训练难度提升了不少。然而,尽管 LSTM 的架构能够成功避免输入过多训练资料而产生的梯度消失和梯度爆炸问题,但是其架构本身的设计使得它在处理序列资料时只能先处理完第一个才可以处理第二个,在面对庞大的资料时权重更新速度其实相当缓慢(更别提双向架构的Bi-LSTM了。)

此外,还记得我说过 RNN 的结构相当仰赖前面资讯,因而可能导致的长期依赖(Long-Term Dependencies)问题吗?虽然透过 LSTM 的控制阀能够一定程度的避免该问题发生,但是如果我们现在要预测的相关讯息和当前预测位置之间的间隔非常非常遥远,难免还是会受到影响。

有没有什麽方法,可以在处理序列资料时不必先处理完第一个才能处理第二个来降低计算时间,预测结果也不会因为和相关讯息的位置过於遥远而受到影响呢?之後就让我们来聊聊 Transformer 和自注意力机制(self-attention)吧!


<<:  DAY26:判断800字外为isnull的方法

>>:  [Day26] HTB Jerry

Day 2 Mac 环境小工具

写在前面 上课前就常常听说 Ruby on Rails 在 Window 作业系统环境里很麻烦很难用...

[Day9] Face Detection - 使用OpenCV & Dlib:Haar cascades

了解一套工具最好的方法是:动手完成一个现有的范例 了解一门技术最好的方法是:用那套技术完整做出一个...

op.26 《全领域》-全域开发实战 - 居家植物盆栽 Mvt I (NodeMCU & MQTT)

op.26 打造属於你的时空廊道 为你我打造一个专属你的自由往返通道 让你可以任意地穿越 不再受拘...

27.unity换图片表情

换图片就是换Sprite sprite是物件的皮,每个看的见的gameobject都有sprite,...

【Day 6】Replication

决定要拆章节了, 这篇只有 5.1, 5.2 5.3 放明天,因为我好累。 这章会提到 replic...