【文本到上下文 #5】:RNN、LSTM 和 GRU

news2024/11/18 23:27:30

一、说明

        欢迎来到“完整的 NLP 指南:文本到上下文 #5”,这是我们对自然语言处理 (NLP) 和深度学习的持续探索。从NLP的基础知识到机器学习应用程序,我们现在深入研究了神经网络的复杂世界及其处理语言的深刻能力。

        在本期中,我们将重点介绍顺序数据在 NLP 中的重要性,介绍递归神经网络 (RNN) 及其在处理此类数据方面的独特能力。我们将解决 RNN 面临的挑战,例如梯度消失问题,并探索长短期记忆 (LSTM) 和门控循环单元 (GRU) 等高级解决方案。

        以下是本章中您可以期待的内容:

  1. 神经网络概述:深入研究神经网络的基本原理,包括它们的架构、功能和在现代技术中的重要性。
  2. 循环神经网络 (RNN):了解专为处理顺序数据而设计的 RNN 的独特架构,探索它们的功能及其在 NLP 中的应用。
  3. 长短期记忆 (LSTM): 了解 LSTM 网络的复杂性,LSTM 网络是一种能够学习长期依赖关系的特殊形式的 RNN,以及它们在解决标准 RNN 中常见的梯度消失问题中的关键作用。
  4. 门控循环单元 (GRU):了解 GRU,它是 LSTM 的简化变体,它以更简单的架构设计提供可比的性能,使其成为某些类型的顺序数据处理的有效工具。
  5. RNN、LSTM 和 GRU 的比较:研究 RNN、LSTM 和 GRU 的优势和劣势,深入了解它们的比较性能、对不同任务的适用性以及处理顺序数据挑战的整体效率。
  6. 使用玩具文本数据实现 RNN、LSTM 和 GRU:深入了解实际演示,了解如何使用简单的文本数据集实现 RNN、GRU 和 LSTM 模型。本部分介绍从预处理文本数据到动手训练和比较不同模型的步骤。

        加入我们的全面探索,我们将揭示神经网络在 NLP 领域的复杂性和功能,弥合理论概念和实际应用之间的差距。

二、神经网络概述

        神经网络 (NN) 是机器学习的一个基本概念,其灵感来自人脑的结构和功能。神经网络的核心由组织成层的互连节点组成。输入层接收数据,隐藏层处理信息,输出层生成结果。神经网络的优势在于它们能够从数据中学习,在训练过程中调整内部参数(权重)以优化性能。

三、解开前向和后向传播

        在前向传播阶段,数据通过网络传输,并在每一层进行计算,从而生成预测。它类似于从输入流向输出的信息。

        向后传播阶段涉及学习的关键方面。通过梯度下降等技术,该网络通过计算损失函数相对于权重的梯度来细化其内部参数。链式规则在这里起着举足轻重的作用,它允许网络将损失归因于特定的权重,从而实现微调以提高准确性。

四、Gradient Descent

        梯度下降是神经网络重量调整背后的驱动力。它是一种优化算法,通过在多维权重空间中迭代地向最陡峭的下坡方向移动来最小化损失函数。这种权重的迭代调整增强了网络的预测准确性。

4.1 链式法则

        微积分中的链式法则是反向传播的关键。它能够计算偏导数,将网络的整体误差归因于单个权重。这种分解对于在训练过程中进行细微的调整至关重要。

4.2 序列在 NLP 任务中的重要性

        在自然语言处理 (NLP) 中,理解和处理序列至关重要。与数据点独立的传统机器学习任务不同,语言本质上涉及顺序信息。在NLP中,句子中单词的顺序具有意义,前一个单词的上下文会影响后续单词的解释。

五、递归神经网络 (RNN)

        RNN 是 NN 的一种特殊形式,旨在处理顺序数据。它们引入了内存的概念,使网络能够保留有关先前输入的信息。这种记忆对于上下文很重要的任务至关重要,例如语言理解和生成。

5.1 RNN 的工作原理

  • 顺序处理:与传统的神经网络不同,RNN 旨在处理数据序列。他们通过按顺序一次获取一个输入来做到这一点。
  • 经常连接:RNN 的主要特征是其循环连接。这些连接允许网络保留某种形式的“内存”。在序列中的每一步,RNN 都会处理当前输入以及上一步的“隐藏状态”。此隐藏状态包含从先前输入中学习的信息。
  • 隐藏状态:隐藏状态在每个时间步长都会根据新输入和以前的隐藏状态进行更新。这种机制允许 RNN 在序列中的不同步骤中携带信息。
  • 共享权重:在 RNN 中,权重(参数)在所有时间步长之间共享。这意味着使用相同的权重来处理序列中的每个输入,从而使模型更加高效并减少参数数量。

5.2 挑战与优势:

  • 递归神经网络 (RNN) 在处理顺序数据方面表现出色,使其适用于语言处理和时间序列分析中的任务。它们记住先前输入的能力对于中短序列来说是一个明显的优势。
  • 然而,RNN 在梯度消失问题上苦苦挣扎,阻碍了它们处理长期依赖关系的能力。对于需要广泛历史背景的任务来说,此限制非常重要。此外,它们的顺序性限制了现代并行处理技术的利用,导致训练时间更长。尽管存在这些挑战,RNN仍然是序列数据分析的基础架构。

5.3 使用案例

  • RNN 在自然语言处理(语言建模、机器翻译)、语音识别(音素识别、语音合成)和时间序列预测(股价预测、天气预报)中都有应用。

六、长短期记忆 (LSTM)

        LSTM 代表了递归神经网络领域的高级发展,专门用于解决和克服传统 RNN 固有的局限性,尤其是在处理长期依赖关系时。

6.1 LSTM 的工作原理:

  • 高级内存处理:LSTM 的定义特征是其复杂的存储单元,称为 LSTM 单元。该装置可以长时间保持信息,这要归功于其由不同门组成的独特结构。
  • 浇注机构:LSTM 包含三种类型的门,每种门在网络的内存管理中都起着至关重要的作用。

输入门:确定应使用输入中的哪些值来修改内存。

忘记门:决定应丢弃现有内存的哪些部分。

输出栅极:控制内存内容到网络中下一层的输出流。

  • 细胞状态:LSTM的核心是单元状态,这是一种直接沿着网络的整个链向下延伸的传送带。它允许信息相对不变地流动,并确保网络有效地保留和访问重要的长期信息。

6.2 挑战与优势:

  • LSTM 专门设计用于避免长期依赖性问题,使其对于需要长时间理解信息的任务更有效。
  • 然而,与基本的 RNN 和 GRU 相比,它们更加复杂和计算密集,这在训练时间和资源分配方面可能是一个挑战。

6.3 使用案例:

  • LSTM 已被证明在需要处理具有长期依赖关系的序列的各种领域中有效,例如文本、语音识别和时间序列分析中的复杂句子结构。

        总之,LSTM 网络提供了一种处理顺序数据的复杂方法,尤其擅长于理解长期依赖关系至关重要的任务。尽管它们很复杂,但它们是神经网络架构库中的强大工具,特别适合 NLP 及其他领域的深度学习任务。

七、门控循环单元 (GRU)

        GRU 是递归神经网络的创新变体,旨在改进和简化 LSTM 的架构。它们提供了一种更简化的方法来处理顺序数据,在长期依赖关系至关重要的情况下特别有效。

7.1 GRU的工作原理:

  • 简化架构:与 LSTM 相比,GRU 以其简化的结构而闻名,使其在计算资源方面更加高效。这种效率源于其门数量的减少。
  • 浇注机构:GRU 使用两个门:

更新门:此门决定将来自先前状态的信息传递到当前状态的程度。它是 LSTM 中遗忘门和输入门的混合体。

重置门:它决定了要忘记多少过去的信息,有效地允许模型决定有多少过去信息与当前预测相关。

  • 没有单独的单元状态:与 LSTM 不同,GRU 没有单独的单元状态。它们将单元状态和隐藏状态组合到一个结构中,简化了信息流,使它们更易于建模和训练。

7.2 挑战与优势:

  • GRU 以其训练效率和速度而闻名,使其成为关注计算资源的模型的合适选择。
  • 虽然它们通常比 LSTM 更快、更简单,但由于其简化的结构,它们在捕获非常长期的依赖关系方面可能不那么有效。

7.3 使用案例:

  • GRU 已成功应用于各种领域,例如语言建模、机器翻译和语音转文本应用程序,在这些领域中,复杂性和性能之间的平衡至关重要。

        总之,GRU 提供了一种更简化的 LSTM 替代方案,在处理具有长期依赖关系的顺序数据方面提供类似的功能,但计算复杂性较低。这使得它们成为 NLP 和其他需要处理顺序数据的领域的许多实际应用的有吸引力的选择。它们能够平衡性能和计算效率,这使它们成为深度学习领域的宝贵工具,尤其是在资源有限或需要更快训练时间的情况下。

八、RNN、LSTM 和 GRU 的比较

        循环神经网络 (RNN):

  • 优点:非常适合在短时间内处理序列和维护信息。简单的架构使它们具有计算效率。
  • 局限性:由于梯度消失问题,难以与长期依赖关系作斗争。

        长短期记忆 (LSTM) 网络:

  • 优势:在学习长期依赖性方面非常有效。输入门、遗忘门和输出门的增加可以更好地控制存储单元,使其能够熟练地处理梯度消失问题等问题。
  • 复杂度:比具有附加参数的 RNN 更复杂,导致更高的计算成本。

        门控循环单元 (GRU):

  • 优势:在管理长期依赖关系方面与 LSTM 类似,但结构更简单。GRU 将输入门和忘记门合并到单个更新门中,从而降低了复杂性。
  • 效率:由于参数较少,训练速度通常比 LSTM 快,同时通常实现相似的性能。

        关键要点:

  • 选择 RNN 是为了简单起见,并且在处理长期依赖关系不重要的较短序列时。
  • 当任务在较长时间内涉及复杂的依赖关系时,请选择 LSTM,并且模型精度至关重要。
  • 选择 GRU 以获得更平衡的方法,特别是当计算效率与模型准确性同样重要时,或者在处理有限的数据时。

总之,RNN、LSTM 和 GRU 之间的选择取决于任务的具体要求,包括输入序列的性质、计算资源以及捕获长期依赖关系的重要性。

九、使用玩具文本数据实现 RNN、LSTM 和 GRU

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import SimpleRNN, GRU, LSTM, Dense, Embedding
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences

# Toy text data
text_data = [
    "This is the first document.",
    "This document is the second document.",
    "And this is the third one.",
    "Is this the first document?"
]

# Tokenize the text data
tokenizer = Tokenizer()
tokenizer.fit_on_texts(text_data)
total_words = len(tokenizer.word_index) + 1

# Create input sequences and labels for training
input_sequences = []
for line in text_data:
    token_list = tokenizer.texts_to_sequences([line])[0]
    for i in range(1, len(token_list)):
        n_gram_sequence = token_list[:i+1]
        input_sequences.append(n_gram_sequence)

max_sequence_length = max(len(seq) for seq in input_sequences)
input_sequences = pad_sequences(input_sequences, maxlen=max_sequence_length, padding='pre')

X, y = input_sequences[:, :-1], input_sequences[:, -1]
y = tf.keras.utils.to_categorical(y, num_classes=total_words)

# Build and train the SimpleRNN model
model_rnn = Sequential()
model_rnn.add(Embedding(total_words, 50, input_length=max_sequence_length-1))
model_rnn.add(SimpleRNN(100))
model_rnn.add(Dense(total_words, activation='softmax'))
model_rnn.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model_rnn.fit(X, y, epochs=100, verbose=0)

# Build and train the GRU model
model_gru = Sequential()
model_gru.add(Embedding(total_words, 50, input_length=max_sequence_length-1))
model_gru.add(GRU(100))
model_gru.add(Dense(total_words, activation='softmax'))
model_gru.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model_gru.fit(X, y, epochs=100, verbose=0)

# Build and train the LSTM model
model_lstm = Sequential()
model_lstm.add(Embedding(total_words, 50, input_length=max_sequence_length-1))
model_lstm.add(LSTM(100))
model_lstm.add(Dense(total_words, activation='softmax'))
model_lstm.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model_lstm.fit(X, y, epochs=100, verbose=0)

# Generate text using the trained models
def generate_text(seed_text, model, max_sequence_len, num_words):
    for _ in range(num_words):
        token_list = tokenizer.texts_to_sequences([seed_text])[0]
        token_list = pad_sequences([token_list], maxlen=max_sequence_len-1, padding='pre')
        predicted = np.argmax(model.predict(token_list), axis=-1)
        output_word = ""
        for word, index in tokenizer.word_index.items():
            if index == predicted:
                output_word = word
                break
        seed_text += " " + output_word
    return seed_text

# Example of generating text with each model
generated_text_rnn = generate_text("This is", model_rnn, max_sequence_length, num_words=5)
generated_text_gru = generate_text("This is", model_gru, max_sequence_length, num_words=5)
generated_text_lstm = generate_text("This is", model_lstm, max_sequence_length, num_words=5)

print("Generated Text (SimpleRNN):", generated_text_rnn)
print("Generated Text (GRU):", generated_text_gru)
print("Generated Text (LSTM):", generated_text_lstm)

十、结论

        在 NLP 之旅的这一阶段,我们深入研究了深度学习,探索了神经网络 (NN) 的复杂性及其在处理 NLP 任务中顺序数据中的关键作用。我们的冒险带领我们穿越了循环神经网络 (RNN) 的迷人领域,在那里我们面对并克服了梯度消失问题等挑战。这一探索为揭示更先进的神经架构奠定了基础,如长短期记忆网络 (LSTM) 和门控循环单元 (GRU)。我们的旅程是对这些神经结构如何熟练地管理顺序数据的丰富探索,这是取决于上下文的任务的一个关键方面,例如语言理解和生成。

        当我们结束这个丰富的探索时,我们准备深入研究下一个激动人心的章节:高级单词嵌入技术。即将到来的这个部分有望进一步增强我们对 NLP 的理解,重点关注表示单词和短语的复杂方法,这对于处理更复杂的语言任务至关重要。请继续关注我们,我们将继续揭开自然语言处理的迷人复杂性!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1395560.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java springcloud中发布webservice 接口

java springcloud中发布webservice 接口 一、在pom文件中添加依赖&#xff1a; <!--webservice--><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.0</version></dependen…

Hardware-Aware-Transformers开源项目笔记

文章目录 Hardware-Aware-Transformers开源项目笔记开源项目背景知识nas进化算法进化算法代码示例 开源项目Evolutionary Search1 生成延迟的数据集2 训练延迟预测器3 使延时约束运行搜索算法4. 训练搜索得到的subTransformer5. 根据重训练后的submodel 得到BLEU精度值 代码结构…

干货满满!MES系统的功能及实施

万界星空科技MES系统的主要功能&#xff1a; &#xff08;1&#xff09;生产资源分配与监控&#xff1b; &#xff08;2&#xff09;作业计划和排产&#xff1b; &#xff08;3&#xff09;工艺规格标准管理&#xff1b; &#xff08;4&#xff09;数据采集&#xff1b; &…

蓝凌EIS智慧协同平台frm_form_upload.aspx接口存在任意文件上传漏洞

@[toc] 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. 蓝凌EIS智慧协同平台frm_form_upload.aspx接…

建筑能耗管理系统的解决方案研究

为什么要做能耗监测&#xff1f; 节约能源、降低成本 可帮助企业准确掌握能源的使用情况&#xff0c;找出能源浪费的地方&#xff0c;进而采取针对性措施减少能源的消耗。从而企业可降低能源成本&#xff0c;提高盈利能力。 提高能源利用效率 可帮助企业掌握那些设备消耗了…

助力工业园区作业违规行为检测预警,基于YOLOv5【n/s/m/l/x】全系列参数模型开发构建工业园区场景下作业人员违规行为检测识别系统

在很多工业园区生产作业场景下保障合规合法进行作业生产操作&#xff0c;对于保护工人生命安全降低安全隐患有着非常重要的作用&#xff0c;但是往往在实际的作业生产中&#xff0c;因为一个安全观念的淡薄或者是粗心大意&#xff0c;对于纪律约束等意思薄弱&#xff0c;导致在…

Python编辑开发---pycharm pro 2023 中文

PyCharm Pro 2023是一款功能强大的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;旨在提高Python开发人员的生产力。它提供了智能代码编辑、实时代码分析和调试工具&#xff0c;支持版本控制和数据库工具&#xff0c;以及可扩展的插件系统。PyCharm Pro 2023可在多…

vue2嵌入高德地图选择地址后显示地址和经纬度

以高德地图为里&#xff0c;申请key&#xff0c;选择js api服务&#xff0c;获取key和密钥. vue2项目代码引入相关依赖&#xff1a; npm i amap/amap-jsapi-loader -S 封装成组件: <template><div><el-row :gutter"15" class""><…

Python项目——久坐提醒定时器(PySide6)编写

1、介绍 使用Python编写一个久坐提醒软件。功能&#xff1a; 设置工作时间。设置休息时间。选择休息时是否播放音乐。休息时&#xff0c;软件置顶&#xff0c;且不能关闭。 2、工具 语言&#xff1a;python3.11UI设计工具&#xff1a;Qt designer编译器&#xff1a;PyCharm包…

C#使用DateTime的Now静态属性动态获得系统当前日期和时间

目录 一实例 1.源码 2.生成效果 ​编辑 二、相关知识点 1. Thread类 &#xff08;1&#xff09;Thread.Sleep() &#xff08;2&#xff09;Thread(ThreadStart) &#xff08;3&#xff09;IsBackground &#xff08;4&#xff09;Invoke( &#xff09; 2. Create…

Elastic Stack 8.12:通过对 ES|QL 等的改进增强了向量搜索

作者&#xff1a;来自 Elastic Tyler Perkins, Shani Sagiv, Gilad Gal, Ninoslav Miskovic Elastic Stack 8.12 构建于 Apache Lucene 9.9&#xff08;有史以来最快的 Lucene 版本&#xff09;之上&#xff0c;基于我们对标量量化和搜索并发性的贡献&#xff0c;为文本、向量和…

【Java 设计模式】结构型之桥接模式

文章目录 1. 定义2. 应用场景3. 代码实现结语 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它将抽象部分与实现部分分离&#xff0c;使它们可以独立变化&#xff0c;从而降低它们之间的耦合。桥接模式通过将抽象部分和实现部分分离&#x…

基于arcgis js api 4.x开发点聚合效果

一、代码 <html> <head><meta charset"utf-8" /><meta name"viewport"content"initial-scale1,maximum-scale1,user-scalableno" /><title>Build a custom layer view using deck.gl | Sample | ArcGIS API fo…

Spring Boot自动配置原理

1.SpringBootApplication注解 springboot是基于spring的新型的轻量级框架&#xff0c;最厉害的地方当属**自动配置。**那我们就可以根据启动流程和相关原理来看看&#xff0c;如何实现传奇的自动配置 SpringBootApplication//标注在某个类上&#xff0c;表示这个类是SpringBo…

C++ Linux动态库的编译和调用

一、C动态库编译 采用g编译C动态库&#xff0c;命令如下&#xff1a; g -fPIC -shared -o 动态库名 cpp文件名1.1 关于fPIC选项 首先了解动态库的载入时重定位。 一般linux的可执行文件都是elf格式&#xff08;一种二进制文件格式&#xff09;&#xff0c;在可执行文件的头部包…

分享 GitHub 上的敏感词汇工具类:sensitive-word

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

快慢指针-Floyd判圈算法

对于环形链表是否存在环的做法&#xff0c;普通算法可以通过额外Hash数组来存储链表元素&#xff0c;直到Hash数组中出现重复元素。时间复杂度O(n)&#xff0c;空间复杂度O(n) Floyd判圈算法通过利用快慢指针的移动来实现&#xff0c;时间复杂度O&#xff08;n&#xff09;&am…

09 STM32 - PWM

9.1 PWM简介 脉冲宽度调制(Pulse Width Modulation,简称PWM)&#xff0c;是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点&#xff0c;就是对脉冲宽度的控制。 9.2 PWM波原理 如下图所示&#xff0c;使用定时器定时&#xff0c;从0开始&#x…

Linux grep命令(grep指令)grep --help各选项介绍(待更)

文章目录 grep --help英文中文 使用示例-E, --extended-regexp&#xff1a;此选项表示模式为扩展正则表达式。-F, --fixed-strings&#xff1a;此选项表示模式被视为固定字符串而不是正则表达式。-G, --basic-regexp&#xff1a;此选项表示模式为基础正则表达式。这是默认的模式…

HFSS笔记/信号完整性分析(二)——软件仿真设置大全

文章目录 1、多核运算设置1.1 如何设置1.2 如何查看自己电脑的core呢&#xff1f;1.3 查看求解的频点 2、求解模式设置Driven Terminal vs Driven modal 3、Design settings4、自适应网格划分5、更改字体设置 仅做笔记整理与分享。 1、多核运算设置 多核运算只对扫频才有效果&…