当前位置: 首页 > news >正文

【深度学习】零基础介绍循环神经网络(RNN)

RNN介绍

  • 零基础介绍
  • 语言处理技术基本介绍
    • 分词算法
    • 词法分析工具
    • 文本分类与聚类
    • 情感分析
  • 自然语言处理
    • 词向量
    • 词向量学习模型
      • 1. 神经网络语言模型
      • 2. CBOW 和 skip-gram
      • 3. 层次化softmax方法
      • 4. 负采样方法
  • RNN介绍
  • RNN的变种:LSTM
    • 1. Forget Gate
    • 2. Input Gate
    • 3. Update Memory
    • 4. Output Gate
  • RNN的变种:GRU
  • Attention 注意力机制
  • RNN的应用
    • 1. 序列到类别
    • 2. 同步序列到序列
      • (1)中文分词
      • (2)命名实体识别
    • 3. 异步序列到序列
      • (1)机器翻译
      • (2)对话系统
    • 4. 看图说话
    • 5. 自动摘要
    • 6. 自动写诗
    • 7. 自动作曲
  • RNN代码
    • 一个简单的RNN代码
    • 电影评论情感分析

零基础介绍

循环神经网络(RNN, Recurrent Neural Network)是一种特殊的神经网络,用于处理和分析序列数据(比如时间序列、文本、语音等)。它的特别之处在于,它能够“记住”之前的信息并用来处理当前的数据,这使得它比普通的前馈神经网络(比如卷积神经网络 CNN)更适合处理时间序列数据。

很多实际问题中,当前的输入往往和之前的数据有关系,比如:

语音识别:一个单词的发音会受到前后音节的影响。
语言翻译:一个句子的理解不仅要看当前的词,还要结合前面的词。
股票预测:当前股票的价格会受到过去价格的影响。

RNN的工作原理:

在这里插入图片描述
RNN的优缺点:

优点:
处理序列数据:RNN非常适合处理和预测序列数据,可以记住历史的信息,理解当前输入与过去输入之间的关系。
灵活性高:可以处理任意长度的序列,不需要固定输入长度。

缺点:
梯度消失/爆炸问题:在长时间序列中,RNN会遇到“梯度消失”或者“梯度爆炸”问题,即网络在训练时,梯度可能会变得非常小或非常大,导致学习过程困难。
训练速度慢:由于需要考虑历史信息,RNN的训练过程通常比普通神经网络慢。

RNN的变种:
为了克服RNN的一些缺点,研究者提出了一些变种模型,最常见的有:

长短期记忆网络(LSTM, Long Short-Term Memory):通过引入“门控机制”,LSTM能够更好地处理长时间依赖问题,避免梯度消失问题。
门控循环单元(GRU, Gated Recurrent Unit):GRU是LSTM的一个简化版本,同样可以有效处理长时间依赖问题,但结构更简单。

语言处理技术基本介绍

分词算法

在这里插入图片描述

词法分析工具

在这里插入图片描述

文本分类与聚类

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

情感分析

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

自然语言处理

词向量

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

词向量学习模型

1. 神经网络语言模型

在这里插入图片描述

2. CBOW 和 skip-gram

在这里插入图片描述

3. 层次化softmax方法

在这里插入图片描述

4. 负采样方法

在这里插入图片描述

RNN介绍

传统的前馈神经网络(Feedforward Neural Network,简称 FNN),其中最常见的一种形式就是 多层感知器(Multilayer Perceptron,简称 MLP)

自然语言处理(NLP, Natural Language Processing)

在这里插入图片描述
MLP是典型的前馈神经网络,在输入层和输出层之间没有任何循环结构。它的每个输入都独立处理,无法处理序列数据和时间依赖关系。而RNN能够通过隐藏状态和递归结构处理时序数据,捕捉序列中的上下文信息。

MLP适合处理独立的输入数据(如静态图像分类、非时序特征等),而RNN更适合处理有时间依赖的序列数据(如文本生成、机器翻译、语音识别等)。
在这里插入图片描述

引入RNN:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
于是引入 LSTM

RNN的变种:LSTM

STM引入了三个门控(输入门、遗忘门和输出门)来控制信息的流动:
遗忘门(Forget Gate):决定上一时刻的记忆单元状态有多少需要被“忘记”。
输入门(Input Gate):决定当前输入有多少需要被写入记忆单元。
输出门(Output Gate):决定当前的记忆单元状态对输出的贡献
在这里插入图片描述
在这里插入图片描述

1. Forget Gate

在这里插入图片描述

2. Input Gate

在这里插入图片描述

3. Update Memory

在这里插入图片描述

4. Output Gate

在这里插入图片描述

在这里插入图片描述

RNN的变种:GRU

GRU是LSTM的一种简化版本,只有两个门(更新门和重置门):
更新门(Update Gate):控制当前隐藏状态的更新程度。
重置门(Reset Gate):决定当前输入与过去的隐藏状态结合的程度。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Attention 注意力机制

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

在这里插入图片描述

RNN的应用

1. 序列到类别

在这里插入图片描述

2. 同步序列到序列

在这里插入图片描述

(1)中文分词

在这里插入图片描述

(2)命名实体识别

在这里插入图片描述

3. 异步序列到序列

在这里插入图片描述

(1)机器翻译

在这里插入图片描述

(2)对话系统

在这里插入图片描述

4. 看图说话

在这里插入图片描述

5. 自动摘要

在这里插入图片描述

6. 自动写诗

在这里插入图片描述

7. 自动作曲

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

RNN代码

一个简单的RNN代码

每10个训练周期会打印出损失值,训练完成后,图表会显示模型的预测结果和真实的正弦曲线对比。
(使用均方误差损失函数(MSELoss)来计算模型的误差,优化器选择了Adam。)

import torch
import torch.nn as nn
import torch.optim as optim# 定义一个简单的RNN模型
class SimpleRNN(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(SimpleRNN, self).__init__()self.hidden_size = hidden_size# 定义RNN层self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)# 定义输出层self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):# 初始化隐藏状态(初始时刻为0)h0 = torch.zeros(1, x.size(0), self.hidden_size).to(x.device)# 通过RNN层得到输出和最终的隐藏状态out, hn = self.rnn(x, h0)# 获取最后一个时刻的输出out = out[:, -1, :]# 通过输出层得到预测结果out = self.fc(out)return out# 超参数设置
input_size = 1       # 每个时间步的输入特征数(例如,序列中的每个元素)
hidden_size = 5      # 隐藏层的大小
output_size = 1      # 输出的特征数
learning_rate = 0.01 # 学习率
num_epochs = 100     # 训练的轮数# 构造一个简单的序列输入(比如一个简单的正弦波或者线性序列)
x_train = torch.linspace(0, 10, steps=100).view(-1, 1, 1)  # 100个时间步,每个时间步的输入是一个1维数据
y_train = torch.sin(x_train).view(-1, 1)  # 正弦函数作为目标输出# 创建RNN模型
model = SimpleRNN(input_size, hidden_size, output_size)# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)# 训练模型
for epoch in range(num_epochs):model.train()# 前向传播outputs = model(x_train)# 计算损失loss = criterion(outputs, y_train)# 反向传播optimizer.zero_grad()loss.backward()optimizer.step()if (epoch+1) % 10 == 0:print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')# 预测
model.eval()
with torch.no_grad():predicted = model(x_train)# 可视化结果
import matplotlib.pyplot as pltplt.plot(x_train.numpy(), y_train.numpy(), label='True')
plt.plot(x_train.numpy(), predicted.numpy(), label='Predicted')
plt.legend()
plt.show()

电影评论情感分析

使用IMDb数据集,它包含大量的电影评论,并且每条评论都已经标注为“正面”或“负面”情感。

import torch
import torch.nn as nn
import torch.optim as optim
from torchtext.datasets import IMDB
from torchtext.data import Field, BucketIterator
import random
import numpy as np
SEED = 1234
random.seed(SEED)
torch.manual_seed(SEED)
torch.backends.cudnn.deterministic = True
# 定义Field
TEXT = Field(sequential=True, lower=True, include_lengths=True)
LABEL = Field(sequential=False, use_vocab=True, is_target=True)# 加载IMDb数据集
train_data, test_data = IMDB.splits(TEXT, LABEL)# 构建词汇表
TEXT.build_vocab(train_data, max_size=25000, vectors="glove.6B.100d", unk_init=torch.Tensor.normal_)
LABEL.build_vocab(train_data)# 创建数据迭代器
BATCH_SIZE = 64train_iterator, test_iterator = BucketIterator.splits((train_data, test_data),batch_size=BATCH_SIZE,device=torch.device("cuda" if torch.cuda.is_available() else "cpu"),sort_within_batch=True,sort_key=lambda x: len(x.text),
)
class RNN_Sentiment(nn.Module):def __init__(self, input_dim, embedding_dim, hidden_dim, output_dim, n_layers, dropout):super(RNN_Sentiment, self).__init__()self.embedding = nn.Embedding(input_dim, embedding_dim)self.rnn = nn.RNN(embedding_dim, hidden_dim, n_layers, batch_first=True, dropout=dropout)self.fc = nn.Linear(hidden_dim, output_dim)self.dropout = nn.Dropout(dropout)def forward(self, text, text_lengths):embedded = self.embedding(text)# RNN expects packed sequencespacked_embedded = nn.utils.rnn.pack_padded_sequence(embedded, text_lengths.cpu(), batch_first=True, enforce_sorted=False)packed_output, hidden = self.rnn(packed_embedded)# Get the last hidden state (for classification)hidden = self.dropout(hidden[-1])output = self.fc(hidden)return output
# 定义超参数
INPUT_DIM = len(TEXT.vocab)
EMBEDDING_DIM = 100
HIDDEN_DIM = 256
OUTPUT_DIM = 1
N_LAYERS = 2
DROPOUT = 0.5model = RNN_Sentiment(INPUT_DIM, EMBEDDING_DIM, HIDDEN_DIM, OUTPUT_DIM, N_LAYERS, DROPOUT)# 使用预训练的GloVe词向量初始化嵌入层
model.embedding.weight.data.copy_(TEXT.vocab.vectors)# 如果有UNK和PAD的token,它们的向量应该是随机初始化
model.embedding.weight.data[TEXT.vocab.stoi[TEXT.pad_token]] = torch.zeros(EMBEDDING_DIM)
model.embedding.weight.data[TEXT.vocab.stoi[TEXT.unk_token]] = torch.randn(EMBEDDING_DIM)# 将模型转移到GPU(如果可用)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = model.to(device)# 定义损失函数和优化器
optimizer = optim.Adam(model.parameters())
criterion = nn.BCEWithLogitsLoss()# 将损失函数放到GPU(如果可用)
criterion = criterion.to(device)# 训练模型
def train(model, iterator, optimizer, criterion):model.train()epoch_loss = 0epoch_acc = 0for batch in iterator:text, text_lengths = batch.textlabels = batch.labeloptimizer.zero_grad()predictions = model(text, text_lengths).squeeze(1)loss = criterion(predictions, labels)acc = binary_accuracy(predictions, labels)loss.backward()optimizer.step()epoch_loss += loss.item()epoch_acc += acc.item()return epoch_loss / len(iterator), epoch_acc / len(iterator)# 计算准确率
def binary_accuracy(preds, y):rounded_preds = torch.round(torch.sigmoid(preds))correct = (rounded_preds == y).float()acc = correct.sum() / len(correct)return acc# 开始训练
N_EPOCHS = 5
for epoch in range(N_EPOCHS):train_loss, train_acc = train(model, train_iterator, optimizer, criterion)print(f'Epoch {epoch+1}, Train Loss: {train_loss:.3f}, Train Accuracy: {train_acc*100:.2f}%')
def evaluate(model, iterator, criterion):model.eval()epoch_loss = 0epoch_acc = 0with torch.no_grad():for batch in iterator:text, text_lengths = batch.textlabels = batch.labelpredictions = model(text, text_lengths).squeeze(1)loss = criterion(predictions, labels)acc = binary_accuracy(predictions, labels)epoch_loss += loss.item()epoch_acc += acc.item()return epoch_loss / len(iterator), epoch_acc / len(iterator)# 测试模型
test_loss, test_acc = evaluate(model, test_iterator, criterion)
print(f'Test Loss: {test_loss:.3f}, Test Accuracy: {test_acc*100:.2f}%')
  1. 数据预处理:使用torchtext加载和处理IMDb数据集。
  2. 模型设计:使用RNN进行文本情感分类,经过词向量嵌入、RNN层处理和全连接层输出。
  3. 训练和评估:通过计算损失函数和准确率来训练模型并评估其性能。

与之前的CNN比较:
在这里插入图片描述

相关文章:

【深度学习】零基础介绍循环神经网络(RNN)

RNN介绍 零基础介绍语言处理技术基本介绍分词算法词法分析工具文本分类与聚类情感分析 自然语言处理词向量词向量学习模型1. 神经网络语言模型2. CBOW 和 skip-gram3. 层次化softmax方法4. 负采样方法 RNN介绍RNN的变种:LSTM1. Forget Gate2. Input Gate3. Update M…...

青少年编程与数学 02-004 Go语言Web编程 13课题、模板引擎

青少年编程与数学 02-004 Go语言Web编程 13课题、模板引擎 一、模板引擎模板引擎的主要特点包括:模板引擎的应用场景:Go语言中的模板引擎:示例:使用Go的html/template包 二、工作流程1. 创建模板文件2. 准备数据3. 加载模板4. 渲染…...

如何优雅的关闭GoWeb服务器

以下内容均为Let’s Go Further内容节选以及作者本人理解。 这里创建了一个后台进程用于捕获关闭信号,在后台进程中,主要内容为: 创建一个缓冲通道 quit使用signal.Notify函数监听并捕获关机信号SIGINT,SIGTERM,在捕获关机信号后…...

AI程序员,开源的Devin,OpenHands 如何使用HuggingFace Inference API

我用了一下,界面这样子: Github:https://github.com/All-Hands-AI/OpenHands OpenHands 如何使用HuggingFace Inference API huggingface/meta-llama/Llama-3.3-70B-Instruct 而不是 meta-llama/Llama-3.3-70B-Instruct 不要设置base URL&…...

【动手学运动规划】 5.2 数值优化基础:梯度下降法,牛顿法

朕四季常服, 不过八套. — 大明王朝1566 道长 🏰代码及环境配置:请参考 环境配置和代码运行! 上一节我们介绍了数值优化的基本概念, 让大家对最优化问题有了基本的理解. 那么对于一个具体的问题, 我们应该如何求解呢? 这一节我们将介绍几个基本的求解…...

电子应用设计方案66:智能打印机系统设计

智能打印机系统设计 一、引言 随着科技的不断发展,打印机也在向智能化方向演进。智能打印机不仅能够提供高质量的打印服务,还具备便捷的操作、智能的管理和连接功能。 二、系统概述 1. 系统目标 - 实现高效、高质量的打印输出。 - 支持多种连接方式&am…...

iClient3D for Cesium 实现限高分析

作者:gaogy 1、背景 随着地理信息技术的发展,三维地球技术逐渐成为了许多领域中的核心工具,尤其是在城市规划、环境监测、航空航天以及军事领域。三维地图和场景的应用正在帮助人们更加直观地理解空间数据,提供更高效的决策支持。…...

AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python

支持向量机是AI开发中最常见的一种算法。之前我们已经一起初步了解了它的概念和应用,今天我们用它来进行一次文本情感分析训练。 一、概念温习 支持向量机(SVM)是一种监督学习算法,广泛用于分类和回归问题。 它的核心思想是通过…...

torch.unsqueeze:灵活调整张量维度的利器

在深度学习框架PyTorch中,张量(Tensor)是最基本的数据结构,它类似于NumPy中的数组,但可以在GPU上运行。在日常的深度学习编程中,我们经常需要调整张量的维度以适应不同的操作和层。torch.unsqueeze函数就是…...

【WRF教程第3.1期】预处理系统 WPS 详解:以4.5版本为例

预处理系统 WPS 详解:以4.5版本为例 每个 WPS 程序的功能程序1:geogrid程序2:ungrib程序3:metgrid WPS运行(Running the WPS)步骤1:Define model domains with geogrid步骤2:Extract…...

SD ComfyUI工作流 根据图像生成线稿草图

文章目录 线稿草图生成SD模型Node节点工作流程工作流下载效果展示线稿草图生成 该工作流的设计目标是将输入的图像转换为高质量的线稿风格输出。其主要流程基于 Stable Diffusion 技术,结合文本和图像条件,精确生成符合预期的线条艺术图像。工作流的核心是通过模型的条件设置…...

挑战一个月基本掌握C++(第六天)了解函数,数字,数组,字符串

一 C函数 函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上&#xff…...

git中的多人协作

目录 1.1多人协作1.1.1创建仓库1.1.2协作处理1.1.3冲突处理 1.2分支推送协作1.3分支拉取协作1.4远程分支的删除 1.1多人协作 1.1.1创建仓库 新建两个文件夹,不需要初始化为git仓库,直接克隆远程仓库命名testGit1,testGit2 指定本地仓库级别…...

解决新安装CentOS 7系统mirrorlist.centos.org can‘t resolve问题

原因 mirrorlist.centos.org yum源用不了 解决办法就是 # cd /etc/yum.repos.d/ # mv CentOS-Base.repo CentOS-Base.repo_bak # vim CentOS-Base.repoCentOS系统操作 # mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/*.repo_bak # curl -o /etc/yum.repos.d/CentOS-Linux-Ba…...

RK3588 , mpp硬编码yuv, 保存MP4视频文件.

RK3588 , mpp硬编码yuv, 保存MP4视频文件. ⚡️ 传送 ➡️ Ubuntu x64 架构, 交叉编译aarch64 FFmpeg mppRK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGBRk3588 FFmpeg 拉流 RTSP, 硬解码转RGBRK3588 , mpp硬编码yuv, 保存MP4视频文件....

Elasticsearch:什么是查询语言?

查询语言定义 查询语言包括数据库查询语言 (database query language - DQL),是一种用于查询和从数据库检索信息的专用计算机语言。它充当用户和数据库之间的接口,使用户能够管理来自数据库管理系统 (database management system - DBMS) 的数据。 最广…...

均值聚类算法

K-均值聚类算法是一种常用的无监督学习算法,用于将数据集划分为 K 个簇。它基于以下的思想:通过计算数据点与各个簇中心之间的距离来确定数据点所属的簇,并更新簇中心来最小化簇内数据点的平方误差。K-均值算法的步骤如下: 1. 选…...

MySQL 中快速插入大量数据

在 MySQL 中快速插入大量数据(例如 20 万条记录)可以通过多种方法实现。以下是一些优化技巧和步骤,可以帮助你高效地插入大量数据: 1. 禁用索引和约束(如果可能) 在插入大量数据之前,禁用索引和…...

腾讯云智能结构化OCR:以多模态大模型技术为核心,推动跨行业高效精准的文档处理与数据提取新时代

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大三学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…...

最大似然检测在通信解调中的应用

最大似然检测(Maximum Likelihood Detection,MLD),也称为最大似然序列估计(Maximum Likelihood Sequence Estimation,MLSE),是一种在通信系统中广泛应用的解调方法。其核心思想是在给…...

QMC解码器终极指南:3步实现加密音乐格式转换的高效解决方案

QMC解码器终极指南:3步实现加密音乐格式转换的高效解决方案 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder QQ音乐下载的加密音频文件格式限制跨平台播放&#…...

不伤身的酒是智商税?这款轻养新标杆打破偏见

1.当“喝酒伤身”成为共识,谁在挑战这个铁律?中国人喝酒的历史,几乎和文明史一样长。但“喝酒伤身”这四个字,也像影子一样,从未离开过酒桌。每一次举杯,耳边总有人念叨:“少喝点”“伤肝”“伤…...

Springboot 实现多数据源(PostgreSQL 和 SQL Server)连接

为 HagiCode 添加 GitHub Pages 自动部署支持 本项目早期代号为 PCode,现已正式更名为 HagiCode。本文记录了如何为项目引入自动化静态站点部署能力,让内容发布像喝水一样简单。 背景/引言 在 HagiCode 的开发过程中,我们遇到了一个很现实的问…...

Git-RSCLIP入门到精通:从基础地物识别到复杂场景分析全流程解析

Git-RSCLIP入门到精通:从基础地物识别到复杂场景分析全流程解析 1. 遥感智能分析的新利器 在遥感图像分析领域,传统方法往往需要大量标注数据和复杂的模型训练流程。Git-RSCLIP的出现彻底改变了这一局面,它基于先进的SigLIP架构&#xff0c…...

一键搞定完整网页截图:Chrome扩展终极指南

一键搞定完整网页截图:Chrome扩展终极指南 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-extension 你…...

Zephyr与MCUBoot的深度整合:从构建到安全启动的完整指南

1. 为什么需要安全启动? 在嵌入式开发中,设备固件的安全性往往是最容易被忽视的一环。想象一下,如果你的智能门锁固件被恶意篡改,或者医疗设备的程序被非法替换,后果会有多严重?这就是为什么我们需要MCUBoo…...

手把手教你学<基于 Linux 的 NPU 协处理器固件开发>专栏第1章 入门:

1.2 典型 AI 芯片架构:主核 Linux + NPU 协处理器 在上一节我们明确了NPU是依附于Linux主核的专用AI协处理器,属于主从配合的工作模式,这一节我们就深入拆解端侧AI芯片最主流的“Linux主核+NPU协处理器”异构架构。结合大家日常接触的代码仓库管理、编译脚本执行、固件烧录…...

嵌入式开发必知:原码、反码与补码详解

1. 为什么嵌入式开发必须掌握原码、反码和补码作为一名在嵌入式领域摸爬滚打多年的工程师,我见过太多因为不理解底层数据表示而导致的诡异bug。记得刚入行时,我调试一个温度传感器项目,当温度低于零度时,读取的数值总是偏差127度。…...

告别模糊边界!用Monodepth2实战KITTI深度估计,详解自动掩码与最小重投影损失

告别模糊边界!用Monodepth2实战KITTI深度估计,详解自动掩码与最小重投影损失 深度估计是计算机视觉领域的一项基础任务,它试图从2D图像中恢复出3D场景的几何信息。在自动驾驶、机器人导航、增强现实等应用中,准确的深度感知至关重…...

如何在旧款Mac上安装最新macOS:OpenCore Legacy Patcher完整指南

如何在旧款Mac上安装最新macOS:OpenCore Legacy Patcher完整指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为苹果官方停止支持的老旧Ma…...