深度学习技术演进:从 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) # 输出形状为 (序列长度, 批次大小, 输出维度)
三者之间的关系
- 应用场景:CNN主要用于图像处理领域,RNN则擅长处理序列数据(如文本、语音等),而Transformer则进一步提升了处理序列数据的能力,尤其在自然语言处理领域表现出色。
- 技术演进:CNN和RNN是深度学习领域的早期代表性模型,为后来的技术发展奠定了基础。Transformer则是在RNN的基础上,通过引入自注意力机制和多头注意力机制,实现了计算效率的显著提升和模型性能的突破。
- 模型结构:CNN通过卷积层和池化层提取特征,RNN通过循环连接保留序列信息,而Transformer则通过编码器-解码器架构和自注意力机制捕捉全局依赖关系。
综上所述,从CNN到RNN再到Transformer的技术演进,代表了深度学习在处理不同类型数据方面的不断进步和创新。这些模型在各自的应用领域都取得了显著的成果,并推动了人工智能技术的快速发展。
总结
- CNN:善于处理图像和其他固定维度数据,利用卷积提取特征。
- RNN:擅长处理序列数据,但在长距离依赖关系上存在局限。
- Transformer:通过自注意力机制解决了 RNN 的瓶颈,在 NLP 和多模态任务中取得了极大成功。
相关文章:
深度学习技术演进:从 CNN、RNN 到 Transformer 的发展与原理解析
深度学习的技术演进经历了从卷积神经网络(CNN)到循环神经网络(RNN)再到 Transformer 的重要发展。这三个架构分别擅长处理图像、序列数据和多种任务的特征,标志着深度学习在不同领域取得的进步。 1. 卷积神经网络&…...
Lua中的goto语句
软考鸭微信小程序 过软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 在Lua编程语言中,goto语句是一种跳转语句,用于将程序的执行流程无条件地转移到程序中的另一个位置。这个位置由一个标签(…...
【rust实战】rust博客系统2_使用wrap启动rust项目服务
如何创建一个使用warp框架的rust项目1.使用cargo 创建项目 cargo new blog 2.添加warp依赖 1.cd blog 2.编辑Cargo.toml文件 添加warp 和 tokio 作为依赖项 在[dependencies]中添加 [package] name "blog" version "0.1.0" …...
【实战案例】Django框架使用模板渲染视图页面及异常处理
本文基于之前内容列表如下: 【图文指引】5分钟搭建Django轻量级框架服务 【实战案例】Django框架基础之上编写第一个Django应用之基本请求和响应 【实战案例】Django框架连接并操作数据库MySQL相关API 视图概述 Django中的视图的概念是一类具有相同功能和模板的网…...
设置K8s管理节点异常容忍时间
说明 每个节点上的 kubelet 需要定时向 apiserver 上报当前节点状态,如果两者间网络异常导致心跳终端,kube-controller-manager 中的 NodeController 会将该节点标记为 Unknown 或 Unhealthy,持续一段时间异常状态后 kube-controller-manage…...
什么样的JSON编辑器才好用
简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也便于机器解析和生成。随着互联网和应用程序的快速发展,JSON已经成为数据传输和存储的主要格式之一。在处理和编辑JSON数据…...
ArkUI自定义TabBar组件
在ArkUI中的Tabs,通过页签进行内容视图切换的容器组件,每个页签对应一个内容视图。其中内容是图TabContent作为Tabs的自组件,通过给TabContent设置tabBar属性来自定义导航栏样式。现在我们就根据UI设计的效果图来实现下图效果: 根…...
pair类型应用举例
在main.cpp里输入程序如下: #include <iostream> //使能cin(),cout(); #include <utility> //使能pair数据类型; #include <string> //使能string字符串; #include <stdlib.h> //使能exit(); //pair类型可以将两个相同的或不同类…...
数字 图像处理算法的形式
一 基本功能形式 按图像处理的输出形式,图像处理的基本功能可分为三种形式。 1)单幅图像 单幅图像 2)多幅图像 单幅图像 3)单(或多)幅图像 数字或符号等 二 几种具体算法形式 1.局部处理邻域对于任一…...
安徽对口高考Python试题选:输入一个正整数,然后输出该整数的3的幂数相加形式。
第一步:求出3的最高次幂是多少 guoint(input("请输入一个正整数:")) iguo a0 while i>0: if 3**i<guo: ai break ii-1print(a)#此语句为了看懂题目,题目中不需要打印出最高幂数 第二步…...
Node.js是什么? 能做什么?
Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它使用事件驱动、非阻塞式I/O模型,使得JavaScript能够在服务器端运行。Node.js允许JavaScript脱离浏览器,直接在服务器和计算机上使用,极大地扩展了JavaScript的应用范围。…...
JVM快速入门
1、 JVM探究 面试问题 :谈谈对JVM的理解? java8虚拟机和之前的变化更新?什么是OOM,什么是栈溢出StackOverFlowError?怎么分析?JVM的常用调优参数有哪些?内存快照如何抓取,怎么分析Dump文件?知道吗?谈谈JVM中,类加载器你的认识?2、JVM的位置 3、JVM的体系结构 3.1…...
理解深度学习模型——高级音频特征表示的分层理解
理解深度学习模型可以是一个复杂的过程,因为这些模型通常包含大量的参数和层次。 (1)复杂性来源: 深度学习模型的复杂性来源于多个方面,包括模型的规模、层次结构、参数数量以及训练数据的复杂性。以下是一些关键点&a…...
【HarmonyOS Next】原生沉浸式界面
背景 在实际项目中,为了软件使用整体色调看起来统一,一般顶部和底部的颜色需要铺满整个手机屏幕。因此,这篇帖子是介绍设置的方法,也是应用沉浸式效果。如下图:底部的绿色延伸到上面的状态栏和下面的导航栏 UI 在鸿蒙…...
数据结构 ——— 树的概念及结构
目录 树的结构以及示意图 树的概念编辑 树的结构与递归的关系编辑 树的结构以及示意图 树是一种非线性的数据结构,它是由 n(n>0) 个有限节点组成一个具有层次关系的集合 把这种结构叫做树是因为它看起来像一棵倒挂的树 特点: 有一个特殊的…...
初探Vue前端框架
文章目录 简介什么是Vue概述优势MVVM框架 Vue的特性数据驱动视图双向数据绑定指令插件 Vue的版本版本概述新版本Vue 3Vue 3新特性UI组件库UI组件库概述常用UI组件库 安装Vue安装Vue查看Vue版本 实例利用Vue命令创建Vue项目切换工作目录安装vue-cli脚手架创建Vue项目启动Vue项目…...
Lucas带你手撕机器学习——岭回归
岭回归(Ridge Regression) 一、背景与引入 在进行线性回归分析时,我们常常面临多重共线性的问题。多重共线性指的是自变量之间高度相关,这会导致回归系数的不稳定性,使得模型的预测能力降低。传统的线性回归通过最小…...
C2W4.LAB.Word_Embedding.Part1
理论课:C2W4.Word Embeddings with Neural Networks 文章目录 Word Embeddings First Steps: Data PreparationCleaning and tokenizationSliding window of wordsTransforming words into vectors for the training setMapping words to indices and indices to w…...
hive初体验
1.首先,确保启动了Metastore服务。 runjar就是metastore进程 2.进入hive客户端: 命令:hive 3.操作:没有指定数据库时默认在default 一:创建表:CREATE TABLE test(id INT, name STRING, gender STRING); 完成,show tables看一下 也可以通过hdfs文件系统查看,默认路径…...
云渲染主要是分布式(分机)渲染,如何使用blender云渲染呢?
云渲染主要是分布式(分机)渲染,比如一个镜头同时开20-100张3090显卡的机器渲染,就能同时渲染20-100帧,渲染不仅不占用自己电脑,效率也将增加几十上百倍! blender使用教程如下: 第一…...
3步解锁SWF逆向工程:JPEXS开源工具深度解析
3步解锁SWF逆向工程:JPEXS开源工具深度解析 【免费下载链接】jpexs-decompiler JPEXS Free Flash Decompiler 项目地址: https://gitcode.com/gh_mirrors/jp/jpexs-decompiler 你是否曾面对一个陈旧的SWF文件束手无策?当Flash技术逐渐退出历史舞台…...
函数调用(Function Calling)深度集成:让 AI 安全执行企业 API
系列导读 你现在看到的是《Spring AI 企业级集成与场景实践:从零搭建智能应用》的第 5/10 篇,当前这篇会重点解决:展示如何让 AI 安全可控地操作企业后端服务,实现真正的智能体能力。 上一篇回顾:第 4 篇《检索增强生成(RAG)实战:Spring AI 集成向量数据库实现知识问…...
在多模型间切换时Taotoken路由策略带来的稳定性体验
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在多模型间切换时Taotoken路由策略带来的稳定性体验 在构建基于大模型的应用时,服务的稳定性是开发者关心的核心问题之…...
3步解决JavaScript精度问题:decimal.js高精度计算完整指南
3步解决JavaScript精度问题:decimal.js高精度计算完整指南 【免费下载链接】decimal.js An arbitrary-precision Decimal type for JavaScript 项目地址: https://gitcode.com/gh_mirrors/de/decimal.js 在JavaScript开发中,你是否经常遇到这样的…...
TrollInstallerX技术深度解析:iOS 14.0-16.6.1系统权限获取完全指南
TrollInstallerX技术深度解析:iOS 14.0-16.6.1系统权限获取完全指南 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX TrollInstallerX是一款面向iOS 14.0至16…...
【2024最严苛功能压力测试】:在金融合规文档生成、医疗术语推理、代码安全审计三大高危场景下,Claude与Gemini谁扛住了0误判红线?
更多请点击: https://intelliparadigm.com 第一章:【2024最严苛功能压力测试】:在金融合规文档生成、医疗术语推理、代码安全审计三大高危场景下,Claude与Gemini谁扛住了0误判红线? 测试设计原则 本测试采用“双盲对…...
基础模型全生命周期管理的混合架构实践与优化
1. 基础模型全生命周期管理的架构挑战基础模型(Foundation Models)正在重塑AI技术栈的每个环节,从预训练到推理部署的全生命周期管理面临前所未有的系统架构挑战。传统HPC(高性能计算)集群和云原生平台各自为政的局面&…...
OpenClaw近一月版本更替讲解
如果你最近没追 OpenClaw 的更新,最容易产生一种错觉:它是不是又只是多接了几个模型、多加了几个花哨功能? 我看完最近一个月的变化后,感觉不是这样。 OpenClaw 这一个月真正值得关注的地方,不是“它更炫了”ÿ…...
Unity性能优化实战:Mesh Baker 纹理合并与UV重映射详解
1. 为什么需要纹理合并与UV重映射 在开发开放世界游戏时,场景中往往会出现大量重复的建筑、植被等模型。每个模型通常都有自己的材质球和贴图,这会导致两个严重问题:首先是Draw Call数量激增,每个材质球都会产生一次Draw Call&…...
终极WebPShop插件:解锁Photoshop专业级WebP处理能力
终极WebPShop插件:解锁Photoshop专业级WebP处理能力 【免费下载链接】WebPShop Photoshop plug-in for opening and saving WebP images 项目地址: https://gitcode.com/gh_mirrors/we/WebPShop WebPShop是一款专为Adobe Photoshop设计的开源插件,…...
