LSTM:RNN中一种重要的变种,应用最广泛的特征抽取模型。
核心:既要考虑 “记住” 前面时刻的内容, 又要考虑不要让前面时刻的内容干扰到当前时刻的输入。
以下内容由自己口水话的方式论述, 不涉及参数计算、和具体前向、反向传播算法。
先贴一张内部原理图:
关于这张图,见过很多遍,但是完全理解却花了不少时间。以下是我个人的一些通俗理解:
LSTM建立的初衷是为了解决 对长句子记忆不到位的问题。
上面可以看出 LSTM(不管内部结构)由三个输入(上个单元的输出 C_t-1 和 隐藏层输入 h_t-1, 当前单元输入 x_t), 两个输出组成 (本单元的输出C_t 和 隐层输出 h_t)。 然后简单介绍以下内部结构中的四个神经元(其实是两种神经元,一个是sigmoid,值域是(0,1);另一个是tanh,值域是(-1,1))
所以这里面第一个部分就是 本单元要记住一部分以前的内容,记住多少呢? 0~1倍 的 上个cell的输出呗 这就是 遗忘门:
这张图中的 f_t 是对 (h_t-1, x_t ) 求sigmoid 的结果,取值范围(0,1),然后再乘以 C_t-1(上一个神经单元的输出) 最终算入到 当前神经单元的输出。(所以我把 f_t 理解为权重, 对上一个cell输出保留多少的权值 ,即 根据输入信息 h_t-1和 x_t 决定要忘记细胞状态C_t-1的哪些部分)
第二个就是 我要保留多少本单元的输入呢? (0,1)倍的 本cell的更新内容,这就是输入门 结构如下:
图上由两部分组成,第一部分 : i_t 是对 (h_t-1, x_t ) 求sigmoid 的结果,取值范围(0,1);第二部分:a_t 是**(h_t-1, x_t ) 求tanh** 的结果,取值范围(-1,1) (所以我把 i_t 理解为权重, 对当前cell输入 更新多少的比例; a_t 是指当前cell的输入信息中需要更新到细胞状态的内容 )
所以前面 遗忘门 和 输入门 整合以下就是 细胞状态更新:
C_t = f_t * C_t + i_t * a_t
即本cell的输出为 上一个细胞输出的(0,1)倍 + 本细胞的输入的(0,1)倍。
最后,因为LSTM由两个输出嘛,还有一个隐层输出 h_t 没有计算撒, 计算方式如下:
这里面也是由 两部分组成,第一部分 : o_t 是对 (h_t-1, x_t ) 求sigmoid 的结果,取值范围(0,1);第二部分:(C_t) 求tanh 的结果,取值范围(-1,1) (所以我把 o_t 理解为权重, 对当前cell输出 保留多少的权值;C_t 是指当前cell的输出信息,也就是说 本单元的隐层输出 h_t 是根据 当前cell的输出 来计算的)
以上,均为个人理解,请读者自行斟酌其中内容,如有错漏或偏颇,烦请好言指正。
附:今天看到了一个不错的公众号:“有三AI”