喜欢的话别忘了点赞、收藏加关注哦(关注即可查看全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)
本文紧承 3.2. 循环神经网络(RNN)理论(基础) ,没看过的建议先看上文。
3.3.1. 基础的RNN结构
图示
我们先来看最基础的RNN结构:
在MLP的基础上把前面序列的部分信息作处理之后给下一个序列。
有的时候你也会看到这样的符号:
这是对应基础的RNN结构,可以用来表示RNN模型,相比于MLP多了一个表示自循环的箭头。
输入&输出
- 输入:x1,x2,x3,…,xix^1, x^2, x^3, \dots, x^ix1,x2,x3,…,xi
- 输出:y1,y2,y3,…,yiy^1, y^2, y^3, \dots, y^iy1,y2,y3,…,yi
特点在于输入输出的序列是一样的,输入有iii个输出就有iii个。这就是多输入对应多输出、维度相同的RNN结构。
主要应用
特定信息识别,比如说判断句子中的哪些单词是人名。
3.3.2. 多输入单输出的RNN架构
图示
输入&输出
- 输入:x1,x2,x3,…,xix^1, x^2, x^3, \dots, x^ix1,x2,x3,…,xi
- 输出:y1y^1y1
主要应用
情感识别:假如我有"I feel happy and positive."这句话,计算机需要判定这句话表达的是正面情绪还是负面情绪。
3.3.3. 单输入多输出的RNN架构
图示
输入&输出
- 输入:x1x^1x1
- 输出:y1,y2,y3,…,yiy^1, y^2, y^3, \dots, y^iy1,y2,y3,…,yi
它一般作为序列数据生成器。
主要应用
- 文章生成:给个标题生成一段话。
- 音乐生成:选定曲风/情感之类的参数来输出音乐。
3.3.4. 多输入多输出的RNN架构
图示
它与基础RNN架构有什么不同吗?不同之处在于输入数据的数量与输出数据可以不保持一致。
输入&输出
- 输入:x1,x2,x3,…,xix^1, x^2, x^3, \dots, x^ix1,x2,x3,…,xi
- 输出:y1,y2,y3,…,yjy^1, y^2, y^3, \dots, y^jy1,y2,y3,…,yj
主要应用
其主要应用是语言翻译(虽然现在Transformer已经基本取代了RNN),比如说我有下面这句话:
“What is artificial intelligence?”(4个单词,不算标点)
计算机把它翻译为中文:
“什么是人工智能?”(7个单词,不算标点)
这里的输入输出单词数不一致。
3.3.5. 普通RNN结构缺陷
普通RNN都存在结构缺陷。前部序列信息在传递到后部的同时,信息权重下降,导致重要信息丢失。
我们来看一个简单的例子(使用过去式填空):
- “The student, who got A+ in the exam, ___ excellent.”
- “The students, who got A+ in the exam, ___ excellent.”
第一个题(关键字:“student”)很明显是填was,第二个题(关键字:“students”)很明显是填were。
但是循环神经网络会在每一次传递中损失信息,最后“student”和“students”的差别就不会被体现。
针对这个问题,我们需要提高前部特定信息的决策权重。
3.3.6. 长短期记忆网络(LSTM)简介
图示
特点
增加了记忆细胞cic^ici,可以传递前部远处部位信息。比如说上文的“student”和“students”的单复数差别就能被记忆细胞记住。
简化理解:相比aia^iai,记忆细胞cic^ici重点记录前部序列重要信息,且在传递过程中信息丢失少。
3.3.7. 深入理解LSTM
1. 输入与输出
输入:该 LSTM 单元的输入包括:
当前时刻的输入xix^ixi
上一时刻的隐藏状态ai−1a^{i-1}ai−1
上一时刻的细胞状态ci−1c^{i-1}ci−1(红色标注)
输出:
- 当前时刻的隐藏状态aia^iai
- 当前时刻的细胞状态cic^ici(红色标注)
- 经过激活函数后的输出yiy^iyi
2. 关键计算单元
LSTM 的关键组件是遗忘门、输入门、输出门,以及一个新的细胞状态计算方式:
(1) 遗忘门(Forget Gate)
- 作用:决定哪些信息应该从过去的细胞状态ci−1c^{i-1}ci−1中遗忘。
- 计算方式:
fi=σ(Wf[ai−1,xi]+bf) f^i = \sigma(W_f [a^{i-1}, x^i] + b_f)fi=σ(Wf[ai−1,xi]+bf)- 其中:σ\sigmaσ是 Sigmoid 激活函数
- WfW_fWf是权重矩阵,bfb_fbf是偏置项
- 计算出的fif^ifi介于0和1之间,表示遗忘的比例
(2) 输入门(Update Gate)
作用:决定哪些新的信息应该被加入到细胞状态中。
计算方式:
gi=tanh(Wg[ai−1,xi]+bg) g^i = \tanh(W_g [a^{i-1}, x^i] + b_g)gi=tanh(Wg[ai−1,xi]+bg)- 其中gig^igi代表新信息(候选细胞状态),使用 tanh 进行归一化。
同时,另一个门控机制决定了信息加入的比例:
ii=σ(Wi[ai−1,xi]+bi) i^i = \sigma(W_i [a^{i-1}, x^i] + b_i)ii=σ(Wi[ai−1,xi]+bi)- iii^iii也是 Sigmoid 计算出的值,表示该信息对新细胞状态的影响程度。
细胞状态更新:
ci=fi⋅ci−1+ii⋅gi c^i = f^i \cdot c^{i-1} + i^i \cdot g^ici=fi⋅ci−1+ii⋅gi
(3) 输出门(Output Gate)
- 作用:决定当前隐藏状态(即 a^i)的值。
- 计算方式:
oi=σ(Wo[ai−1,xi]+bo) o^i = \sigma(W_o [a^{i-1}, x^i] + b_o)oi=σ(Wo[ai−1,xi]+bo)- 其中oio^ioi控制了输出的程度。
计算最终的隐藏状态:
ai=oi⋅tanh(ci) a^i = o^i \cdot \tanh(c^i)ai=oi⋅tanh(ci)
3. 关键连线说明
- 红色的cic^ici和ci−1c^{i-1}ci−1表示 LSTM 细胞状态的传递
- aia^iai和ai−1a^{i-1}ai−1是隐藏状态的传递,供下一时刻使用
- 输入xix^ixi通过多个门控制其信息流
- 激活函数(如 tanh)在细胞状态和输出门中起到了归一化作用
3.3.8. 深层循环网络(DRNN)
解决更复杂的序列任务,可以把单层RNN叠起来或者在输出前和普通MLP结构结合使用:
1. 左图:单层RNN
- 这是最基本的RNN结构,输入依赖于时间步(time step),并且隐藏层通过时间传播信息
- 黑色节点表示隐藏状态,箭头表示信息流动的方向
- 由于仅有单层隐藏层,该结构在建模复杂序列时存在局限性
2. 中图:多层RNN
- 这一结构在时间维度上保持RNN特性,同时在深度方向上叠加了多个隐藏层
- 低层的隐藏状态不仅连接到下一个时间步,还作为输入传递到上层隐藏状态,使模型可以在不同层次学习不同级别的表示(低层学习局部模式,高层学习长期依赖)
- 这使得模型更具表达能力,能够提取更复杂的特征
3. 右图:全连接的深度RNN
- 该结构进一步增强了网络的建模能力,每一层的隐藏状态都与下一层进行连接,并且在时间步之间进行传播
- 这种结构能够更好地捕捉长期依赖关系,同时利用深度结构提升特征学习能力
DRNN的关键特性
- 深度结构:相比单层RNN,DRNN具有多个隐藏层,使得模型在不同层级上学习不同的特征表示,提升表达能力
- 更强的时序建模能力:深层结构可以更好地学习长期依赖关系,减少梯度消失问题
- 信息流的层次化传播:信息在不同时间步和不同层之间进行传播,提高模型的预测能力
我们会在之后的实战环节进行更深入的了解