目录
RNN:Recurrent Neural Network-循环神经网络
一、什么是RNN?
RNN(Recurrent Neural Network,循环神经网络) 是一类专门处理序列数据 的深度学习模型,核心是通过隐藏状态(记忆) 传递历史信息,捕捉时序依赖。
主要应用场景:
- 自然语言处理(NLP):语言建模、机器翻译、情感分析、文本生成。
- 语音处理:语音识别、语音合成。
- 时间序列预测:股价、气温、流量预测。
- 其他:手写识别、视频行为分析。
二、主要组成部分?
- 输入层 xt:第 t 时刻的输入(词向量、音频帧等)。
- 隐藏层 ht:记忆单元,融合当前输入与历史状态。
- 输出层 ot:第 t 时刻的输出(预测值、概率等)。

三、词嵌入层
1、词嵌入层的作用
词嵌入层的作用就是将文本转换为向量。
词嵌入层在 RNN 中的作用有输入表示、降低维度和捕捉语义相似性。
词嵌入层首先会根据输入的词的数量构建一个词向量矩阵,例如: 我们有 100 个词,每个词希望转换成 128 维度的向量,那么构建的矩阵形状即为: 100*128,输入的每个词都对应了一个该矩阵中的一个向量。

2、词嵌入层的工作流程
(1)初始化词向量:词嵌入层的初始词向量通常会使用随机初始化或者通过加载预训练的词向量(如Word2Vec或GloVe)进行初始化。
(2)输入索引:每个单词在词汇表中都有一个唯一的索引。输入文本(例如一个句子)会先被分词,然后每个单词会被转换为相应的索引。
(3)查找词向量:词嵌入层将这些单词索引映射为对应的词向量。这些词向量是一个低维稠密向量,表示该词的语义。
(4)输入到RNN:这些词向量作为RNN的输入,RNN处理它们并根据上下文生成一个序列的输出。
3、词嵌入层API
python
nn.Embedding(num_embeddings=10, embedding_dim=4)
# num_embeddings 表示词的数量
# embedding_dim 表示用多少维的向量来表示每个词
四、循环网络层
1、RNN网络原理
处理有序列特点的样本数据
2、RNN的计算过程
以输入"我爱你"为例

h 表示隐藏状态, 保存了序列数据中的历史信息,并将这些信息传递给下一个时间步,从而允许RNN处理和预测序列数据中的元素。
每一次的输入包含两个值: 上一个时间步的隐藏状态、当前状态的输入值x
每一次的输出也会包含两个值:当前时间步的隐藏状态、当前时间步的预测结果y
隐藏状态作用:
(1)记忆功能:隐藏状态就像RNN的记忆,它能够在不同的时间步之间传递信息。当一个新的输入进入网络时,当前的隐藏状态会结合这个新输入来生成新的隐藏状态。
(2)上下文理解:由于隐藏状态携带了过去的信息,它可以用于理解和生成与上下文相关的输出。这对于语言模型、机器翻译等任务尤其重要。
(3)连接不同时间步:隐藏状态通过网络内部的循环连接将各个时间步连接起来,使得网络可以处理变长的序列数据。
3、神经元内部如何计算
(1)计算隐藏状态:每个时间步的隐藏状态$$h_t$$是根据当前输入$$x_t$$和前一时刻的隐藏状态$$h_{t-1}$$计算的。

上述公式中:
Wih 表示输入数据的权重
bih 表示输入数据的偏置
Whh 表示输入隐藏状态的权重
bhh 表示输入隐藏状态的偏置
ht-1 表示输入隐藏状态
ht 表示输出隐藏状态
最后对输出的结果使用 tanh 激活函数进行计算,得到该神经元你的输出隐藏状态。

(2)计算当前时刻的输出:网络的输出yt是当前时刻的隐藏状态经过一个线性变换得到的。

上述公式中:
yt 是当前时刻的输出(通常是一个向量,表示当前时刻的预测值,RNN层的预测值)
ht 是当前时刻的隐藏状态
Why 是从隐藏状态到输出的权重矩阵
by 是输出层的偏置项
词汇表映射: 输出yt是一个向量,该向量经过全连接层后输出得到最终预测结果Ypred,Ypred中每个元素代表当前时刻生成词汇表中某个词的得分(或概率,通过激活函数如softmax)。词汇表有多少个词,Ypred就有多少个元素值,最大元素值对应的词就是当前时刻预测生成的词。
神经元工作机制总结:
接收输入:每个RNN神经元接收来自输入数据xt和前一时刻的隐藏状态ht-1。
更新隐藏状态:神经元通过一个加权和(由权重矩阵和偏置项组成)更新当前时刻的隐藏状态ht,该隐藏状态包含了来自过去的记忆以及当前输入的信息。
输出计算:基于当前隐藏状态ht,神经元生成当前时刻的输出yt,该输出可以用于任务的最终预测。

4、文本生成示例

输入数据和输出结果
将RNN实例化就可以将数据送入其中进行处理,处理的方式如下所示:
**输入数据:**输入主要包括词嵌入的x 、初始的隐藏层h0
(1)x的表示形式为[seq_len, batch, input_size],即[句子的长度,batch的大小,词向量的维度]
(2)h0的表示形式为[num_layers, batch, hidden_size],即[隐藏层的层数,batch的大,隐藏层h的维数]
输出结果:主要包括输出结果output,最后一层的hn
(1)output的表示形式与输入x类似,为[seq_len, batch, hidden_size],即[句子的长度,batch的大小,输出向量的维度]
(2)hn的表示形式与输入h0一样,为[num_layers, batch, hidden_size],即[隐藏层的层数,batch的大,隐藏层h的维度]
5、RNN的API
python
RNN = torch.nn.RNN(input_size,hidden_size,num_layers)
# 参数意义是:
# input_size:输入数据的维度,一般设为词向量的维度;
# hidden_size:隐藏层h的维度,也是当前层神经元的输出维度;
# num_layers: 隐藏层h的层数,默认为1.
内容总结:
1、掌握RNN原理
2、掌握RNNAPI的应用