【LSTM】深入浅出讲解长短时记忆神经网络(结构、原理)

本文深入浅出地介绍了长短时记忆网络(LSTM),一种特殊的循环神经网络(RNN),旨在解决长期依赖性问题。文章详细解释了LSTM的结构、原理及其如何通过门控机制有效处理序列数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 本文收录于《深入浅出讲解自然语言处理》专栏,此专栏聚焦于自然语言处理领域的各大经典算法,将持续更新,欢迎大家订阅!
  • ​个人主页:有梦想的程序星空
  • ​个人介绍:小编是人工智能领域硕士,全栈工程师,深耕Flask后端开发、数据挖掘、NLP、Android开发、自动化等领域,有较丰富的软件系统、人工智能算法服务的研究和开发经验。
  • ​如果文章对你有帮助,欢迎关注点赞收藏订阅。

1、LSTM的背景介绍

        长短时记忆神经网络(Long Short-term Memory Networks,简称LSTM)是特殊的RNN,尤其适合顺序序列数据的处理,LSTM 由 Hochreiter & Schmidhuber (1997) 提出,并在近期被 Alex Graves 进行了改良和推广,LSTM明确旨在避免长期依赖性问题,成功地解决了原始循环神经网络的缺陷,成为当前最流行的RNN,在语音识别、图片描述、自然语言处理等许多领域中成功应用。

2、RNN的不足

图1 RNN的网络结构图 

        循环神经网络处理时间序列数据具有先天优势,通过反向传播和梯度下降算法达到了纠正错误的能力,但是在进行反向传播时也面临梯度消失或者梯度爆炸问题,这种问题表现在时间轴上。如果输入序列的长度很长,人们很难进行有效的参数更新。通常来说梯度爆炸更容易处理一些。梯度爆炸时我们可以设置一个梯度阈值,当梯度超过这个阈值的时候可以直接截取。

        有三种方法应对梯度消失问题:

        (1)合理的初始化权重值。初始化权重,使每个神经元尽可能不要取极大或极小值,以躲开梯度消失的区域。

        (2)使用 ReLu 代替 sigmoid 和 tanh 作为激活函数。

        (3)使用其他结构的RNNs,比如长短时记忆网络(LSTM)和 门控循环单元 (GRU),这是最流行的做法。

3、LSTM的结构和原理

图2 LSTM的结构图 

上图中使用的各个元素的图标的含义如下图所示:

其中:

Neural Network Layer:神经网络层,用于学习;

Pointwise Operation:逐点运算操作,如逐点相乘、逐点相加、向量和等;

Vector Transfer:向量转移,向量沿箭头方向移动;

Concatenate:连接,将两个向量连接在一起;

Copy:复制,将向量复制为两份。

        LSTM核心是细胞状态,穿过图的顶部的长横线,长直线称之为细胞状态(Cell State),决定什么样的信息会被保留,什么样的信息会被遗忘,记为{C_t}

        细胞状态像传送带一样,它贯穿整个细胞却只有很少的分支,这样能保证信息不变的流过整个RNN,细胞状态如下图所示:

图3 细胞状态图

        LSTM网络能通过一种被称为门的结构对细胞状态进行删除或者添加信息。门能够有选择性的决定让哪些信息通过。门的结构为一个sigmoid层和一个点乘操作的组合,sigmoid层输出0到1之间的数,描述每个部分有多少量可以通过,0代表不允许任何量通过,1表示允许任何量通过,结构如下图所示:

图4 门结构单元

         LSTM实现了三个门计算,即遗忘门、输入门和输出门,用来保护和控制细胞状态。

        遗忘门负责决定保留多少上一时刻的单元状态到当前时刻的单元状态,即决定从细胞状态中丢弃什么信息。该门读取{h_{t - 1}}{x_t},然后经过sigmoid层后,输出一个0-1之间的数{f_t}给每个在细胞状态{C_{t - 1}}中的数字逐点相乘。{f_t}的值为0表示完全丢弃,1表示完全保留。结构如下图所示:

图5 遗忘门结构图 

        输入门负责决定保留多少当前时刻的输入到当前时刻的单元状态,包含两个部分,第一部分为sigmoid层,该层决定要更新什么值,第二部分为tanh层,该层把需要更新的信息更新到细胞状态里。tanh层创建一个新的细胞状态值向量{\tilde C_t}{\tilde C_t}会被加入到状态中。结构如下图:

图6 输入门结构图 

        然后就到了更新旧细胞状态的时间了,将{C_{t - 1}}更新为{C_t},把旧状态与{f_t}相乘,丢弃确定需要丢弃的信息,再加上{i_t}*{\tilde C_t} ,这样就完成了细胞状态的更新,结构如下图所示:

 图7 更新旧细胞状态

        输出门负责决定当前时刻的单元状态有多少输出,通过一个sigmoid层来确定细胞状态的哪个部分将输出出去。把细胞状态通过tanh进行处理,得到一个-1到1之间的值,并将它和sigmoid门的输出相乘,最终仅仅输出确定输出的部分。结构如下图所示:

图8 输出门的结构

4、LSTM的训练过程

        LSTM的参数训练算法,依然是反向传播算法。主要有如下三个步骤:

        第一步:前向计算每个神经元的输出值。对于LSTM而言,依据前面介绍的算法,分别进行计算。

        第二步:确定优化目标函数。在训练早期,输出值和预期值会不一致,于是计算每个神经元的误差项值,构造出损失函数。

        第三步:根据损失函数的梯度指引,更新网络权值参数。与传统RNN类似,LSTM误差项的反向传播包括两个层面:一个是空间上层面的,将误差项向网络的上一层传播。另一个是时间层面上的,沿时间反向传播,即从当前t时刻开始,计算每个时刻的误差。

        然后跳转第一步,重复做第一、二和三步,直至网络误差小于给定值。

关注微信公众号【有梦想的程序星空】,了解软件系统和人工智能算法领域的前沿知识,让我们一起学习、一起进步吧!

### LSTM 单元结构图及其解释 LSTM(Long Short-Term Memory)是一种特殊的RNN架构,能够通过门控机制解决长期依赖问题。以下是关于LSTM单元结构图的详细说明以及其工作流程。 #### 1. LSTM 的基本组成 LSTM的核心在于它的细胞状态 \(C_t\) 和三个主要的门控机制:遗忘门、输入门和输出门。这些组件共同决定了信息如何流入、保留或流出神经网络中的每个时间步[^1]。 #### 2. 遗忘门 (Forget Gate) 遗忘门决定哪些信息应该被丢弃或者忘记。它接收当前时刻的输入 \(x_t\) 和前一时刻隐藏状态 \(h_{t-1}\),并通过一个sigmoid层计算出一个介于0到1之间的值向量。如果某个位置上的值接近0,则表示该位置的信息应完全忽略;反之则需部分保存。 \[ f_t = \sigma(W_f[h_{t-1}, x_t]+b_f) \] #### 3. 输入门 (Input Gate) 此阶段分为两部分操作: - **更新候选值**:利用tanh激活函数生成一个新的潜在添加项\(\tilde{C}_t\); - **控制权重分配**:同样借助sigmoid层来评估哪一部分新数据值得采纳进入记忆体中去替代旧有内容。 最终得到的结果将会作为下一步调整整体Cell State的重要依据之一。 \[ i_t = \sigma(W_i[h_{t-1}, x_t]+b_i), \quad \tilde{C}_t=tanh(W_C[h_{t-1}, x_t]+b_c)\] #### 4. 更新细胞状态(Cell State Update) 基于前面两个步骤产生的信号,现在可以正式修改实际存储的数据了——即所谓的“长短期记忆”。具体做法是先按比例减少原有记录(乘以f_t),再加入经过筛选的新元素(i_ti * C~_t )完成整个过程。 \[ C_t=f_tC_{t−1}+i_t\tilde{C}_t \] #### 5. 输出门(Output Gate) 最后一步涉及确定本周期结束后的出口表现形式\(o_t\) ,这依旧依靠Sigmoid判定强度大小,并配合Tanh转换过的最新版Cell Content形成最终版本Hidden Representation供后续调用。 \[ o_t=\sigma(W_o[h_{t-1}, x_t ]+ b_o ), h_t=o_ttanh(C_t)] ```python import numpy as np def lstm_cell(x, h_prev, c_prev, W_f, W_i, W_c, W_o, U_f, U_i, U_c, U_o, b_f, b_i, b_c, b_o): forget_gate = sigmoid(np.dot(W_f, x) + np.dot(U_f, h_prev) + b_f) input_gate = sigmoid(np.dot(W_i, x) + np.dot(U_i, h_prev) + b_i) cell_candidate = tanh(np.dot(W_c, x) + np.dot(U_c, h_prev) + b_c) c_next = forget_gate * c_prev + input_gate * cell_candidate output_gate = sigmoid(np.dot(W_o, x) + np.dot(U_o, h_prev) + b_o) h_next = output_gate * tanh(c_next) return h_next, c_next ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有梦想的程序星空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值