深度学习--RNN循环神经网络和LSTM

本文详细介绍了循环神经网络(RNN)的工作原理、常用领域如语言建模、机器翻译等,以及其结构和训练过程,包括前向传播和后向传播。同时,针对RNN的梯度消失和爆炸问题,文中提及了LSTM的解决方案,重点解析了LSTM的前向传播和核心代码。

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

RNN

RNN简介

我们来看一看百度百科给的解释

下面是循环神经网络的一部分

黑色直线代表权重,a1,a2代表存储单元,黄色框框代表输入,曲线是激活函数

RNN常用领域

  1. 语言建模(Language Modeling):RNN可以根据前文预测下一个单词或字符,用于自动文本生成、拼写纠错等任务。
  2. 机器翻译(Machine Translation):RNN可以将输入语言的序列转换为输出语言的序列,实现自动翻译。
  3. 文本分类(Text Classification):RNN可以对文本进行情感分析、垃圾邮件过滤等分类任务。
  4. 命名实体识别(Named Entity Recognition):RNN可以识别文本中的人名、地名、组织名等实体。

RNN结构 

这是一个序列模型的例子。

我们可以看出, 这个是模型是由很多个相同的网络结构结成的,因此也称它为循环神经网络。

我们将这个网络的结构进行抽象,然后展开,就得到了以下内容:

RNN的工作原理

循环神经网络的工程原理其实就是它的训练算法,一种基于时间的反向传播算法BPTT.

BPTT算法是针对循环层设计的训练算法,它的工作原理和反向传播BP的工作原理是相同的,也包含同样的三个步骤:

1.前向计算每个神经元的输出值

2.反向计算每个神经元的误差项值,它是误差函数对神经元的加权输入的偏导数。

3.计算每个权重的梯度,用随机梯度下降法更新权重。

以下是加权输入的含义: 

现在,我们就对RNN有了大致的了解,下面就让我们来具体学习它的各个部分的内容。

RNN的前向传播 

我们主要观察中间那层,b我们设为0,可以忽略不计

中间结果z=前一层即隐藏层的值*隐藏层权重U+这一层的输入值*权重W

我们对z加上激活函数得到h,我们这在这里用到的是Tanh激活函数

这是隐藏层中间结果的表示方法。

 

输出层y的表示方法。

V在这里表示的也是权重。

g()是使用Softmax激活函数。

这是我们的输出值的最终函数,也就是一个嵌套的循环函数。

接下来,我们对应公式来书写代码

代码

import numpy as np
def forward_propagation(self,x):
    T=len(x)    # T为输入序列的长度

    # 初始化
    h=np.zeros((T+1,self.hidden_dim))
    h[-1]=np.zeros(self.hidden_dim)
    y_pre=np.zeros((T,self.in_shape))
    
### RNN LSTM 的概念 #### 循环神经网络(Recurrent Neural Network, RNN循环神经网络是一种专门用于处理序列数据的神经网络架构。它的核心特点是隐藏层之间存在连接,允许信息在网络中沿时间维度传递。这种特性使得RNN能够捕捉序列中的依赖关系[^1]。 然而,传统的RNN在处理长期依赖问题时表现不佳,容易受到梯度消失或爆炸的影响。这主要是因为随着序列长度的增长,误差信号逐渐减弱,导致早期的时间步无法有效学习到有用的信息[^2]。 --- #### 长短期记忆网络(Long Short-Term Memory, LSTM) 为了克服传统RNN的局限性,HochreiterSchmidhuber提出了LSTM模型。LSTM通过引入特殊的门控机制来调节信息流动,从而有效地解决了长期依赖问题。LSTM的核心组件是一个细胞状态(cell state),它可以沿着整个序列传输信息而不受梯度消失的影响[^3]。 LSTM中有三种主要的门控机制: - **输入门**:决定哪些新信息会被加入到细胞状态中。 - **遗忘门**:控制先前细胞状态中的哪些部分需要被丢弃。 - **输出门**:确定细胞状态的哪一部分会作为最终输出。 这些门由sigmoid激活函数逐点乘法操作组成,能够在必要时保存或清除信息。 --- ### RNN LSTM 的区别 | 特性 | RNN | LSTM | |---------------------|---------------------------------------|----------------------------------------------------------------------| | 结构复杂度 | 较简单 | 更复杂,包含多个门控机制 | | 处理长期依赖能力 | 不足 | 强大,能有效应对长期依赖 | | 参数数量 | 少 | 多,由于增加了门控结构 | | 训练难度 | 容易陷入梯度消失 | 减少了梯度消失的可能性 | | 应用领域 | 短序列任务 | 需要捕捉长期上下文的任务,如机器翻译、语音识别 | 虽然LSTM相比RNN更加复杂,但它在许多实际应用场景中表现出更优的性能,尤其是在需要建模长距离依赖的情况下。 --- ### 双向LSTM(Bi-directional LSTM, BI-LSTM) 除了单向LSTM外,还有一种变体称为双向LSTM。该模型同时考虑了序列的历史信息未来信息。具体实现方式是在原有正向LSTM的基础上增加了一层反向LSTM,并将两者的输出进行拼接后进一步处理[^1]。 这种方法特别适合那些不仅依赖过去的数据,还需要利用后续信息才能做出更好决策的任务,比如情感分析或者命名实体识别。 ```python import torch.nn as nn class BiLSTMModel(nn.Module): def __init__(self, input_size, hidden_size, num_layers, output_size): super(BiLSTMModel, self).__init__() self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True, bidirectional=True) self.fc = nn.Linear(hidden_size * 2, output_size) # 因为是双向,所以hidden_size*2 def forward(self, x): out, _ = self.lstm(x) out = self.fc(out[:, -1, :]) # 使用最后一个时间步的输出 return out ``` 上述代码展示了一个简单的双向LSTM模型定义过程。 --- ### 总结 RNN提供了一种基础框架用来处理序列化数据;而LSTM则在此基础上进行了改进,增强了对长时间跨度内的关联性的把握能力。两者各有千秋,在不同类型的项目里发挥着各自独特的作用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值