『零基础+1』一文看懂LSTM原理-《动手学深度学习》

长短期记忆网络(LSTM)为解决隐变量模型的长期信息保存与短期输入缺失问题而设计,含记忆元及输入门、遗忘门、输出门三个门控机制,通过特定计算控制信息留存更新。文中介绍其数学原理、从零开始及简洁实现,提及变体(如带猫眼连接)、与GRU的区别,并展示了训练和预测示例。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

『零基础+1』一文看懂lstm原理-《动手学深度学习》 - 创想鸟

1 长短期记忆网络(LSTM)

长期以来,隐变量模型存在着长期信息保存和短期输入缺失的问题。 解决这一问题的最早方法之一是长短期存储器(long short-term memory,LSTM) Hochreiter.Schmidhuber.1997。

它有许多与门控循环单元(9.1节)一样的属性。 有趣的是,长短期记忆网络的设计比门控循环单元稍微复杂一些, 却比门控循环单元早诞生了近20年。

1.1 门控记忆元

可以说,长短期记忆网络的设计灵感来自于计算机的逻辑门。

长短期记忆网络引入了记忆元(memory cell),或简称为单元(cell)。

有些文献认为记忆元是隐状态的一种特殊类型,

它们与隐状态具有相同的形状,其设计目的是用于记录附加的信息。

为了控制记忆元,我们需要许多门。

其中一个门用来从单元中输出条目,我们将其称为输出门(output gate)。

另外一个门用来决定何时将数据读入单元,我们将其称为输入门(input gate)。

我们还需要一种机制来重置单元的内容,由遗忘门(forget gate)来管理,

这种设计的动机与门控循环单元相同,能够通过专用机制决定什么时候记忆或忽略隐状态中的输入。

注:

『零基础+1』一文看懂LSTM原理-《动手学深度学习》 - 创想鸟        

Sigmoid 层的输出值在 0 到 1 间,表示每个部分所通过的信息。0 表示「对所有信息关上大门」;1 表示「我家大门常打开」。

一个 LSTM 有三个这样的门,控制 cell 的状态。

门实质上是控制有百分之多少的信息保留下来。门操作由一个 sigmoid 网络层计算得到【0,1】的小数与输入数据流按位乘操作构成。

门的操作是相同的,只是根据不同的设计思想,不同的数据流,叫不同的名字

1.2 输入门、忘记门和输出门

就如在门控循环单元中一样,当前时间步的输入和前一个时间步的隐状态作为数据送入长短期记忆网络的门中,

它们由三个具有sigmoid激活函数的全连接层处理,以计算输入门、遗忘门和输出门的值。因此,这三个门的值都在(0,1)(0,1)的范围内。

『零基础+1』一文看懂LSTM原理-《动手学深度学习》 - 创想鸟 『零基础+1』一文看懂LSTM原理-《动手学深度学习》 - 创想鸟        


首先,LSTM 的第一步需要决定我们需要从 cell 中抛弃哪些信息。这个决定是从 sigmoid 中的「遗忘层」来实现的。

它的输入是 ht-1 和 xt,输出为一个 0 到 1 之间的数。Ct−1 就是每个在 cell 中所有在 0 和 1 之间的数值,就像我们刚刚所说的,0 代表全抛弃,1 代表全保留。

『零基础+1』一文看懂LSTM原理-《动手学深度学习》 - 创想鸟        

下一步,我们需要决定什么样的信息应该被存储起来。这个过程主要分两步。

首先是 sigmoid 层(输入门)决定我们需要更新哪些值;

随后,tanh 层生成了一个新的候选向量 C`,它能够加入状态中。

『零基础+1』一文看懂LSTM原理-《动手学深度学习》 - 创想鸟        

接下来,我们就可以更新 cell 的状态了。

将旧状态与 ft 相乘,忘记此前我们想要忘记的内容,然后加上 C`。此时遗忘门为ftft

得到的结果便是新的候选值,依照itit进行缩放。

『零基础+1』一文看懂LSTM原理-《动手学深度学习》 - 创想鸟        

最后,我们需要决定要输出什么。此输出将基于我们处理后的单元状态。

首先,我们会运行一个 sigmoid 层决定 cell 状态输出哪一部分。

随后,我们把 cell 状态通过 tanh 函数,将输出值保持在-1 到 1 间。

之后,我们再乘以 sigmoid 门的输出值,就可以得到结果了。

『零基础+1』一文看懂LSTM原理-《动手学深度学习》 - 创想鸟        


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

假设有hh个隐藏单元,批量大小为nn,输入数为dd。

因此,输入为Xt∈Rn×dXt∈Rn×d,

前一时间步的隐状态为Ht−1∈Rn×hHt−1∈Rn×h。

相应地,时间步tt的门被定义如下:

输入门是It∈Rn×hIt∈Rn×h,

遗忘门是Ft∈Rn×hFt∈Rn×h,

输出门是Ot∈Rn×hOt∈Rn×h。

它们的计算方法如下:

It=σ(XtWxi+Ht−1Whi+bi)It=σ(XtWxi+Ht−1Whi+bi)

Ft=σ(XtWxf+Ht−1Whf+bf),Ft=σ(XtWxf+Ht−1Whf+bf),

Ot=σ(XtWxo+Ht−1Who+bo)Ot=σ(XtWxo+Ht−1Who+bo)

其中Wxi,Wxf,Wxo∈Rd×hWxi,Wxf,Wxo∈Rd×h

和Whi,Whf,Who∈Rh×hWhi,Whf,Who∈Rh×h是权重参数,

bi,bf,bo∈R1×hbi,bf,bo∈R1×h是偏置参数。


我们将其中的一些操作集合命名为不同的记忆元名称

1.3 候选记忆元

由于还没有指定各种门的操作,所以先介绍候选记忆元(candidate memory cell) C~t∈Rn×hC~t∈Rn×h。 它的计算与上面描述的三个门的计算类似, 但是使用tanh⁡tanh函数作为激活函数,函数的值范围为(−1,1)(−1,1)。 下面导出在时间步tt处的方程:

C~t=tanh(XtWxc+Ht−1Whc+bc),C~t=tanh(XtWxc+Ht−1Whc+bc),

其中Wxc∈Rd×hWxc∈Rd×h和 Whc∈Rh×hWhc∈Rh×h是权重参数, bc∈R1×hbc∈R1×h是偏置参数。


1.4 记忆元

在门控循环单元中,有一种机制来控制输入和遗忘(或跳过)。 类似地,在长短期记忆网络中,也有两个门用于这样的目的: 输入门ItIt控制采用多少来自C~tC~t的新数据, 而遗忘门FtFt控制保留多少过去的 记忆元Ct−1∈Rn×hCt−1∈Rn×h的内容。 使用按元素乘法,得出:

Ct=Ft⊙Ct−1+It⊙C~t.Ct=Ft⊙Ct−1+It⊙C~t.

如果遗忘门始终为11且输入门始终为00, 则过去的记忆元Ct−1Ct−1 将随时间被保存并传递到当前时间步。 引入这种设计是为了缓解梯度消失问题, 并更好地捕获序列中的长距离依赖关系。


1.5 隐状态

最后,我们需要定义如何计算隐状态 Ht∈Rn×hHt∈Rn×h, 这就是输出门发挥作用的地方。 在长短期记忆网络中,它仅仅是记忆元的tanh⁡tanh的门控版本。 这就确保了HtHt的值始终在区间(−1,1)(−1,1)内:

Ht=Ot⊙tanh⁡(Ct).          (9.2.4)Ht=Ot⊙tanh(Ct).          (9.2.4)

只要输出门接近11,我们就能够有效地将所有记忆信息传递给预测部分, 而对于输出门接近00,我们只保留记忆元内的所有信息,而不需要更新隐状态。

2 从零开始实现

现在,我们从零开始实现长短期记忆网络。

我们首先加载时光机器数据集。

In [1]

import paddlefrom paddle import nnfrom d2l import paddle as d2limport paddle.nn.functional as Functionbatch_size, num_steps = 32, 35train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)

   

2.1 初始化模型参数

接下来,我们需要定义和初始化模型参数。

如前所述,超参数num_hiddens定义隐藏单元的数量。

我们按照标准差0.010.01的高斯分布初始化权重,并将偏置项设为00。

In [2]

def get_lstm_params(vocab_size, num_hiddens):    num_inputs = num_outputs = vocab_size    def normal(shape):        return paddle.randn(shape=shape)*0.01    def three():        return (normal((num_inputs, num_hiddens)),                normal((num_hiddens, num_hiddens)),                paddle.zeros([num_hiddens]))    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 = paddle.zeros([num_outputs])    # 附加梯度    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.stop_gradient = False    return params

   

2.2 定义模型

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

因此,我们得到以下的状态初始化。

In [3]

def init_lstm_state(batch_size, num_hiddens):    return (paddle.zeros([batch_size, num_hiddens]),            paddle.zeros([batch_size, num_hiddens]))

   

实际模型的定义与我们前面讨论的一样:提供三个门和一个额外的记忆元。

请注意:只有隐状态才会传递到输出层,而记忆元CtCt不直接参与输出计算。In [4]

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 = Function.sigmoid((X @ W_xi) + (H @ W_hi) + b_i)        F = Function.sigmoid((X @ W_xf) + (H @ W_hf) + b_f)        O = Function.sigmoid((X @ W_xo) + (H @ W_ho) + b_o)        C_tilda = paddle.tanh((X @ W_xc) + (H @ W_hc) + b_c)        C = F * C + I * C_tilda        H = O * paddle.tanh(C)        Y = (H @ W_hq) + b_q        outputs.append(Y)    return paddle.concat(outputs, axis=0), (H, C)

   

2.3 训练 和 预测

让我们通过实例化8.5节中,引入的RNNModelScratch类来训练一个长短期记忆网络。

此外,我们还加入了额外的模型测试。

In [6]

##  训练vocab_size, num_hiddens, device = len(vocab), 256, d2l.try_gpu()num_epochs, lr = 500, 1.0model = 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)

   In [10]

##  预测# 自定义 prefix , num_preds 进行预测prefix = 'tr'num_preds = 5net = modeld2l.predict_ch8(prefix, num_preds, net, vocab, device)

       

'treasth'

               

2.4 简洁实现

使用高级API,我们可以直接实例化LSTM模型。

高级API封装了前文介绍的所有配置细节。

这段代码的运行速度要快得多,因为它使用的是编译好的运算符而不是Python来处理之前阐述的许多细节。

In [7]

num_inputs = vocab_sizelstm_layer = nn.LSTM(num_inputs, num_hiddens, time_major=True)model = d2l.RNNModel(lstm_layer, len(vocab))d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)

   

2.5 结构拓展

比较流行的 LSTM 变体就是 Gers & Schmidhuber (2000) 提出的「猫眼连接」(peephole connections)的神经网络,也就是说,门连接层能够接收到 cell 的状态。

『零基础+1』一文看懂LSTM原理-《动手学深度学习》 - 创想鸟        

上图展示了全加上「猫眼连接」的效果,但实际上论文中并不会加这么多。

另一种变体就是采用一对门,分别叫遗忘门(forget)及输入门(input)。

与分开决定遗忘及输入的内容不同,现在的变体会将这两个流程一同实现。

我们只有在将要输入新信息时才会遗忘,而也只会在忘记信息的同时才会有新的信息输入。

『零基础+1』一文看懂LSTM原理-《动手学深度学习》 - 创想鸟        

一个比较知名的变体为 GRU(Gated Recurrent),由 Cho, et al. (2014) 提出。他将遗忘门与输入门结合在一起,名为**「更新门」**(update gate),并将 cell 状态与隐藏层状态合并在一起,此外还有一些小的改动。

『零基础+1』一文看懂LSTM原理-《动手学深度学习》 - 创想鸟        

GRU和LSTM的区别:

LSTM有三个门,而GRU有两个门去掉了细胞单元C输出的时候取消了二阶的非线性函数

这个模型比起标准 LSTM 模型简单一些,因此也变得更加流行了。

当然,这里所列举的只是一管窥豹,还有很多其它的变体,

比如 Yao, et al. (2015) 提出的 Depth Gated RNNs;或是另辟蹊径处理长期依赖问题的 Clockwork RNNs,由 Koutnik, et al. (2014) 提出。

哪个是最好的呢?而这些变化是否真的意义深远?

Greff, et al. (2015) 曾经对比较流行的几种变种做过对比,发现它们基本上都差不多;

Jozefowicz, et al. (2015) 测试了超过一万种 RNN 结构,发现有一些能够在特定任务上超过 LSTMs。

以上就是『零基础+1』一文看懂LSTM原理-《动手学深度学习》的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/46256.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
利用Webman实现网站的响应式图片显示
上一篇 2025年11月7日 17:34:39
APP系统软件开发的总体流程分析
下一篇 2025年11月7日 17:34:40

相关推荐

  • Java中固定长度用户ID输入验证:解决int类型长度检查问题

    本文详细介绍了在Java程序中如何实现用户输入固定长度ID的验证机制。针对常见的int cannot be dereferenced错误,我们将探讨将ID作为字符串读取并进行长度及格式校验的最佳实践,并提供处理字母数字型和纯数字型ID的示例代码,确保数据输入的准确性和程序的健壮性。 引言:用户输入验…

    2026年9月24日
    500
  • 数据实时迁移同步工具 CloudCanal v5.2.0.0 发布,支持 SaaS 全托管

    cloudcanal 免费社区版 是 clougence 公司推出的一款全自研、可视化、自动化数据迁移同步工具,具备 结构迁移、数据迁移、数据同步、数据校验、数据订正 等功能,支持 60+ 款流行关系型数据库、实时数仓、消息中间件、缓存数据库和搜索引擎之间数据互通,其中包含国产数据库 oceanba…

    2026年9月24日
    000
  • VSCode如何实现AI代码反混淆 VSCode智能分析混淆代码的技巧

    vscode没有一键ai反混淆功能,但可通过智能扩展、调试器、ast查看器、代码格式化工具及外部ai工具集成来辅助分析和逐步还原混淆代码;2. 利用eslint、prettier等扩展提升代码可读性,通过“重命名符号”“转到定义”“查找引用”等功能追踪变量和函数流向,结合多光标编辑和代码片段进行手动…

    2026年9月24日
    100
  • Laravel 表单验证失败后保留输入值:最佳实践教程

    本文旨在帮助 Laravel 开发者解决表单验证失败后,如何保留用户已输入数据的问题。我们将深入探讨 withInput() 方法的使用,并提供清晰的代码示例,确保即使在验证失败的情况下,用户体验也能保持流畅。通过本文的学习,你将掌握在 Laravel 中优雅地处理表单验证,并提升应用的可用性。 在…

    2026年9月24日
    000
  • 小红书推广选择阅读量还是粉丝量?小红书怎么推广引流

    小红书作为融合内容、社交与电商的综合性平台,近年来吸引了大量创作者和品牌入驻。在进行推广时,很多人常常纠结:是更重视阅读量,还是更关注粉丝量?本文将从两者的定义出发,分析各自的优劣势,并提供实用建议,帮助你制定适合自己的推广策略。 一、阅读量与粉丝量的本质区别 1. 阅读量 阅读量代表的是某篇笔记或…

    2026年9月24日
    000
  • 怎么在mysql中创建数据库表 mysql建表完整流程解析

    在 mysql 中创建数据库表的步骤包括:1) 选择合适的数据类型,如 int、varchar、timestamp;2) 设置索引,如主键和唯一索引;3) 应用约束条件,如 not null 和 unique;4) 设计表结构以满足业务需求,如使用 foreign key 和 enum;5) 优化性…

    2026年9月24日
    000
  • 生成Java中全范围正Double随机数的正确方法

    本文旨在指导开发者如何在Java中生成覆盖整个正Double范围的随机数,并解释了使用ThreadLocalRandom.nextDouble(Double.MIN_VALUE, Double.MAX_VALUE)可能产生偏差的原因。我们将提供一种基于位操作的替代方案,确保生成的随机数在Double…

    2026年9月24日
    100
  • PixVerse V5入围Artificial Analysis第一梯队,上线首日全球超百万用户更新并体验

    PixVerse V5入围Artificial Analysis第一梯队,上线首日全球超百万用户更新并体验PixVerse V5入围Artificial Analysis第一梯队,上线首日全球超百万用户更新并体验PixVerse V5入围Artificial Analysis第一梯队,上线首日全球超百万用户更新并体验PixVerse V5入围Artificial Analysis第一梯队,上线首日全球超百万用户更新并体验

    8月27日晚,根据权威独立测评平台 artificial analysis 最新测试结果,爱诗科技发布的pixverse v5 新一代自研视频生成大模型,在图生视频(image to video)项目中排名全球 top2,在文生视频(text to video)项目中位列 top3,保持在全球第一梯…

    2026年9月24日 用户投稿
    100
  • hive安装配置实验

    一、安装前的准备工作 1. 配置并安装hadoop,请参考链接http://blog.csdn.net/wzy0623/article/details/50681554。 2. 下载以下安装包:mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz、apache-hive…

    2026年9月24日
    600
  • 大学论文怎么写?让AI工具助你一臂之力

    大学论文怎么写?让AI工具助你一臂之力大学论文怎么写?让AI工具助你一臂之力大学论文怎么写?让AI工具助你一臂之力大学论文怎么写?让AI工具助你一臂之力

    如果要选出大学学习过程中最令人头疼的事,写论文无疑能稳居榜首。从选题开题、内容撰写,到翻译润色、查重降重,每个步骤都耗时耗力,让人焦头烂额。然而,随着 ai 技术的发展,如今写论文这件事,已经可以借助智能工具变得更高效、更轻松。 开题太难?AI 来帮你破局! 论文的第一道难关就是开题。面对浩如烟海的…

    2026年9月24日 用户投稿
    100
  • 苹果15换屏幕费用是多少

    官方维修费用:品质与保障的代价 苹果官方售后以其高标准的服务和原装零部件著称。针对iPhone 15的屏幕更换,官方定价普遍处于1000元至2000元区间,具体费用会因机型差异(如标准版与Pro版)以及所在城市而有所不同。这一价格不仅体现了苹果品牌的技术投入与服务保障,也确保了维修后的设备性能与出厂…

    2026年9月24日
    200
  • VSCode 怎样配置终端默认路径 VSCode 终端默认路径的配置技巧​

    在 vscode 中配置终端默认启动路径需修改 terminal.integrated.cwd 设置项;2. 可通过用户设置(全局生效)或工作区设置(项目专属)进行配置,优先级为工作区设置覆盖用户设置;3. 路径可使用绝对路径或相对路径(推荐相对路径以提升协作性),windows 系统需注意反斜杠转…

    2026年9月24日
    000
  • 使用 PHP 解析 JSON 文件并在网页上显示特定数据

    本文旨在帮助开发者学习如何使用 PHP 解析 JSON 文件,并提取其中的特定数据,将其以结构化的方式展示在网页上。我们将通过一个简单的示例,演示如何读取 JSON 数据,解析成 PHP 数组,并最终以 HTML 表格的形式呈现。 PHP 解析 JSON 数据 JSON (JavaScript Ob…

    2026年9月24日
    100
  • OriginOS 6 深度体验:当操作系统回归「体验为王」

    OriginOS 6 深度体验:当操作系统回归「体验为王」OriginOS 6 深度体验:当操作系统回归「体验为王」OriginOS 6 深度体验:当操作系统回归「体验为王」OriginOS 6 深度体验:当操作系统回归「体验为王」

    2020 年,智能手机刚刚进入 5g 普及阶段,手机的硬件与软件都迎来了一次迭代浪潮——新形态的需求对操作系统的设计与交互都提出了诸多新的问题,originos 的首个版本,可以看作 vivo对这些问题的回答。 彼时,我曾有机会与 OriginOS 开发团队沟通,正如 OriginOS 的中文名原 …

    2026年9月24日 用户投稿
    100
  • 《Python完全自学教程》免费在线连载1.5

    《Python完全自学教程》免费在线连载1.5《Python完全自学教程》免费在线连载1.5《Python完全自学教程》免费在线连载1.5《Python完全自学教程》免费在线连载1.5

    说明: 本节内容,是针对非计算机专业的读者提供的补充知识。 1.5 操作系统 本节不是全面介绍操作系统知识,是提醒读者从开发者的角度认识自己的操作系统——根据多年的经验,至少要能熟练使用一些命令完成常见操作。 首先要声明硬件设备,本书所演示的代码都是基于个人计算机( Personal Compute…

    2026年9月24日 用户投稿
    700
  • 探索VSCode Jupyter Notebook集成与扩展

    VSCode集成Jupyter Notebook提升开发效率,安装Jupyter扩展后可直接运行.ipynb文件,支持内核选择、Shift+Enter执行单元格、图表渲染及变量状态保留;结合Python扩展、Pylance、GitLens等工具,实现调试、智能提示、版本控制与代码转换,适合数据分析与…

    2026年9月24日
    000
  • Linux用户adduser与useradd命令区别

    adduser是交互式脚本,默认创建家目录并设密码,适用于Debian/Ubuntu;2. useradd是底层命令,需手动加参数创建家目录和Shell,通用性强,适合脚本使用。 在Linux系统中,adduser 和 useradd 都可以用来创建新用户,但它们在实现方式、使用习惯和功能上存在明显…

    2026年9月24日
    000
  • 如何在PHP的require语句中传递参数并有效管理变量作用域

    本文探讨了在php中使用`require`或`include`语句时如何向被引入文件传递参数。文章详细阐述了通过直接变量作用域共享、利用`$_get`超全局变量(不推荐)以及将引入文件内容封装为函数或类(推荐最佳实践)这三种方法,并提供了相应的代码示例,旨在帮助开发者理解和选择最适合其场景的参数传递…

    2026年9月24日
    000
  • DeepArt的AI混合工具怎么操作?快速生成艺术风格图像的方法

    使用DeepArt类工具时,先选匹配的风格图与内容图,调节风格强度避免失真,推荐尝试Artbreeder、RunwayML、NightCafe等多元平台以提升创作效果。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ DeepArt的AI混合…

    2026年9月24日
    000
  • VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧

    VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧

    vscode通过集成语言服务协议(lsp)、内置quick fixes和refactoring actions,并结合扩展如eslint、prettier等,实现代码自动修复与智能重构;2. 启用editor.formatonsave和editor.codeactionsonsave设置可在保存时自…

    2026年9月24日 用户投稿
    100

发表回复

登录后才能评论
关注微信