万字长文解读深度学习——循环神经网络RNN、LSTM、GRU、Bi-RNN
🌺历史文章列表🌺
- 深度学习——优化算法、激活函数、归一化、正则化
- 深度学习——权重初始化、评估指标、梯度消失和梯度爆炸
- 深度学习——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总
- 万字长文解读深度学习——卷积神经网络CNN
- 万字长文解读深度学习——循环神经网络RNN、LSTM、GRU、Bi-RNN
- 万字长文解读深度学习——Transformer
- 万字长文解读深度学习——GPT、BERT、T5
- 万字长文解读深度学习——ViT、ViLT、DiT
- 万字长文解读深度学习——CLIP、BLIP
- 万字长文解读深度学习——AE、VAE
- 万字长文解读深度学习——GAN
- 万字长文解读深度学习——训练、优化、部署细节
推荐阅读
深度学习知识点全面总结
如何从RNN起步,一步一步通俗理解LSTM
深度学习之RNN(循环神经网络)
循环神经网络(RNN与LSTM)
文章目录
- 文本特征提取的方法
- 1. 基础方法
- 1.1 词袋模型(Bag of Words, BOW)
- 工作原理
- 举例
- 优点
- 缺点
- 1.2 TF-IDF(Term Frequency-Inverse Document Frequency)
- 工作原理
- 举例
- 优点
- 缺点
- 1.3 TF-IDF的改进——BM25
- 优化
- 1.4 N-Gram 模型
- 工作原理
- 举例
- 优点
- 缺点
- 2. 词向量(Word Embeddings)
- 2.1 Word2Vec
- 工作原理
- 举例
- 优点
- 缺点
- 2.2 FastText
- 工作原理
- 优点
- 缺点
- 3. 预训练模型:BERT(Bidirectional Encoder Representations from Transformers)
- 工作原理
- 优点
- 缺点
- 总结
- RNN
- RNN 参数
- RNN 的特点
- RNN 的局限性
- 前向传播的核心计算
- 隐状态更新
- 输出更新
- RNN 的训练流程
- 1. 输入准备
- 2. 前向传播(Forward Pass)
- 3. 计算损失(Loss Calculation)
- 4. 反向传播(Backward Pass)
- 5. 参数更新
- RNN 的推理流程
- 1. 输入准备
- 2. 前向传播
- 3. 生成输出
- 4. 推理结束
- RNN参数初始化
- LSTM(Long Short-Term Memory)
- LSTM 的核心部件
- LSTM 的公式和工作原理
- (1) 遗忘门(Forget Gate)
- (2) 输入门(Input Gate)
- (3) 更新记忆单元状态
- (4) 输出门(Output Gate)
- LSTM 的流程总结
- LSTM 的优点
- LSTM 的局限性
- GRU(Gated Recurrent Unit)
- GRU 的基本结构
- GRU 的工作原理与公式
- (1) 更新门(Update Gate)
- (2) 重置门(Reset Gate)
- (3) 生成候选隐藏状态(Candidate Hidden State)
- (4) 隐藏状态更新
- GRU 的优点
- GRU 的局限性
- GRU 与 LSTM 的对比
- Bi-RNN
- Bi-RNN 的结构
- Bi-RNN 的工作原理
- Bi-RNN 的特点
- RNN、LSTM、GRU 和 Bi-RNN 总结
- 全连接层在各神经网络模型中的作用
文本特征提取的方法
1. 基础方法
1.1 词袋模型(Bag of Words, BOW)
词袋模型最简单的方法。它将文本表示为一个词频向量,不考虑词语的顺序或上下文关系,只统计每个词在文本中出现的频率。
工作原理
- 构建词汇表:对整个语料库中的所有词汇建立一个词汇表(也称为词典)。每个文档中的每个词都与词汇表中的一个位置对应。
- 生成词频向量:对于每个文本(文档),生成一个与词汇表长度相同的向量。向量中每个元素表示该词在文档中出现的次数(或者是否出现,用二进制表示)。
举例
假设有两个句子:
- 句子 1:
猫 喜欢 鱼 - 句子 2:
狗 不 喜欢 鱼
词汇表 = [“猫”, “狗”, “喜欢”, “不”, “鱼”]
- 句子 1 的词袋向量表示为:[1, 0, 1, 0, 1]
- 句子 2 的词袋向量表示为:[0, 1, 1, 1, 1]
优点
- 简单直观,易于实现,有效地表示词频信息。
缺点
- 忽略词序:词袋模型无法捕捉词语的顺序,因此在语义表达上有局限。
- 高维稀疏:对于大词汇表,词袋模型会生成非常长的特征向量,大多数元素为 0,容易导致稀疏矩阵,影响计算效率。
- 受到常见词的影响:常见词(如 “the”、“and” 等)可能在各类文档中频繁出现,但对语义贡献较少,词袋模型会受到这些高频词的影响,降低模型的效果。
1.2 TF-IDF(Term Frequency-Inverse Document Frequency)
TF-IDF 是对词袋模型的改进,它为词语赋予不同的权重,来衡量每个词在文档中的重要性。与词袋模型相比,TF-IDF 不仅考虑词频,还考虑词的普遍性,以避免常见词(如"the"、“and”)的影响。
工作原理

举例
对于句子“猫 喜欢 鱼”和“狗 不 喜欢 鱼”,假设 “喜欢” 出现在所有文档中,IDF 会给它较低的权重,而像 “猫”、“狗” 这样的词会有较高的 IDF 权重,因为它们只出现在一部分文档中。
优点
- 更准确地反映词的重要性,避免了词袋模型中常见词占主导地位的情况。尤其适用于文本分类任务。
缺点
- 稀疏矩阵:虽然词频的权重经过调整,但词汇表的大小仍然很大,容易产生稀疏矩阵问题。
- 忽略词序:仍然无法捕捉词语之间的顺序和上下文关系。
1.3 TF-IDF的改进——BM25
BM25对TF和IDF进行加权,同时考虑文档长度对相关性的影响,使得对较短和较长文档的评分更加合理。
BM25 的计算公式如下:

TF-IDF 中的 IDF(逆文档频率)使用
来衡量词的普遍性。然而这种计算方式可能会导致在某些极端情况下(如 df(t) = 0 )出现不合理的结果。
BM25 对 IDF 进行了小改进,以提高在极端情况下的稳定性:

这种改进的 IDF 计算在文档数量较少或者某个词的出现频率极高时,能提供更合理的 IDF 值,增加了 BM25 的稳定性。
优化
相比于 TF-IDF,BM25 主要做了以下改进:
- 非线性词频缩放:通过 k 1 k_1 k1 控制词频TF饱和 ,避免 TF 值无限增大导致的偏差。
- 文档长度归一化:使用参数 b b b调整文档长度对评分的影响,防止长文档得分偏高。
- 改进的 IDF 计算:使用平滑后的 IDF 计算,保证在极端情况下的稳定性。
- 查询词频考虑:在评分中更合理地衡量查询中词频的影响,提高了对复杂查询的检索效果。
1.4 N-Gram 模型
N-Gram 模型是一种基于词袋模型的扩展方法,它通过将词组作为特征,来捕捉词语的顺序信息。
工作原理
-
N-Gram 是指在文本中提取连续的 n 个词组成的词组作为特征。当 n=1 时,即为 unigram(单词级别特征);当 n=2 时,即为 bigram(双词组特征);当 n=3 时,即为 trigram(词三元组特征)。
-
在提取 N-Gram 时,模型不仅关注单个词,还捕捉到词与词之间的顺序和依赖关系。例如,2-Gram 模型会将句子分解为相邻的两词组合。
举例
对于句子“猫 喜欢 吃 鱼”,2-Gram 模型会提取出以下特征:
- [“猫 喜欢”, “喜欢 吃”, “吃 鱼”]
优点
- 能捕捉到顺序和依赖关系,比单词级别的特征表达更丰富。n 越大,模型捕捉的上下文信息越多。
缺点
- 维度膨胀:n 值越大,特征向量的维度会急剧增加,容易导致稀疏矩阵和计算复杂度升高。
- 对长文本,N-Gram 模型可能会生成非常多的组合,计算资源消耗较大。
2. 词向量(Word Embeddings)
词向量是现代 NLP 中的关键特征提取方法,能够捕捉词语的语义信息。常见的词向量方法包括 Word2Vec、GloVe、和 FastText。词向量的核心思想是将每个词表示为一个低维的、密集的向量,词向量之间的相似性能够反映词语的语义相似性。
2.1 Word2Vec
Word2Vec 是一种使用浅层神经网络学习词向量的模型,由 Google 在 2013 年提出。它有两种模型架构:CBOW 和 Skip-gram。
工作原理
- CBOW(Continuous Bag of Words):根据上下文中的词语来预测中心词。模型输入是上下文词语,输出是预测的中心词。
- Skip-gram:与 CBOW 相反,它是根据中心词来预测上下文中的词语。
举例
对于一个句子 “猫 喜欢 吃 鱼”,CBOW 会使用上下文 [“猫”, “吃”, “鱼”] 来预测 “喜欢”,而 Skip-gram 则会使用 “喜欢” 来预测上下文。
优点
- 语义相似性:Word2Vec 生成的词向量能够捕捉词语之间的语义相似性。例如,“king” 和 “queen” 的词向量会非常相近。
- 稠密向量:与词袋模型和 TF-IDF 生成的高维稀疏向量不同,Word2Vec 生成的词向量是低维的密集向量(如 100 维或 300 维),更加高效。
缺点
- 无法处理 OOV(未登录词):如果测试集中出现了训练集中未见过的词,Word2Vec 无法为其生成词向量。
- 上下文无关:Word2Vec 生成的词向量是固定的,无法根据上下文变化来调整词向量。
2.2 FastText
FastText 是 Facebook 提出的词向量方法,它是 Word2Vec 的改进版。FastText 通过将词分解为n-gram字符级别的子词,捕捉词的形态信息。
工作原理
- FastText 将词分解为多个字符 n-gram,然后对每个 n-gram 生成词向量。通过这种方式,FastText 可以捕捉到词语内部的形态信息,尤其对拼写错误或未登录词有较好的处理能力。
优点
- 处理 OOV(未登录词):因为 FastText 基于子词生成词向量,它能够为未见过的词生成向量表示。
- 考虑词形信息:能够捕捉词的形态变化,例如词根、前缀、后缀等。
缺点
- 计算复杂度较高:相比 Word2Vec,FastText 需要对每个词生成多个 n-gram,因此计算量更大。
3. 预训练模型:BERT(Bidirectional Encoder Representations from Transformers)
BERT 是一种基于 Transformer 架构的预训练语言模型,由 Google 于 2018 年提出。与传统的词向量方法不同,BERT 通过双向的 Transformer 网络,能够生成上下文相关的动态词向量。
工作原理
- 双向Transformer:BERT 同时从词语的前后上下文学习词的表示,而不像传统的模型只从前向或后向学习。这样,BERT 能够捕捉到更丰富的语义信息。
- 预训练任务:
- 遮蔽语言模型(Masked Language Model, MLM):在训练时,BERT 会随机遮蔽部分词语,并要求模型预测这些词,从而让模型学到上下文的双向依赖关系。
- 下一句预测(Next Sentence Prediction, NSP):训练时,BERT 要预测两句话是否是连续的句子对,这让模型能够学习句子级别的关系。
优点
- 上下文相关词向量:BERT 生成的词向量是上下文相关的。例如,“bank” 在句子 “I went to the bank” 和 “The river bank” 中会有不同的向量表示。
- 强大的语义理解能力:BERT 在问答、阅读理解、文本分类等任务中表现非常好,能够捕捉到复杂的语义关系。
缺点
- 计算资源需求大:BERT 是一个深层的 Transformer 模型,预训练和微调都需要大量的计算资源,训练时间较长。
- 较慢的推理速度:由于模型较大,在实际应用中推理速度较慢,尤其在实时任务中。
BERT详细参考:https://lichuachua.blog.csdn.net/article/details/142980441
总结
| 方法 | 工作原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 词袋模型(BOW) | 将文本表示为词频向量,不考虑词序和上下文。 | 简单直观,易实现,能够有效表示词频信息。 | 忽略词序,生成高维稀疏向量。 | 文本分类、信息检索 |
| TF-IDF | 基于词袋模型,考虑词在文档中的频率以及整个语料库中的普遍性,赋予不同词权重。 | 反映词的重要性,避免常见词主导影响,适用于文本分类。 | 生成稀疏矩阵,无法捕捉词序和上下文关系。 | 文本分类、关键词提取 |
| BM25 | 基于 TF-IDF 的改进,考虑词频、文档长度、词重要性等因素,以计算每个词对文档匹配的相关性得分。 非线性词频缩放、 文档长度归一化、 改进的 IDF 计算 | 更好地反映词在文档中的相关性,更适合信息检索,适用于长文档,计算匹配更准确。 | 对参数敏感,适用性依赖于超参数调优,不能捕捉上下文关系。 | 信息检索、文档排名 |
| N-Gram | 捕捉连续 n 个词作为特征,考虑词序信息。 | 能捕捉词语的顺序和依赖关系,n 越大捕捉的上下文信息越多。 | 维度膨胀,计算资源消耗大。 | 语言模型、短文本分类 |
| Word2Vec | 使用浅层神经网络学习词向量,有 CBOW 和 Skip-gram 两种架构。 | 词向量能捕捉语义相似性,生成低维稠密向量,效率高。 | 无法处理未登录词(OOV),词向量上下文无关。 | 词嵌入、相似度计算、文本分类 |
| FastText | 将词分解为字符 n-gram,生成词向量,捕捉词的形态信息。 | 能处理未登录词,捕捉词形信息,适合拼写错误和变形词。 | 计算复杂度高于 Word2Vec。 | 词嵌入、拼写纠错、文本分类 |
| BERT | 基于双向 Transformer,通过预训练生成上下文相关的词向量,支持 Masked Language Model 和 Next Sentence Prediction。 | 生成上下文相关词向量,语义理解强,适用于复杂 NLP 任务。 | 需要大量计算资源,训练和推理时间长。 | 问答系统、文本分类、阅读理解 |
- 传统方法:如词袋模型、TF-IDF 和 N-Gram 易于实现,但无法捕捉语义和上下文信息。
- 词向量方法:如 Word2Vec 和 FastText 通过词嵌入表示词语的语义关系,适合语义相似度计算、文本分类等任务。FastText 能够处理未登录词。
- 预训练模型:如 BERT,能够生成上下文相关的动态词向量,适用于更复杂的自然语言处理任务,但对计算资源的要求更高。
RNN
循环神经网络(RNN,Recurrent Neural Network)是一种用于处理序列数据等具有顺序关系的数据的神经网络。与传统的前馈神经网络不同,RNN 具有循环连接 ,允许信息通过隐藏状态在序列的不同时间步之间传播。这种结构使得RNN非常适合处理时间序列、文本数据、语音信号等具有顺序关系的数据。
RNN 参数

其他相关参数:
- 时间步(Time Steps):决定模型的循环次数,非可学习参数。
- 损失函数(Loss Function):指导模型参数更新的依据,非可学习参数。
- 学习率(Learning Rate):控制优化过程的步幅大小,超参数。
RNN 的特点
- 顺序处理:RNN 可以处理不同长度的输入序列,这是由于其内部结构允许将前一步的信息作为当前步的输入之一。
- 隐藏状态:RNN 具有隐藏状态,隐藏状态是前一个时间步的信息的压缩,并与当前输入一起决定下一时间步的输出。
- 权重共享:RNN 中每个时间步之间共享相同的网络权重( W h h W_{hh} Whh, W x h W_{xh} Wxh, W h y W_{hy} Why),减少了模型参数的数量,适合处理序列长度不同的问题。
RNN 的局限性
- 梯度消失与爆炸问题:在长序列处理中,由于反向传播算法在计算梯度时,RNN 容易出现梯度消失(gradient vanishing)或梯度爆炸(gradient exploding)的现象,导致模型难以学习长期依赖关系。
- 长时间依赖问题:RNN 处理长序列时,无法有效捕捉到前后相距较远的依赖关系,导致模型的性能下降。
- 并行化困难:由于 RNN 是逐时间步处理序列的,因此不容易并行化处理,这使得其训练时间较长。
前向传播的核心计算
在 RNN 中,当前时间步的输出不仅依赖于当前输入,还依赖于之前时间步的隐状态(hidden state)。隐状态是 RNN 中的一个内部存储器,它能够保存之前的时间步的信息,使得网络具备记忆能力。RNN 的计算公式如下:
隐状态更新

输出更新

RNN 的训练流程
RNN 的训练主要包括以下步骤:
1. 输入准备

2. 前向传播(Forward Pass)
逐个时间步执行前向传播,将输入数据逐步传递到隐藏层,计算每个时间步的隐藏状态和输出(上面的核心计算)。
- 初始化隐藏状态:在时间步 t = 0 时,隐藏状态 h 0 h_0 h0通常初始化为 0 或随机值。
- 逐时间步的状态更新:对于每一个时间步 t ,计算当前时间步的隐藏状态和输出:

3. 计算损失(Loss Calculation)
- 损失函数:RNN 根据每个时间步的预测输出 y t y_t yt 和真实标签 y ^ t \hat{y}_t y^t计算损失。常见的损失函数包括:
- 分类任务使用 交叉熵损失。
- 回归任务使用 均方误差(MSE)。

4. 反向传播(Backward Pass)
RNN 的反向传播主要通过**反向传播通过时间(Backpropagation Through Time, BPTT)**来更新权重。BPTT 是对标准反向传播算法的扩展,沿着时间轴进行梯度传递。
- 反向传播的核心步骤:

- 梯度消失问题:BPTT 在长时间序列上可能出现梯度消失或爆炸问题,尤其是当梯度逐步传递时,这限制了 RNN 捕捉长时依赖的能力。
5. 参数更新
- 根据反向传播得到的梯度更新网络中的权重参数,如 W x h W_{xh} Wxh, W h h W_{hh} Whh, W h y W_{hy} Why,完成当前批次的训练。
- 继续执行下一个批次的训练,直至完成所有训练数据的迭代。
RNN 的推理流程
RNN 的推理(inference)过程与训练过程中的前向传播类似,但没有反向传播和参数更新,主要是用于生成输出或进行预测。
1. 输入准备
- 输入序列数据 X = [ x 1 , x 2 , . . . , x T ] X = [x_1, x_2, ..., x_T] X=[x1,x2,...,xT]。
- 不需要提供标签数据,因为推理阶段是无监督的,RNN 根据输入数据生成输出。
2. 前向传播
推理阶段执行与训练相同的前向传播过程:
-
初始化隐藏状态:
- 与训练时一样,隐藏状态 h 0 h_0 h0初始化为 0 或随机值。
-
逐时间步的状态更新:

3. 生成输出
- 推理过程中,RNN 根据输入数据在每个时间步生成相应的输出 y t y_t yt。
- 在序列生成任务(如文本生成)中,RNN 的输出 y t y_t yt 可以作为下一个时间步的输入 x t + 1 x_{t+1} xt+1,从而生成一个完整的输出序列。
4. 推理结束
- 推理结束时,RNN 已经生成了完整的输出序列或预测结果。
RNN参数初始化
RNN 的参数初始化策略会影响训练过程的稳定性和收敛速度,以下是不同参数的初始化方法概述:
| 参数 | 初始化方法 | 适用场景 |
|---|---|---|
| 输入权重 ( W x h W_{xh} Wxh ) | Xavier 初始化、He 初始化、标准正态分布 | 用于将输入映射到隐藏状态,适合不同激活函数场景 |
| 隐藏状态权重 ( W h h W_{hh} Whh ) | 正交初始化、Xavier 初始化、He 初始化 | 隐藏状态循环权重,正交初始化适合处理梯度问题 |
| 输出权重 ( W h y W_{hy} Why ) | Xavier 初始化、He 初始化 | 用于将隐藏状态映射到输出层,取决于任务类型 |
| 偏置项 ( b h , b y b_h, b_y bh,by ) | 零初始化、小随机数、遗忘门的偏置可初始化为较大正值(LSTM/GRU) | 偏置项通常为零初始化,特殊情况下设定固定值 |
通过使用合适的初始化方法,可以显著提高 RNN 的收敛性和模型的训练效果,尤其在处理长序列时,正交初始化和 Xavier 初始化能帮助缓解梯度消失和梯度爆炸问题。
LSTM(Long Short-Term Memory)
LSTM 是 RNN 的一种改进版本,旨在解决 RNN 的长时间依赖问题。LSTM 通过引入记忆单元(cell state) 和门控机制(gates) 来有效地控制信息流动,使得它在长序列建模中表现优异。
LSTM 的核心部件

LSTM 的核心结构由以下几部分组成:
- 记忆单元(Cell State):贯穿整个序列的数据流【图中的C】,能够存储序列中的重要信息,允许网络长时间保留重要的信息。
- 隐藏状态(Hidden State):每个时间步的输出,LSTM 通过它来决定当前的输出和对下一时间步的传递信息。【RNN中就有】
- 三个门控机制(Forget Gate、Input Gate、Output Gate):通过这些门控机制,LSTM 可以选择性地遗忘、存储、或者输出信息(具体在图中的结构参考下面具体介绍)。
LSTM 中最重要的概念是记忆单元状态和门控机制,它们帮助网络在长时间序列中保留重要的历史信息。
在 LSTM 中,隐藏状态是对当前时间步的即时记忆(短期记忆),而记忆单元是对整个序列中长期信息的存储(长期记忆)。
- 遗忘门(Forget Gate):根据当前输入和前一个时间步的隐藏状态,决定记忆单元哪些信息需要被遗忘;
- 输入门(Input Gate):根据当前输入和前一时间步的隐藏状态,决定当前时间步输入对记忆单元的影响;
- 输出门(Output Gate):根据当前的输入和前一时间步的隐藏状态以及记忆单元状态,决定当前时间步隐藏状态的输出/影响;(输出内容是从记忆单元中提取的信息);
LSTM 的公式和工作原理
在 LSTM 中,每个时间步 ( t ) 的计算分为以下几步:
图像参考:LSTM(长短期记忆网络)
(1) 遗忘门(Forget Gate)


遗忘门的作用:它根据当前输入和前一个时间步的隐藏状态,选择哪些来自过去的记忆单元信息需要被遗忘。
(2) 输入门(Input Gate)


输入门的作用:输入门通过 sigmoid 激活函数决定当前输入 ( x t x_t xt ) 和前一时间步的隐藏状态 ( h t − 1 h_{t-1} ht−1 ) 对记忆单元的影响。结合候选记忆 ( C ~ t \tilde{C}_t C~t),输入门决定是否将当前输入的信息入到记忆单元中。
(3) 更新记忆单元状态


记忆单元的作用:记忆单元 ( C t C_t Ct ) 根据遗忘门和输入门的输出,保留了来自过去的长期信息,使得重要的历史信息能够长时间存储。
(4) 输出门(Output Gate)

输出门控制从记忆单元中提取多少信息作为当前时间步的隐藏状态 ( h_t ) 并输出。

输出门的作用:输出门根据当前的输入和前一时间步的隐藏状态以及记忆单元状态,决定当前的隐藏状态 ( h t h_t ht ) 的值,它不仅作为当前时间步的输出,还会传递到下一时间步。
LSTM 的流程总结
在每个时间步 ( t t t ),LSTM 会执行以下步骤:
- 遗忘门:根据当前输入和前一个时间步的隐藏状态,控制哪些来自上一个时间步的记忆单元信息需要被保留或遗忘。
- 输入门:根据当前输入和前一时间步的隐藏状态,决定当前输入信息是否更新到记忆单元中,通过候选记忆生成新的信息。
- 记忆单元状态更新:根据遗忘门和输入门的输出,更新当前时间步的记忆单元状态 ( C t C_t Ct )。
- 输出门:根据当前的输入和记忆单元状态,控制当前时间步的隐藏状态 ( h t h_t ht ) 的输出,隐藏状态会传递到下一时间步,作为当前的输出结果。
LSTM 的优点
LSTM 通过引入门控机制,可以选择性地控制信息的流动;记忆单元可以有效地保留长期信息,避免了传统 RNN 中的梯度消失问题。因此,LSTM 能够同时处理短期和长期的依赖关系,尤其在需要保留较长时间跨度信息的任务中表现优异。
LSTM 的局限性
LSTM 的门控机制使得它的结构复杂,训练时间较长,需要更多的计算资源,尤其是在处理大规模数据时。依赖于序列数据的时间步信息,必须按顺序处理每个时间步,难以并行化处理序列数据。
GRU(Gated Recurrent Unit)

GRU 的基本结构
相比于 LSTM,GRU 的结构更为简洁:
- 少了一个门控:GRU 合并 LSTM 中的遗忘门和输入门,变为一个更新门来实现。
- 没有单独的记忆单元状态:GRU 将 LSTM 中的记忆单元状态(Cell State)合并到隐藏状态(Hidden State) 中,隐藏状态既用于存储当前时间步的信息,也用于在时间步之间传递长期信息。
这种简化使得 GRU 具有更少的参数,训练速度更快,并且在某些任务上,GRU 的性能和 LSTM 相当甚至更优。
GRU 主要由两个门组成:
更新门:
- 输入:前一时间步的隐藏状态 ( h t − 1 h_{t-1} ht−1 ) 和当前时间步的输入 ( x t x_t xt )。
- 作用:决定当前时间步的隐藏状态 多少旧的信息需要保留 ( h t − 1 h_{t-1} ht−1 ) ,以及多少新的信息需要加入 ( x t x_t xt )
重置门:
- 输入:前一时间步的隐藏状态 ( h t − 1 h_{t-1} ht−1 ) 和当前时间步的输入 ( x t x_t xt )。
- 作用:控制生成新的候选隐藏状态时,前一时间步的隐藏状态 ( h t − 1 h_{t-1} ht−1 ) 被遗忘或保留的程度。
这两个门决定了每个时间步的信息如何被保留、更新或丢弃。通过这两个门,GRU 能够高效地捕捉短期和长期的依赖关系。
GRU 的工作原理与公式
在 GRU 中,给定一个输入序列 ( x 1 , x 2 , . . . . . . , x T x_1, x_2, ......, x_T x1,x2,......,xT),每个时间步 ( t t t ) 的计算过程分为以下几个步骤:
(1) 更新门(Update Gate)
更新门 Z t Z_t Zt 控制着当前时间步的隐藏状态与前一时间步的隐藏状态之间的融合。它决定了多少旧的信息 h t − 1 h_{t-1} ht−1需要保留,以及多少新的信息 x t x_t xt需要加入,从而控制隐藏状态的更新。

(2) 重置门(Reset Gate)
重置门 r t r_t rt决定如何将前一时间步的隐藏状态( h t − 1 h_{t-1} ht−1 ) 和当前输入 ( x t x_t xt ) 结合,生成新的候选隐藏状态。它控制前一时间步的隐藏状态 ( h t − 1 h_{t-1} ht−1 ) 在多大程度上被遗忘。

(3) 生成候选隐藏状态(Candidate Hidden State)
结合当前输入 ( x t x_t xt ) 和部分前一时刻隐藏状态信息和重置门的输出 ( r t ∗ h t − 1 r_t * h_{t-1} rt∗ht−1 ) 生成的候选隐藏状态 ( h ~ t \tilde{h}_t h~t )

(4) 隐藏状态更新
最终的隐藏状态 ( h t h_t ht ) 是根据更新门 ( z t z_t zt ) 的输出来决定的。更新门 ( z t z_t zt ) 控制了当前隐藏状态 ( h t h_t ht ) 是更依赖于上一时刻的隐藏状态 ( h t − 1 h_{t-1} ht−1 ) 还是新计算的候选隐藏状态 ( h ~ t \tilde{h}_t h~t )。

GRU 的优点
- GRU 和 LSTM 一样,通过门控机制可以有效地缓解梯度消失问题。
- 由于 GRU 的结构比 LSTM 简单,没有记忆单元状态,门的数量也较少,因此 GRU 的训练速度更快,计算效率高。
- 在许多任务中,GRU 的表现与 LSTM 相当,尤其在较短的序列数据上,GRU 甚至表现得更好。
GRU 的局限性
- 灵活性稍低:由于缺少独立的记忆单元状态,GRU 对非常长的依赖关系和复杂序列的处理能力可能不如 LSTM 强大。
- 统一的隐藏状态:在 GRU 中,隐藏状态既负责短期信息的存储,也负责长期信息的传递。无法更好地分离短期和长期信息。
GRU 与 LSTM 的对比
| 特性 | GRU | LSTM |
|---|---|---|
| 门控机制 | 2 个门:更新门、重置门 | 3 个门:输入门、遗忘门、输出门 |
| 记忆状态 | 没有单独的记忆单元状态,只有隐藏状态 | 有记忆单元状态和隐藏状态 |
| 结构复杂性 | 结构较简单,参数较少 | 结构复杂,参数较多 |
| 处理长依赖 | 表现较好,能捕捉长期依赖 | 更适合处理复杂的长时间依赖 |
| 计算效率 | 相对较高,训练时间更快 | 计算开销较大,训练时间较长 |
- 序列较短时:在处理较短的序列时,GRU 的表现通常与 LSTM 相当甚至更好,由于 GRU 的结构更简单、计算效率更高,通常优先选择 GRU。
- 序列较长或依赖关系复杂时:在处理较长序列或有复杂长期依赖关系的任务时,LSTM 的表现通常更优,因为 LSTM 能够更灵活地通过记忆单元状态存储和传递长期信息。
- 计算资源有限时:如果对计算资源或训练时间有较高要求,GRU 是更好的选择,因为它参数更少、计算效率更高。
Bi-RNN
Bi-RNN 通过引入双向信息流,使网络能够同时考虑从左到右(前向)和从右到左(后向)的信息流动。计算每个时间步的输出时,Bi-RNN 不仅考虑当前时间步之前的信息,还考虑之后的信息,从而提升了模型对时间序列依赖的捕捉能力。
Bi-RNN 的结构
Bi-RNN 的结构与传统 RNN 不同的是,它由两个独立的 RNN 层组成:一个是处理输入序列的前向 RNN,另一个是处理输入序列的后向 RNN。这两个 RNN 层分别处理序列的正向和反向信息流,然后将它们的输出进行组合,生成最终的输出。
Bi-RNN 的工作原理
Bi-RNN 的基本工作流程如下:
- 输入序列:网络接收一个输入序列 ( x_1, x_2, …, x_T ),并同时将序列传递给前向 RNN 和后向 RNN。
- 前向 RNN:前向 RNN 从序列的第一个时间步开始,逐步处理输入序列,并生成每个时间步的前向隐藏状态 ( \overrightarrow{h_t} )。
- 后向 RNN:后向 RNN 从序列的最后一个时间步开始,逐步反向处理输入序列,并生成每个时间步的后向隐藏状态 ( \overleftarrow{h_t} )。
- 组合输出:在每个时间步 ( t ),将前向隐藏状态和后向隐藏状态进行组合,生成最终的输出 ( y_t )。
- 输出序列:最终输出的序列 ( y_1, y_2, …, y_T ) 同时考虑了输入序列的前后信息。
Bi-RNN 的特点
- 前后信息的整合:双向 RNN 能够同时利用序列的前后信息,因此在处理像语音、文本等需要上下文信息的任务中表现更好。
- 适合全局依赖任务:Bi-RNN 通过从两个方向处理数据,可以捕捉到更全局的依赖关系。
- 双倍计算量:由于需要处理两个方向的序列,因此计算复杂度比单向 RNN 高。
RNN、LSTM、GRU 和 Bi-RNN 总结
| 特性 | RNN | LSTM | GRU | Bi-RNN |
|---|---|---|---|---|
| 结构 | 单向循环结构,只有隐藏状态 | 有记忆单元状态和隐藏状态,三门控制信息流 | 只有隐藏状态,合并了输入门和遗忘门 | 双向结构,有前向和后向两个独立的 RNN |
| 记忆能力 | 适合处理短期依赖,长序列时有梯度消失问题 | 能有效处理长时依赖,解决梯度消失问题 | 简化的版本,参数更少,能处理长短期依赖 | 能同时捕捉序列的前后信息,适合上下文相关任务 |
| 门机制 | 无门控机制 | 有输入门、遗忘门和输出门 | 有更新门和重置门,控制信息的保留和更新 | 没有门机制,双向结构通过前向和后向的组合增强 |
| 计算复杂度 | 低,参数少,计算速度快 | 复杂度较高,三门结构增加计算量 | 相对简单,参数和计算量比 LSTM 少 | 计算量大,需两次遍历输入序列,较高开销 |
| 优点 | 结构简单,适合短序列建模 | 能捕捉长短期依赖,解决梯度消失问题 | 训练效率高,能捕捉长短期依赖 | 能同时利用历史和未来信息,捕捉前后文依赖 |
| 缺点 | 难以捕捉长时间依赖,容易梯度消失或爆炸 | 训练时间较长,计算资源需求大 | 虽然简化了结构,但对复杂依赖建模较弱 | 需要双向处理,实时性差,计算开销大 |
| 适用场景 | 短期时间序列预测、简单的文本处理任务 | 长时间序列任务,如机器翻译、文本生成 | 适合资源受限、需要较快训练的任务 | 自然语言处理、语音识别、视频分析等上下文任务 |
| 应用示例 | 基本序列预测、时间序列分类 | 机器翻译、语言模型、文本分类、对话系统 | 语音识别、时间序列预测、情感分析 | 命名实体识别、语义角色标注、情感分类、语音识别 |
- RNN:适合处理短期依赖的简单任务,结构较为简单,但在处理长序列时容易出现梯度消失问题。
- LSTM:通过记忆单元和门控机制解决了梯度消失问题,擅长处理长时依赖任务,适合复杂的时间序列建模。
- GRU:LSTM 的简化版本,具有较少的参数和更高的计算效率,适合在需要较快训练的任务中使用,性能上通常与 LSTM 相当。
- Bi-RNN:双向结构能够同时捕捉序列中的前向和后向信息,非常适合自然语言处理和语音处理等需要利用上下文信息的任务。
这些网络结构都是处理序列数据的基础工具,选择哪一种网络通常取决于任务的复杂性和计算资源。
全连接层在各神经网络模型中的作用
全连接层(Fully Connected Layer, FC Layer)广泛应用于分类任务或回归任务的最后阶段。全连接层的主要作用是将上层提取的特征转换为具体的决策结果或输出。它在不同类型的神经网络模型中具有不同的作用。以下是全连接层在各类神经网络模型中的作用详细解释:
- 在MLP中,全连接层是主要计算单元,完成输入到输出的映射。
- 在CNN中,全连接层主要用于整合局部特征并生成分类结果。
- 在RNN和LSTM中,全连接层将时间序列特征映射为输出结果。
- 在Transformer模型中,全连接层参与注意力机制和输出映射。
- 在GAN中,全连接层用于潜在空间和图像特征之间的映射。
- 在自编码器中,全连接层用于特征压缩和重构。
- 在注意力机制中,全连接层用于计算注意力得分并变换上下文向量。
无论在哪种神经网络中,全连接层的核心作用都是将前一层的特征进一步映射到目标空间,形成最后的输出或决策。
相关文章:
万字长文解读深度学习——循环神经网络RNN、LSTM、GRU、Bi-RNN
🌺历史文章列表🌺 深度学习——优化算法、激活函数、归一化、正则化深度学习——权重初始化、评估指标、梯度消失和梯度爆炸深度学习——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总万字长文解读…...
HDR视频技术之二:光电转换与 HDR 图像显示
将自然界中的真实场景转换为屏幕上显示出来的图像,往往需要经过两个主要的步骤:第一个是通过摄影设备,将外界的光信息转换为图像信息存储起来,本质上是存储为数字信号;第二个是通过显示设备,将图像信息转换…...
【Linux】Linux入门实操——vim、目录结构、远程登录、重启注销
一、Linux 概述 1. 应用领域 服务器领域 linux在服务器领域是最强的,因为它免费、开源、稳定。 嵌入式领域 它的内核最小可以达到几百KB, 可根据需求对软件剪裁,近些年在嵌入式领域得到了很大的应用。 主要应用:机顶盒、数字电视、网络…...
Redis的缓存问题与应对策略
Redis 作为一种高效的缓存系统,在高并发环境下应用广泛,但也面临一些缓存问题,以下是常见问题及其应对策略。 1. 缓存穿透 问题描述 缓存穿透是指请求的数据在缓存和数据库中都不存在,但大量请求直接到达数据库,从而给…...
Java项目实战II基于Spring Boot的智慧生活商城系统的设计与实现(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着科技的飞速发展,人们的…...
每日一题之成绩排序
在N(N<30)名运动员参加的体操比赛中,有K(K<10)名裁判给每位运动员分别打分, 按规则每名运动员最后得分需去掉一个最高分和一个最低分, 然后把其他裁判的打分相加,计算得出该运…...
QT Widget:使用技巧
1、Qt中的QString和const char *之间转换,最好用toStdString().c_str()而不是toLocal8Bit().constData(),比如在setProperty中如果用后者,字符串中文就会不正确,英文正常。 2、数据库处理一般建议在主线程,如果非要在…...
深入Zookeeper节点操作:高级功能与最佳实践
Zookeeper之节点基本操作(二) 在《Zookeeper之节点基本操作(一)》中,我们介绍了如何创建、读取、更新、删除节点的基本操作。接下来将进一步探讨Zookeeper中节点的进阶操作和更多细节,包括节点的监视&…...
【C++】map和set的介绍及使用
前言: map和 set 是 C STL(标准模板库)中的两种非常重要的容器,它们基于一种叫做平衡二叉搜索树(通常是红黑树)的数据结构来实现。在 C 中,map 是一个键值对容器,set 只存储唯一的键…...
从0开始搭建一个生产级SpringBoot2.0.X项目(十)SpringBoot 集成RabbitMQ
前言 最近有个想法想整理一个内容比较完整springboot项目初始化Demo。 SpringBoot集成RabbitMQ RabbitMQ中的一些角色: publisher:生产者 consumer:消费者 exchange个:交换机,负责消息路由 queue:队列…...
GNU/Linux - /proc/sys/vm/drop_caches
/proc/sys/vm/drop_caches 是 Linux 中的一个特殊文件,允许用户释放系统内存中的各种缓存。让我们深入了解一下这项功能的细节: The /proc/sys/vm/drop_caches is a special file in Linux that allows users to free up various caches in the systems …...
ubuntu 22.04 如何调整进程启动后能打开的文件数限制
在 Ubuntu 22.04 中,可以通过修改系统配置来调整进程启动后能够打开的文件数软限制。软限制是指操作系统允许单个进程打开的文件描述符的最大数量。以下是调整该限制的方法: 1. 查看当前限制 首先,你可以通过 ulimit 命令查看当前的软限制和…...
linux基础-完结(详讲补充)
linux基础-完结 一、Linux目录介绍 二、基础命令详细讲解 1. ls(列出目录内容) 2. cd(更改目录) 3. clear(清除终端屏幕) 4. pwd(显示你当前所在的目录) 5. vim(文本编辑器) 6. touch(创…...
LoRA:大型语言模型(LLMs)的低秩适应;低秩调整、矩阵的低秩与高秩
目录 LoRA:大型语言模型(LLMs)的低秩适应 一、LoRA的基本原理 二、LoRA的举例说明 三、LoRA的优势 低秩调整、矩阵的低秩与高秩 一、低秩调整(LoRA) 二、矩阵的低秩 三、矩阵的高秩 LoRA:大型语言模型(LLMs)的低秩适应 LoRA(Low-Rank Adaptation of LLMs),…...
游戏引擎学习第四天
视频参考:https://www.bilibili.com/video/BV1aDmqYnEnc/ BitBlt 是 Windows GDI(图形设备接口)中的一个函数,用于在设备上下文(device context, DC)之间复制位图数据。BitBlt 的主要用途是将一个图像区域从一个地方复…...
GIT GUI和 GIT bash区别
Git GUI 和 Git Bash 都是与 Git 版本控制工具相关的用户界面,但它们有不同的功能和用途。下面详细说明它们的区别及各自的作用: Git GUI 作用: Git GUI 是一个图形用户界面(GUI)工具,用于执行 Git 操作。…...
丹摩征文活动|Faster-Rcnn-训练与测试详细教程
本文 丹摩智算平台官方网站的介绍Faster-Rcnn-训练与测试提前准备进行Faster-rcnn 的环境配置数据集的介绍 丹摩智算平台官方网站的介绍 丹摩智算平台(DAMODEL)是专为人工智能(AI)开发者打造的高性能计算服务平台,旨在…...
星期-时间范围选择器 滑动选择时间 最小粒度 vue3
星期-时间范围选择器 功能介绍属性说明事件说明实现代码使用范例 根据业务需要,实现了一个可选择时间范围的周视图。用户可以通过鼠标拖动来选择时间段,并且可以通过快速选择组件来快速选择特定的时间范围。 功能介绍 时间范围选择:用户可以…...
一条SQL查询语句的执行流程(MySQL)
第一步:连接器(负责跟客户端建立连接、获取权限、维持和管理连接) 第二步:查询缓存 之前执行过的查询,MySQL以"Key - Value"的形式存在内存(key为SQL,value为结果集)&…...
linux基础——详细篇
免责声明 学习视频来自B 站up主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 linux 基础命令重现 cd(切…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
