# 长短期记忆(LSTM)
用于解决普通RNN在循环链条过长的情况下存在的梯度消失问题。解决思路与ResNet有一些共性,即叠加前一轮(或前某轮)的输出结果到本轮中,实现已经学习到的结论的复用。
LSTM比RNN更加复杂,其单时刻隐层状态输出有两支而非一支,分别记为C和H,即元胞/细胞(Cell)状态和隐层(Hidden)状态,且使用三个门(遗忘门、输入门、输出门)来控制这两个上一时刻状态与本时刻输入的计算关系。

注意在本套图示中,框外圆圈指的是输入和输出张量,框内圆圈指的是某种矩阵或向量运算,而框内矩形指的是以框内所写函数为激活函数的一层(多层)神经元。
## 遗忘门(ForgetGate)

遗忘门将$h_{t-1}$和$x_t$组合后投入到激活函数为$\sigma$的神经网络中进行计算。$\sigma$表示Sigmoid(Sigma和Sigmoid同词根,表示弯曲型的,S型的),正好可以输出(0,1)之间的值。
在下一步处理本时刻元胞状态$C_t$时,这个每个维度都介于0和1之间的输出值$f_t$将对上一时刻元胞状态$C_{t-1}$具有极强的控制作用(遗忘作用)
## 输入门(InputGate)

个人认为这里的tanh可以变化为其他激活函数,而$\sigma$最好保持为Sigmoid函数,因为恰好为(0,1)间的数,理解起来比较���单。
## 元胞状态(Cell State)

这里的$+$为矩阵加法,$\times$为矩阵的哈达玛积(同型矩阵对应位置相乘)
其实遗忘门中$C_{t-1}$与$f_t$的乘积,与输入门$i_t$和$a_t$的乘积具有很有趣的共性:他们都是将某一个计算结果的部分维度通过乘以Sigmoid函数的方法进行缩小甚至归零,也就是进行一个权重处理。遗忘门是处理上一时刻的元胞状态$C_{t-1}$,输入门是处理本时刻的状态$a_t$。最后这两个处理结果再相加,得到本时刻的元胞状态。
## 输出门(OutputGate)

输出门将经过$\sigma$网络的本时刻输入与经过$tanh$运算的本时刻元胞状态再次相乘,得到本时刻隐层状态
## 更具体的结构图(真实的神经网络实现)
来自 https://blog.csdn.net/shenxiaoming77/article/details/79390595

另外,由LSTM的结构容易知道,$C_t$、$h_t$以及三个门中的数据,维度都必须相同,否则就必须变化处理
-----
> 深入研究可看:
> - https://mp.weixin.qq.com/s/RqFcO8FT7P23gyOFSx-t8g
> - https://mp.weixin.qq.com/s/Kz5DSaDcfQf3oAqAQT-WJA