![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=1739217457-aB9q2WEXJYlnfWkyXVfpC6fT2sWqf0Ub-0-909470526fe2c002ea4dd61b7c40bdec)
图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=1739217457-ZLnye25v0DComfdJKtoxbMyKID0PIpo8-0-b54fa77549b6badd95d0207cd982dbea)
如果预测一个句子的下一个单词,那么函数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=1739217457-HJUfB5lSxxupYqlURQSWcJvXd3WOyET4-0-05cd7083937d0759658fc1c37eeba743)
对于连接第k步记忆状态和第k+1步记忆状态
的权值
,等式(3-2)成立。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-097-5.jpg?sign=1739217457-g47kU8I2k6a86Rwuz7fZbySeX5xHNXDA-0-d39fc05e4cc3aee1344b7d1800d45bc0)
在上面的公式中,是记忆状态在第k+1步的总输入,如式(3-3)所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-097-7.jpg?sign=1739217457-ASpmVIORt1odVGY16gLfGJUmkZcUyEAq-0-d5a92d824c55a6c0ca5d6660a153c59b)
到此很容易看出为什么梯度消失问题会发生在一个CNN里面。从式(3-1)和式(3-2)可以得出
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-097-8.jpg?sign=1739217457-vHUZDfC4tjbc9iQA4cnLebcoOsJ10Cf3-0-1dd6356be18fbd0fd951f5d8fc3de51f)
对于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=1739217457-YAAHCkpybIrNZWzK8YHVDjktMRdekdLD-0-d563c5ad1d6bcca4ccf9cb3edc1c5098)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-098-1.jpg?sign=1739217457-u0AW7TCWH9dcbGxsyxXVENUa4871xi3F-0-296c54c63150336dba13a8c227ac4efb)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-099-1.jpg?sign=1739217457-oM70znD8HKs5vxSTjXcAKUqS5gxK4ZyW-0-543089b80c2677e4ef53d91fac586277)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-099-2.jpg?sign=1739217457-K67UpmegUO6VVz5lIZGcitN4zqVNH6Xl-0-1139866ebcefdf9d40ed1ab599c081d3)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-100-1.jpg?sign=1739217457-F3vsNtN1UgQ1avWmTfUhzbtHSq9lLHRD-0-03986ffbb1ddd715ae8dcc5f95a3c2c8)
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=1739217457-CCIm974ySMtHCNMMoylxKSpvOEzUM73c-0-56dcc3407ee09fdc2e133a8b099a1d6d)
图3-21 LSTM单元架构
除了在学习RNN时知道的记忆状态,LSTM单元还引入了单元状态
。单元状态由3个门控制:遗忘门、更新门和输出门。遗忘门决定了从之前的单元状态
保留多少信息,它的输出为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-100-6.jpg?sign=1739217457-kyRS7IkLGOctGfOwQnjI4j9QWFF7sTFQ-0-85c08b0eba5c44286e219e6e2ec6cdc0)
更新门的输出为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-100-7.jpg?sign=1739217457-K9J6QUCFUZhKjAkc4iqno9B1HIQt2RaZ-0-64427e80b71cbb2a4af667bde31b736f)
潜在的候选新单元状态可以表示为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-100-9.jpg?sign=1739217457-qsBHsGLrIP4t9Mr8zwNwsR0CepThjovf-0-0308de668ca76712a7f8c43abe448a93)
根据之前的单元状态和当前的潜在单元状态,更新后的单元状态输出可以从式(3-8)得到。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-1.jpg?sign=1739217457-Gxb1BC5kst53HPzThLWtHswprbiHOMNd-0-0aad0e41e3521bcb23dc67eae93059fb)
单元状态的所有信息不会全部被遗传至下一步,而由输出门决定单元状态的多少信息可以输出到下一步。输出门的输出为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-2.jpg?sign=1739217457-wvkc3840Vl3KQFl7lsqEikah46q6hIzl-0-43a1ee6316e0079f9b8c6c4c87d51b83)
基于当前的单元状态和输出门,更新后的记忆状态被传递到下一步。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-3.jpg?sign=1739217457-w3clwc5yHhZAfaZBcnjWbtshHllJZErM-0-ee7966ed41e74cc23a47974ca28f5d7e)
现在存在一个问题:LSTM单元如何避免梯度消失的问题。在LSTM单元中,等价于
,后者可以用式(3-10)的乘积形式表达。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-6.jpg?sign=1739217457-zuIorPmHtGSsUxR2P6Rrmkh74aq2kNfz-0-7bdfbcc7afe231f7d0bf77344ba34542)
此时,单元状态中的循环为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-7.jpg?sign=1739217457-b165OEQ7qhPWaSsE1wcLXoylNul4Pv5s-0-f648be638af8724ee942eb66a7fab272)
从上面的公式可以得到
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-8.jpg?sign=1739217457-xDAm9bB4a1IsH7vq4Z5itEYwYrcu6rK0-0-af715c371912bc3c4663fc396a78aebe)
结果,梯度表达式变成式(3-13)的形式
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-10.jpg?sign=1739217457-4SnQfLGrd9Wp7OL6xJblKVQe0VPsjeMF-0-98a8c32200db374adebd1b5c0f1879dd)
可以看到,如果我们保持遗忘单元状态接近1,那么梯度将几乎没有衰减,因此LSTM单元不会导致梯度消失问题。
【例3-9】 利用Python实现单层和多层LSTM单元。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-101-11.jpg?sign=1739217457-vmjUg6DAioTGDoLi7XoApL4bgt1CYyNf-0-5aba913cd5c4c2781d6ed145e2debef8)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-102-1.jpg?sign=1739217457-t6c3yK7BJYDomr9X06Cmf6JCoZsnqZa5-0-63c9cde4c724b9d9cb5aa1ff0e7e8d9c)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-103-1.jpg?sign=1739217457-5G0dK5JvxJGyG1xRPPfECv9xBPbhJ5bN-0-794652fcb739862c4648688be62cf123)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-103-2.jpg?sign=1739217457-eBfe7RjJpewCXdQ5QSXVTwZaXQXcHgfs-0-72422281de94cad52f71c184c456cd64)