RNN和LSTM

本文介绍了循环神经网络(RNN)的基础概念,如何处理长期依赖问题,以及LSTM(长短期记忆)的诞生及其内部机制。重点讲解了LSTM的门控机制和GRU(门控循环单元)的简化版,适合初学者理解记忆网络在自然语言处理中的应用。

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

如果想了解CNN,推荐     CNN     卷积神经网络(CNN)入门讲解 - 知乎

参考B站视频  李宏毅机器学习-RNN网络   和吴恩达

一、引出RNN

        假设出现下面两种情况,显然第一句中Taipei是目的地,第二句中是出发地。当输入都是Taipei时,我们的输出要么都是目的地的概率高,要么都是出发地的概率高,出现不了一个是出发地的概率高,一个是目的地的概率高。因此,我们希望神经网络能有记忆力,记得在第一句中看到Taipei之前,看到过arrive,在第二句在看到Taipei之前,看到过leave,就可以根据上下文判断出来是出发地还是目的地,产生不同的输出。由此引出了RNN。

 二、介绍RNN

        一个简单的循环神经网络如下,它由一个输入层,一个隐藏层,一个输出层组成。然后我们可以看到在Hidden Layer 有一个箭头表示数据的循环更新, 这就是RNN中的记忆功能实现。如下图,绿色的隐藏层输出会被存储到蓝色的记忆单元中即进行值的更新,初始的记忆单元一般为0向量。这个输出的产生也不仅仅要考虑输入,还要考虑记忆单元。

     

 Example

开始整个流程之前,需要构造将store置初始值,一般选择零向量。假定权重都为1,而且激活函数都是线性函数,也没哟偏置。如下图:

隐藏层输出(即绿色圆):y11=1*1+0+1*1+0=2  同理y12=2

输出层: y21=2+2=4同理y22=4

我们

### RNNLSTM的区别 RNN(循环神经网络)是一种专门用于处理序列数据的神经网络模型,其核心特点是能够通过隐藏状态传递上下文信息[^1]。然而,标准的RNN存在梯度消失或梯度爆炸的问题,在长时间依赖的情况下表现不佳。 相比之下,LSTM(长短期记忆网络)作为RNN的一种变体,引入了复杂的门控机制来缓解这些问题。具体来说,LSTM通过“遗忘门”、“输入门”“输出门”三种结构控制信息流,允许网络选择性地记住或忘记某些信息[^2]。“遗忘门”决定哪些先前的信息被丢弃,“输入门”负责更新细胞状态,而“输出门”则决定了当前时刻的输出值。这些机制使得LSTM能够在更长的时间跨度内保持重要的历史信息。 #### 改进之处 LSTM的主要改进在于解决了传统RNN难以捕捉长期依赖关系的问题。这是因为传统的RNN仅依靠简单的tanh激活函数无法有效存储时间跨度较大的信息,而LSTM通过精心设计的记忆单元门控机制实现了这一点。 --- ### 应用场景比较 #### RNN的应用场景 尽管RNN在理论上适用于各种序列建模任务,但由于其固有的缺陷,实际应用中通常局限于较短时间范围内的预测问题。以下是典型的RNN应用场景: - **语音信号预处理**:对于一些实时性强、复杂程度较低的任务,如声学特征提取。 - **小型文本分类**:当数据集规模较小或者对计算效率要求较高时,可以选择使用基本形式的RNN。 需要注意的是,随着技术的发展,纯RNN已经逐渐被更加先进的架构所取代。 #### LSTM的应用场景 由于具备更强的学习能力,LSTM广泛应用于需要考虑远距离关联性的场合: - **自然语言处理 (NLP)** 如机器翻译、情感分析、问答系统等领域均大量采用LSTM模型。例如,在生成高质量译文的过程中,源语言句子可能包含多个影响最终结果的关键词组,这正是LSTM擅长应对的情况之一[^3]。 - **时间序列预测** 股票价格走势、天气预报等涉及连续变量的趋势判断非常适合运用LSTM来进行精准建模[^4]。 - **视频动作识别** 对于多帧画面组成的动态行为理解任务而言,LSTM可以很好地捕获跨帧间的逻辑联系并作出合理推断。 综上所述,虽然两者都属于序列学习范畴下的工具箱成员,但在性能层面显然LSTM占据优势地位。 ```python import torch.nn as nn class SimpleRNN(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(SimpleRNN, self).__init__() self.rnn = nn.RNN(input_size, hidden_size, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): out, _ = self.rnn(x) out = self.fc(out[:, -1, :]) return out class LSTMModel(nn.Module): def __init__(self, input_size, hidden_size, num_layers, output_size): super(LSTMModel, self).__init__() 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): lstm_out, _ = self.lstm(x) out = self.fc(lstm_out[:, -1, :]) # 取最后一个时间步的结果 return out ``` 上述代码展示了如何构建基础版的RNNLSTM模型,并突出体现了两者的差异——后者拥有额外参数配置选项以支持深层堆叠及双向扩展等功能特性开发需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值