- 自然语言→有顺序关系 —— 依赖于词
# 循环神经网络:Recurrent Neural Network
循环神经网络(Recurrent Neural Network,RNN)是一种特别适合处理序列数据的神经网络模型。RNN 的设计理念是利用网络中的循环结构,使得网络能够记住序列中的前面信息,从而捕捉数据的时间依赖性。
# RNN 基本结构
RNN 的基本单元包含一个隐藏层,该隐藏层的输出不仅依赖于当前输入,还依赖于前一个时刻的隐藏层输出。这种依赖关系可以用以下公式表示:
其中:
- 是时刻 $ t $ 的隐藏状态。
- 是时刻 $ t$ 的输入。
- 是时刻 $ t$ 的输出。
- , 和 是权重矩阵。
- 和 是偏置。
- 是激活函数,如 tanh 或 ReLU。
# RNN 的特点
- 处理序列数据:RNN 可以处理任意长度的序列数据,这使得它特别适合时间序列分析、自然语言处理等任务。
- 记忆能力:通过隐藏层的循环连接,RNN 可以记住前面时刻的信息,并将其用于当前时刻的输出计算。
- 参数共享:RNN 在每个时间步共享相同的参数,这使得模型参数数量不会随着序列长度的增加而增加。
# RNN 的运用
自然语言处理(NLP):
- 语言模型:预测句子中的下一个词。
- 机器翻译:将一句话从一种语言翻译成另一种语言。
- 文本生成:生成与训练数据相似的文本。
时间序列预测:
- 股价预测:预测未来的股价走势。
- 天气预报:基于历史天气数据预测未来天气。
语音识别:
- 将语音信号转换为文本。
# RNN 的局限性
- 梯度消失和梯度爆炸问题:在长序列训练中,标准 RNN 会遇到梯度消失和梯度爆炸的问题,导致模型难以捕捉长时间依赖。
- 训练复杂性:由于循环依赖,RNN 的训练相对复杂,计算开销较大。
# RNN 计算过程
# tanh 激活函数
# 流程图
# 代码设计
# RNN Cell
1 | cell=torch.nn.RNNCell(input_size=input_size,hidden_size=hidden_size) |
- 两个值:确定了权重维度和偏置维度
1 | hidden=cell(input,hidden) |
- 更新
hidden
值
# input
input of shape(batch,input_size)
hiadden of shape(batch,hidden_size)
# output
hidden of shape(batch,hidden_size)
# 假设
# 假设我们有以下属性的序列:
- batchSize = 1:批量大小为 1,表示每次处理一个样本。
- seqLen = 3:序列长度为 3,表示每个样本有 3 个时间步。
- inputSize = 4:输入大小为 4,表示每个时间步有 4 个输入特征。
- hiddenSize = 2:隐藏状态大小为 2,表示 RNN 的隐藏层维度为 2。
# RNNCell 的输入和输出形状
- 输入形状
- 输入的形状为 ,即 。
- 输出形状
- 输出的形状为 ,即。
# 序列可以包装在一个张量中,形状为:
- 数据集形状
- 数据集的形状为,即 。
- 这个形状表示整个数据集包含 3 个时间步,每个时间步有一个样本,每个样本有 4 个输入特征。
# 代码实现
1 | import torch |
# 如何使用 RNN?
- 输入的时候送所有序列和 即可
# 代码实现
1 | import torch |
# 自然语言处理
# 处理字符
- 构建单词表 / 字母表
- 构建索引
input_size=4
# 代码设计
1 | idx2char = ['e', 'h', 'l', 'o'] |
# 模型设计
1 | import torch |
# 训练
1 | for epoch in range(15): |