ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

lstm详细解释(附代码实现)

lstm详细解释(附代码实现) 传统 RNN 的结构是它在理论上可以记住历史信息但在反向传播时梯度会随着时间步不断相乘如果权重小于 1梯度会指数衰减 →梯度消失网络学不到长距离依赖如果权重大于 1梯度会指数增长 →梯度爆炸训练不稳定。因此RNN 实际上只能记住较短距离的信息。LSTM 通过引入门控机制和细胞状态让信息可以选择性地保留或遗忘从而捕捉长期依赖。LSTM的核心三个门 1个记忆细胞(细胞状态)大白话解释你把LSTM想象成小房间里边有三个门(开关) 遗忘门,输入门,输出门 (控制信息的进,出,留)1个记忆细胞(cell)专门存重要的信息,相当于长期记忆本整体流程总结有点像管家整理记忆遗忘门 筛选旧记忆(丢垃圾) - 更新长期记忆本输入门 筛选新信息(捡宝贝) - 加到长期记忆本记忆细胞长期保存关键信息(记到小本本中)输出门 筛选要传递的记忆(挑重点讲) - 传递给下1个管家1. 遗忘门 - 决定忘掉哪些记忆作用:通过当前输入和上一时刻的隐藏状态,决定记忆细胞里的哪些信息可以丢掉.举例:你记日记时,发现昨天记天气预报对今天的事儿没用,把它从长期记忆本中划掉.公式: 门值 激活函数(权重矩阵 [上一时刻隐藏状态, 本次输入] 偏置)结论:数值(门值)接近1 - 保留这条旧记忆数值(门值)接近0 - 忘掉这条旧记忆2. 输入门 - 决定记住哪些新信息作用:通过当前输入和上一时刻的隐藏状态,决定哪些新信息需要放进记忆细胞举例:你今天遇到一件大事(过生日, 女友送你法拉利), 判断这事儿重要, 记到长期记忆本里公式: 门值 激活函数(权重矩阵 [上一时刻隐藏状态, 本次输入] 偏置)3. 记忆细胞(Cell) - 长期记忆本作用:存储关键信息,能跨很多时间步传递 - 解决长序列记忆问题公式(更新方式):新的细胞状态 遗忘门门值 * 旧记忆细胞状态 输入门门值 * 候选记忆图片中的文字内容如下4. 输出门 - 决定输出哪些记忆作用: 通过本次输入, 上一时刻的隐藏状态, 更新后的记忆细胞, 决定: 输出哪些信息.类比: 你给你朋友讲今天的事儿, 从长期记忆本中挑重要的(女友送你法拉利)讲,不重要的(例如:早上吃了包子)暂时不说.公式:门值 激活函数(权重矩阵 [上一时刻隐藏状态, 本次输入] 偏置)本次隐藏状态 输出门门值 * tanh激活函数(新记忆细胞状态)双向lstm它没有改变LSTM本身任何的内部结构“我爱中国”这句话从左到右和从右到左两次LSTM处理将得到的结果张量进行了拼接作为最终输出双向LSTM会模型参数和计算复杂度也随之增加了一倍lstm代码实现案例:演示LSTM入门代码.LSTM简介:概述:Long Short Term Memory, 长短时记忆结构, 能够解决传统RNN的弊端 - 处理长序列数据效果差的问题.组成:遗忘门, 输入门, 细胞状态, 输出门.优点:1. 能够解决长时依赖.2. 缓解梯度消失, 爆炸的问题 - 训练更稳定.3. 能够抓取复杂的特征.缺点:1. 计算慢, 消耗资源大. - 相对于RNN来讲2. 调参相对较难.3. 可解释性稍差.# 导包import torchimport torch.nn as nn# todo 1.定义函数, 演示LSTM模型的用法.def lstm_demo():# 1. 实例化LSTM模型(即: 创建LSTM对象)# 参1: 词向量维度(输入的维度), 参2: 隐藏层的维度(输出的维度), 参3: LSTM的(隐藏层)层数, 参4: 是否双向.lstm nn.LSTM(input_size5, hidden_size6, num_layers1, bidirectionalFalse)# 2. 构建输入张量.# 参1: 句子的长度(sequence_length), 参2: 批次大小(batch_size), 参3: 词向量的维度(input_size).input torch.randn(4, 3, 5)# 3. 初始化 隐藏状态 和 细胞状态.# 参1: LSTM层数(隐藏层层数), 参2: 批次大小(batch_size), 参3: 隐藏层的维度(hidden_size).h0 torch.randn(1, 3, 6)c0 torch.randn(1, 3, 6)# 4. 模型计算.# 实参列表解释:# input: 输入张量.# (h0,c0): 初始化隐藏状态和细胞状态, 元组形式# 返回值解释:# output: 输出张量.# (hn,cn): (最后1个时间步的)隐藏状态和细胞状态.# output, (hn, cn) lstm(input, (h0, c0))# 语法糖: 如果不写(h0, c0), 底层会自动创建1个全0的 h0(上一时刻的隐藏状态) 和 c0(上一时刻的细胞状态)output, (hn, cn) lstm(input)# 5. 打印结果.print(foutput: {output}, output.shape: {output.shape}) # shape: (4, 3, 6)print(fhn: {hn}, hn.shape: {hn.shape}) # shape: (1, 3, 6)print(fcn: {cn}, cn.shape: {cn.shape}) # shape: (1, 3, 6)# todo 2.调用函数.if __name__ __main__:lstm_demo()
返回列表