LSTM有关问题

详细解释LSTM的公式

LSTM结构如图所示:

LSTM结构

LSTM公式如图所示:

LSTM公式
这些公式是长短期记忆网络(LSTM)的核心计算公式。下面我将解释每个等式左边变量的尺寸,并通过一个简单的例子说明。

1. i t i_t it f t f_t ft o t o_t ot g t g_t gt c t c_t ct h t h_t ht的尺寸

假设:

  • 输入特征的维度为 d x d_{x} dx
  • 隐藏层单元的数量为 d h d_{h} dh
  • 批次大小为 N N N

则公式中各变量的尺寸如下:

  1. i t i_t it:输入门的激活值,尺寸为 ( N , d h ) (N, d_h) (N,dh)
  2. f t f_t ft:遗忘门的激活值,尺寸为 ( N , d h ) (N, d_h) (N,dh)
  3. g t g_t gt:候选记忆单元的值,尺寸为 ( N , d h ) (N, d_h) (N,dh)
  4. o t o_t ot:输出门的激活值,尺寸为 ( N , d h ) (N, d_h) (N,dh)
  5. c t c_t ct:记忆单元的值,尺寸为 ( N , d h ) (N, d_h) (N,dh)
  6. h t h_t ht:隐藏层状态,尺寸为 ( N , d h ) (N, d_h) (N,dh)

2. 举例说明

假设我们有以下配置:

  • 批次大小 N = 4 N = 4 N=4
  • 输入特征维度 d x = 3 d_{x} = 3 dx=3
  • 隐藏层单元数 d h = 5 d_{h} = 5 dh=5

那么每个变量的尺寸如下:

  • i t i_t it, f t f_t ft, g t g_t gt, o t o_t ot, c t c_t ct, h t h_t ht 都将是 ( 4 , 5 ) (4, 5) (4,5) 的矩阵,表示每个时间步中,每个批次中的每个样本有5个隐藏单元的值。

3. LSTM公式中的权重和偏置尺寸

LSTM中的权重和偏置的尺寸如下:

  • W i x , W f x , W g x , W o x W_{ix}, W_{fx}, W_{gx}, W_{ox} Wix,Wfx,Wgx,Wox 是输入到隐状态的权重矩阵,尺寸为 ( d x , d h ) (d_x, d_h) (dx,dh)
  • W i h , W f h , W g h , W o h W_{ih}, W_{fh}, W_{gh}, W_{oh} Wih,Wfh,Wgh,Woh 是隐状态到隐状态的权重矩阵,尺寸为 ( d h , d h ) (d_h, d_h) (dh,dh)
  • b i i , b i f , b i g , b i o b_{ii}, b_{if}, b_{ig}, b_{io} bii,bif,big,bio是偏置向量,尺寸为 ( d h , ) (d_h,) (dh,)

4. 详细尺寸计算例子

以批次大小 N = 4 N = 4 N=4,输入维度 d x = 3 d_x = 3 dx=3,隐藏单元数 d h = 5 d_h = 5 dh=5 为例:

  • 输入 x t x_t xt 的尺寸为 ( 4 , 3 ) (4, 3) (4,3)
  • 隐藏状态 h t − 1 h_{t-1} ht1 的尺寸为 ( 4 , 5 ) (4, 5) (4,5)
  • W i i W_{ii} Wii的尺寸为 ( 3 , 5 ) (3, 5) (3,5)
  • W h i W_{hi} Whi 的尺寸为 ( 5 , 5 ) (5, 5) (5,5)
  • 偏置 b i i , b h i b_{ii}, b_{hi} bii,bhi 的尺寸为 ( 5 , ) (5,) (5,)
  • 经过矩阵运算后,输入门的激活值 i t i_t it 的尺寸为 ( 4 , 5 ) (4, 5) (4,5)

每个公式右边的计算结果都会是 ( N , d h ) (N, d_h) (N,dh),也就是 ( 4 , 5 ) (4, 5) (4,5) 的矩阵。

详细解释下 c t c_t ct 的计算式

在LSTM(长短期记忆网络)中, c t c_t ct 代表的是记忆单元(Cell State),它是LSTM的重要组成部分,用于存储长期信息。 c t c_t ct 的计算公式如下:

c t = f t ⊙ c t − 1 + i t ⊙ g t c_t = f_t \odot c_{t-1} + i_t \odot g_t ct=ftct1+itgt

公式中每个符号的含义

  • c t c_t ct:当前时间步 t t t 的记忆单元状态。
  • f t f_t ft:遗忘门的激活值,用于决定前一时间步的记忆单元状态 c t − 1 c_{t-1} ct1 中有多少信息保留到当前时间步。尺寸为 ( N , d h ) (N, d_h) (N,dh)
  • c t − 1 c_{t-1} ct1:前一时间步 t − 1 t-1 t1 的记忆单元状态。尺寸为 ( N , d h ) (N, d_h) (N,dh)
  • i t i_t it:输入门的激活值,用于决定当前时间步的输入 x t x_t xt 中有多少信息用于更新当前的记忆单元。尺寸为 ( N , d h ) (N, d_h) (N,dh)
  • g t g_t gt:候选记忆单元的值,它是当前输入 x t x_t xt 和前一时间步隐藏状态 h t − 1 h_{t-1} ht1 的综合信息,通过一个 t a n h tanh tanh 非线性变换生成,尺寸为 ( N , d h ) (N, d_h) (N,dh)
  • ⊙ \odot :逐元素相乘(Hadamard 乘积),用于对矩阵或向量中的对应位置元素进行乘法运算。

计算步骤详解

  1. 遗忘门的作用 ( f t ⊙ c t − 1 f_t \odot c_{t-1} ftct1)

    • 遗忘门 f t f_t ft 的输出是一个值在 [ 0 , 1 ] [0, 1] [0,1] 之间的向量,每个值决定了前一时间步记忆单元 c t − 1 c_{t-1} ct1 中相应部分有多少信息应该保留。
    • 如果某个位置上的值接近 0,表示遗忘该部分的信息;如果接近 1,表示保留该部分的信息。
    • 逐元素相乘 f t ⊙ c t − 1 f_t \odot c_{t-1} ftct1 的结果是一个新的向量,表示保留了哪些记忆。
  2. 输入门的作用 ( i t ⊙ g t i_t \odot g_t itgt)

    • 输入门 i t i_t it 控制了当前时间步的输入 x t x_t xt 和前一时间步的隐藏状态 h t − 1 h_{t-1} ht1 所产生的新信息 g t g_t gt 的影响程度。
    • g t g_t gt 是通过当前输入 x t x_t xt 和前一时间步隐藏状态 h t − 1 h_{t-1} ht1 经过加权求和后,再通过 t a n h tanh tanh 激活函数获得的。
    • 逐元素相乘 i t ⊙ g t i_t \odot g_t itgt 的结果是一个新的向量,表示新的候选记忆信息。
  3. 更新记忆单元 ( c t c_t ct)

    • 通过将遗忘门的输出 f t ⊙ c t − 1 f_t \odot c_{t-1} ftct1 和输入门的输出 i t ⊙ g t i_t \odot g_t itgt 相加,得到当前时间步的记忆单元状态 c t c_t ct
    • 这个加法操作将遗忘的旧记忆和新的候选记忆进行结合,形成了当前时间步的记忆单元状态 c t c_t ct

举例说明

假设我们有以下值:

  • f t = [ 0.8 , 0.1 , 0.5 ] f_t = [0.8, 0.1, 0.5] ft=[0.8,0.1,0.5]
  • c t − 1 = [ 1.0 , 0.5 , − 0.5 ] c_{t-1} = [1.0, 0.5, -0.5] ct1=[1.0,0.5,0.5]
  • i t = [ 0.7 , 0.9 , 0.3 ] i_t = [0.7, 0.9, 0.3] it=[0.7,0.9,0.3]
  • g t = [ 0.2 , − 0.3 , 0.6 ] g_t = [0.2, -0.3, 0.6] gt=[0.2,0.3,0.6]

则:

  • f t ⊙ c t − 1 = [ 0.8 × 1.0 , 0.1 × 0.5 , 0.5 × − 0.5 ] = [ 0.8 , 0.05 , − 0.25 ] f_t \odot c_{t-1} = [0.8 \times 1.0, 0.1 \times 0.5, 0.5 \times -0.5] = [0.8, 0.05, -0.25] ftct1=[0.8×1.0,0.1×0.5,0.5×0.5]=[0.8,0.05,0.25]
  • i t ⊙ g t = [ 0.7 × 0.2 , 0.9 × − 0.3 , 0.3 × 0.6 ] = [ 0.14 , − 0.27 , 0.18 ] i_t \odot g_t = [0.7 \times 0.2, 0.9 \times -0.3, 0.3 \times 0.6] = [0.14, -0.27, 0.18] itgt=[0.7×0.2,0.9×0.3,0.3×0.6]=[0.14,0.27,0.18]
  • c t = [ 0.8 + 0.14 , 0.05 − 0.27 , − 0.25 + 0.18 ] = [ 0.94 , − 0.22 , − 0.07 ] c_t = [0.8 + 0.14, 0.05 - 0.27, -0.25 + 0.18] = [0.94, -0.22, -0.07] ct=[0.8+0.14,0.050.27,0.25+0.18]=[0.94,0.22,0.07]

最终的 c t c_t ct 代表了当前时间步 t t t 的记忆单元状态,结合了前一时间步的记忆信息和当前时间步的输入信息。这种设计使得 LSTM 能够在长时间序列中有效地保持或更新必要的信息,避免传统 RNN 中的梯度消失问题。

pytorch中的LSTM模块的参数含义以及用法

PyTorch 的 nn.LSTM 模块是一个实现长短期记忆网络(LSTM)的封装,它是循环神经网络(RNN)的一种改进版本,用于处理和预测基于时间序列的数据。下面详细解释 LSTM 模块的参数及其用法。

1. nn.LSTM 模块参数

torch.nn.LSTM(input_size, hidden_size, num_layers=1, bias=True, batch_first=False, dropout=0, bidirectional=False)
参数说明:
  • input_size: 输入特征的维度,即输入数据的每个时间步的特征数量。如果输入是一个序列,每个时间步包含 input_size 个特征。

  • hidden_size: 隐藏状态的维度。LSTM 层的每个时间步的输出维度为 hidden_size

  • num_layers: LSTM 堆叠的层数。默认为 1。若 num_layers > 1,则是一个多层的 LSTM,前一层的输出将作为下一层的输入。

  • bias: 如果为 True,则在计算门控单元时添加偏置。默认为 True

  • batch_first: 如果为 True,输入和输出的张量形状为 (batch, seq_len, feature),否则形状为 (seq_len, batch, feature)。默认为 False

  • dropout: 如果 num_layers > 1dropout > 0,则会在每个 LSTM 层之间应用 dropout,以防止过拟合。默认为 0。

  • bidirectional: 如果为 True,则使用双向 LSTM。即每个时间步都会有两个隐藏状态:一个正向,一个反向。默认为 False

2. 使用示例

import torch
import torch.nn as nn

# 参数定义
input_size = 10   # 输入特征维度
hidden_size = 20  # 隐藏状态维度
num_layers = 2    # LSTM的层数
batch_size = 5    # 批大小
seq_len = 7       # 序列长度

# 创建LSTM模型
lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)

# 创建随机输入数据 (batch_size, seq_len, input_size)
inputs = torch.randn(batch_size, seq_len, input_size)

# 初始化隐藏状态 (num_layers, batch_size, hidden_size)
h0 = torch.zeros(num_layers, batch_size, hidden_size)

# 初始化细胞状态 (num_layers, batch_size, hidden_size)
c0 = torch.zeros(num_layers, batch_size, hidden_size)

# 前向传播
output, (hn, cn) = lstm(inputs, (h0, c0))

# output: (batch_size, seq_len, hidden_size)
# hn: (num_layers, batch_size, hidden_size)
# cn: (num_layers, batch_size, hidden_size)

3. 解释代码

  • inputs: 输入数据的形状为 (batch_size, seq_len, input_size),表示批大小为 batch_size,序列长度为 seq_len,每个时间步的输入维度为 input_size

  • h0c0: 初始的隐藏状态和细胞状态,形状为 (num_layers, batch_size, hidden_size)

  • output: LSTM 的输出,形状为 (batch_size, seq_len, hidden_size),表示每个时间步的输出。

  • hncn: 最后一个时间步的隐藏状态和细胞状态,形状为 (num_layers, batch_size, hidden_size)

4. 在 LSTM 后添加线性层进行分类

假设你要将 LSTM 的输出传递到一个线性层进行分类,例如类别数为 output_size

output_size = 3  # 分类类别数量
linear = nn.Linear(hidden_size, output_size)

# 取最后一个时间步的输出
final_output = output[:, -1, :]  # 形状为 (batch_size, hidden_size)

# 通过线性层
pred = linear(final_output)  # 形状为 (batch_size, output_size)

5. 总结

  • input_size 控制输入特征的维度。
  • hidden_size 控制隐藏状态的维度。
  • num_layers 控制 LSTM 层数。
  • 你可以通过 batch_first=True 控制输入输出的维度顺序。
  • 输出可以通过线性层连接实现分类任务。

这套代码提供了一个简单的 LSTM 模型实例及其使用方式,你可以在这个基础上根据任务需要进行扩展和调整。

参考文献

pytorch中LSTM参数详解(一张图帮你更好的理解每一个参数)
Understanding LSTM Networks

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值