当前位置: 首页 > article >正文

深度学习基础--LSTM学习笔记(李沐《动手学习深度学习》)

前言

  • LSTM是RNN模型的升级版,神经网络模型较为复杂,这里是学习笔记的记录;
  • LSTM比较复杂,可以先看:
    • 深度学习基础–一文搞懂RNN
    • 深度学习基础–GRU学习笔记(李沐《动手学习深度学习》)
  • RNN:RNN讲解
  • 参考:李沐动手学习深度学习;
  • 欢迎收藏加关注,本人将会持续更新。

    文章目录

        • 长距离依赖问题
        • LSTM的核心思想
        • LSTM门简介
          • 三个输入门
          • 候选记忆单元
          • 记忆状态
          • 隐状态
          • 总结
        • Pytorch实践
        • 参考资料

LSTM也称为长短期记忆网络,他说RNN、GRU的升级版,它能够学到长期依赖,说白了,RNN是理解一句话,但是LSTM就是理解一段话.

长距离依赖问题

RNN模型中,核心的是有一个隐藏层,这个隐藏层记录之前的信息,但是这个隐藏层的每次更新,权重都是一样的,但是我们生活中不是所有信息都是等价的,[知乎大佬一个案例](LSTM - 长短期记忆递归神经网络 - 知乎):

在这里插入图片描述

我们看到这句话,核心就是几个关键词:“纸好”、“没味道”、“便宜”、“质量好”,我们看完这句话其实和看到这几个关键词没什么大得区别,从这来看,这里也可以得出两点:

  • 在一个时间序列中,前后信息不是所有都是等效的,“关键词”往往最核心,也有一些词“没有啥效果”;
  • 我们在从左到右阅读的时候,脑子自动会帮我们过滤掉一些无用的信息,只留下一些“关键词”的理解,并且能够利用之前的信息去理解后面的信息,这也是我们熟悉的“上下文”;

LSTM也称“长短期记忆网络”,他的核心就是**“记忆”**,有点像我们大脑一样,对于过去的一些信息,有些“忘记”,有些“记得牢”,也有些“只是有个印象”。

LSTM的核心思想

相比于RNN,LSTM的核心就是,除了有隐藏态ht 之外,还有Ct, Ct代表T这个时刻的记忆,从Ct-1计算得来,用于信息的赛选,对重要信息进行保留,如图:

在这里插入图片描述

那怎么进行保留呢?对上一层的信息Ct-1保留,无非就是全部保留,全部不保留,或者保留一部分,这样的话就需要输入一个[0, 1]之间的值,而这个在神经网络中,有一个激活函数可以很好的做到,叫做:sigmoid,记忆保留过程,如图:

输入0,全部不要;输入1,全部保留;输入(0, 1),保留部分信息。

LSTM门简介

LSTM有三个门,分别是:

  • 忘记门(遗忘门):将朝着0减少
  • 输入门:决定是不是要忽略输入数据
  • 输出门:决定是不是要使用隐状态

👀 提示:一下数学公式组合成一块,我感觉就不是那么容易理解了,但是能大概理解即可,后面在案例中实践学习。

三个输入门

首先数据经过输入、输出、遗忘门,这三个门第一步都是做线性运算+激活函数进行非线性运算,由于是RNN的升级版,故都会吸取前面的特征Ht-1

在这里插入图片描述

候选记忆单元

候选记忆单元经过先进过线性计算,在经过激活函数tanh的作用,将函数值映射到[-1,1]之间,这个的作用需要结合记忆状态更新来看,结合隐藏层更新公式,可以发现,这个其实的作用可以理解为:对当前的输入信息“记忆多少”

在这里插入图片描述

记忆状态

记忆状态:这是LSTM的核心,看公式有两部分组成,第一部分是遗忘门的更新,决定对之前的记忆信息“吸取多少”,第二个是结合候选记忆单元结合输入门数据,这个我感觉就是代表者说是对当前的数据输入“吸收多少信息”,用于下一个数据的更新。

这个极端情况下,数据范围是[-2, 2]。

在这里插入图片描述

隐状态

在这里,对当前的记忆**Ct**再一次进行了tanh激活函数的作用,他的用处是将记忆单元数据映射到[-1, 1],然后再结合当前输入,这样当前的输入结合了之前的记忆做了更新,然后输出。

在这里插入图片描述
blog.csdnimg.cn/direct/29dd0a2418c04d2d98866a31dccd52d3.png#pic_center)

总结

LSTM原理具体细节确实复杂,但是我感觉可以结合实践慢慢理解,毕竟小编还是本科生🤠🤠.

在这里插入图片描述

Pytorch实践

pytorchAPI

class torch.nn.LSTM(
    input_size, 
    hidden_size, 
    num_layers=1, 
    bias=True, 
    batch_first=False, 
    dropout=0, 
    bidirectional=False, 
    proj_size=0
)
  • nput_size: 输入特征的数量。
  • hidden_size: 隐藏状态(或输出)特征的数量。
  • num_layers: LSTM 层的数量。默认是 1。
  • bias: 如果为 False,则不会使用偏置项。默认是 True。
  • batch_first: 如果为 True,则输入和输出张量提供给模块的形式为 (batch, seq, feature)。默认是 False,即 (seq, batch, feature)。
  • dropout: 如果非零,则在除了最后一层之外的所有RNN层之后引入一个Dropout层。默认是 0。
  • bidirectional: 如果为 True,则会变成双向LSTM。默认是 False。
  • proj_size: 如果 > 0,则将 LSTM 的隐藏状态投影到这个大小。这有助于减少内存消耗。默认是 0,表示没有投影。

下面将用这个API接口进行搭建一个简单的LSTM网络结构

import torch  
import torch.nn as nn 

class SimpleLSTM(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, output_size):
        super().__init__()
        # 定义LSTM
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
        # 定义线性层
        self.fc = nn.Linear(hidden_size, output_size)
        
    def forward(self, x):
        list_out, (hh, cn) = self.lstm(x)
        
        # 取最后一个时间步输出
        out = list_out[:, -1, :]
        
        output = self.fc(out)
        
        return output.view(-1, 1, 1)  # 保持维度
    
# 设置参数
input_size = 10 # 输入维度
hidden_size = 20  # 隐藏层维度
num_layers = 2  # LSTM层数
output_size = 1 # 输出维度

# 实例化模型
model = SimpleLSTM(input_size, hidden_size, num_layers, output_size)

# 随机生产数据
# 示例输入(batch_size, seq_len, input_size)
x = torch.randn(5, 15, input_size)

# 模型
out = model(x)

print(out.shape)

输出:

torch.Size([5, 1, 1])

参考资料

LSTM - 长短期记忆递归神经网络 - 知乎


http://www.kler.cn/a/511045.html

相关文章:

  • 使用Pydantic驾驭大模型
  • Docker私有仓库管理工具Registry
  • 从零开始,掌握Django Web开发
  • 【论文阅读笔记】人工智能胃镜在盲区检测和自主采图中的应用
  • WebSocket实现分布式的不同方案对比
  • HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (二、首页轮播图懒加载的实现)
  • JWT在线解密/JWT在线解码 - 加菲工具
  • 3.2 OpenAI 语言模型总览:GPT 系列的演进与应用解析
  • 精准测量,尽在掌握 —— 电导率传感器:科技之水质的守护者
  • ubuntu支持中文的字体
  • 【PowerQuery专栏】PowerQuery提取XML数据
  • Golang——常用库reflect和unsafe
  • 实施工程师:面试基础宝典
  • 【FlutterDart】MVVM(Model-View-ViewModel)架构模式例子-dio版本(31 /100)
  • QT 使用QTableView读取数据库数据,表格分页,跳转,导出,过滤功能
  • ASP.NET Core--依赖注入(DI)--在ASP.NET Core中使用依赖注入
  • 通过内核模块按fd强制tcp的quickack方法
  • 从零到一:构建高效稳定的电商数据API接口
  • HarmonyOS开发中模拟器TextInput表单类的无法输入中文字符问题
  • (python)数据分析-描述性统计
  • Linux中的基本指令(一)
  • QT 如何禁止QComboBox鼠标滚轮
  • Android系统开发(十):标准协议和通讯的桥梁:探索蓝牙、NFC、WLAN 的工作原理
  • JavaEE之CAS
  • Go os/exec 使用实践
  • Low-Level 大一统:如何使用Diffusion Models完成视频超分、去雨、去雾、降噪等所有Low-Level 任务?