RNN&LSTM 系统管理员 2022-09-03 05:26 208阅读 0赞 #### Recurrent Neural Network #### ### 文章目录 ### * * * * Recurrent Neural Network * * 参考 * RNN * LSTM * * Three-gate * Memory Cell * LSTM Example * LSTM Structure * LSTM for RNN ##### 参考 ##### * [机器学习系列26-循环神经网络(Ⅰ)][26-] * [机器学习系列27-循环神经网络RNN(Ⅱ)][27-_RNN] ##### RNN ##### * slot filling技术,它会分析用户说出的语句,将时间、地址等有效的关键词填到对应的槽上,并过滤掉无效的词语。 用RNN处理Slot Filling的流程举例如下: * “arrive”的vector作为 x 1 x^1 x1输入RNN,通过hidden layer生成 a 1 a^1 a1,再根据 a 1 a^1 a1生成 y 1 y^1 y1,表示“arrive”属于每个slot的概率,其中 a 1 a^1 a1会被存储到memory中 * “Taipei”的vector作为 x 2 x^2 x2输入RNN,此时hidden layer同时考虑 x 2 x^2 x2和存放在memory中的 a 1 a^1 a1,生成 a 2 a^2 a2,再根据 a 2 a^2 a2生成 y 2 y^2 y2,表示“Taipei”属于某个slot的概率,此时再把 a 2 a^2 a2存到memory中 * 依次类推 ![rnn-example2.png][] 注意:上图为同一个RNN在三个不同时间点被分别使用了三次,并非是三个不同的NN,且hidden layer中的参数是同一套。 这个时候,即使输入同样是“Taipei”,我们依旧可以根据前文的“leave”或“arrive”来得到不一样的输出 RNN有不同的变形: * Elman Network:将hidden layer的输出保存在memory里 * Jordan Network:将整个neural network的输出保存在memory里 * ![rnn-type.png][] ##### LSTM ##### * 前文提到的RNN只是最简单的版本,并没有对memory的管理多加约束,可以随时进行读取,而现在常用的memory管理方式叫做长短期记忆(Long Short-term Memory),简称LSTM * 冷知识:可以被理解为比较长的短期记忆,因此是short-term,而非是long-short term ###### Three-gate ###### LSTM有三个gate: * 当某个neuron的输出想要被写进memory cell,它就必须要先经过一道叫做**input gate**的闸门,如果input gate关闭,则任何内容都无法被写入,而关闭与否、什么时候关闭,都是由神经网络自己学习到的 * output gate决定了外界是否可以从memory cell中读取值,当**output gate**关闭的时候,memory里面的内容同样无法被读取 * forget gate则决定了什么时候需要把memory cell里存放的内容忘记清空,什么时候依旧保存 ![lstm.png][] 整个LSTM可以看做是4个input,1个output: * 4个input=想要被存到memory cell里的值+操控input gate的信号+操控output gate的信号+操控forget gate的信号 * 1个output=想要从memory cell中被读取的值 ###### Memory Cell ###### 如果从表达式的角度看LSTM,它比较像下图中的样子 * z z z是想要被存到cell里的输入值 * z i z\_i zi是操控input gate的信号 * z o z\_o zo是操控output gate的信号 * z f z\_f zf是操控forget gate的信号 * a a a是综合上述4个input得到的output值 ![lstm2.png][] 把 z z z、 z i z\_i zi、 z o z\_o zo、 z f z\_f zf通过activation function,分别得到 g ( z ) g(z) g(z)、 f ( z i ) f(z\_i) f(zi)、 f ( z o ) f(z\_o) f(zo)、 f ( z f ) f(z\_f) f(zf) 其中对 z i z\_i zi、 z o z\_o zo和 z f z\_f zf来说,它们通过的激活函数 f ( ) f() f()一般会选sigmoid function,因为它的输出在0~1之间,代表gate被打开的程度 令 g ( z ) g(z) g(z)与 f ( z i ) f(z\_i) f(zi)相乘得到 g ( z ) ⋅ f ( z i ) g(z)\\cdot f(z\_i) g(z)⋅f(zi),然后把原先存放在cell中的 c c c与 f ( z f ) f(z\_f) f(zf)相乘得到 c f ( z f ) cf(z\_f) cf(zf),两者相加得到存在memory中的新值 c ′ = g ( z ) ⋅ f ( z i ) + c f ( z f ) c'=g(z)\\cdot f(z\_i)+cf(z\_f) c′=g(z)⋅f(zi)\+cf(zf) * 若 f ( z i ) = 0 f(z\_i)=0 f(zi)=0,则相当于没有输入,若 f ( z i ) = 1 f(z\_i)=1 f(zi)=1,则相当于直接输入 g ( z ) g(z) g(z) * 若 f ( z f ) = 1 f(z\_f)=1 f(zf)=1,则保存原来的值 c c c并加到新的值上,若 f ( z f ) = 0 f(z\_f)=0 f(zf)=0,则旧的值将被遗忘清除 从中也可以看出,forget gate的逻辑与我们的直觉是相反的,控制信号打开表示记得,关闭表示遗忘 此后, c ′ c' c′通过激活函数得到 h ( c ′ ) h(c') h(c′),与output gate的 f ( z o ) f(z\_o) f(zo)相乘,得到输出 a = h ( c ′ ) f ( z o ) a=h(c')f(z\_o) a=h(c′)f(zo) ###### LSTM Example ###### 下图演示了一个LSTM的基本过程, x 1 x\_1 x1、 x 2 x\_2 x2、 x 3 x\_3 x3是输入序列, y y y是输出序列,基本原则是: * 当 x 2 = 1 x\_2=1 x2=1时,将 x 1 x\_1 x1的值写入memory * 当 x 2 = − 1 x\_2=-1 x2=−1时,将memory里的值清零 * 当 x 3 = 1 x\_3=1 x3=1时,将memory里的值输出 * 当neuron的输入为正时,对应gate打开,反之则关闭 ![lstm3.png][] ###### LSTM Structure ###### 你可能会觉得上面的结构与平常所见的神经网络不太一样,实际上我们只需要把LSTM整体看做是下面的一个neuron即可 ![lstm4.png][] 假设目前我们的hidden layer只有两个neuron,则结构如下图所示: * 输入 x 1 x\_1 x1、 x 2 x\_2 x2会分别乘上四组不同的weight,作为neuron的输入以及三个状态门的控制信号 * 在原来的neuron里,1个input对应1个output,而在LSTM里,4个input才产生1个output,并且所有的input都是不相同的 * 从中也可以看出LSTM所需要的参数量是一般NN的4倍 ![lstm5.png][] ###### LSTM for RNN ###### 从上图中你可能看不出LSTM与RNN有什么关系,接下来我们用另外的图来表示它 假设我们现在有一整排的LSTM作为neuron,每个LSTM的cell里都存了一个scalar值,把所有的scalar连接起来就组成了一个vector c t − 1 c^\{t-1\} ct−1 在时间点 t t t,输入了一个vector x t x^t xt,它会乘上一个matrix,通过转换得到 z z z,而 z z z的每个dimension就代表了操控每个LSTM的输入值,同理经过不同的转换得到 z i z^i zi、 z f z^f zf和 z o z^o zo,得到操控每个LSTM的门信号 ![lstm6.png][] 下图是单个LSTM的运算情景,其中LSTM的4个input分别是 z z z、 z i z^i zi、 z f z^f zf和 z o z^o zo的其中1维,每个LSTM的cell所得到的input都是各不相同的,但它们却是可以一起共同运算的,整个运算流程如下图左侧所示: f ( z f ) f(z^f) f(zf)与上一个时间点的cell值 c t − 1 c^\{t-1\} ct−1相乘,并加到经过input gate的输入 g ( z ) ⋅ f ( z i ) g(z)\\cdot f(z^i) g(z)⋅f(zi)上,得到这个时刻cell中的值 c t c^t ct,最终再乘上output gate的信号 f ( z o ) f(z^o) f(zo),得到输出 y t y^t yt ![lstm7.png][] 上述的过程反复进行下去,就得到下图中各个时间点上,LSTM值的变化情况,其中与上面的描述略有不同的是,这里还需要把hidden layer的最终输出 y t y^t yt以及当前cell的值 c t c^t ct都连接到下一个时间点的输入上 因此在下一个时间点操控这些gate值,不只是看输入的 x t + 1 x^\{t+1\} xt\+1,还要看前一个时间点的输出 h t h^t ht和cell值 c t c^t ct,你需要把 x t + 1 x^\{t+1\} xt\+1、 h t h^t ht和 c t c^t ct这3个vector并在一起,乘上4个不同的转换矩阵,去得到LSTM的4个输入值 z z z、 z i z^i zi、 z f z^f zf、 z o z^o zo,再去对LSTM进行操控 注意:下图是**同一个**LSTM在两个相邻时间点上的情况 ![lstm8.png][] 上图是单个LSTM作为neuron的情况,事实上LSTM基本上都会叠多层,如下图所示,左边两个LSTM代表了两层叠加,右边两个则是它们在下一个时间点的状态 ![lstm9.png][] [26-]: https://blog.csdn.net/weixin_44406200/article/details/107693331 [27-_RNN]: https://blog.csdn.net/weixin_44406200/article/details/107812374 [rnn-example2.png]: /images/20220829/4446555d041c458cb3c450a171950fa3.png [rnn-type.png]: /images/20220829/7f4b1937d227425c8a0cd7b860469efc.png [lstm.png]: /images/20220829/a12b4dbd4f6542ffa90f14576c098288.png [lstm2.png]: /images/20220829/af2537ab99a44764a447e9cf2d5e40fc.png [lstm3.png]: /images/20220829/2e7840df13dc49cfb3c69265bd43274a.png [lstm4.png]: /images/20220829/c42c36c39a124073ba80041d95ce6946.png [lstm5.png]: /images/20220829/030ad95b709940e4aca3045f31b6bc97.png [lstm6.png]: /images/20220829/d038678b42df487cbb39e51c0452fe7e.png [lstm7.png]: /images/20220829/9b5659ae0329452f9a1a72eae226690c.png [lstm8.png]: /images/20220829/8d688dff117d4f8ab32bbec09724647e.png [lstm9.png]: /images/20220829/e236e842f9a545ff92f1bd805cbb4cab.png
还没有评论,来说两句吧...