从RNN到LSTM(包含代码实现)
本文最后更新于 2025年2月19日 晚上
一,RNN
- 红色:输入层$(X_i)$
- 绿色:隐藏层$(h_i)$
- 蓝色:输出层$(Y_i)$
1. 内核公式
- 核心思想:每个时间步(time step)接收当前输入和前一时刻的隐藏状态,生成当前输出和新的隐藏状态。
- 核心公式:看似是每个进行计算,其实还是基于矩阵的。
$$
h_t = \sigma(W_{xh} x_t + W_{hh} h_{t-1} + b_h)
$$
- $ h_t $: 当前时刻的隐藏状态
- $ x_t $: 当前时刻的输入
- $ y_t $: 当前时刻的输出
- $ W_{xh}, W_{hh}, W_{hy} $: 权重矩阵
- $ \sigma $: 激活函数(如tanh或ReLU)
在RNN中,权重矩阵的格式(即维度)是由输入维度、隐藏状态维度和输出维度共同决定的。以下是具体说明。
2. 权重矩阵的格式(维度)
假设:
- 输入向量 $ x_t $ 的维度为 $ d $(即 $ x_t \in \mathbb{R}^d $)。
- 隐藏状态 $ h_t $ 的维度为 $ D $(即 $ h_t \in \mathbb{R}^D $)。
- 输出向量 $ y_t $ 的维度为 $ k $(即 $ y_t \in \mathbb{R}^k $)。
那么,权重矩阵的格式如下:
(1) 输入到隐藏层的权重矩阵 $ W_{xh} $
- 维度:$ D \times d $
- 作用:将输入 $ x_t $ 从 $ d $ 维映射到隐藏层的 $ D $ 维空间。
- 公式:
$$
W_{xh} \in \mathbb{R}^{D \times d}, \quad W_{xh} x_t \in \mathbb{R}^D
$$
(2) 隐藏层到隐藏层的权重矩阵 $ W_{hh} $
- 维度:$ D \times D $
- 作用:将前一步的隐藏状态 $ h_{t-1} $ 映射到当前隐藏状态 $ h_t $ 的空间。
- 公式:
$$
W_{hh} \in \mathbb{R}^{D \times D}, \quad W_{hh} h_{t-1} \in \mathbb{R}^D
$$
(3) 隐藏层到输出层的权重矩阵 $ W_{hy} $
- 维度:$ k \times D $
- 作用:将隐藏状态 $ h_t $ 从 $ D $ 维映射到输出 $ y_t $ 的 $ k $ 维空间。
- 公式:
$$
W_{hy} \in \mathbb{R}^{k \times D}, \quad W_{hy} h_t \in \mathbb{R}^k
$$
(4) 偏置向量 $ b_h $ 和 $ b_y $
- **隐藏层偏置 $ b_h $**:维度为 $ D $(即 $ b_h \in \mathbb{R}^D $)。
- **输出层偏置 $ b_y $**:维度为 $ k $(即 $ b_y \in \mathbb{R}^k $)。
3. 具体示例
假设:
- 输入维度 $ d = 3 $(例如一个3维的词向量)。
- 隐藏层维度 $ D = 5 $。
- 输出维度 $ k = 2 $(例如二分类任务)。
那么,权重矩阵的格式为:
- $ W_{xh} \in \mathbb{R}^{5 \times 3} $
- $ W_{hh} \in \mathbb{R}^{5 \times 5} $
- $ W_{hy} \in \mathbb{R}^{2 \times 5} $
- $ b_h \in \mathbb{R}^5 $
- $ b_y \in \mathbb{R}^2 $
4. 权重矩阵的初始化
在实际训练中,权重矩阵通常通过以下方式初始化:
- 随机初始化:从均匀分布或正态分布中随机采样。
- Xavier初始化:适用于Sigmoid或Tanh激活函数,初始化范围为 $ \left[-\sqrt{\frac{6}{d + D}}, \sqrt{\frac{6}{d + D}}\right] $。
- He初始化:适用于ReLU激活函数,初始化范围为 $ \left[-\sqrt{\frac{6}{d}}, \sqrt{\frac{6}{d}}\right] $。
5. 总结
- 权重矩阵的格式由输入维度 $ d $、隐藏层维度 $ D $ 和输出维度 $ k $ 决定。
- $ W_{xh} $:$ D \times d $
- $ W_{hh} $:$ D \times D $
- $ W_{hy} $:$ k \times D $
- 偏置向量:$ b_h \in \mathbb{R}^D $,$ b_y \in \mathbb{R}^k $
通过这种设计,RNN能够灵活地处理不同维度的输入、隐藏状态和输出,同时确保时间步 $ t $ 的计算流程一致。
二,LSTM
LSTM(Long Short-Term Memory,长短期记忆网络) 是一种特殊的循环神经网络(RNN),专门设计用来解决传统RNN在处理长序列数据时的梯度消失和长程依赖问题。LSTM通过引入门控机制和记忆单元,能够有效地捕捉序列数据中的长期依赖关系,广泛应用于自然语言处理、语音识别、时间序列预测等领域。
1. LSTM的核心思想
LSTM的核心是记忆单元(Cell State)和门控机制。记忆单元负责保存长期信息,而门控机制(输入门、遗忘门、输出门)则控制信息的流动,决定哪些信息需要保留、哪些需要丢弃。
2. LSTM的结构
$ \odot $ 表示逐元素相乘(Hadamard积),LSTM的每个时间步包含以下关键组件:
(1) 记忆单元(Cell State)
- 记忆单元 $ C_t $ 是LSTM的核心,负责保存长期信息。
- 它在时间步之间传递,并通过门控机制更新。
(2) 遗忘门(Forget Gate)
- 决定从记忆单元中丢弃哪些信息。
- 公式:
$$
f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)
$$- $ f_t $ 是遗忘门的输出(范围在0到1之间)。
- $ W_f $ 是权重矩阵,$ b_f $ 是偏置。
- $ \sigma $ 是Sigmoid激活函数。
(3) 输入门(Input Gate)
- 决定哪些新信息需要存储到记忆单元中。
- 公式:
$$
i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i)
$$ $$ g_t = \tanh(W_C \cdot [h_{t-1}, x_t] + b_C) $$- $ i_t $ 是输入门的输出。
- $ g_t $ 是候选记忆单元值。
(4) 更新记忆单元
- 结合遗忘门和输入门的信息,更新记忆单元:
$$
C_t = f_t \odot C_{t-1} + i_t \odot g_t
$$- $ \odot $ 表示逐元素相乘(Hadamard积)。
(5) 输出门(Output Gate)
- 决定从记忆单元中输出哪些信息到隐藏状态。
- 公式:
$$
o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o)
$$ $$ h_t = o_t \odot \tanh(C_t) $$- $ o_t $ 是输出门的输出。
- $ h_t $ 是当前时间步的隐藏状态。
3. LSTM的工作流程
- 遗忘门决定从记忆单元中丢弃哪些信息。
- 输入门决定将哪些新信息存储到记忆单元中。
- 更新记忆单元,结合遗忘门和输入门的信息。
- 输出门决定从记忆单元中输出哪些信息到隐藏状态。
- 隐藏状态 $ h_t $ 作为当前时间步的输出,并传递到下一个时间步。
4.生成输出 $ y_t $ 的公式
线性变换:
$$
y_t = W_{hy} \cdot h_t + b_y
$$- $ W_{hy} \in \mathbb{R}^{k \times D} $: 输出层权重矩阵($ k $ 是输出维度,$ D $ 是隐藏状态维度)。
- $ b_y \in \mathbb{R}^k $: 输出层偏置。
- $ h_t \in \mathbb{R}^D $: 当前时间步的隐藏状态。
激活函数(根据任务选择):
- 分类任务(Softmax):
$$
y_t = \text{Softmax}(W_{hy} \cdot h_t + b_y)
$$ - 二分类任务(Sigmoid):
$$
y_t = \sigma(W_{hy} \cdot h_t + b_y)
$$ - 回归任务(线性激活):
$$
y_t = W_{hy} \cdot h_t + b_y
$$
- 分类任务(Softmax):
三,pytorch实现LSTM
因为RNN的效果和LSTM相差较大,因此这里只放LSTM的,将网络结构定义改变即可实现RNN。
词汇表和词嵌入映射均下载在本地。
数据为评论+类别,任务是10分类。
1 |
|
测试
1 |
|
从RNN到LSTM(包含代码实现)
https://jimes.cn/2025/02/08/RNN/