![Python人工智能](https://wfqqreader-1252317822.image.myqcloud.com/cover/801/40107801/b_40107801.jpg)
3.5 循环神经网络
循环神经网络(Recurrent Neural Network,RNN)在处理顺序或时间数据时十分有效,在特定时间或位置的这些数据与上一个时间或位置的数据强相关。
3.5.1 普通循环神经网络
RNN在处理文本数据方面非常成功,因为给定位置的单词与它前一个单词有很大的相关性。在RNN的每一个时间步长内(Time Step)都执行相同的处理操作,因此用循环对RNN命名。如图3-20所示为RNN架构图。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-096-2.jpg?sign=1739087034-TMXWEdfmKgIjjt46LDsyTa1kKM2Imlv3-0-6e9ea4d728bd3e712c2e5203e6e03002)
图3-20 RNN架构图
在每个给定的时间步长t上,根据之前在第t-1步的状态ht-1和输入xi计算得出记忆状态ht。新的状态ht用来预测第t步的输出ot。RNN的核心公式为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-096-3.jpg?sign=1739087034-IjEMnMn6lDkndsBeEfY2wLsnAUbUobLD-0-cb344cd3e5be0503653305c3b93d82d2)
如果预测一个句子的下一个单词,那么函数f2通常是针对词汇表中所有单词的一个softmax函数。函数f1可以是任意的激活函数。
在RNN中,第t步的输出误差试图通过传递前几步的误差来修正前一步的预测。这有助于RNN学习距离较远单词之间的长度依赖关系。在现实中,由于梯度消失和梯度爆炸问题,很难通过RNN学习这么长的依赖关系。
我们已经知道,神经网络通过梯度下降进行学习,对于在第t个时间步长上的单词与在之前第k个时间步长上的单词之间的关系,可以通过记忆状态相对记忆状态
(∀i)的梯度来学习,如式(3-1)所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-097-1.jpg?sign=1739087034-9VYIBq53J7aPXbPwmCEklqsDCA34ijJg-0-4181c8fd56f2811af294bcc1e91dc7e4)
对于连接第k步记忆状态和第k+1步记忆状态
的权值
,等式(3-2)成立。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-097-5.jpg?sign=1739087034-badXmrr7pKc7iovGfv3QZtkseyfsot0Z-0-cea5438125ee3727beb09aa601df8459)
在上面的公式中,是记忆状态在第k+1步的总输入,如式(3-3)所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-097-7.jpg?sign=1739087034-vnS3Vy4l0SZs1V5DbvTvPgToLOj70B7u-0-369e42a629c9f0774123d6d71268002c)
到此很容易看出为什么梯度消失问题会发生在一个CNN里面。从式(3-1)和式(3-2)可以得出
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-097-8.jpg?sign=1739087034-UOnCVKfsZW9R0j1Yq8c3htl34qlhPGbI-0-31bca220bfb9930474a16c6e0df1f4f3)
对于RNN而言,函数通常是Sigmoid函数或tanh函数,这两个函数的输入在超过一定范围后会有很低的梯度,即出现饱和问题。现在,由于
的导数相乘,如果激活函数的输入在饱和区,即便t-k的值不大,那么梯度
也可能会变成零。即使函数
不在饱和区,函数
对Sigmoid函数的梯度也会总是小于1,因此很难学习到一个序列中单词之间的远程距离依赖关系。相似地,
可能会引起梯度爆炸问题。假设第t步和第k步之间的距离大约是10,而权值
的值大约是2,在这种情况下,梯度会被放大
,从而导致梯度爆炸问题。
【例3-8】 用RNN学习二进制加法,实现:(1)学习当前位的加法;(2)学习前一位的进位。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-097-18.jpg?sign=1739087034-HPzUSurm8K1nVYrNcBXjanfYdBS0i8cG-0-43f20e88aef2516c526eaaa10de19516)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-098-1.jpg?sign=1739087034-g5R9jQ6uu5XFjt8fcBEkwKDtYSSDnfFA-0-6714116c7e895ed4aa06b24845e993b2)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-099-1.jpg?sign=1739087034-7AOBU5ax2SDDXuWRvcWXXdNdJc36s1UV-0-72f82a2123bca725395e4ab7ff49f8bf)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-099-2.jpg?sign=1739087034-tYqJreq2zbVo9Dy7GlCXAD7kfqEwSiXx-0-e26a2a316a6a8b5cdd65d88269f6964e)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-100-1.jpg?sign=1739087034-YclM3u7nQIDJZQRIW8y8YQ96kmhnM78K-0-43abf545e2f5526fa9d77a0fcf0e7e40)
3.5.2 长短期记忆单元
梯度消失问题在一定程度上可以通过一个改进版本的RNN解决,它叫长短期记忆(Long Short-Term Memory,LSTM)单元。长短期记忆单元的架构如图3-21所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-100-2.jpg?sign=1739087034-LHwgPv6vEwm4BcJmHWxAmcwtV0Fk7Czj-0-e1e5c47dc7ed85f24291669566b5aea1)
图3-21 LSTM单元架构
除了在学习RNN时知道的记忆状态,LSTM单元还引入了单元状态
。单元状态由3个门控制:遗忘门、更新门和输出门。遗忘门决定了从之前的单元状态
保留多少信息,它的输出为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-100-6.jpg?sign=1739087034-e6h6l7pXA5sKqOHnU0hw181f07veZ8ac-0-80b3855bac53f310b43533eb0ff23330)
更新门的输出为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-100-7.jpg?sign=1739087034-0eTamMNcAKLzKbtQltGFlJF2t3K0wzQa-0-c4b8a386395cb7d5332d6938988c4d39)
潜在的候选新单元状态可以表示为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-100-9.jpg?sign=1739087034-RLacWNa8wco3UN6neWzS11LEf4cGzfCJ-0-96639902890a0dad8d68e84fb7fa835d)
根据之前的单元状态和当前的潜在单元状态,更新后的单元状态输出可以从式(3-8)得到。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-1.jpg?sign=1739087034-fo7GW0YMUWjOUqwew0IuqIJQZki7DiD7-0-51968e2f17aa9cb89fd0d147947374a9)
单元状态的所有信息不会全部被遗传至下一步,而由输出门决定单元状态的多少信息可以输出到下一步。输出门的输出为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-2.jpg?sign=1739087034-QsgGfI4hupLzcascX0HlOjOFTWhZX5Nx-0-2d3937a6141141562df957b7a9419955)
基于当前的单元状态和输出门,更新后的记忆状态被传递到下一步。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-3.jpg?sign=1739087034-kG2sHsQwj9wxBrl2e2mAofA0aIrncuGI-0-f533968b4460443271ebaa3e0b6756df)
现在存在一个问题:LSTM单元如何避免梯度消失的问题。在LSTM单元中,等价于
,后者可以用式(3-10)的乘积形式表达。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-6.jpg?sign=1739087034-V8TKAEH19dih1LR2nIs3TQWK5SxKqGFw-0-3a47908f6ad70652938402df4423d97e)
此时,单元状态中的循环为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-7.jpg?sign=1739087034-AdOVwHlWGs6JzU13BOdu4t5aT6LuUXLK-0-539f765ba27f531254e5a8322f945f40)
从上面的公式可以得到
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-8.jpg?sign=1739087034-PC4hTGITX3UTwwCxRVCRg0dJBRRGGVrC-0-d69a45959945655c5ed8662b113e4869)
结果,梯度表达式变成式(3-13)的形式
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-10.jpg?sign=1739087034-Md6DcMiF7cvldULXJ0XvS9ubvEPdWHyB-0-ac364fce16a1de045889be89eb23ffdf)
可以看到,如果我们保持遗忘单元状态接近1,那么梯度将几乎没有衰减,因此LSTM单元不会导致梯度消失问题。
【例3-9】 利用Python实现单层和多层LSTM单元。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-11.jpg?sign=1739087034-9H2qJKX76l7boFRpZ5XtDnLcR9jTgh9h-0-01532d72de667d867e4a1d97287dc546)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-102-1.jpg?sign=1739087034-bKq7vTg4YmiuT9GdYvk3nhD95zcAfbL3-0-20809cc4a436877efca86403cda90d73)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-103-1.jpg?sign=1739087034-f7lFnMLtSMcpeKLEBCRqvFv8j9iNc5Zi-0-bb135d0eb5ea033f9ef1c9ea771de159)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-103-2.jpg?sign=1739087034-uQolYLBH2QIsHzeG1noBdtKFbnfAOJBh-0-2b12fc09b3d7f75ed19700b45524e84b)