LSTM原理讲解 GRU原理讲解

本文详细介绍了LSTM(长短期记忆网络)和GRU(门控循环单元)的工作原理,包括遗忘门、输入门、输出门在LSTM中的作用,以及GRU如何通过更新门和重置门简化LSTM的复杂性,同时保持良好的性能表现。

2.1 LSTM(Long-short term memory)

长短期记忆((Long short-term memory)最早是1997年由Hochreiter 和 Schmidhuber在论文《LONG SHORT-TERM MEMORY》[3]^{[3]}[3]中提出的。

传统神经网络

在所有的循环神经网络中都有一个如图所示的循环链,链式结构的每个单元将输入的信息进行处理后输出。在常规循环神经网络中的链式结构的单元中只含有一个非线性函数对数据进行非线性转换,比如tanh函数。而在LSTM等RNN变体的循环神经网络中,每个单元在不同位置多加了几个不同的非线性函数,实现不同的功能,解决不同的问题。如下图所示。

LSTM

LSTM最主要的就是记忆细胞(memory cell ),处于整个单元的水平线上,起到了信息传送带的作用,只几个含有简单的线性操作,能够保证数据流动时保持不变,也就相当于上文说的渗漏单元。如下图所示。

记忆细胞

详解LSTM
LSTM就是在每个小单元中增加了三个sigmoid函数,实现门控功能,控制数据的流入流出,分别称为遗忘门(forget gate),输入门(input gate)和输出门(output gate)。

1、遗忘门(forget gate)

遗忘门
主要功能: 决定记忆细胞中要丢弃的信息,也就是决定前一时刻记忆细胞Ct−1C_{t-1}Ct1中有多少信息能够继续传递给当前时刻的记忆细胞CtC_{t}Ct
数学公式:
KaTeX parse error: No such environment: split at position 8: \begin{̲s̲p̲l̲i̲t̲}̲ f_{t} &=\sigma…

2、输入门(input gate)

输入门

主要功能: 决定有多少新的输入信息能够进入当前时刻的记忆细胞CtC_{t}Ct
数学公式:
KaTeX parse error: No such environment: split at position 8: \begin{̲s̲p̲l̲i̲t̲}̲ i_{t} &=\sigma…

3、输出门(output gate)

输出门

主要功能: 决定有多少当前时刻的记忆细胞CtC_{t}Ct中的信息能够进入到隐藏层状态hth_{t}ht中。
数学公式:
KaTeX parse error: No such environment: split at position 8: \begin{̲s̲p̲l̲i̲t̲}̲ o_{t} &=\sigma…

4、利用遗忘门和输入门更新记忆细胞:

利用tanh函数产生候选记忆细胞Ct~\tilde{C_{t}}Ct~,也就是即将要进入输入门的信息。
KaTeX parse error: No such environment: split at position 8: \begin{̲s̲p̲l̲i̲t̲}̲ \tilde{C_{t}} …

更新
遗忘门的输出与旧状态相乘,决定有多少旧状态的信息能够进入到新的记忆细胞;输入门的输出与候选记忆细胞相乘,决定有多少信息要被更新。二者线性相加得到当前时刻被更新过的记忆细胞。
KaTeX parse error: No such environment: split at position 7: \begin{̲s̲p̲l̲i̲t̲}̲ C_{t} &= f_{t…

也正是这一过程实现了历史信息的累积。

5、利用输出门将信息输出到隐藏层

将数据经过tanh函数的处理(tanh(Ct))(tanh(C_{t}))(tanh(Ct)),将数据归一化在[-1, 1]区间内。然后输出门的结果与归一化的数据相乘,控制输出到隐藏层的数据量。
ht=ot∗tanh(Ct)(11) h_{t} = o_{t} \ast tanh(C_{t}) \qquad (11) ht=ottanh(Ct)(11)

2.2 GRU

在神经网络发展的过程中,几乎所有关于LSTM的文章中对于LSTM的结构都会做出一些变动,也称为LSTM的变体。其中变动较大的是门控循环单元(Gated Recurrent Units),也就是较为流行的GRU。GRU是2014年由Cho, et al在文章《Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation》中提出的,某种程度上GRU也是对于LSTM结构复杂性的优化。LSTM能够解决循环神经网络因长期依赖带来的梯度消失和梯度爆炸问题,但是LSTM有三个不同的门,参数较多,训练起来比较困难。GRU只含有两个门控结构,且在超参数全部调优的情况下,二者性能相当,但是GRU结构更为简单,训练样本较少,易实现。

GRU在LSTM的基础上主要做出了两点改变 :

(1)GRU只有两个门。GRU将LSTM中的输入门和遗忘门合二为一,称为更新门(update gate),上图中的z(t)z_{(t)}z(t),控制前边记忆信息能够继续保留到当前时刻的数据量,或者说决定有多少前一时间步的信息和当前时间步的信息要被继续传递到未来;GRU的另一个门称为重置门(reset gate),上图中的r(t)r_{(t)}r(t),控制要遗忘多少过去的信息。

(2)取消进行线性自更新的记忆单元(memory cell),而是直接在隐藏单元中利用门控直接进行线性自更新。GRU的逻辑图如上图所示。

GRU

详解GRU

1、更新门(update gate)

主要功能:
决定有多少过去的信息可以继续传递到未来。 将前一时刻和当前时刻的信息分别进行线性变换,也就是分别右乘权重矩阵,然后相加后的数据送入更新门,也就是与sigmoid函数相乘,得出的数值在[0, 1]之间。

数学公式:

KaTeX parse error: No such environment: split at position 7: \begin{̲s̲p̲l̲i̲t̲}̲ z_{t} &= \sigm…

2、重置门(reset gate)
主要功能:

决定有多少历史信息不能继续传递到下一时刻。同更新门的数据处理一样,将前一时刻和当前时刻的信息分别进行线性变换,也就是分别右乘权重矩阵,然后相加后的数据送入重置门,也就是与sigmoid函数相乘,得出的数值在[0, 1]之间。只是两次的权重矩阵的数值和用处不同。

数学公式:

KaTeX parse error: No such environment: split at position 7: \begin{̲s̲p̲l̲i̲t̲}̲ r_{t} &= \sigm…

3、利用重置门重置记忆信息

GRU不再使用单独的记忆细胞存储记忆信息,而是直接利用隐藏单元记录历史状态。利用重置门控制当前信息和记忆信息的数据量,并生成新的记忆信息继续向前传递。
KaTeX parse error: No such environment: split at position 7: \begin{̲s̲p̲l̲i̲t̲}̲ \tilde{h_{t}} …

如公式(14),因为重置门的输出在区间[0, 1]内,所以利用重置门控制记忆信息能够继续向前传递的数据量,当重置门为0时表示记忆信息全部清除,反之当重置门为1时,表示记忆信息全部通过。

4、利用更新门计算当前时刻隐藏状态的输出

隐藏状态的输出信息由前一时刻的隐藏状态信息ht−1h_{t-1}ht1和当前时刻的隐藏状态输出hth_{t}ht,利用更新门控制这两个信息传递到未来的数据量。
ht=zt∗ht−1+(1−zt)∗ht~(15) h_{t} = z_{t} \ast h_{t-1} + (1 - z_{t} ) \ast \tilde {h_{t}} \qquad (15) ht=ztht1+(1zt)ht~(15)

<think>好的,我现在需要处理用户关于LSTM代码实现的问题。用户已经提供了参考的站内引用,我需要结合这些内容来生成详细的回答和相关问题。 首先,我需要确认用户的需求。用户想要寻找LSTM代码的详细讲解或教程,特别是使用PyTorch实现的。根据提供的引用,引用[1]提到了PyTorch中的LSTMGRU网络,引用[3]则包含了PyTorch的代码片段。因此,我应该重点利用这些引用来构建回答。 接下来,我需要确保回答符合系统级指令的要求。比如,所有行内数学公式需要用$...$,独立公式用$$...$$,并且正确使用LaTeX语法。同时,回答需要用中文,并生成相关问题。 开始组织回答结构。首先介绍LSTM的基本原理,包括其结构中的遗忘门、输入门和输出门,以及每个门的作用和数学公式。这里需要引用参考中的内容,比如引用[2]提到LSTM解决了长依赖问题,引用[1]讨论了梯度消失的问题。然后,进入代码实现部分,使用PyTorch框架,展示如何构建LSTM模型,并解释关键参数如input_size、hidden_size、num_layers。引用[3]中的代码示例可以作为基础,需要详细解释每一部分的功能,比如定义模型、前向传播、训练过程等。 在写作过程中,需要注意正确引用来源,例如在提到LSTM解决梯度问题时添加引用[^1],在解释网络结构时引用[^2],在代码部分引用[^3]。同时,确保每个引用标识自然地出现在段落末尾。 生成的相关问题需要与LSTM相关,可能包括应用场景、与GRU的区别、参数调优、处理长序列的技巧等,这些问题应基于用户可能感兴趣的扩展点来设计。 最后,检查是否符合所有格式要求,包括代码块使用正确的语法,数学公式正确应用LaTeX,引用标识正确放置,没有使用任何Markdown格式,语言流畅自然。</think>### LSTM神经网络代码实现及详解 #### 1. LSTM基本原理 LSTM通过引入**门控机制**解决传统RNN的梯度问题,核心结构包含三个门: - **遗忘门**:控制历史信息的保留比例,计算为$f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)$ - **输入门**:决定新信息的存储量,包含两个部分: $$i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i)$$ $$\tilde{C}_t = \tanh(W_C \cdot [h_{t-1}, x_t] + b_C)$$ - **输出门**:控制最终输出的信息量: $$o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o)$$ $$h_t = o_t \odot \tanh(C_t)$$ 完整细胞状态更新公式: $$C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t$$ #### 2. PyTorch代码实现 ```python import torch import torch.nn as nn class LSTM_Model(nn.Module): def __init__(self, input_size, hidden_size, num_layers, output_size): super().__init__() self.lstm = nn.LSTM( input_size=input_size, hidden_size=hidden_size, num_layers=num_layers, batch_first=True # 输入数据格式为(batch, seq_len, feature) ) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): # h_n形状(num_layers, batch, hidden_size) out, (h_n, c_n) = self.lstm(x) # 取最后一个时间步的输出 out = self.fc(out[:, -1, :]) return out ``` **代码解析**: 1. `nn.LSTM`参数说明: - `input_size`:输入特征维度 - `hidden_size`:隐层状态维度 - `num_layers`:堆叠的LSTM层数 - `batch_first`:输入维度顺序设置[^3] 2. 前向传播过程: - 输入形状应为$(batch\_size, sequence\_length, input\_size)$ - 输出包含: - `out`:所有时间步的隐藏状态$(batch, seq\_len, hidden\_size)$ - `(h_n, c_n)`:最终时刻的隐藏状态和细胞状态 #### 3. 训练示例(文本生成场景) ```python # 超参数设置 vocab_size = 10000 embed_dim = 128 hidden_size = 256 num_layers = 2 # 模型初始化 model = LSTM_Model( input_size=embed_dim, hidden_size=hidden_size, num_layers=num_layers, output_size=vocab_size ) # 训练循环(伪代码) for epoch in range(100): for batch in dataloader: inputs, targets = batch outputs = model(inputs) loss = criterion(outputs, targets) optimizer.zero_grad() loss.backward() torch.nn.utils.clip_grad_norm_(model.parameters(), 0.5) # 梯度裁剪 optimizer.step() ``` **关键技巧**: - 使用梯度裁剪防止梯度爆炸[^1] - 采用Dropout层增强泛化能力 - 使用双向LSTM处理双向上下文
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值