![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=1739596530-pfHNClohI0oVx7G5EUYMpfqY3VUM9Ay6-0-c26c9ada49a72b06bd3d1d28cf8ab8e0)
图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=1739596530-4E9xRvYRAvvafivynQlwGBDQ9BlqCgR7-0-e97e06f5fa38ccccebf03cc65f3e871b)
如果预测一个句子的下一个单词,那么函数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=1739596530-5hSZ7SQWUEu4s5DWL24JrISbI3xxuOa2-0-99914f88358a6f9623a4a21d05830c4f)
对于连接第k步记忆状态和第k+1步记忆状态
的权值
,等式(3-2)成立。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-097-5.jpg?sign=1739596530-oGOyrXS5Mkz4zIzfoJLXrTEUY09Dz35f-0-3bed385720b9c64a922b7cdae71b3d01)
在上面的公式中,是记忆状态在第k+1步的总输入,如式(3-3)所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-097-7.jpg?sign=1739596530-jxRjkSvOhLXQSj81guEiM6IkGKKFyyVN-0-3edd68cdf2e1076050518bfcb04d355c)
到此很容易看出为什么梯度消失问题会发生在一个CNN里面。从式(3-1)和式(3-2)可以得出
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-097-8.jpg?sign=1739596530-Rrn8Z1jabSUQIbHLLOrjwT9qgxAIo0t3-0-dac942c6b1a8b013fe7065f158fee0dd)
对于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=1739596530-UFJQjHR2mYm8kx8lZmECDmkJ07eTLgzn-0-c38ffa74ab84be1dcaf883bd1cd6635b)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-098-1.jpg?sign=1739596530-hTDDjbJdUz876ZTYMD1VEltXmnlV06SI-0-75dadf45999afe3bceaefc059bdb77f0)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-099-1.jpg?sign=1739596530-62sSvIAH0GKpppXzE9e6dFfj4nMMWBvB-0-b5923770f68015070d6bd3e1945d21e5)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-099-2.jpg?sign=1739596530-2BaGFSx8bMAaaz6U6ONdP9tMBmkFYAHv-0-ce77bf93339b786db1e09197198f6971)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-100-1.jpg?sign=1739596530-5jpvPCN4lq2DdQ9t06BYRKPW1sAkp78n-0-9e9eadcd696995957cdb162f026d6ec1)
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=1739596530-Bmk9FQqAilR0R28CnO919aFJPUBvNx2j-0-6df99aa398cbb96ea64e793424baf56d)
图3-21 LSTM单元架构
除了在学习RNN时知道的记忆状态,LSTM单元还引入了单元状态
。单元状态由3个门控制:遗忘门、更新门和输出门。遗忘门决定了从之前的单元状态
保留多少信息,它的输出为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-100-6.jpg?sign=1739596530-tWCLwlvImDbKTuv1iSTfX5AcdTEwLf61-0-e2a06989ee3ec9c83d5c8f6eb955a9fe)
更新门的输出为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-100-7.jpg?sign=1739596530-5rHauyMvlNN8L0pnnre6S7soikEylYIg-0-10059513b9678f211befcfb9e93f4e22)
潜在的候选新单元状态可以表示为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-100-9.jpg?sign=1739596530-IwzxDQqPAuEiker2TpwywB3YlQhyHNO0-0-454302b6e852daca4dc7dae408395f2b)
根据之前的单元状态和当前的潜在单元状态,更新后的单元状态输出可以从式(3-8)得到。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-1.jpg?sign=1739596530-dVMcyt5Xk6VCDcgGDKdO5LrzlYPLSFpa-0-c2919401d2689f845834118cda6dea68)
单元状态的所有信息不会全部被遗传至下一步,而由输出门决定单元状态的多少信息可以输出到下一步。输出门的输出为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-2.jpg?sign=1739596530-Fwfa5CTxJw8utLLa8HSMbrPUpYkpLheC-0-ba51f7c39cda3f7d0691acec3d45f131)
基于当前的单元状态和输出门,更新后的记忆状态被传递到下一步。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-3.jpg?sign=1739596530-b4exVDUFtgnRL5NWW7Beh24lS8yezJYw-0-549352fc902aad4bf7606df60d12f2a3)
现在存在一个问题:LSTM单元如何避免梯度消失的问题。在LSTM单元中,等价于
,后者可以用式(3-10)的乘积形式表达。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-6.jpg?sign=1739596530-iyfXJOMLJ5h5a65axltF6wbzTR2D2Iut-0-d19afcb4a07420988d4546233f7579f1)
此时,单元状态中的循环为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-7.jpg?sign=1739596530-PSbsoOn6Gdz4AMOHBnYlB4M8JlXOzL4N-0-847f6b86b073922e29d6cd59f61204d1)
从上面的公式可以得到
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-8.jpg?sign=1739596530-PZjMymtZJ7XXwmEUysJapdlLGBeasKLg-0-c8e8ec972e859d09ed31e6ad7e51e302)
结果,梯度表达式变成式(3-13)的形式
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-10.jpg?sign=1739596530-C5OmItDRwSymebl25rqxRH8ntYx7CH3H-0-6ef34cbfedb92f4f93a471ba33034ae7)
可以看到,如果我们保持遗忘单元状态接近1,那么梯度将几乎没有衰减,因此LSTM单元不会导致梯度消失问题。
【例3-9】 利用Python实现单层和多层LSTM单元。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-11.jpg?sign=1739596530-bRTW4anLfkb4s5XJtZI8syLS3yLqQxvE-0-ff9f58bef845032eae5f21a0de0076c3)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-102-1.jpg?sign=1739596530-waZqbJzAUv9ESzTD1K7JHdr37mHKV5HB-0-2028e50ef61a76cbe07f8bdcbcc3c76c)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-103-1.jpg?sign=1739596530-4x3zaq8Qlj7kkas2mSSUhe3ectsWGvnt-0-2f3ee794116b75a1e1de70ab9ceef92d)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-103-2.jpg?sign=1739596530-qPfyWQiDt4CLtgbgSFihieRzZvERDFQT-0-0f0a64a1f90349d46c74113b40e4e946)