大话循环神经网络RNN、LSTM、GRU

CNN主要处理图像信息,主要应用于计算机视觉领域。
RNN(recurrent neural network)主要就是处理序列数据(自然语言处理、语音识别、视频分类、文本情感分析、翻译),核心就是它能保持过去的记忆。但RNN有着梯度消失问题,专家之后接着改进为LSTM和GRU结构。下面将用通俗的语言分别详细介绍。

在这里插入图片描述

对机器学习或深度学习不太熟的童鞋可以先康康这几篇哦:
《无废话的机器学习笔记》
《一文极速理解深度学习》
《一文总结经典卷积神经网络CNN模型》

RNN(Recurrent Neural Network)

RNN中的处理单元,中间绿色就是过去处理的结果,左边第一幅图就是正常的DNN,不会保存过去的结果,右边的图都有一个特点,输出的结果(蓝色)不仅取决于当前的输入,还取决于过去的输入!不同的单元能赋予RNN不同的能力,如 多对一就能对一串文本进行分类,输出离散值,比如根据你的言语判断你今天高不高兴。
 
在这里插入图片描述

 
RNN中保存着过去的信息,输出取决于现在与过去。如果大伙学过数电,这就是状态机!这玩意跟触发器很像。
 
在这里插入图片描述
 
有个很重要的点:
这个权重fw沿时间维度是一致的,权值共享。就像CNN中一个卷积核在卷积过程中参数一致。所以CNN是沿着空间维度权值共享;RNN是沿着时间维度权值共享。
在这里插入图片描述
 
具体来说有三个权重,过去与现在各一个权重,加起来再来一个权重。 它们都沿着时间维度权值共享。不然每个时间都不一样权重,参数量会很恐怖。

在这里插入图片描述
 

整体的计算图(多对多):
每次的输出y可以与标签值构建损失函数,这样就跟之前DNN训练模型思想一样,训练3套权重使损失函数不断下降至满意。

在这里插入图片描述

反向传播要沿时间反向传回去(backpropagation through time,BPTT)
Forward through entire sequence to compute loss, then backward through entire sequence to compute gradient.

在这里插入图片描述

这样会有问题,就是一下子把全部序列弄进来求梯度,运算量非常大。实际我们会将大序列分成等长的小序列,分别处理:

 
在这里插入图片描述

不同隐含层中不同的值负责的是语料库中不同的特征,所以隐含状态的个数越多,模型就越能捕获文本的底层特征。

 

下面来看一个例子:字符级语言模型(由上文预测下文):
我想输入hell,然后模型预测我会输出o;或者我输入h,模型输出e,我再输入e,模型输出l…
首先对h,e,l,o进行独热编码,然后构建模型进行训练。

在这里插入图片描述

在这里插入图片描述

 
输入莎士比亚的剧本,让模型自己生成剧本,训练过程:

在这里插入图片描述

输入latex文本,让模型自己生成内容,公式写得有模有样的,就不知道对不对:

在这里插入图片描述
当然输入代码,模型也会输出代码。所以现在火热的Chatgpt的本质就是RNN。

对于图像描述,专家会先用CNN对图像进行特征抽取(编码器),然后将特征再输入RNN进行图像描述(解码器)

在这里插入图片描述
 

在这里插入图片描述
 

还可以结合注意力机制(Image captioning with attention):

在这里插入图片描述
 

普通堆叠的RNN一旦隐含层变多变深,反向传播时就很容易出现梯度消失/爆炸
子豪兄总结得非常好,以最简单的三层网络来看,对于输出的O3可以列出损失函数L3,对L3进行求偏导,分别对输出权重w0,输入权重wx,过去权重ws进行求导。我们发现对w0求偏导会很轻松。但是,由于链式法则(chain rule),对输入权重wx和过去权重ws求偏导就会很痛苦。在表达式里,对于越是前面层的链式求导,乘积项越多,所以很容易梯度消失/爆炸,梯度消失占大多数。

在这里插入图片描述

 
 

LSTM(Long Short-Term Memory)

长短时记忆神经网络(LSTM) 应运而生!
LSTM既有长期记忆也有短期记忆,包括遗忘门、输入门、输出门、长期记忆单元。右图红色函数是sigmoid,蓝色函数是tanh。

在这里插入图片描述

C是长期记忆,h是短期记忆。
所以当前输出ht是由短期记忆产生的。

在这里插入图片描述
 

我们看到长期记忆那条线是贯通的,且只有乘加操作。
在这里插入图片描述
 
 

LSTM算法详解:

下面几个图完美解释了:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

所以总共有四个权重:Wf、Wi、Wc、Wo,当然还有它们对应的偏置项。
整体过程可以概括为:遗忘、更新、输出。(更新包括先选择保留信息,再更新最新记忆。)

原论文中的图也非常形象:

在这里插入图片描述

在这里插入图片描述
 

现在反向传播求偏导就舒服了

在这里插入图片描述
在这里插入图片描述
 
在这里插入图片描述
 
 

GRU(Gated Recurrent Unit)

GRU也能很好解决梯度消失问题,结构简单一点,主要就是重置门更新门

在这里插入图片描述

在这里插入图片描述

 

GRU与LSTM对比:

  1. 参数数量:GRU的参数数量相对LSTM来说更少,因为它将LSTM中的输入门、遗忘门和输出门合并为了一个门控单元,从而减少了模型参数的数量。
    LSTM中有三个门控单元:输入门、遗忘门和输出门。每个门控单元都有自己的权重矩阵和偏置向量。这些门控单元负责控制历史信息的流入和流出。
    GRU中只有两个门控单元:更新门和重置门。它们共享一个权重矩阵和一个偏置向量。更新门控制当前输入和上一时刻的输出对当前时刻的输出的影响,而重置门则控制上一时刻的输出对当前时刻的影响。
  2. 计算速度:由于参数数量更少,GRU的计算速度相对LSTM更快。
  3. 长序列建模:在处理长序列数据时,LSTM更加优秀。由于LSTM中引入了一个长期记忆单元(Cell State),使得它可以更好地处理长序列中的梯度消失和梯度爆炸问题。

GRU适用于:
处理简单序列数据,如语言模型和文本生成等任务。
处理序列数据时需要快速训练和推断的任务,如实时语音识别、语音合成等。
对计算资源有限的场景,如嵌入式设备、移动设备等。

LSTM适用于:
处理复杂序列数据,如长文本分类、机器翻译、语音识别等任务。
处理需要长时依赖关系的序列数据,如长文本、长语音等。
对准确度要求较高的场景,如股票预测、医学诊断等。

公式总结:
在这里插入图片描述

### RNNLSTMGRU 的概念及区别 #### 循环神经网络 (RNN) 循环神经网络是一种专门用于处理序列数据的模型。它具有输入层、输出层和隐藏层,与普通前馈神经网络不同的是,RNN 在不同的时间步 $ t $ 上有不同的状态,并且上一时刻 ($ t-1 $) 隐藏层的状态会被传递到当前时刻 ($ t $),形成了一种动态的时间依赖关系。这种特性使得 RNN 能够捕捉序列中的上下文信息[^1]。 然而,标准的 RNN 存在一个显著的问题——梯度消失或爆炸现象,在训练过程中可能导致无法有效学习长时间跨度的信息[^3]。 --- #### 长短期记忆网络 (LSTM) 为了克服 RNN 中存在的梯度消失问题以及难以建模长期依赖性的缺陷,Hochreiter 和 Schmidhuber 提出了长短期记忆网络(Long Short-Term Memory, LSTM)。 LSTMRNN 的一种改进版本,其核心在于引入了 **门控机制** 来调节信息流。具体来说,LSTM 包括三个主要组件:遗忘门、输入门和输出门。这些门的作用分别是决定哪些信息应该被丢弃、更新或者保留下来。通过这种方式,LSTM 可以更好地保存历史信息并缓解梯度消失问题[^2]。 在实际应用中,由于能够很好地捕获远距离的相关性,因此广泛应用于自然语言处理领域内的诸多任务,比如机器翻译、情感分析等场景下表现出色。 --- #### 门控循环单元 (GRU) 尽管 LSTM 解决了很多关于传统 RNN 所面临挑战方面取得成功,但它也增加了计算复杂性和内存消耗。于是 Cho 等人在研究基础上提出了更简洁高效的替代方案即 Gated Recurrent Unit(GRU) 。 相比起完整的三重门设计,LSTM简化成了两个部分:一个是reset gate用来控制候选激活值c_t'如何组合先前状态h_(t−1);另一个update gate则决定了最终新状态ht由多少比例来自旧状态加上新的贡献构成。这样的架构不仅减少了参数数量还提高了运行效率同时保持良好性能水平接近甚至超越原始形式下的表现效果. --- #### 使用场景对比 | 特性/算法 | RNN | LSTM | GRU | |------------|-------------------------|-------------------------------|--------------------------------| | 复杂程度 | 较低 | 高 | 中等 | | 参数量 | 少 | 多 | 居中 | | 效率 | 易受梯度消失影响 | 对抗梯度消失能力强 | 平衡了速度与能力 | | 应用范围 | 文本分类、简单序列预测 | 自然语言生成、语音识别 | 时间序列预测、对话系统优化 | 当面对较短的记忆需求时,RNN可能已经足够胜任;而对于那些需要考虑较长周期关联的任务而言(如视频帧间动作检测),那么采用具备更强表达力的LSTM将是更好的选择;如果追求更高的运算效能同时又不想牺牲太多准确性的话,则可以尝试利用GRU作为解决方案之一。 ```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) class LSTMModel(nn.Module): def __init__(self, input_dim, hidden_dim, layer_dim, output_dim): super(LSTMModel, self).__init__() self.lstm = nn.LSTM(input_dim, hidden_dim, layer_dim, batch_first=True) class GRUModel(nn.Module): def __init__(self,input_dim,hidden_dim,output_dim,num_layers=1,bidirectional=False): super().__init__() self.gru=nn.GRU(input_dim,hidden_dim,num_layers=num_layers,batch_first=True,bidirectional=bidirectional) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

全栈O-Jay

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

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

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

打赏作者

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

抵扣说明:

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

余额充值