Loading [MathJax]/extensions/TeX/AMSmath.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【现代深度学习技术】现代循环神经网络02:长短期记忆网络(LSTM)

【现代深度学习技术】现代循环神经网络02:长短期记忆网络(LSTM)

作者头像
Francek Chen
发布于 2025-05-02 13:22:58
发布于 2025-05-02 13:22:58
30000
代码可运行
举报
运行总次数:0
代码可运行

深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning

  长期以来,隐变量模型存在着长期信息保存和短期输入缺失的问题。解决这一问题的最早方法之一是长短期记忆网络(long short-term memory,LSTM)。它有许多与门控循环单元一样的属性。有趣的是,长短期记忆网络的设计比门控循环单元稍微复杂一些,却比门控循环单元早诞生了近20年。

一、门控记忆元

  可以说,长短期记忆网络的设计灵感来自于计算机的逻辑门。长短期记忆网络引入了记忆元(memory cell),或简称为单元(cell)。有些文献认为记忆元是隐状态的一种特殊类型,它们与隐状态具有相同的形状,其设计目的是用于记录附加的信息。为了控制记忆元,我们需要许多门。其中一个门用来从单元中输出条目,我们将其称为输出门(output gate)。另外一个门用来决定何时将数据读入单元,我们将其称为输入门(input gate)。我们还需要一种机制来重置单元的内容,由遗忘门(forget gate)来管理,这种设计的动机与门控循环单元相同,能够通过专用机制决定什么时候记忆或忽略隐状态中的输入。让我们看看这在实践中是如何运作的。

(一)输入门、忘记门和输出门

  就如在门控循环单元中一样,当前时间步的输入和前一个时间步的隐状态作为数据送入长短期记忆网络的门中,如图1所示。它们由三个具有sigmoid激活函数的全连接层处理,以计算输入门、遗忘门和输出门的值。因此,这三个门的值都在

(0,1)

的范围内。

图1 长短期记忆网络模型中的输入门、遗忘门和输出门

  我们来细化一下长短期记忆网络的数学表达。假设有

h

个隐藏单元,批量大小为

n

,输入数为

d

。因此,输入为

,前一时间步的隐状态为

。相应地,时间步

的门被定义如下:输入门是

,遗忘门是

,输出门是

。它们的计算方法如下:

其中

是权重参数,

是偏置参数。

(二)候选记忆元

  由于还没有指定各种门的操作,所以先介绍候选记忆元(candidate memory cell)

。它的计算与上面描述的三个门的计算类似,但是使用

函数作为激活函数,函数的值范围为

。下面导出在时间步

处的方程:

其中,

是权重参数,

是偏置参数。

  候选记忆元的如图2所示。

图2 长短期记忆网络模型中的候选记忆元

(三)记忆元

  在门控循环单元中,有一种机制来控制输入和遗忘(或跳过)。类似地,在长短期记忆网络中,也有两个门用于这样的目的:输入门

控制采用多少来自

的新数据,而遗忘门

控制保留多少过去的记忆元

的内容。使用按元素乘法,得出:

  如果遗忘门始终为

且输入门始终为

,则过去的记忆元

将随时间被保存并传递到当前时间步。引入这种设计是为了缓解梯度消失问题,并更好地捕获序列中的长距离依赖关系。

  这样我们就得到了计算记忆元的流程图,如图3所示。

图3 在长短期记忆网络模型中计算记忆元

(四)隐状态

  最后,我们需要定义如何计算隐状态

,这就是输出门发挥作用的地方。在长短期记忆网络中,它仅仅是记忆元的

的门控版本。这就确保了

的值始终在区间

内:

  只要输出门接近

,我们就能够有效地将所有记忆信息传递给预测部分,而对于输出门接近

,我们只保留记忆元内的所有信息,而不需要更新隐状态。

  图4提供了数据流的图形化演示。

图4 在长短期记忆网络模型中计算隐状态

二、从零开始实现

  现在,我们从零开始实现长短期记忆网络。与循环神经网络的从零开始实现中的实验相同,我们首先加载时光机器数据集。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
from torch import nn
from d2l import torch as d2l

batch_size, num_steps = 32, 35
train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)
(一)初始化模型参数

  接下来,我们需要定义和初始化模型参数。如前所述,超参数num_hiddens定义隐藏单元的数量。我们按照标准差

的高斯分布初始化权重,并将偏置项设为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_lstm_params(vocab_size, num_hiddens, device):
    num_inputs = num_outputs = vocab_size

    def normal(shape):
        return torch.randn(size=shape, device=device)*0.01

    def three():
        return (normal((num_inputs, num_hiddens)),
                normal((num_hiddens, num_hiddens)),
                torch.zeros(num_hiddens, device=device))

    W_xi, W_hi, b_i = three()  # 输入门参数
    W_xf, W_hf, b_f = three()  # 遗忘门参数
    W_xo, W_ho, b_o = three()  # 输出门参数
    W_xc, W_hc, b_c = three()  # 候选记忆元参数
    # 输出层参数
    W_hq = normal((num_hiddens, num_outputs))
    b_q = torch.zeros(num_outputs, device=device)
    # 附加梯度
    params = [W_xi, W_hi, b_i, W_xf, W_hf, b_f, W_xo, W_ho, b_o, W_xc, W_hc, b_c, W_hq, b_q]
    for param in params:
        param.requires_grad_(True)
    return params
(二)定义模型

  在初始化函数中,长短期记忆网络的隐状态需要返回一个额外的记忆元,单元的值为0,形状为(批量大小,隐藏单元数)。因此,我们得到以下的状态初始化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def init_lstm_state(batch_size, num_hiddens, device):
    return (torch.zeros((batch_size, num_hiddens), device=device),
            torch.zeros((batch_size, num_hiddens), device=device))

  实际模型的定义与我们前面讨论的一样:提供三个门和一个额外的记忆元。请注意,只有隐状态才会传递到输出层,而记忆元

不直接参与输出计算。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def lstm(inputs, state, params):
    [W_xi, W_hi, b_i, W_xf, W_hf, b_f, W_xo, W_ho, b_o, W_xc, W_hc, b_c, W_hq, b_q] = params
    (H, C) = state
    outputs = []
    for X in inputs:
        I = torch.sigmoid((X @ W_xi) + (H @ W_hi) + b_i)
        F = torch.sigmoid((X @ W_xf) + (H @ W_hf) + b_f)
        O = torch.sigmoid((X @ W_xo) + (H @ W_ho) + b_o)
        C_tilda = torch.tanh((X @ W_xc) + (H @ W_hc) + b_c)
        C = F * C + I * C_tilda
        H = O * torch.tanh(C)
        Y = (H @ W_hq) + b_q
        outputs.append(Y)
    return torch.cat(outputs, dim=0), (H, C)
(三)训练和预测

  让我们通过实例化循环神经网络的从零开始实现中引入的RNNModelScratch类来训练一个长短期记忆网络,就如我们在门控循环单元(GRU)中所做的一样。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vocab_size, num_hiddens, device = len(vocab), 256, d2l.try_gpu()
num_epochs, lr = 500, 1
model = d2l.RNNModelScratch(len(vocab), num_hiddens, device, get_lstm_params, init_lstm_state, lstm)
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)
在这里插入图片描述
在这里插入图片描述

三、简洁实现

  使用高级API,我们可以直接实例化LSTM模型。高级API封装了前文介绍的所有配置细节。这段代码的运行速度要快得多,因为它使用的是编译好的运算符而不是Python来处理之前阐述的许多细节。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
num_inputs = vocab_size
lstm_layer = nn.LSTM(num_inputs, num_hiddens)
model = d2l.RNNModel(lstm_layer, len(vocab))
model = model.to(device)
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)

  长短期记忆网络是典型的具有重要状态控制的隐变量自回归模型。多年来已经提出了其许多变体,例如,多层、残差连接、不同类型的正则化。然而,由于序列的长距离依赖性,训练长短期记忆网络和其他序列模型(例如门控循环单元)的成本是相当高的。在后面的内容中,我们将讲述更高级的替代模型,如Transformer。

小结

  • 长短期记忆网络有三种类型的门:输入门、遗忘门和输出门。
  • 长短期记忆网络的隐藏层输出包括“隐状态”和“记忆元”。只有隐状态会传递到输出层,而记忆元完全属于内部信息。
  • 长短期记忆网络可以缓解梯度消失和梯度爆炸。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
长短期记忆(LSTM):突破性的序列训练技术
长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。
数据科学工厂
2023/11/20
5500
长短期记忆(LSTM):突破性的序列训练技术
循环神经网络——中篇【深度学习】【PyTorch】【d2l】
来杯Sherry
2023/09/19
4050
循环神经网络——中篇【深度学习】【PyTorch】【d2l】
【现代深度学习技术】现代循环神经网络01:门控循环单元(GRU)
  在通过时间反向传播中,我们讨论了如何在循环神经网络中计算梯度,以及矩阵连续乘积可以导致梯度消失或梯度爆炸的问题。下面我们简单思考一下这种梯度异常在实践中的意义:
Francek Chen
2025/05/02
1770
【现代深度学习技术】现代循环神经网络01:门控循环单元(GRU)
【现代深度学习技术】现代循环神经网络03:深度循环神经网络
深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。
Francek Chen
2025/05/03
1350
【现代深度学习技术】现代循环神经网络03:深度循环神经网络
【深度学习实验】循环神经网络(三):门控制——自定义循环神经网络LSTM(长短期记忆网络)模型
LSTM(长短期记忆网络)是一种循环神经网络(RNN)的变体,用于处理序列数据。它具有记忆单元和门控机制,可以有效地捕捉长期依赖关系。
Qomolangma
2024/07/30
1.5K0
【深度学习实验】循环神经网络(三):门控制——自定义循环神经网络LSTM(长短期记忆网络)模型
【深度学习实验】循环神经网络(五):基于GRU的语言模型训练(包括自定义门控循环单元GRU)
get_params 函数用于初始化模型的参数。它接受三个参数:vocab_size 表示词汇表的大小,num_hiddens 表示隐藏单元的数量,device 表示模型所在的设备(如 CPU 或 GPU)。
Qomolangma
2024/07/30
4620
【深度学习实验】循环神经网络(五):基于GRU的语言模型训练(包括自定义门控循环单元GRU)
动手学深度学习(十二) NLP循环神经网络进阶
RNN存在的问题:梯度较容易出现衰减或爆炸(BPTT) ⻔控循环神经⽹络:捕捉时间序列中时间步距离较⼤的依赖关系 RNN:
致Great
2020/02/25
4780
动手学深度学习(十二)  NLP循环神经网络进阶
【现代深度学习技术】现代循环神经网络04:双向循环神经网络
深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
Francek Chen
2025/05/04
1200
【现代深度学习技术】现代循环神经网络04:双向循环神经网络
从零开始学Pytorch(十一)之ModernRNN
• 重置⻔有助于捕捉时间序列⾥短期的依赖关系; • 更新⻔有助于捕捉时间序列⾥⻓期的依赖关系。
墨明棋妙27
2022/09/23
4450
【深度学习实验】循环神经网络(四):基于 LSTM 的语言模型训练
【深度学习实验】循环神经网络(一):循环神经网络(RNN)模型的实现与梯度裁剪_QomolangmaH的博客-CSDN博客
Qomolangma
2024/07/30
4590
【深度学习实验】循环神经网络(四):基于 LSTM 的语言模型训练
【现代深度学习技术】循环神经网络05:循环神经网络的从零开始实现
  本节将根据循环神经网络中的描述, 从头开始基于循环神经网络实现字符级语言模型。 这样的模型将在H.G.Wells的时光机器数据集上训练。 和前面语言模型和数据集中介绍过的一样, 我们先读取数据集。
Francek Chen
2025/04/22
1200
【现代深度学习技术】循环神经网络05:循环神经网络的从零开始实现
【现代深度学习技术】现代循环神经网络07:序列到序列学习(seq2seq)
  正如我们在机器翻译与数据集中看到的,机器翻译中的输入序列和输出序列都是长度可变的。为了解决这类问题,我们在编码器-解码器架构中设计了一个通用的”编码器-解码器“架构。本节,我们将使用两个循环神经网络的编码器和解码器,并将其应用于序列到序列(sequence to sequence,seq2seq)类的学习任务。
Francek Chen
2025/05/06
2120
【现代深度学习技术】现代循环神经网络07:序列到序列学习(seq2seq)
白话--长短期记忆(LSTM)的几个步骤,附代码!
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
mantch
2019/08/29
1.4K0
白话--长短期记忆(LSTM)的几个步骤,附代码!
用pytorch写个RNN 循环神经网络
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
程序猿川子
2022/10/21
1.1K0
循环神经网络——下篇【深度学习】【PyTorch】【d2l】
设计多个隐藏层,目的是为了获取更多的非线性性。深度循环神经网络需要大量的调参(如学习率和修剪) 来确保合适的收敛,模型的初始化也需要谨慎。
来杯Sherry
2023/09/19
4830
循环神经网络——下篇【深度学习】【PyTorch】【d2l】
【AI前沿】深度学习基础:循环神经网络(RNN)
循环神经网络(RNN)与传统的前馈神经网络(如多层感知器和卷积神经网络)不同,RNN具有内存能力,能够在处理当前输入时保留之前的信息。这使得RNN特别适合处理序列数据,如文本、语音和时间序列等。
屿小夏
2024/07/13
4050
【AI前沿】深度学习基础:循环神经网络(RNN)
动手学深度学习(十一) NLP循环神经网络
本节介绍循环神经网络,下图展示了如何基于循环神经网络实现语言模型。我们的目的是基于当前的输入与过去的输入序列,预测序列的下一个字符。循环神经网络引入一个隐藏变量
致Great
2020/02/25
7890
动手学深度学习(十一)  NLP循环神经网络
【深度学习 | LSTM】解开LSTM的秘密:门控机制如何控制信息流
🙋‍♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)
计算机魔术师
2023/09/24
7260
【现代深度学习技术】循环神经网络06:循环神经网络的简洁实现
深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
Francek Chen
2025/04/26
1220
【现代深度学习技术】循环神经网络06:循环神经网络的简洁实现
LSTM:克服长期依赖难题的循环神经网络升级方案
长短期记忆网络(Long Short-Term Memory)作为RNN的进阶架构,在序列建模领域具有里程碑意义。其核心突破在于通过智能门控系统,有效捕获跨越数百个时间步的语义关联,成功缓解了传统RNN存在的梯度消失/爆炸难题,在语音识别、金融预测等需要长程记忆的场景中表现卓越。
JavaEdge
2025/03/19
2300
推荐阅读
长短期记忆(LSTM):突破性的序列训练技术
5500
循环神经网络——中篇【深度学习】【PyTorch】【d2l】
4050
【现代深度学习技术】现代循环神经网络01:门控循环单元(GRU)
1770
【现代深度学习技术】现代循环神经网络03:深度循环神经网络
1350
【深度学习实验】循环神经网络(三):门控制——自定义循环神经网络LSTM(长短期记忆网络)模型
1.5K0
【深度学习实验】循环神经网络(五):基于GRU的语言模型训练(包括自定义门控循环单元GRU)
4620
动手学深度学习(十二) NLP循环神经网络进阶
4780
【现代深度学习技术】现代循环神经网络04:双向循环神经网络
1200
从零开始学Pytorch(十一)之ModernRNN
4450
【深度学习实验】循环神经网络(四):基于 LSTM 的语言模型训练
4590
【现代深度学习技术】循环神经网络05:循环神经网络的从零开始实现
1200
【现代深度学习技术】现代循环神经网络07:序列到序列学习(seq2seq)
2120
白话--长短期记忆(LSTM)的几个步骤,附代码!
1.4K0
用pytorch写个RNN 循环神经网络
1.1K0
循环神经网络——下篇【深度学习】【PyTorch】【d2l】
4830
【AI前沿】深度学习基础:循环神经网络(RNN)
4050
动手学深度学习(十一) NLP循环神经网络
7890
【深度学习 | LSTM】解开LSTM的秘密:门控机制如何控制信息流
7260
【现代深度学习技术】循环神经网络06:循环神经网络的简洁实现
1220
LSTM:克服长期依赖难题的循环神经网络升级方案
2300
相关推荐
长短期记忆(LSTM):突破性的序列训练技术
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验