博客 > 人工智能&数据科学 > 通用算法和模型 > 神经网络 > 循环神经网络
# 长短期记忆(LSTM) 用于解决普通RNN在循环链条过长的情况下存在的梯度消失问题。解决思路与ResNet有一些共性,即叠加前一轮(或前某轮)的输出结果到本轮中,实现已经学习到的结论的复用。 LSTM比RNN更加复杂,其单时刻隐层状态输出有两支而非一支,分别记为C和H,即元胞/细胞(Cell)状态和隐层(Hidden)状态,且使用三个门(遗忘门、输入门、输出门)来控制这两个上一时刻状态与本时刻输入的计算关系。 ![8fb2d4e0a769654612d6aa5d03dfccbe.png](/resources/438505c1b7b248e291d8509cccd505ce) 注意在本套图示中,框外圆圈指的是输入和输出张量,框内圆圈指的是某种矩阵或向量运算,而框内矩形指的是以框内所写函数为激活函数的一层(多层)神经元。 ## 遗忘门(ForgetGate) ![3f8b7ea61470a11ccc82f3b60d2fcd4f.png](/resources/bc419ae7522240c9a351f49934ab1bf7) 遗忘门将$h_{t-1}$和$x_t$组合后投入到激活函数为$\sigma$的神经网络中进行计算。$\sigma$表示Sigmoid(Sigma和Sigmoid同词根,表示弯曲型的,S型的),正好可以输出(0,1)之间的值。 在下一步处理本时刻元胞状态$C_t$时,这个每个维度都介于0和1之间的输出值$f_t$将对上一时刻元胞状态$C_{t-1}$具有极强的控制作用(遗忘作用) ## 输入门(InputGate) ![3c5999c2cb0621ff5989282adc9dd0fc.png](/resources/cf971ce1343c466e97026860aec0fb7a) 个人认为这里的tanh可以变化为其他激活函数,而$\sigma$最好保持为Sigmoid函数,因为恰好为(0,1)间的数,理解起来比较���单。 ## 元胞状态(Cell State) ![e1a89d4a576fdfb4e49bd8e1179f36bd.png](/resources/9b168b60815b47aaadcfb056bd2ca211) 这里的$+$为矩阵加法,$\times$为矩阵的哈达玛积(同型矩阵对应位置相乘) 其实遗忘门中$C_{t-1}$与$f_t$的乘积,与输入门$i_t$和$a_t$的乘积具有很有趣的共性:他们都是将某一个计算结果的部分维度通过乘以Sigmoid函数的方法进行缩小甚至归零,也就是进行一个权重处理。遗忘门是处理上一时刻的元胞状态$C_{t-1}$,输入门是处理本时刻的状态$a_t$。最后这两个处理结果再相加,得到本时刻的元胞状态。 ## 输出门(OutputGate) ![ddcc9dc77704cdc86bc0e8aaac55a6d2.png](/resources/93456a9e713a42b28102516f24d777c4) 输出门将经过$\sigma$网络的本时刻输入与经过$tanh$运算的本时刻元胞状态再次相乘,得到本时刻隐层状态 ## 更具体的结构图(真实的神经网络实现) 来自 https://blog.csdn.net/shenxiaoming77/article/details/79390595 ![02b24c96de0efd6a10ed0a5ae61e47ec.png](/resources/d4414788bc8b4af494e5a09c407be12c) 另外,由LSTM的结构容易知道,$C_t$、$h_t$以及三个门中的数据,维度都必须相同,否则就必须变化处理 ----- > 深入研究可看: > - https://mp.weixin.qq.com/s/RqFcO8FT7P23gyOFSx-t8g > - https://mp.weixin.qq.com/s/Kz5DSaDcfQf3oAqAQT-WJA