深度学习技术演进:从 CNN、RNN 到 Transformer 的发展与原理解析

在这里插入图片描述

深度学习的技术演进经历了从卷积神经网络(CNN)到循环神经网络(RNN)再到 Transformer 的重要发展。这三个架构分别擅长处理图像、序列数据和多种任务的特征,标志着深度学习在不同领域取得的进步。


1. 卷积神经网络(CNN)

基本原理

CNN 最早用于图像处理任务,利用卷积操作和池化层来提取图像的空间特征。CNN 中的核心是卷积核(或过滤器),它会在输入图像上滑动,以获得局部特征,再经过多个卷积层和池化层逐步抽取高层次的特征。CNN 利用权值共享和局部感知,适合处理固定大小的输入和空间不变性的任务。

Python 示例代码

以下代码使用 PyTorch 构建一个简单的 CNN 来处理手写数字数据集(MNIST):

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms# CNN 模型定义
class SimpleCNN(nn.Module):def __init__(self):super(SimpleCNN, self).__init__()self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)self.fc1 = nn.Linear(64 * 7 * 7, 128)self.fc2 = nn.Linear(128, 10)self.pool = nn.MaxPool2d(2, 2)def forward(self, x):x = self.pool(F.relu(self.conv1(x)))x = self.pool(F.relu(self.conv2(x)))x = x.view(-1, 64 * 7 * 7)x = F.relu(self.fc1(x))x = self.fc2(x)return x# 加载 MNIST 数据集
transform = transforms.Compose([transforms.ToTensor()])
train_data = datasets.MNIST(root='mnist', train=True, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_data, batch_size=64, shuffle=True)# 初始化模型和优化器
model = SimpleCNN()
optimizer = optim.Adam(model.parameters(), lr=0.001)
criterion = nn.CrossEntropyLoss()# 训练模型
for epoch in range(1, 6):for data, target in train_loader:optimizer.zero_grad()output = model(data)loss = criterion(output, target)loss.backward()optimizer.step()print(f'Epoch {epoch}, Loss: {loss.item()}')

2. 循环神经网络(RNN)

基本原理

RNN 是为序列数据设计的网络,通过引入“循环”连接,RNN 能够在处理当前输入时记住之前的输入信息,适合处理序列数据如文本、时间序列数据等。但由于 RNN 存在梯度消失问题,无法有效捕获长距离的依赖关系。改进版如 LSTM 和 GRU 通过引入门控机制缓解了这些问题。

Python 示例代码

以下代码实现了一个简单的 RNN 进行字符级文本生成:

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_sizeself.rnn = nn.RNN(input_size, hidden_size, batch_first=True)self.fc = nn.Linear(hidden_size, output_size)def forward(self, x, hidden):out, hidden = self.rnn(x, hidden)out = self.fc(out[:, -1, :])return out, hiddendef init_hidden(self):return torch.zeros(1, 1, self.hidden_size)# 准备数据
input_size = 10
hidden_size = 50
output_size = 10
model = SimpleRNN(input_size, hidden_size, output_size)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)# 训练 RNN 模型(伪数据)
data = torch.rand(1, 5, input_size)
target = torch.randint(0, output_size, (1,))for epoch in range(1, 6):hidden = model.init_hidden()optimizer.zero_grad()output, hidden = model(data, hidden)loss = criterion(output, target)loss.backward()optimizer.step()print(f'Epoch {epoch}, Loss: {loss.item()}')

3. Transformer

基本原理

Transformer 摒弃了 RNN 的循环结构,完全基于自注意力机制,直接让每个输入词能够“关注”其他词的位置。这种并行化处理提高了效率,能够捕获序列中的长程依赖。Transformer 模型的核心组件包括自注意力、多头注意力、前馈神经网络、编码器和解码器模块。典型的 Transformer 应用是自然语言处理中的机器翻译和文本生成。

Python 示例代码

以下是 PyTorch 中一个简单的 Transformer 模型定义,用于序列到序列任务:

import torch
import torch.nn as nn
import torch.optim as optim# Transformer 模型定义
class SimpleTransformer(nn.Module):def __init__(self, input_dim, output_dim, hidden_dim, n_heads, num_layers):super(SimpleTransformer, self).__init__()self.embedding = nn.Embedding(input_dim, hidden_dim)self.transformer = nn.Transformer(d_model=hidden_dim, nhead=n_heads, num_encoder_layers=num_layers)self.fc = nn.Linear(hidden_dim, output_dim)def forward(self, src, tgt):src_emb = self.embedding(src)tgt_emb = self.embedding(tgt)transformer_output = self.transformer(src_emb, tgt_emb)return self.fc(transformer_output)# 初始化模型
input_dim = 10
output_dim = 10
hidden_dim = 16
n_heads = 2
num_layers = 2
model = SimpleTransformer(input_dim, output_dim, hidden_dim, n_heads, num_layers)# 模拟输入输出序列
src = torch.randint(0, input_dim, (5, 1))
tgt = torch.randint(0, output_dim, (5, 1))# 模型输出
output = model(src, tgt)
print(output.shape)  # 输出形状为 (序列长度, 批次大小, 输出维度)

三者之间的关系

  1. 应用场景:CNN主要用于图像处理领域,RNN则擅长处理序列数据(如文本、语音等),而Transformer则进一步提升了处理序列数据的能力,尤其在自然语言处理领域表现出色。
  2. 技术演进:CNN和RNN是深度学习领域的早期代表性模型,为后来的技术发展奠定了基础。Transformer则是在RNN的基础上,通过引入自注意力机制和多头注意力机制,实现了计算效率的显著提升和模型性能的突破。
  3. 模型结构:CNN通过卷积层和池化层提取特征,RNN通过循环连接保留序列信息,而Transformer则通过编码器-解码器架构和自注意力机制捕捉全局依赖关系。

综上所述,从CNN到RNN再到Transformer的技术演进,代表了深度学习在处理不同类型数据方面的不断进步和创新。这些模型在各自的应用领域都取得了显著的成果,并推动了人工智能技术的快速发展。

总结

  • CNN:善于处理图像和其他固定维度数据,利用卷积提取特征。
  • RNN:擅长处理序列数据,但在长距离依赖关系上存在局限。
  • Transformer:通过自注意力机制解决了 RNN 的瓶颈,在 NLP 和多模态任务中取得了极大成功。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java智能物流管理系统源码(springboot)

项目简介 智能物流管理系统实现了以下功能: 智能物流管理系统的主要使用者分为管理员,顾客,员工,店主。功能有个人中心,顾客管理,员工管理,店主管理,门店信息管理,门店…

Go 语言中的 for range 循环教程

在 Go 语言中,for range 循环是一个方便的语法结构,用于遍历数组、切片、映射和字符串。本教程将通过示例代码来帮助理解如何在 Go 中使用 for range 循环。 package mainimport "fmt"func main() {// 遍历切片并计算和nums : []int{2, 3, 4}…

OpenCV视觉分析之目标跟踪(1)计算密集光流的类DISOpticalFlow的介绍

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 这个类实现了 Dense Inverse Search (DIS) 光流算法。更多关于该算法的细节可以在文献 146中找到。该实现包含了三个预设参数集,以提…

Visual studio 下载安装

1,Visual stutdio 网址 下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 2,下划页面,点击 较早的下载 3,选择对应的版本进行下载

蓝牙技术的多种模式详解

蓝牙作为一种广泛应用的无线通信技术,已经在我们的日常生活中无处不在。随着技术的发展,蓝牙已经不再仅限于传统的音频传输,而是扩展到了各种应用领域。本文将深入探讨蓝牙的各种模式及其应用场景。 1. 经典蓝牙(BR/EDR&#xff…

单链表OJ题:移除链表元素(力扣)

目录 解法一:带头节点的新链表 解法二:不带头节点的新指向关系链表 总结 这是一道简单的力扣题目,关于解法的话,这里提供了二种思路,重点解释前两种,还有一种思路好想,但是时间复杂度为O(n^2…

一站式学习 Shell 脚本语法与编程技巧,踏出自动化的第一步

文章目录 1. 初识 Shell 解释器1.1 Shell 类型1.2 Shell 的父子关系 2. 编写第一个 Shell 脚本3. Shell 脚本语法3.1 脚本格式3.2 注释3.2.1 单行注释3.2.2 多行注释 3.3 Shell 变量3.3.1 系统预定义变量(环境变量)printenv 查看所有环境变量set 查看所有…

SMT 生产可视化:提升电子组装流程效率

通过图扑 HT 对表面贴装技术(SMT)生产线的实时数据采集与可视化分析,实现对产品质量、产能利用率和流程优化的有效监控,助力生产效率最大化与质量提升。

听见文本的魅力:AI 与未来的语音交互

AI 与未来的语音交互 引言什么是文本转语音(TTS)?当前 TTS 技术现状国内海外文本转语音能力调研文本转语音能力说明多情感风格SSML语音合成标记语言 未来趋势 引言 随着人工智能(AI)技术的迅猛发展,文本转…

OpenCV视觉分析之运动分析(4)背景减除类:BackgroundSubtractorKNN的一系列set函数的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 BackgroundSubtractorKNN类有一系列的set函数,下面我们一一列举他们的名字和用法。 一系列set函数 函数setDetectShadows() setDe…

笔记整理—linux驱动开发部分(1)驱动梗概

驱动可以分为广义上的和狭义上的驱动。广义上的驱动是用于操作硬件的代码,而狭义上的驱动为基于内核系统之上让硬件去被操作的逻辑方法。 linux体系架构: 1.分层思想 :在OS中间还会有许多层。 : 2.驱动的上面是系统调用(API&…

JavaScript网页设计案例教程:从零开始构建一个响应式网页

JavaScript网页设计案例教程:从零开始构建一个响应式网页 前言 在当今互联网时代,网页设计已成为一项重要技能。JavaScript作为网页开发的核心技术之一,能够让网页变得更加生动和交互。本文将带您通过一个实际案例,逐步学习如何…

万字图文实战:从0到1构建 UniApp + Vue3 + TypeScript 移动端跨平台开源脚手架

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🍃 vue-uniapp-template 🌺 仓库主页: Gitee 💫 Github &#x1f…

【C语言】控制台学生成绩管理系统

文章目录 C语言编程:学生成绩管理系统一、程序概述二、代码实现三、程序解释 C语言编程:学生成绩管理系统 在这篇文章中,我们将一起探讨如何使用C语言来创建一个简单的学生成绩管理系统。这个系统将允许用户输入学生数量、学号和成绩&#x…

钉钉录播抓取视频

爬取钉钉视频 免责声明 此脚本仅供学习参考,切勿违法使用下载他人资源进行售卖,本人不但任何责任! 仓库地址: GItee 源码仓库 执行顺序 poxyM3u8开启代理getM3u8url用于获取m3u8文件userAgent随机请求头downVideo|downVideoThreadTqdm单线程下载和…

水轮发电机油压自动化控制系统解决方案介绍

在现代水电工程中,水轮机组油压自动化控制系统,不仅直接关系到水轮发电机组的安全稳定运行,还影响着整个水电站的生产效率和经济效益。 一、系统概述 国科JSF油压自动控制系统,适用于水轮发电机组调速器油压及主阀(蝶…

Golang | Leetcode Golang题解之第503题下一个更大元素II

题目&#xff1a; 题解&#xff1a; func nextGreaterElements(nums []int) []int {n : len(nums)ans : make([]int, n)for i : range ans {ans[i] -1}stack : []int{}for i : 0; i < n*2-1; i {for len(stack) > 0 && nums[stack[len(stack)-1]] < nums[i%…

01 springboot-整合日志(logback-config.xml)

logback-config.xml 是一个用于配置 Logback 日志框架的 XML 文件&#xff0c;通常位于项目的 classpath 下的根目录或者 src/main/resources 目录下。 Logback 提供了丰富的配置选项&#xff0c;可以满足各种不同的日志需求。需要根据具体情况进行配置。 项目创建&#xff0…

Nginx、Tomcat等项目部署问题及解决方案详解

目录 前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的常见原因 2. 端口开启问题2.1 Windows环境下的端口开放2.2 Linux环境下的端口开放 3. 重视日志分析3.1 Nginx日志分析3.2 Tomcat日志分析 4. 开发环境与部署后运行结果不同4.1 开发环境与生产…

redis的配置文件解析

我的后端学习大纲 我的Redis学习大纲 1.1.Redis的配置文件&#xff1a; 1.Redis的配置文件名称是&#xff1a;redis.conf 2.在vim这个配置文件的时候&#xff0c;默认是不显示行号的&#xff0c;可以编辑下面这个文件&#xff0c;末尾加上set nu&#xff0c;就会显示行号: 1.…