🕷️ Crawler Inspector

URL Lookup

Direct Parameter Lookup

Raw Queries and Responses

1. Shard Calculation

Query:
Response:
Calculated Shard: 16 (from laksa197)

2. Crawled Status Check

Query:
Response:

3. Robots.txt Check

Query:
Response:

4. Spam/Ban Check

Query:
Response:

5. Seen Status Check

ℹ️ Skipped - page is already crawled

📄
INDEXABLE
CRAWLED
2 days ago
🤖
ROBOTS ALLOWED

Page Info Filters

FilterStatusConditionDetails
HTTP statusPASSdownload_http_code = 200HTTP 200
Age cutoffPASSdownload_stamp > now() - 6 MONTH0.1 months ago
History dropPASSisNull(history_drop_reason)No drop reason
Spam/banPASSfh_dont_index != 1 AND ml_spam_score = 0ml_spam_score=0
CanonicalPASSmeta_canonical IS NULL OR = '' OR = src_unparsedNot set

Page Details

PropertyValue
URLhttps://www.53ai.com/news/LargeLanguageModel/2025072446057.html
Last Crawled2026-04-04 00:16:45 (2 days ago)
First Indexed2025-07-24 22:03:02 (8 months ago)
HTTP Status Code200
Meta TitleAI 基础知识从 0.3 到 0.4——如何选对深度学习模型? - 53AI-AI知识库|企业AI知识库|大模型知识库|AIHub
Meta Description深入探索 AI 基础知识,从 0.3 到 0.4,聚焦如何选对深度学习模型。了解 AI 大模型的发展脉络,从 Seq2Seq 到 RNN 再到 Transformer 及 GPT 模型。掌握模型架构与具体模型的区别,如 CNN、Transformer 等架构与 GPT 模型的关系。带你探究大模型技术原理与架构,助力你在业务问题中做出正确选型。点击阅读,开启 AI 学习之旅!
Meta Canonicalnull
Boilerpipe Text
推荐语 深度学习模型选型指南:从CNN到Transformer,一文掌握主流模型架构与应用场景。 核心内容: 1. 模型架构与具体模型的本质区别解析 2. CNN、Transformer等主流架构的典型应用场景 3. 根据业务需求选择最佳模型的实战方法论 杨芳贤 53AI创始人/腾讯云(TVP)最具价值专家 沿着 AI 的发展脉络,本系列文章从Seq2Seq到RNN,再到Transformer,直至今日强大的GPT模型,我们将带你一步步深入了解这些关键技术背后的原理与实现细节。无论你是初学者还是有经验的开发者,相信读完这个系列文章后,不仅能掌握Transformer的核心概念,还能对其在整个NLP领域中的位置有一个全面而深刻的认识。那就让我们一起开始这段学习之旅吧! 在深度学习的语境里“模型”是一个高频出现的词汇,我们听说过识别手写数字的 CNN 模型,处理自然语言的 Transformer 模型,还有能写文章、做对话的 GPT 模型,这么多模型我们在解决业务问题时候应该如何做选型? 模型与模型架构 仔细观察还会发现一个问题 —— GPT 模型只有一个,而 CNN、Transformer 却有很多,比如 ResNet、VGG 属于 CNN 家族,BERT、GPT 又都和 Transformer 相关,这些概念之间究竟是怎样的关系? 我们首先需要了解机器学习中两个关键概念——模型架构(Model Architecture)与具体模型(Trained Model)的区别。就像建筑设计中「蓝图」与「建成的房子」的关系 ——CNN 和 Transformer 是模型架构,类似于可复用的「设计蓝图」,允许开发者根据需求调整细节(如层数、参数),从而衍生出无数具体实现;而 GPT 则是基于 Transformer 蓝图构建并训练完成的「成品模型」,是前者的一个典型实例。 以之前讨论的手写数字分类任务为例: model = keras.Sequential([    keras.Input(shape=(28, 28, 1)),  # 输入层(图像尺寸)    keras.layers.Conv2D(32, (3, 3), activation='relu'),  # 卷积层    keras.layers.MaxPooling2D((2, 2)),  # 池化层    keras.layers.Flatten(),  # 展平层    keras.layers.Dense(128, activation='relu'),  # 全连接层    keras.layers.Dense(10, activation='softmax')  # 输出层]) 这里定义的是架构,描述了模型的层次、各层的类型、连接方式以及数据流动的路径。它是模型的 “骨架”,决定了模型如何处理输入数据、提取特征以及生成输出。 # 训练模型model.compile(optimizer='adam',              loss='sparse_categorical_crossentropy',              metrics=['accuracy'])model.fit(    train_images.reshape(-1, 28, 28, 1), train_labels,     epochs=5, batch_size=32,    validation_data=(val_images.reshape(-1, 28, 28, 1), val_labels)) 当上述架构通过 model.fit() 训练后,学习到具体的权重和偏置,也就产生了包含具体参数的模型,能够对新图像进行分类预测。因此可以这样理解 模型架构 是模型的 “设计图纸”,决定了模型的结构和计算逻辑(无参数)。 模型 是架构经过训练后的 “实例”,包含可学习的参数,能够实现具体的预测功能。 常见模型架构类型 个人理解工程同学首先要对常见的模型眼熟,比如目标检测任务能联想到 CNN、YOLO,这样 AI 就能帮大家开写代码了 卷积神经网络 (Convolutional Neural Networks, CNNs) CNNs 通过卷积操作高效提取数据的局部空间特征,特别适用于具有网格状结构的数据,如图像。 典型模型: LeNet-5 : 早期的 CNN,用于手写数字识别。 AlexNet : 在 ImageNet 竞赛中显著提升图像分类性能,推动深度学习的发展。 VGGNet : 通过加深网络(如 VGG16、VGG19)提升性能。 ResNet (Residual Networks) : 引入残差模块,解决深层网络的梯度消失问题。 EfficientNet : 通过复合缩放方法优化模型规模与性能平衡。 YOLO(You Only Look Once) : 为目标检测设计,提供了图像分类、目标检测、实例分割、关键点检测等任务支持 循环神经网络 (Recurrent Neural Networks, RNNs) RNNs 通过其循环结构处理序列数据,能够捕捉时间上的依赖关系,适用于需要处理时序信息的任务。 典型模型: 标准RNN : 基础循环网络,存在梯度消失问题。 长短期记忆网络 (Long Short-Term Memory, LSTM) : 引入门控机制,解决梯度消失问题。 门控循环单元 (Gated Recurrent Units, GRU) : 结构更简洁,计算效率更高,功能类似于LSTM。 双向 RNN (Bi-directional RNNs) : 双向处理序列,提高信息捕捉能力。 Transformer 模型 Transformer 基于自注意力机制,能够并行处理整个序列,擅长捕捉长距离依赖关系,广泛应用于 NLP 和计算机视觉领域。 典型模型: Transformer (原始模型) : 用于机器翻译任务。 BERT (Bidirectional Encoder Representations from Transformers) : 预训练语言模型,用于多种 NLP 任务。 GPT (Generative Pre-trained Transformer) 系列 : 用于文本生成、对话系统等。 Vision Transformer (ViT) : 将 Transformer 应用于图像分类。 DETR (DEtection TRansformer) : 用于目标检测任务。 生成对抗网络 (Generative Adversarial Networks, GANs) GANs 通过生成器与判别器的对抗训练,实现高质量数据的生成,广泛应用于生成任务和数据增强。 典型模型: 原始 GAN : 最基础的生成对抗框架。 DCGAN (Deep Convolutional GAN) : 结合卷积神经网络提升图像生成效果。 StyleGAN : 生成高质量的人脸图像,并可控制样式特征。 CycleGAN : 实现无监督的图像到图像转换,如马到斑马。 BigGAN : 大规模GAN模型,提升生成图像的质量与多样性。 图神经网络 (Graph Neural Networks, GNNs) GNNs 专为处理图结构数据设计,通过节点间的连接关系传递和聚合信息,适用于复杂的关系数据。 典型模型: Graph Convolutional Networks (GCNs) : 基于图卷积操作进行特征提取。 Graph Attention Networks (GATs) : 引入注意力机制,动态分配邻居节点的权重。 GraphSAGE : 通过采样邻居节点,实现大规模图数据的高效训练。 总结 不同架构因设计原理的差异,在数据处理、特征提取和任务适配上各有专攻,适用于不同类型的任务: 计算机视觉 : CNN、ResNet、ViT(Vision Transformer) 自然语言处理 : RNN、LSTM、GRU、Transformer(如 BERT、GPT) 生成任务 : GAN、VAE 图结构数据 : GNN、GCN 序列与时间数据 : RNN、LSTM、GRU、Transformer 开始选择模型 拿到业务需求、收集数据、确定目标、选择模型架构,就可以开始进行模型训练了,但在机器学习开发的日常实践中,完全 从零开始训练模型的情况已越来越少,大多数开发者会基于任务需求与数据特性,优先选择在 预训练模型 基础上进行 微调 优化。这种站在巨人肩膀上的策略,既充分利用了大规模数据预训练积累的通用特征表示,又能通过轻量化的适配过程快速满足特定场景需求。 预训练模型 预训练模型(Pre-trained Models)是在特定模型架构基础上,通过在大规模通用数据集上进行初步训练,学习到通用特征或知识,设定了具体参数的神经网络模型。 比如基于 Transformer 架构的 BERT、GPT 系列模型,基于 CNN 架构的 ResNet-101、VGG16 等,都是预训练模型。这些预训练模型覆盖了自然语言处理、计算机视觉、音频处理、多模态任务和推荐系统等多个领域。开发者可以在  Hugging Face Hub 、 PyTorch Hub 、 TensorFlow Hub 等平台,获取这些预训练模型。 Hugging Face Hub: https://huggingface.co/models PyTorch Hub: https://pytorch.org/hub/ TensorFlow Hub: https://www.tensorflow.org/hub 现在回头看 GPT (Generative Pre-trained Transformer) 是不是知道大概是什么意思了。 微调 Fine-tuning 因为预训练模型一般使用通用数据集训练,为了更好的支持业务需求,开发者会对预训练模型进行微调。微调是指在预训练模型上,针对特定任务或特定数据集,进行少量参数的调整和训练,以使模型更好地适应新的任务需求。 随着模型规模的不断增大和应用场景的多样化,出现了多种微调方法,以提高效率、减少计算资源消耗或提升模型性能。 1. 标准微调(Standard Fine-tuning) 标准微调是最基本的微调方法,即将预训练模型在特定任务的数据集上进行全量参数的进一步训练。通常情况下,微调时会采用较低的学习率,以避免破坏预训练模型中学到的通用特征。 优点 : 简单直接,效果较好,尤其适用于目标任务与预训练任务相似的情况。 缺点 : 大模型全量微调计算资源消耗高,可能导致 过拟合 ,尤其在目标任务数据量较小时。 2. 监督微调(Supervised Fine-Tuning, SFT) 监督微调是在标准微调基础上,利用有标注数据进行进一步训练,旨在提升模型在特定监督任务上的表现。SFT 通常应用于需要明确标签的任务,如分类、序列标注等。 自然语言处理 : 文本分类、命名实体识别、机器翻译等。 计算机视觉 : 图像分类、目标检测、图像分割等。 3. 低秩适配(Low-Rank Adaptation, LoRA) LoRA 是一种 PEFT 的微调方法,通过在预训练模型的权重矩阵中引入低秩矩阵来适配新任务,而无需大幅调整原有模型的参数。这种方法能够显著减少微调过程中新增的参数量,同时保持或提升模型性能。 在矩阵理论中,秩(Rank)指的是矩阵中线性无关行或列的最大数量。一个矩阵的秩决定了其线性独立性的程度。 满秩矩阵:如果一个 m×n 矩阵的秩 r 等于其最小维度 min⁡(m,n),则称其为满秩矩阵。 低秩矩阵:如果一个 m×n 矩阵的秩 r满足 r≪min⁡(m,n),即远小于其最小维度,则称其为低秩矩阵。 低秩矩阵: 在保持模型表现的同时,通过引入低秩矩阵在特定层(如 Transformer 的自注意力层)中调整权重。 参数冻结 : 预训练模型的原始参数冻结,仅训练新增的低秩矩阵参数。 4. 知识蒸馏(Knowledge Distillation) 知识蒸馏是通过将大型复杂模型(教师模型)的知识传递给小型高效模型(学生模型),以实现模型压缩和性能优化的技术。尽管知识蒸馏主要用于模型压缩,但它也可以作为微调的一种补充技术,进一步提升模型在特定任务上的表现。 基本原理 : 教师模型 : 在大规模数据集上训练好的高性能模型。 学生模型 : 结构更简单、参数更少的模型,旨在模仿教师模型的行为。 蒸馏过程 : 通过让学生模型学习教师模型的输出(如软概率分布、特征表示等),传递教师模型的知识。 小小成本就能干大事,2025 年初 DeepSeek-R1 横空出世,671B 参数,训练仅消耗 278.8 万 GPU 小时,成本约为 GPT-4 的 1/200。是不是可以理解为什么 OpenAI 会公开质疑 DeepSeek 可能通过蒸馏 “窃取” 其技术成果。 当然已被《 DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning 》打脸 https://arxiv.org/abs/2501.12948 Hugging face Hugging Face 提供了 模型 + 数据集 + 工具 + 社区 的一站式 AI 开发者平台,无论是想快速调用预训练模型的新手,还是需要大规模分布式训练的企业,都能在平台上找到对应的解决方案: 海量预训练模型 : 提供超过 10 万 + 预训练模型,支持 NLP、计算机视觉、语音处理、多模态等任务,覆盖分类、生成、翻译、摘要、问答等多种场景。 丰富的公开数据集 : 收录超 5 万 + 公开数据集,涵盖文本、图像、语音、表格等类型,如 IMDB 影评、MNIST、COCO、维基百科等,支持一键加载。 数据处理工具 : 提供 datasets 库,支持数据清洗、预处理、分拆(如训练集 / 验证集 / 测试集),兼容多种格式(CSV、JSON、Parquet 等)。 快速部署演示 : 通过 “Hugging Face Spaces”,用户可直接在浏览器中部署模型演示(Demo),支持 Gradio、Streamlit、HTML 等界面,无需复杂服务器配置。 开源生态 : 核心库(Transformers、Datasets 等)完全开源,社区贡献活跃,文档丰富,适合研究者、开发者和企业使用。 学习使用的预训练模型及数据集都可以在 Hugging face 获取,也可以瞅瞅  ModelScope。 使用预训练模型 IMDB 影评数据集包含 5 万条电影评论(2.5 万训练/2.5 万测试),标注为正面/负面情感,是情感分析领域的标杆数据集。 文本长度适中(平均 200-300 词),适合验证模型的长文本理解能力。 已完成预处理(去除 HTML 标签、统一格式),可直接使用。 接下来我们使用预训练的 bert-base-uncased 模型,对 IMDB 电影评论数据集进行情感分析,也就是判断评论是积极的还是消极的 因为需要下载 Hugging face 的数据集与预训练模型,代码本地运行需要保证对 Hugging face 的访问畅通。 导入必要的库 import torchfrom torch.utils.data import Dataset, DataLoaderfrom torch.optim import AdamWfrom transformers import BertTokenizer, BertForSequenceClassification, get_linear_schedule_with_warmupfrom datasets import load_datasetimport numpy as npfrom sklearn.metrics import accuracy_score, f1_score torch :  PyTorch 的核心库。 Dataset, DataLoader :  Dataset 用于定义数据集,DataLoader 用于批量加载数据。 AdamW :  一种基于 Adam 优化器的变体,添加了权重衰减(weight decay)。 Transformers :  Hugging Face 提供的预训练模型库 BertTokenizer 用于分词 BertForSequenceClassification 用于序列分类任务 get_linear_schedule_with_warmup 是学习率调度器,线性递减并带有预热阶段 datasets :  Hugging Face 的数据集库,load_dataset 用于加载各种公开数据集。 accuracy_score, f1_score :  sklearn 提供的评估指标,用于计算准确率和 F1 分数。 定义数据集类 IMDBDataset 继承自 PyTorch 的  Dataset  类,用于封装 IMDB 数据集: # 自定义数据集类:将 IMDB 数据集转换为 PyTorch 可用的格式class IMDBDataset(Dataset):    """    自定义数据集类,用于处理IMDB电影评论数据        参数:        dataset: Hugging Face数据集对象        tokenizer: BERT 分词器        max_length: 序列最大长度    """    def __init__(self, dataset, tokenizer, max_length):        self.dataset = dataset          # 原始数据集        self.tokenizer = tokenizer      # BERT分词器        self.max_length = max_length    # 序列最大长度        def __len__(self):        """返回数据集中样本的数量"""        return len(self.dataset)        def __getitem__(self, idx):        """获取指定索引的数据样本并进行预处理"""        # 获取文本和标签        text = self.dataset[idx]['text']        label = self.dataset[idx]['label']                # 使用BERT分词器对文本进行编码        encoding = self.tokenizer.encode_plus(            text,            add_special_tokens=True,      # 添加[CLS]和[SEP]特殊标记            max_length=self.max_length,   # 最大序列长度            padding='max_length',         # 填充到最大长度            truncation=True,              # 截断超长序列            return_tensors='pt'           # 返回PyTorch张量        )                # 返回模型所需的输入格式        return {            'input_ids': encoding['input_ids'].flatten(),              # 输入ID            'attention_mask': encoding['attention_mask'].flatten(),    # 注意力掩码            'labels': torch.tensor(label, dtype=torch.long)            # 标签        } 加载 IMDB 数据集 使用  load_dataset  从 Hugging Face 的数据集库中加载 IMDB 数据集: print("1. 数据准备阶段")print("正在加载 IMDB 数据集...")# 从 Hugging Face 加载 IMDB 电影评论数据集imdb_dataset = load_dataset('imdb')print("成功加载 IMDB 数据集") 划分训练集和验证集 使用 Hugging Face 数据集库自带的  train_test_split  方法,将训练集划分为训练集和验证集,比例为 80% 训练,20% 验证。 # 将训练集分割为训练集和验证集(80%-20%分割)print("划分训练集和验证集...")train_val_split = imdb_dataset['train'].train_test_split(test_size=0.2, seed=42)train_data = train_val_split['train']# train_test_split 验证集被命名为 'test'val_data = train_val_split['test']print(f"训练集样本数: {len(train_data)}, 验证集样本数: {len(val_data)}") 加载分词器和模型 # 2. 模型初始化阶段print("2. 模型初始化阶段")print("加载 BERT 模型和分词器...")# 加载预训练的BERT分词器和模型tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2)print("成功加载 BERT 模型和分词器") 分词器 (BertTokenizer): 加载预训练的 bert-base-uncased 分词器,该分词器将文本分割成小的词片段,并将其转换为对应的词汇表索引。 uncased  表示分词器会将文本转换为小写,忽略大小写信息。 模型 (BertForSequenceClassification): 加载预训练的 bert-base-uncased 模型,并在顶部添加一个用于序列分类的全连接层。 num_labels=2  表示分类任务有两个类别(正面和负面)。 bert-base-uncased  模型,包含 1.1 亿个参数,每个参数通常以 32 位浮点数(FP32) 存储,每个 FP32 占 4 字节,下载和占用磁盘空间 440M 左右。 定义数据集和数据加载器 使用前面定义的  IMDBDataset  类,将训练集、验证集和测试集封装为 PyTorch 数据集对象。 # 设置序列最大长度并创建数据集对象max_length = 128print(f"创建数据集对象,序列最大长度: {max_length}")train_dataset = IMDBDataset(train_data, tokenizer, max_length)val_dataset = IMDBDataset(val_data, tokenizer, max_length)test_dataset = IMDBDataset(imdb_dataset['test'], tokenizer, max_length) max_length=128  指定每条文本的最大长度为 128 个 token,超出部分会被截断,未达到的部分会被填充。 # 创建数据加载器batch_size = 16print(f"创建数据加载器,批次大小: {batch_size}")train_dataloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)val_dataloader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False)test_dataloader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False) shuffle=True  表示每个 epoch 前会打乱数据,增强模型的泛化能力。 定义优化器和学习率调度器 # 设置优化器和学习率调度器print("配置优化器和学习率调度器")learning_rate = 2e-5optimizer = AdamW(model.parameters(), lr=learning_rate)# 计算总训练步数num_epochs = 3total_steps = len(train_dataloader) * num_epochs# 创建学习率调度器,在训练过程中逐步降低学习率scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps=0, num_training_steps=total_steps) 使用 AdamW 优化器,根据损失函数的梯度信息,调整模型参数(如权重、偏置),以最小化损失函数。 get_linear_schedule_with_warmup 创建一个线性学习率调度器,该调度器会在训练过程中逐步调整学习率,帮助模型更好地收敛 num_warmup_steps=0 : 无预热阶段,从一开始就使用线性递减。 num_training_steps=total_steps : 总训练步数,等于每个 epoch 的步数乘以 epoch 数。 设备设置 检查是否有可用的 GPU( cuda ),如果有,则使用 GPU 加速训练,否则使用 CPU。 # 设置运行设备(GPU/CPU)device = torch.device('cuda'if torch.cuda.is_available() else'cpu')print(f"运行设备: {device}")model.to(device)  # 将模型移动到指定设备 如果没有 GPU 预计需要 3 小时左右跑完。 训练模型 训练三轮,每一轮中先进行训练,再进行验证,计算训练损失、验证损失和验证准确率。如果当前验证准确率超过之前的最佳值,更新  best_val_accuracy  并保存模型的状态字典到  best_model.pth 。 # 3. 模型训练阶段print("\n3. 模型训练阶段")print(f"开始训练,总周期数: {num_epochs}")best_val_accuracy = 0for epoch in range(num_epochs):    print(f"\n开始第 {epoch + 1}/{num_epochs} 个训练周期")        # 训练模式    model.train()    total_train_loss = 0    print("训练中...")    for batch in train_dataloader:        # 将数据移动到指定设备        input_ids = batch['input_ids'].to(device)        attention_mask = batch['attention_mask'].to(device)        labels = batch['labels'].to(device)                # 清除之前的梯度        optimizer.zero_grad()                # 前向传播        outputs = model(input_ids, attention_mask=attention_mask, labels=labels)        loss = outputs.loss        total_train_loss += loss.item()                # 反向传播        loss.backward()                # 更新参数        optimizer.step()        scheduler.step()  # 更新学习率        # 计算平均训练损失    avg_train_loss = total_train_loss / len(train_dataloader)        # 验证模式    print("验证中...")    model.eval()  # 设置为评估模式    val_predictions = []    val_true_labels = []    total_val_loss = 0    with torch.no_grad():  # 不计算梯度        for batch in val_dataloader:            # 将数据移动到指定设备            input_ids = batch['input_ids'].to(device)            attention_mask = batch['attention_mask'].to(device)            labels = batch['labels'].to(device)                        # 前向传播            outputs = model(input_ids, attention_mask=attention_mask, labels=labels)            loss = outputs.loss            total_val_loss += loss.item()                        # 获取预测结果            logits = outputs.logits            preds = torch.argmax(logits, dim=1)                        # 收集预测结果和真实标签            val_predictions.extend(preds.cpu().tolist())            val_true_labels.extend(labels.cpu().tolist())        # 计算验证指标    avg_val_loss = total_val_loss / len(val_dataloader)    val_accuracy = accuracy_score(val_true_labels, val_predictions)    print(f'第 {epoch + 1} 个周期: 训练损失 = {avg_train_loss:.4f}, 验证损失 = {avg_val_loss:.4f}, 验证准确率 = {val_accuracy:.4f}')        # 保存最佳模型    if val_accuracy > best_val_accuracy:        best_val_accuracy = val_accuracy        print(f"发现更好的模型,保存模型权重 (准确率: {val_accuracy:.4f})")        torch.save(model.state_dict(), 'best_model.pth') 前向传播 (Forward Propagation)和 反向传播 (Backward Propagation)是深度学习中两个至关重要的概念,它们共同构成了神经网络模型训练的核心流程 前向传播是指将输入数据(代码中的 input_ids 和 attention_mask)依次通过神经网络的各个层,经过一系列的线性变换和非线性激活函数处理,最终得到模型的预测输出。 反向传播是在得到损失值之后,通过链式法则计算损失函数对模型中每个参数的梯度。通过计算梯度,可以知道应该如何调整模型的参数,使得损失函数的值减小,从而提高模型的性能。 第 1 个周期: 训练损失 = 0.3398, 验证损失 = 0.2854, 验证准确率 = 0.8792 发现更好的模型,保存模型权重 (准确率: 0.8792) 第 2 个周期: 训练损失 = 0.1799, 验证损失 = 0.2949, 验证准确率 = 0.8864 发现更好的模型,保存模型权重 (准确率: 0.8864) 第 3 个周期: 训练损失 = 0.0822, 验证损失 = 0.3687, 验证准确率 = 0.8888 发现更好的模型,保存模型权重 (准确率: 0.8888) 模型评估 # 4. 模型评估阶段 print ( "\n4. 模型评估阶段" ) # 加载训练过程中保存的最佳模型 print ( "加载最佳模型权重..." ) model.load_state_dict(torch.load( 'best_model.pth' )) # 在测试集上评估模型 print ( "在测试集上评估模型..." ) model. eval ()   # 设置为评估模式 predictions = [] true_labels = [] with  torch.no_grad():   # 不计算梯度      for  batch  in  test_dataloader:          # 将数据移动到指定设备         input_ids = batch[ 'input_ids' ].to(device)         attention_mask = batch[ 'attention_mask' ].to(device)         labels = batch[ 'labels' ].to(device)                   # 前向传播         outputs = model(input_ids, attention_mask=attention_mask)         logits = outputs.logits         preds = torch.argmax(logits, dim= 1 )                   # 收集预测结果和真实标签         predictions.extend(preds.cpu().tolist())         true_labels.extend(labels.cpu().tolist()) # 计算评估指标 accuracy = accuracy_score(true_labels, predictions) f1 = f1_score(true_labels, predictions) print ( f'测试集准确率:  {accuracy: .4 f} ' ) print ( f'测试集F1分数:  {f1: .4 f} ' ) 自定义测试 自定义一个测试函数: # 定义情感预测函数:用于对新文本进行情感分析 def   predict_sentiment ( text, tokenizer, model, max_length= 128 , device= 'cpu' ):      """     使用训练好的BERT模型对文本进行情感分析          参数:         text: 要分析的文本字符串         tokenizer: BERT分词器         model: 训练好的BERT模型         max_length: 序列最大长度         device: 运行设备('cpu'或'cuda')              返回:         包含情感预测结果的字典     """      # 预处理文本     encoding = tokenizer.encode_plus(         text,         add_special_tokens= True ,         max_length=max_length,         padding= 'max_length' ,         truncation= True ,         return_tensors= 'pt'     )      # 将张量移动到指定设备     input_ids = encoding[ 'input_ids' ].to(device)     attention_mask = encoding[ 'attention_mask' ].to(device)      # 预测阶段     model. eval ()   # 设置为评估模式      with  torch.no_grad():   # 不计算梯度,节省内存         outputs = model(input_ids, attention_mask=attention_mask)         logits = outputs.logits          # 转换为概率值         prob = torch.softmax(logits, dim= 1 ).squeeze().cpu().numpy()      # 解析结果     negative_prob = prob[ 0 ]   # 负面情感概率     positive_prob = prob[ 1 ]   # 正面情感概率     sentiment =  'positive' if  positive_prob >  0.5 else 'negative'    # 情感判断           # 返回预测结果      return  {          'text' : text,          'sentiment' : sentiment,          'negative_prob' :  f' {negative_prob: .4 f} ' ,          'positive_prob' :  f' {positive_prob: .4 f} '     } 对自定义文本进行测试: # 5. 自定义文本测试print("\n5. 自定义文本测试")print("对自定义文本进行情感分析...")custom_text = "This film is a masterpiece! The cinematography and soundtrack are unparalleled."print(f"输入文本: {custom_text}")result = predict_sentiment(custom_text, tokenizer, model, device=device)print(f"预测结果: {result['sentiment']} (积极概率: {result['positive_prob']}, 消极概率: {result['negative_prob']})") 输出: 测试集准确率: 0.8857 测试集F1分数: 0.8842 5. 自定义文本测试 对自定义文本进行情感分析... 输入文本: This film is a masterpiece! The cinematography and soundtrack are unparalleled. 预测结果: positive (积极概率: 0.9983, 消极概率: 0.0017) done! # 程序完成print("\n程序执行完毕!")
Markdown
2026年4月9日 周四晚上19:30分,来了解“从个人单点提效,到构建企业AI生产力”(限30人) [抢占你的席位](https://www.53ai.com/huiyiliebiao/2026031686403.html) [![](https://static.53ai.com/assets/static/images/logo.png)](https://www.53ai.com/) ![](https://static.53ai.com/uploads/20240311/eb21a9e0409ab946254c64427055a5fa.png) 免费POC, 零成本试错 [首页](https://www.53ai.com/) [产品服务](https://www.53ai.com/products/53AIBrain) - 热门场景 ![]() 工作+AI 大模型提升全员工作效率 [工作对话](https://www.53ai.com/product/gongzuoduihua) [内容创作](https://www.53ai.com/product/neirongchuangzuo) [方案撰写](https://www.53ai.com/product/zhinengwendang) [魔法菜单](https://www.53ai.com/product/mofacaidan) ![]() 业务+AI 大模型掌握企业知识与流程 [微信分身](https://www.53ai.com/product/weixinfenshen) [海外客服](https://www.53ai.com/product/haiwaikefu) [官网客服](https://www.53ai.com/product/guanwangkefu) [抖音客服](https://www.53ai.com/product/douyinkefu) [数字老师](https://www.53ai.com/product/shuzilaoshi) [数字督导](https://www.53ai.com/product/shuzidudao) [智能服务台](https://www.53ai.com/product/zhinengfuwutai) ![]() AIx业务 大模型驱动产品智能化改造 [智能问数](https://www.53ai.com/product/zhinengwenshu) [智能审核](https://www.53ai.com/product/zhinengshenhe) [智能工单](https://www.53ai.com/product/zhinenggongdan) [企微跟进助手](https://www.53ai.com/product/qiweigenjinzhushou) [智能报价](https://www.53ai.com/product/zhinengbaojia) [企微销售助手](https://www.53ai.com/product/qiweixiaoshouzhushou) [应用智改](https://www.53ai.com/product/zijianyingyong) [企微客服助手](https://www.53ai.com/product/qiweikefuzhushou) - 落地咨询 [![]() Consulting AI生产力教练 了解更多 \>](https://www.53ai.com/consulting.html) - 场景共创 [![]() Co-creation AI场景共创 了解更多 \>](https://www.53ai.com/fine-tuning.html) 热门产品 [![53AI Brain](https://static.53ai.com/uploads/20250429/f9ed1b6c2d16a688c5791a0057c2217d.png) 53AI Brain 让知识在人与AI之间高效流动](https://www.53ai.com/products/53AIBrain) [![53AI Studio](https://static.53ai.com/uploads/20250429/b2cd4330d03bce8eb0eb0332eb2954cd.png) 53AI Studio 高准确率的企业级智能体开发平台](https://www.53ai.com/products/53AIStudio) [![53AI Hub](https://static.53ai.com/uploads/20250429/94e6d990ee63512db567bc53c113e8bd.png) 53AI Hub开源 三分钟搭建出独立的企业AI门户](https://www.53ai.com/products/53AIHub) [![53AI Browser](https://static.53ai.com/uploads/20250429/05d03bb026421069826c64e2407ad7ee.png) 53AI Browser “AI专家”效率倍增的秘密武器 敬请期待...]() [客户案例](https://www.53ai.com/kehuanli.html) - 行业案例 [![政府央国企](https://static.53ai.com/uploads/20250718/14a52c018cf42a962cd782bc00deecaf.png) 政府央国企 政府央国企大模型落地应用案例](https://www.53ai.com/kehuanli/hangyeanli#solution-230) [![能源矿业](https://static.53ai.com/uploads/20250718/febd8ab7274bef72d77798177fa4b55a.png) 能源矿业 新能源与矿业大模型落地应用案例](https://www.53ai.com/kehuanli/hangyeanli#solution-231) [![电子科技](https://static.53ai.com/uploads/20250718/94f808db1b269c89e3da457d49752174.png) 电子科技 电子科技行业大模型落地应用案例](https://www.53ai.com/kehuanli/hangyeanli#solution-232) [![贸易流通](https://static.53ai.com/uploads/20250718/0816ed40b43b19540c8149301535a27e.png) 贸易流通 贸易流通大模型落地应用案例](https://www.53ai.com/kehuanli/hangyeanli#solution-235) [![制造行业](https://static.53ai.com/uploads/20250718/4c7688c517858072bee15b3eae9a8eb1.png) 制造行业 高端制造行业大模型落地应用案例](https://www.53ai.com/kehuanli/hangyeanli#solution-236) [![企科数服](https://static.53ai.com/uploads/20250718/20339b3fdb032d7ee0d009b2a3595191.png) 企科数服 企科数服行业大模型落地应用案例](https://www.53ai.com/kehuanli/hangyeanli#solution-237) [![生物医药](https://static.53ai.com/uploads/20250718/2640c0c52d0e598bf673372b5d771d4a.png) 生物医药 生物医药行业大模型落地应用案例](https://www.53ai.com/kehuanli/hangyeanli#solution-234) [![地产与消费品](https://static.53ai.com/uploads/20250718/f3e87229b4498063145a2c622d2072cc.png) 地产与消费品 地产与消费品行业大模型落地应用案例](https://www.53ai.com/kehuanli/hangyeanli#solution-233) - 场景案例 [![【智能问答】场景案例](https://static.53ai.com/assets/static/images/solution_icon_1.png) 【智能问答】场景案例 让大模型掌握企业的知识和流程](https://www.53ai.com/kehuanli/solution#solution-148) [![【应用智改】场景案例](https://static.53ai.com/assets/static/images/solution_icon_2.png) 【应用智改】场景案例 让大模型融入企业的产品和业务](https://www.53ai.com/kehuanli/solution#solution-149) [![【智能工单】场景案例](https://static.53ai.com/assets/static/images/solution_icon_3.png) 【智能工单】场景案例 让大模型创建和受理业务工单](https://www.53ai.com/kehuanli/solution#solution-150) [![【智能问数】场景案例](https://static.53ai.com/uploads/20250811/9be0a71f6e9b51b9cd9ca9b7dfeddd95.png) 【智能问数】场景案例 与业务系统数据对话式互动](https://www.53ai.com/kehuanli/solution#solution-151) [AI知识库](https://www.53ai.com/news.html) 企业AI落地知识库 [前沿技术](https://www.53ai.com/news/qianyanjishu) [大模型技术](https://www.53ai.com/news/LargeLanguageModel) [多模态技术](https://www.53ai.com/news/MultimodalLargeModel) [RAG技术](https://www.53ai.com/news/RAG) [知识图谱](https://www.53ai.com/news/knowledgegraph) [模型微调](https://www.53ai.com/news/finetuning) [Skill](https://www.53ai.com/news/tishicikuangjia) [提示词技巧](https://www.53ai.com/news/tishicijiqiao) [开源大模型](https://www.53ai.com/news/OpenSourceLLM) [智能硬件](https://www.53ai.com/news/zhinengyingjian) [Palantir](https://www.53ai.com/news/Palantir) [Agent框架](https://www.53ai.com/news/agentplatform) [langchain](https://www.53ai.com/news/langchain) [llamaindex](https://www.53ai.com/news/llamaindex) [RAGFlow](https://www.53ai.com/news/RAGFlow) [coze](https://www.53ai.com/news/coze) [Dify](https://www.53ai.com/news/dify) [Fastgpt](https://www.53ai.com/news/fastgpt) [Bisheng](https://www.53ai.com/news/Bisheng) [Qanything](https://www.53ai.com/news/Qanything) [MaxKB](https://www.53ai.com/news/MaxKB) [Openclaw](https://www.53ai.com/news/Openclaw) [行业应用](https://www.53ai.com/news/hangyeyingyong) [AI+汽车](https://www.53ai.com/news/AIqiche) [AI+金融](https://www.53ai.com/news/AIjinrong) [AI+工业](https://www.53ai.com/news/AIgongye) [AI+培训](https://www.53ai.com/news/AIpeixun) [AI+SaaS](https://www.53ai.com/news/AISaaS) [AI+电商](https://www.53ai.com/news/AIdianshang) [AI+医疗](https://www.53ai.com/news/AIyiliao) [企业落地](https://www.53ai.com/news/qiyejingying) [内容创作](https://www.53ai.com/news/neirongchuangzuo) [个人提效](https://www.53ai.com/news/gerentixiao) [智能客服](https://www.53ai.com/news/zhinengkefu) [AI面试](https://www.53ai.com/news/AImianshi) [数字员工](https://www.53ai.com/news/shuziyuangong) [ChatBI](https://www.53ai.com/news/zhinengbaobiao) [AI知识库](https://www.53ai.com/news/zhishiguanli) [智能营销](https://www.53ai.com/news/zhinengyingxiao) [智能化改造](https://www.53ai.com/news/zhinenghuagaizao) [Glean](https://www.53ai.com/news/Glean) [行业报告](https://www.53ai.com/hangyebaogao.html) [研究报告](https://www.53ai.com/hangyebaogao.html?report_type=%E7%A0%94%E7%A9%B6%E6%8A%A5%E5%91%8A) [行业报告](https://www.53ai.com/hangyebaogao.html?report_type=%E8%A1%8C%E4%B8%9A%E6%8A%A5%E5%91%8A) [技术分享](https://www.53ai.com/hangyebaogao.html?report_type=%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB) [专题报告](https://www.53ai.com/hangyebaogao.html?report_type=%E4%B8%93%E9%A2%98%E6%8A%A5%E5%91%8A) [课件讲义](https://www.53ai.com/hangyebaogao.html?report_type=%E8%AF%BE%E4%BB%B6%E8%AE%B2%E4%B9%89) [关于我们](https://www.53ai.com/about.html) [公司介绍](https://www.53ai.com/about/introduction) [渠道合作](https://www.53ai.com/about/cooperation) [GitHub Star 8.7K+](https://github.com/53ai/53aihub) [预约演示](https://www.53ai.com/trial.html) ![]() ![]() - [首页](https://www.53ai.com/) - [产品服务]() - [客户案例]() - [AI知识库]() - [关于我们]() 热门场景 ![]() 工作+AI [![]() 工作对话](https://www.53ai.com/product/gongzuoduihua) [![]() 内容创作](https://www.53ai.com/product/neirongchuangzuo) [![]() 方案撰写](https://www.53ai.com/product/zhinengwendang) [![]() 魔法菜单](https://www.53ai.com/product/mofacaidan) ![]() 业务+AI [![]() 微信分身](https://www.53ai.com/product/weixinfenshen) [![]() 海外客服](https://www.53ai.com/product/haiwaikefu) [![]() 官网客服](https://www.53ai.com/product/guanwangkefu) [![]() 抖音客服](https://www.53ai.com/product/douyinkefu) [![]() 数字老师](https://www.53ai.com/product/shuzilaoshi) [![]() 数字督导](https://www.53ai.com/product/shuzidudao) [![]() 智能服务台](https://www.53ai.com/product/zhinengfuwutai) ![]() AIx业务 [![]() 智能问数](https://www.53ai.com/product/zhinengwenshu) [![]() 智能审核](https://www.53ai.com/product/zhinengshenhe) [![]() 智能工单](https://www.53ai.com/product/zhinenggongdan) [![]() 企微跟进助手](https://www.53ai.com/product/qiweigenjinzhushou) [![]() 智能报价](https://www.53ai.com/product/zhinengbaojia) [![]() 企微销售助手](https://www.53ai.com/product/qiweixiaoshouzhushou) [![]() 应用智改](https://www.53ai.com/product/zijianyingyong) [![]() 企微客服助手](https://www.53ai.com/product/qiweikefuzhushou) [落地咨询](https://www.53ai.com/consulting.html) [场景共创](https://www.53ai.com/fine-tuning.html) 热门产品 [![53AI Brain](https://static.53ai.com/uploads/20250429/f9ed1b6c2d16a688c5791a0057c2217d.png) 53AI Brain 让知识在人与AI之间高效流动](https://www.53ai.com/products/53AIBrain) [![53AI Studio](https://static.53ai.com/uploads/20250429/b2cd4330d03bce8eb0eb0332eb2954cd.png) 53AI Studio 高准确率的企业级智能体开发平台](https://www.53ai.com/products/53AIStudio) [![53AI Hub](https://static.53ai.com/uploads/20250429/94e6d990ee63512db567bc53c113e8bd.png) 53AI Hub开源 三分钟搭建出独立的企业AI门户](https://www.53ai.com/products/53AIHub) [![53AI Browser](https://static.53ai.com/uploads/20250429/05d03bb026421069826c64e2407ad7ee.png) 53AI Browser “AI专家”效率倍增的秘密武器 敬请期待...]() [行业案例](https://www.53ai.com/kehuanli/hangyeanli) [场景案例](https://www.53ai.com/kehuanli/solution) [前沿技术](https://www.53ai.com/news/qianyanjishu) [Agent框架](https://www.53ai.com/news/agentplatform) [行业应用](https://www.53ai.com/news/hangyeyingyong) [企业落地](https://www.53ai.com/news/qiyejingying) [公司介绍](https://www.53ai.com/about/introduction) [渠道合作](https://www.53ai.com/about/cooperation) ![AI知识库](https://static.53ai.com/uploads/20250210/aec076a60258b0cc07078c8ea7dff92c.webp) 53AI知识库 学习大模型的前沿技术与行业应用场景 [立即咨询]() [预约演示]() [![](https://static.53ai.com/assets/static/images/tab1.png) 首页](https://www.53ai.com/) [AI知识库](https://www.53ai.com/news.html) [前沿技术](https://www.53ai.com/news/qianyanjishu) [大模型技术](https://www.53ai.com/news/LargeLanguageModel) ![](https://static.53ai.com/assets/static/images/edit-icon.png) 我要投稿 # AI 基础知识从 0.3 到 0.4——如何选对深度学习模型? 发布日期:2025-07-24 21:41:21 浏览次数: 2190 作者:阿里云开发者 ![](https://static.53ai.com/assets/static/images/detail-icon.png) 微信搜一搜,关注“阿里云开发者” 推荐语 深度学习模型选型指南:从CNN到Transformer,一文掌握主流模型架构与应用场景。 核心内容: 1. 模型架构与具体模型的本质区别解析 2. CNN、Transformer等主流架构的典型应用场景 3. 根据业务需求选择最佳模型的实战方法论 ![](https://static.53ai.com/assets/static/images/avatar.jpg) 杨芳贤 53AI创始人/腾讯云(TVP)最具价值专家 沿着 AI 的发展脉络,本系列文章从Seq2Seq到RNN,再到Transformer,直至今日强大的GPT模型,我们将带你一步步深入了解这些关键技术背后的原理与实现细节。无论你是初学者还是有经验的开发者,相信读完这个系列文章后,不仅能掌握Transformer的核心概念,还能对其在整个NLP领域中的位置有一个全面而深刻的认识。那就让我们一起开始这段学习之旅吧! *** 在深度学习的语境里“模型”是一个高频出现的词汇,我们听说过识别手写数字的 CNN 模型,处理自然语言的 Transformer 模型,还有能写文章、做对话的 GPT 模型,这么多模型我们在解决业务问题时候应该如何做选型? 模型与模型架构 仔细观察还会发现一个问题 —— GPT 模型只有一个,而 CNN、Transformer 却有很多,比如 ResNet、VGG 属于 CNN 家族,BERT、GPT 又都和 Transformer 相关,这些概念之间究竟是怎样的关系? 我们首先需要了解机器学习中两个关键概念——模型架构(Model Architecture)与具体模型(Trained Model)的区别。就像建筑设计中「蓝图」与「建成的房子」的关系 ——CNN 和 Transformer 是模型架构,类似于可复用的「设计蓝图」,允许开发者根据需求调整细节(如层数、参数),从而衍生出无数具体实现;而 GPT 则是基于 Transformer 蓝图构建并训练完成的「成品模型」,是前者的一个典型实例。 以之前讨论的手写数字分类任务为例: ``` model = keras.Sequential([    keras.Input(shape=(28, 28, 1)),  # 输入层(图像尺寸)    keras.layers.Conv2D(32, (3, 3), activation='relu'),  # 卷积层    keras.layers.MaxPooling2D((2, 2)),  # 池化层    keras.layers.Flatten(),  # 展平层    keras.layers.Dense(128, activation='relu'),  # 全连接层    keras.layers.Dense(10, activation='softmax')  # 输出层]) ``` 这里定义的是架构,描述了模型的层次、各层的类型、连接方式以及数据流动的路径。它是模型的 “骨架”,决定了模型如何处理输入数据、提取特征以及生成输出。 ``` # 训练模型model.compile(optimizer='adam',              loss='sparse_categorical_crossentropy',              metrics=['accuracy'])model.fit(    train_images.reshape(-1, 28, 28, 1), train_labels,     epochs=5, batch_size=32,    validation_data=(val_images.reshape(-1, 28, 28, 1), val_labels)) ``` 当上述架构通过`model.fit()`训练后,学习到具体的权重和偏置,也就产生了包含具体参数的模型,能够对新图像进行分类预测。因此可以这样理解 - 模型架构是模型的 “设计图纸”,决定了模型的结构和计算逻辑(无参数)。 - 模型是架构经过训练后的 “实例”,包含可学习的参数,能够实现具体的预测功能。 常见模型架构类型 > 个人理解工程同学首先要对常见的模型眼熟,比如目标检测任务能联想到 CNN、YOLO,这样 AI 就能帮大家开写代码了 ### 卷积神经网络 (Convolutional Neural Networks, CNNs) CNNs 通过卷积操作高效提取数据的局部空间特征,特别适用于具有网格状结构的数据,如图像。 典型模型: - LeNet-5:早期的 CNN,用于手写数字识别。 - AlexNet:在 ImageNet 竞赛中显著提升图像分类性能,推动深度学习的发展。 - VGGNet:通过加深网络(如 VGG16、VGG19)提升性能。 - ResNet (Residual Networks):引入残差模块,解决深层网络的梯度消失问题。 - EfficientNet:通过复合缩放方法优化模型规模与性能平衡。 - YOLO(You Only Look Once):为目标检测设计,提供了图像分类、目标检测、实例分割、关键点检测等任务支持 ### 循环神经网络 (Recurrent Neural Networks, RNNs) RNNs 通过其循环结构处理序列数据,能够捕捉时间上的依赖关系,适用于需要处理时序信息的任务。 典型模型: - 标准RNN:基础循环网络,存在梯度消失问题。 - 长短期记忆网络 (Long Short-Term Memory, LSTM):引入门控机制,解决梯度消失问题。 - 门控循环单元 (Gated Recurrent Units, GRU):结构更简洁,计算效率更高,功能类似于LSTM。 - 双向 RNN (Bi-directional RNNs):双向处理序列,提高信息捕捉能力。 ### Transformer 模型 Transformer 基于自注意力机制,能够并行处理整个序列,擅长捕捉长距离依赖关系,广泛应用于 NLP 和计算机视觉领域。 典型模型: - Transformer (原始模型):用于机器翻译任务。 - BERT (Bidirectional Encoder Representations from Transformers):预训练语言模型,用于多种 NLP 任务。 - GPT (Generative Pre-trained Transformer) 系列:用于文本生成、对话系统等。 - Vision Transformer (ViT):将 Transformer 应用于图像分类。 - DETR (DEtection TRansformer):用于目标检测任务。 ### 生成对抗网络 (Generative Adversarial Networks, GANs) GANs 通过生成器与判别器的对抗训练,实现高质量数据的生成,广泛应用于生成任务和数据增强。 典型模型: - 原始 GAN:最基础的生成对抗框架。 - DCGAN (Deep Convolutional GAN):结合卷积神经网络提升图像生成效果。 - StyleGAN:生成高质量的人脸图像,并可控制样式特征。 - CycleGAN:实现无监督的图像到图像转换,如马到斑马。 - BigGAN:大规模GAN模型,提升生成图像的质量与多样性。 ### 图神经网络 (Graph Neural Networks, GNNs) GNNs 专为处理图结构数据设计,通过节点间的连接关系传递和聚合信息,适用于复杂的关系数据。 典型模型: - Graph Convolutional Networks (GCNs):基于图卷积操作进行特征提取。 - Graph Attention Networks (GATs):引入注意力机制,动态分配邻居节点的权重。 - GraphSAGE:通过采样邻居节点,实现大规模图数据的高效训练。 ### 总结 不同架构因设计原理的差异,在数据处理、特征提取和任务适配上各有专攻,适用于不同类型的任务: - 计算机视觉:CNN、ResNet、ViT(Vision Transformer) - 自然语言处理:RNN、LSTM、GRU、Transformer(如 BERT、GPT) - 生成任务:GAN、VAE - 图结构数据:GNN、GCN - 序列与时间数据:RNN、LSTM、GRU、Transformer 开始选择模型 拿到业务需求、收集数据、确定目标、选择模型架构,就可以开始进行模型训练了,但在机器学习开发的日常实践中,完全 从零开始训练模型的情况已越来越少,大多数开发者会基于任务需求与数据特性,优先选择在预训练模型基础上进行微调优化。这种站在巨人肩膀上的策略,既充分利用了大规模数据预训练积累的通用特征表示,又能通过轻量化的适配过程快速满足特定场景需求。 ### 预训练模型 预训练模型(Pre-trained Models)是在特定模型架构基础上,通过在大规模通用数据集上进行初步训练,学习到通用特征或知识,设定了具体参数的神经网络模型。 比如基于 Transformer 架构的 BERT、GPT 系列模型,基于 CNN 架构的 ResNet-101、VGG16 等,都是预训练模型。这些预训练模型覆盖了自然语言处理、计算机视觉、音频处理、多模态任务和推荐系统等多个领域。开发者可以在 Hugging Face Hub、PyTorch Hub、TensorFlow Hub等平台,获取这些预训练模型。 Hugging Face Hub:https://huggingface.co/models PyTorch Hub:https://pytorch.org/hub/ TensorFlow Hub:https://www.tensorflow.org/hub > 现在回头看 GPT (Generative Pre-trained Transformer) 是不是知道大概是什么意思了。 ### 微调 Fine-tuning 因为预训练模型一般使用通用数据集训练,为了更好的支持业务需求,开发者会对预训练模型进行微调。微调是指在预训练模型上,针对特定任务或特定数据集,进行少量参数的调整和训练,以使模型更好地适应新的任务需求。 随着模型规模的不断增大和应用场景的多样化,出现了多种微调方法,以提高效率、减少计算资源消耗或提升模型性能。 #### 1\. 标准微调(Standard Fine-tuning) 标准微调是最基本的微调方法,即将预训练模型在特定任务的数据集上进行全量参数的进一步训练。通常情况下,微调时会采用较低的学习率,以避免破坏预训练模型中学到的通用特征。 - 优点:简单直接,效果较好,尤其适用于目标任务与预训练任务相似的情况。 - 缺点:大模型全量微调计算资源消耗高,可能导致过拟合,尤其在目标任务数据量较小时。 2\. 监督微调(Supervised Fine-Tuning, SFT) 监督微调是在标准微调基础上,利用有标注数据进行进一步训练,旨在提升模型在特定监督任务上的表现。SFT 通常应用于需要明确标签的任务,如分类、序列标注等。 - 自然语言处理:文本分类、命名实体识别、机器翻译等。 - 计算机视觉:图像分类、目标检测、图像分割等。 3\. 低秩适配(Low-Rank Adaptation, LoRA) LoRA 是一种 PEFT 的微调方法,通过在预训练模型的权重矩阵中引入低秩矩阵来适配新任务,而无需大幅调整原有模型的参数。这种方法能够显著减少微调过程中新增的参数量,同时保持或提升模型性能。 > 在矩阵理论中,秩(Rank)指的是矩阵中线性无关行或列的最大数量。一个矩阵的秩决定了其线性独立性的程度。 > > 满秩矩阵:如果一个 m×n 矩阵的秩 r 等于其最小维度 min⁡(m,n),则称其为满秩矩阵。 > > 低秩矩阵:如果一个 m×n 矩阵的秩 r满足 r≪min⁡(m,n),即远小于其最小维度,则称其为低秩矩阵。 - 低秩矩阵:在保持模型表现的同时,通过引入低秩矩阵在特定层(如 Transformer 的自注意力层)中调整权重。 - 参数冻结:预训练模型的原始参数冻结,仅训练新增的低秩矩阵参数。 4\. 知识蒸馏(Knowledge Distillation) 知识蒸馏是通过将大型复杂模型(教师模型)的知识传递给小型高效模型(学生模型),以实现模型压缩和性能优化的技术。尽管知识蒸馏主要用于模型压缩,但它也可以作为微调的一种补充技术,进一步提升模型在特定任务上的表现。 基本原理: - 教师模型:在大规模数据集上训练好的高性能模型。 - 学生模型:结构更简单、参数更少的模型,旨在模仿教师模型的行为。 - 蒸馏过程:通过让学生模型学习教师模型的输出(如软概率分布、特征表示等),传递教师模型的知识。 小小成本就能干大事,2025 年初 DeepSeek-R1 横空出世,671B 参数,训练仅消耗 278.8 万 GPU 小时,成本约为 GPT-4 的 1/200。是不是可以理解为什么 OpenAI 会公开质疑 DeepSeek 可能通过蒸馏 “窃取” 其技术成果。 > 当然已被《DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning》打脸 > > https://arxiv.org/abs/2501.12948 Hugging face Hugging Face提供了 模型 + 数据集 + 工具 + 社区 的一站式 AI 开发者平台,无论是想快速调用预训练模型的新手,还是需要大规模分布式训练的企业,都能在平台上找到对应的解决方案: - 海量预训练模型:提供超过 10 万 + 预训练模型,支持 NLP、计算机视觉、语音处理、多模态等任务,覆盖分类、生成、翻译、摘要、问答等多种场景。 - 丰富的公开数据集:收录超 5 万 + 公开数据集,涵盖文本、图像、语音、表格等类型,如 IMDB 影评、MNIST、COCO、维基百科等,支持一键加载。 - 数据处理工具:提供 datasets 库,支持数据清洗、预处理、分拆(如训练集 / 验证集 / 测试集),兼容多种格式(CSV、JSON、Parquet 等)。 - 快速部署演示:通过 “Hugging Face Spaces”,用户可直接在浏览器中部署模型演示(Demo),支持 Gradio、Streamlit、HTML 等界面,无需复杂服务器配置。 - 开源生态:核心库(Transformers、Datasets 等)完全开源,社区贡献活跃,文档丰富,适合研究者、开发者和企业使用。 学习使用的预训练模型及数据集都可以在 Hugging face 获取,也可以瞅瞅 ModelScope。 使用预训练模型 IMDB 影评数据集包含 5 万条电影评论(2.5 万训练/2.5 万测试),标注为正面/负面情感,是情感分析领域的标杆数据集。 - 文本长度适中(平均 200-300 词),适合验证模型的长文本理解能力。 - 已完成预处理(去除 HTML 标签、统一格式),可直接使用。 接下来我们使用预训练的 bert-base-uncased 模型,对 IMDB 电影评论数据集进行情感分析,也就是判断评论是积极的还是消极的 > 因为需要下载 Hugging face 的数据集与预训练模型,代码本地运行需要保证对 Hugging face 的访问畅通。 ### 导入必要的库 ``` import torchfrom torch.utils.data import Dataset, DataLoaderfrom torch.optim import AdamWfrom transformers import BertTokenizer, BertForSequenceClassification, get_linear_schedule_with_warmupfrom datasets import load_datasetimport numpy as npfrom sklearn.metrics import accuracy_score, f1_score ``` - torch: PyTorch 的核心库。 - Dataset, DataLoader: Dataset 用于定义数据集,DataLoader 用于批量加载数据。 - AdamW: 一种基于 Adam 优化器的变体,添加了权重衰减(weight decay)。 - Transformers: Hugging Face 提供的预训练模型库 - BertTokenizer 用于分词 - BertForSequenceClassification 用于序列分类任务 - get\_linear\_schedule\_with\_warmup 是学习率调度器,线性递减并带有预热阶段 - datasets: Hugging Face 的数据集库,load\_dataset 用于加载各种公开数据集。 - accuracy\_score, f1\_score: sklearn 提供的评估指标,用于计算准确率和 F1 分数。 ### 定义数据集类 IMDBDataset 继承自 PyTorch 的 `Dataset` 类,用于封装 IMDB 数据集: ``` # 自定义数据集类:将 IMDB 数据集转换为 PyTorch 可用的格式class IMDBDataset(Dataset):    """    自定义数据集类,用于处理IMDB电影评论数据        参数:        dataset: Hugging Face数据集对象        tokenizer: BERT 分词器        max_length: 序列最大长度    """    def __init__(self, dataset, tokenizer, max_length):        self.dataset = dataset          # 原始数据集        self.tokenizer = tokenizer      # BERT分词器        self.max_length = max_length    # 序列最大长度        def __len__(self):        """返回数据集中样本的数量"""        return len(self.dataset)        def __getitem__(self, idx):        """获取指定索引的数据样本并进行预处理"""        # 获取文本和标签        text = self.dataset[idx]['text']        label = self.dataset[idx]['label']                # 使用BERT分词器对文本进行编码        encoding = self.tokenizer.encode_plus(            text,            add_special_tokens=True,      # 添加[CLS]和[SEP]特殊标记            max_length=self.max_length,   # 最大序列长度            padding='max_length',         # 填充到最大长度            truncation=True,              # 截断超长序列            return_tensors='pt'           # 返回PyTorch张量        )                # 返回模型所需的输入格式        return {            'input_ids': encoding['input_ids'].flatten(),              # 输入ID            'attention_mask': encoding['attention_mask'].flatten(),    # 注意力掩码            'labels': torch.tensor(label, dtype=torch.long)            # 标签        } ``` ### 加载 IMDB 数据集 使用 `load_dataset` 从 Hugging Face 的数据集库中加载 IMDB 数据集: ``` print("1. 数据准备阶段")print("正在加载 IMDB 数据集...")# 从 Hugging Face 加载 IMDB 电影评论数据集imdb_dataset = load_dataset('imdb')print("成功加载 IMDB 数据集") ``` ### 划分训练集和验证集 使用 Hugging Face 数据集库自带的 `train_test_split` 方法,将训练集划分为训练集和验证集,比例为 80% 训练,20% 验证。 ``` # 将训练集分割为训练集和验证集(80%-20%分割)print("划分训练集和验证集...")train_val_split = imdb_dataset['train'].train_test_split(test_size=0.2, seed=42)train_data = train_val_split['train']# train_test_split 验证集被命名为 'test'val_data = train_val_split['test']print(f"训练集样本数: {len(train_data)}, 验证集样本数: {len(val_data)}") ``` ### 加载分词器和模型 ``` # 2. 模型初始化阶段print("2. 模型初始化阶段")print("加载 BERT 模型和分词器...")# 加载预训练的BERT分词器和模型tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2)print("成功加载 BERT 模型和分词器") ``` - 分词器 (BertTokenizer): - 加载预训练的 bert-base-uncased 分词器,该分词器将文本分割成小的词片段,并将其转换为对应的词汇表索引。 - uncased 表示分词器会将文本转换为小写,忽略大小写信息。 - 模型 (BertForSequenceClassification): - 加载预训练的 bert-base-uncased 模型,并在顶部添加一个用于序列分类的全连接层。 - num\_labels=2 表示分类任务有两个类别(正面和负面)。 `bert-base-uncased` 模型,包含 1.1 亿个参数,每个参数通常以 32 位浮点数(FP32) 存储,每个 FP32 占 4 字节,下载和占用磁盘空间 440M 左右。 ### 定义数据集和数据加载器 使用前面定义的 `IMDBDataset` 类,将训练集、验证集和测试集封装为 PyTorch 数据集对象。 ``` # 设置序列最大长度并创建数据集对象max_length = 128print(f"创建数据集对象,序列最大长度: {max_length}")train_dataset = IMDBDataset(train_data, tokenizer, max_length)val_dataset = IMDBDataset(val_data, tokenizer, max_length)test_dataset = IMDBDataset(imdb_dataset['test'], tokenizer, max_length) ``` `max_length=128` 指定每条文本的最大长度为 128 个 token,超出部分会被截断,未达到的部分会被填充。 ``` # 创建数据加载器batch_size = 16print(f"创建数据加载器,批次大小: {batch_size}")train_dataloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)val_dataloader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False)test_dataloader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False) ``` `shuffle=True` 表示每个 epoch 前会打乱数据,增强模型的泛化能力。 ### 定义优化器和学习率调度器 ``` # 设置优化器和学习率调度器print("配置优化器和学习率调度器")learning_rate = 2e-5optimizer = AdamW(model.parameters(), lr=learning_rate)# 计算总训练步数num_epochs = 3total_steps = len(train_dataloader) * num_epochs# 创建学习率调度器,在训练过程中逐步降低学习率scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps=0, num_training_steps=total_steps) ``` - 使用 AdamW 优化器,根据损失函数的梯度信息,调整模型参数(如权重、偏置),以最小化损失函数。 - get\_linear\_schedule\_with\_warmup 创建一个线性学习率调度器,该调度器会在训练过程中逐步调整学习率,帮助模型更好地收敛 - num\_warmup\_steps=0: 无预热阶段,从一开始就使用线性递减。 - num\_training\_steps=total\_steps: 总训练步数,等于每个 epoch 的步数乘以 epoch 数。 ### 设备设置 检查是否有可用的 GPU(`cuda`),如果有,则使用 GPU 加速训练,否则使用 CPU。 ``` # 设置运行设备(GPU/CPU)device = torch.device('cuda'if torch.cuda.is_available() else'cpu')print(f"运行设备: {device}")model.to(device)  # 将模型移动到指定设备 ``` > 如果没有 GPU 预计需要 3 小时左右跑完。 ### 训练模型 训练三轮,每一轮中先进行训练,再进行验证,计算训练损失、验证损失和验证准确率。如果当前验证准确率超过之前的最佳值,更新 `best_val_accuracy` 并保存模型的状态字典到 `best_model.pth。` ``` # 3. 模型训练阶段print("\n3. 模型训练阶段")print(f"开始训练,总周期数: {num_epochs}")best_val_accuracy = 0for epoch in range(num_epochs):    print(f"\n开始第 {epoch + 1}/{num_epochs} 个训练周期")        # 训练模式    model.train()    total_train_loss = 0    print("训练中...")    for batch in train_dataloader:        # 将数据移动到指定设备        input_ids = batch['input_ids'].to(device)        attention_mask = batch['attention_mask'].to(device)        labels = batch['labels'].to(device)                # 清除之前的梯度        optimizer.zero_grad()                # 前向传播        outputs = model(input_ids, attention_mask=attention_mask, labels=labels)        loss = outputs.loss        total_train_loss += loss.item()                # 反向传播        loss.backward()                # 更新参数        optimizer.step()        scheduler.step()  # 更新学习率        # 计算平均训练损失    avg_train_loss = total_train_loss / len(train_dataloader)        # 验证模式    print("验证中...")    model.eval()  # 设置为评估模式    val_predictions = []    val_true_labels = []    total_val_loss = 0    with torch.no_grad():  # 不计算梯度        for batch in val_dataloader:            # 将数据移动到指定设备            input_ids = batch['input_ids'].to(device)            attention_mask = batch['attention_mask'].to(device)            labels = batch['labels'].to(device)                        # 前向传播            outputs = model(input_ids, attention_mask=attention_mask, labels=labels)            loss = outputs.loss            total_val_loss += loss.item()                        # 获取预测结果            logits = outputs.logits            preds = torch.argmax(logits, dim=1)                        # 收集预测结果和真实标签            val_predictions.extend(preds.cpu().tolist())            val_true_labels.extend(labels.cpu().tolist())        # 计算验证指标    avg_val_loss = total_val_loss / len(val_dataloader)    val_accuracy = accuracy_score(val_true_labels, val_predictions)    print(f'第 {epoch + 1} 个周期: 训练损失 = {avg_train_loss:.4f}, 验证损失 = {avg_val_loss:.4f}, 验证准确率 = {val_accuracy:.4f}')        # 保存最佳模型    if val_accuracy > best_val_accuracy:        best_val_accuracy = val_accuracy        print(f"发现更好的模型,保存模型权重 (准确率: {val_accuracy:.4f})")        torch.save(model.state_dict(), 'best_model.pth') ``` 前向传播(Forward Propagation)和反向传播(Backward Propagation)是深度学习中两个至关重要的概念,它们共同构成了神经网络模型训练的核心流程 - 前向传播是指将输入数据(代码中的 input\_ids 和 attention\_mask)依次通过神经网络的各个层,经过一系列的线性变换和非线性激活函数处理,最终得到模型的预测输出。 - 反向传播是在得到损失值之后,通过链式法则计算损失函数对模型中每个参数的梯度。通过计算梯度,可以知道应该如何调整模型的参数,使得损失函数的值减小,从而提高模型的性能。 ``` 第 1 个周期: 训练损失 = 0.3398, 验证损失 = 0.2854, 验证准确率 = 0.8792发现更好的模型,保存模型权重 (准确率: 0.8792)第 2 个周期: 训练损失 = 0.1799, 验证损失 = 0.2949, 验证准确率 = 0.8864发现更好的模型,保存模型权重 (准确率: 0.8864)第 3 个周期: 训练损失 = 0.0822, 验证损失 = 0.3687, 验证准确率 = 0.8888发现更好的模型,保存模型权重 (准确率: 0.8888) ``` ### 模型评估 ``` # 4. 模型评估阶段print("\n4. 模型评估阶段")# 加载训练过程中保存的最佳模型print("加载最佳模型权重...")model.load_state_dict(torch.load('best_model.pth'))# 在测试集上评估模型print("在测试集上评估模型...")model.eval()  # 设置为评估模式predictions = []true_labels = []with torch.no_grad():  # 不计算梯度    for batch in test_dataloader:        # 将数据移动到指定设备        input_ids = batch['input_ids'].to(device)        attention_mask = batch['attention_mask'].to(device)        labels = batch['labels'].to(device)                # 前向传播        outputs = model(input_ids, attention_mask=attention_mask)        logits = outputs.logits        preds = torch.argmax(logits, dim=1)                # 收集预测结果和真实标签        predictions.extend(preds.cpu().tolist())        true_labels.extend(labels.cpu().tolist())# 计算评估指标accuracy = accuracy_score(true_labels, predictions)f1 = f1_score(true_labels, predictions)print(f'测试集准确率: {accuracy:.4f}')print(f'测试集F1分数: {f1:.4f}') ``` ### 自定义测试 自定义一个测试函数: ``` # 定义情感预测函数:用于对新文本进行情感分析def predict_sentiment(text, tokenizer, model, max_length=128, device='cpu'):    """    使用训练好的BERT模型对文本进行情感分析        参数:        text: 要分析的文本字符串        tokenizer: BERT分词器        model: 训练好的BERT模型        max_length: 序列最大长度        device: 运行设备('cpu'或'cuda')            返回:        包含情感预测结果的字典    """    # 预处理文本    encoding = tokenizer.encode_plus(        text,        add_special_tokens=True,        max_length=max_length,        padding='max_length',        truncation=True,        return_tensors='pt'    )    # 将张量移动到指定设备    input_ids = encoding['input_ids'].to(device)    attention_mask = encoding['attention_mask'].to(device)    # 预测阶段    model.eval()  # 设置为评估模式    with torch.no_grad():  # 不计算梯度,节省内存        outputs = model(input_ids, attention_mask=attention_mask)        logits = outputs.logits        # 转换为概率值        prob = torch.softmax(logits, dim=1).squeeze().cpu().numpy()    # 解析结果    negative_prob = prob[0]  # 负面情感概率    positive_prob = prob[1]  # 正面情感概率    sentiment = 'positive'if positive_prob > 0.5else'negative'  # 情感判断        # 返回预测结果    return {        'text': text,        'sentiment': sentiment,        'negative_prob': f'{negative_prob:.4f}',        'positive_prob': f'{positive_prob:.4f}'    } ``` 对自定义文本进行测试: ``` # 5. 自定义文本测试print("\n5. 自定义文本测试")print("对自定义文本进行情感分析...")custom_text = "This film is a masterpiece! The cinematography and soundtrack are unparalleled."print(f"输入文本: {custom_text}")result = predict_sentiment(custom_text, tokenizer, model, device=device)print(f"预测结果: {result['sentiment']} (积极概率: {result['positive_prob']}, 消极概率: {result['negative_prob']})") ``` 输出: ``` 测试集准确率: 0.8857测试集F1分数: 0.88425. 自定义文本测试对自定义文本进行情感分析...输入文本: This film is a masterpiece! The cinematography and soundtrack are unparalleled.预测结果: positive (积极概率: 0.9983, 消极概率: 0.0017) ``` ### done! ``` # 程序完成print("\n程序执行完毕!") ``` [大模型技术原理](https://www.53ai.com/keyword/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%8A%80%E6%9C%AF%E5%8E%9F%E7%90%86) [大模型技术架构](https://www.53ai.com/keyword/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%8A%80%E6%9C%AF%E6%9E%B6%E6%9E%84) [大模型技术路线](https://www.53ai.com/keyword/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%8A%80%E6%9C%AF%E8%B7%AF%E7%BA%BF) 分享: ![]() ![]() ![]() ![]() 53AI,企业落地大模型首选服务商 **产品**:场景落地咨询+大模型应用平台+行业解决方案 **承诺**:免费POC验证,效果达标后再合作。**零风险落地应用大模型**,已交付160+中大型企业 [上一篇:面向 AI Agent 的搜索服务,小宿科技有机会成为百亿美金的新巨头吗?](https://www.53ai.com/news/LargeLanguageModel/2025072546170.html) [下一篇:任务紧急,CodeBuddy是如何成为“第二双手”的?](https://www.53ai.com/news/LargeLanguageModel/2025072467392.html) [返回列表](https://www.53ai.com/news/LargeLanguageModel) 相关资讯 [2026-04-04 ollama v0.20.0 更新:Gemma 4 全家桶发布,音频、视觉、MoE、BPE 支持全面升级](https://www.53ai.com/news/LargeLanguageModel/2026040476504.html) [2026-04-04 Cursor 3来了:内置Codex,前端福音Design Mode,WorkTree多开](https://www.53ai.com/news/LargeLanguageModel/2026040403579.html) [2026-04-03 淘宝跨端体验优化 AI 演进之路](https://www.53ai.com/news/LargeLanguageModel/2026040321476.html) [2026-04-03 Qoder 工程实践:Harness Engineering 指南](https://www.53ai.com/news/LargeLanguageModel/2026040304682.html) [2026-04-02 GLM-5.1 实测:面向 Agent 长程任务的国内第一模型](https://www.53ai.com/news/LargeLanguageModel/2026040224397.html) [2026-04-02 AI代码的“屎山危机”才刚刚开始](https://www.53ai.com/news/LargeLanguageModel/2026040213829.html) [2026-04-02 千问发布新一代大语言模型Qwen3.6-Plus](https://www.53ai.com/news/LargeLanguageModel/2026040210437.html) [2026-04-02 疑似GPT-6曝光! OpenAI 联合创始人亲口爆料 Spud 新一代AI模型,并且拥有“大模型气味”!网友评论:它是第一个真正会“思考”的型号!](https://www.53ai.com/news/LargeLanguageModel/2026040273591.html) ![智能化改造方案]() ![智能化改造方案]() [联系获取](https://www.53ai.com/solution.html) ![大模型落地应用平台]() ![大模型落地应用平台]() [联系获取](https://www.53ai.com/solution.html) 160+中大型企业正在使用53AI [立即咨询]() [预约演示]() [把握AI发展的机遇,共同探索、共同进步 2025-01-22](https://www.53ai.com/news/dongtai/2025012294502.html) [如何打造基于GenAI的员工服务机器人 2025-01-22](https://www.53ai.com/news/dongtai/2025012234192.html) [![banner](https://static.53ai.com/uploads/20250611/c637940d8902b253d3264aaf89cd40fc.jpg)](https://hub.53ai.com/) 热点资讯 [Pencil:设计和写代码,以后就全让AI干了 2026-01-24](https://www.53ai.com/news/LargeLanguageModel/2026012420847.html) [独家实录|唐杰、杨植麟、林俊旸、姚顺雨...All Star 对话上,大家聊了啥? 2026-01-10](https://www.53ai.com/news/LargeLanguageModel/2026011069524.html) [从0到1玩转Clawdbot:我花了40小时,把这些坑都踩完了 2026-01-26](https://www.53ai.com/news/LargeLanguageModel/2026012692386.html) [Claude Code Skills 国内实践全指南:从安装部署到高阶开发 2026-01-09](https://www.53ai.com/news/LargeLanguageModel/2026010976504.html) [终于!Gemini CLI支持Agent Skills,一键搬运Claude Code的“绝招” 2026-01-09](https://www.53ai.com/news/LargeLanguageModel/2026010936401.html) [深度解析——为什么Claude code CEO Dario 如此反中? 2026-01-23](https://www.53ai.com/news/LargeLanguageModel/2026012391248.html) [不会封号的Claude Code使用方法!已稳定测试一个月,还能共享给团队。 2026-01-14](https://www.53ai.com/news/LargeLanguageModel/2026011419723.html) [2026年 国内如何注册 Claude 账号教程 2026-03-13](https://www.53ai.com/news/LargeLanguageModel/2026031379015.html) [他来了他来了!Claude Code官方桌面版惊艳上线! 2026-01-07](https://www.53ai.com/news/LargeLanguageModel/2026010787621.html) [我装了 9 个 Skill,终于看懂了 Google Antigravity 的野心 2026-01-21](https://www.53ai.com/news/LargeLanguageModel/2026012130815.html) 大家都在问 [华为AI 49元/月!贵?不贵? 2026-04-01](https://www.53ai.com/news/LargeLanguageModel/2026040104721.html) [为什么这波 AI 产品都开始抢着做 CLI ? 2026-03-31](https://www.53ai.com/news/LargeLanguageModel/2026033136410.html) [Harness Engineering 来了,SDD 还有意义吗? 2026-03-31](https://www.53ai.com/news/LargeLanguageModel/2026033108794.html) [OpenAI不会干黄了吧? 2026-03-22](https://www.53ai.com/news/LargeLanguageModel/2026032273409.html) [专访OpenAI首席科学家:我们离“AI自己做研究”有多远? 2026-03-22](https://www.53ai.com/news/LargeLanguageModel/2026032212094.html) [编程选GPT-5.4,还是GPT-5.3-Codex? 2026-03-21](https://www.53ai.com/news/LargeLanguageModel/2026032181730.html) [真实测评MiniMax M2.7,不吹不夸,它到底什么水平? 2026-03-20](https://www.53ai.com/news/LargeLanguageModel/2026032070852.html) [深度分析:Agent Harness/框架到底有没有竞争壁垒? 2026-03-19](https://www.53ai.com/news/LargeLanguageModel/2026031979806.html) 热门标签 [内容创作](https://www.53ai.com/news/neirongchuangzuo) [大模型技术](https://www.53ai.com/news/LargeLanguageModel) [个人提效](https://www.53ai.com/news/gerentixiao) [langchain](https://www.53ai.com/news/langchain) [llamaindex](https://www.53ai.com/news/llamaindex) [多模态技术](https://www.53ai.com/news/MultimodalLargeModel) [RAG技术](https://www.53ai.com/news/RAG) [智能客服](https://www.53ai.com/news/zhinengkefu) [知识图谱](https://www.53ai.com/news/knowledgegraph) [模型微调](https://www.53ai.com/news/finetuning) [RAGFlow](https://www.53ai.com/news/RAGFlow) [coze](https://www.53ai.com/news/coze) [Dify](https://www.53ai.com/news/dify) [Fastgpt](https://www.53ai.com/news/fastgpt) [Bisheng](https://www.53ai.com/news/Bisheng) [Qanything](https://www.53ai.com/news/Qanything) [AI+汽车](https://www.53ai.com/news/AIqiche) [AI+金融](https://www.53ai.com/news/AIjinrong) [AI+工业](https://www.53ai.com/news/AIgongye) [AI+培训](https://www.53ai.com/news/AIpeixun) [AI+SaaS](https://www.53ai.com/news/AISaaS) [Skill](https://www.53ai.com/news/tishicikuangjia) [提示词技巧](https://www.53ai.com/news/tishicijiqiao) [AI+电商](https://www.53ai.com/news/AIdianshang) [AI面试](https://www.53ai.com/news/AImianshi) [数字员工](https://www.53ai.com/news/shuziyuangong) [ChatBI](https://www.53ai.com/news/zhinengbaobiao) [AI知识库](https://www.53ai.com/news/zhishiguanli) [开源大模型](https://www.53ai.com/news/OpenSourceLLM) [智能营销](https://www.53ai.com/news/zhinengyingxiao) [智能硬件](https://www.53ai.com/news/zhinengyingjian) [智能化改造](https://www.53ai.com/news/zhinenghuagaizao) [AI+医疗](https://www.53ai.com/news/AIyiliao) [MaxKB](https://www.53ai.com/news/MaxKB) [Palantir](https://www.53ai.com/news/Palantir) [Glean](https://www.53ai.com/news/Glean) [Openclaw](https://www.53ai.com/news/Openclaw) [应聘简历请发送至: ceo@53ai.com](mailto:ceo@53ai.com) [产品服务](https://www.53ai.com/product.html) [工作+AI](https://www.53ai.com/product/quanyuanAI) [工作对话](https://www.53ai.com/product/gongzuoduihua) [内容创作](https://www.53ai.com/product/neirongchuangzuo) [方案撰写](https://www.53ai.com/product/zhinengwendang) [魔法菜单](https://www.53ai.com/product/mofacaidan) [业务+AI](https://www.53ai.com/product/yewuAI) [微信分身](https://www.53ai.com/product/weixinfenshen) [海外客服](https://www.53ai.com/product/haiwaikefu) [官网客服](https://www.53ai.com/product/guanwangkefu) [抖音客服](https://www.53ai.com/product/douyinkefu) [数字老师](https://www.53ai.com/product/shuzilaoshi) [数字督导](https://www.53ai.com/product/shuzidudao) [智能服务台](https://www.53ai.com/product/zhinengfuwutai) [AIx业务](https://www.53ai.com/product/AIXyewu) [智能问数](https://www.53ai.com/product/zhinengwenshu) [智能审核](https://www.53ai.com/product/zhinengshenhe) [智能工单](https://www.53ai.com/product/zhinenggongdan) [企微跟进助手](https://www.53ai.com/product/qiweigenjinzhushou) [智能报价](https://www.53ai.com/product/zhinengbaojia) [企微销售助手](https://www.53ai.com/product/qiweixiaoshouzhushou) [应用智改](https://www.53ai.com/product/zijianyingyong) [企微客服助手](https://www.53ai.com/product/qiweikefuzhushou) [落地咨询](https://www.53ai.com/consulting.html) [场景共创](https://www.53ai.com/fine-tuning.html) [客户案例](https://www.53ai.com/kehuanli.html) [行业案例](https://www.53ai.com/kehuanli/hangyeanli) [场景案例](https://www.53ai.com/kehuanli/solution) [AI知识库](https://www.53ai.com/news.html) [前沿技术](https://www.53ai.com/news/qianyanjishu) [Agent框架](https://www.53ai.com/news/agentplatform) [行业应用](https://www.53ai.com/news/hangyeyingyong) [企业落地](https://www.53ai.com/news/qiyejingying) [结构化提示词](https://www.53ai.com/prompt.html) [关于我们](https://www.53ai.com/about.html) [公司介绍](https://www.53ai.com/about/introduction) [渠道合作](https://www.53ai.com/about/cooperation) 友情链接: [通往AGI之路](https://www.waytoagi.com/) [云璨信息](https://www.yuncan.com/) [企微SCRM](https://www.wescrm.com/) [小名片](https://www.mingpian.top/) [优网科技](https://www.uweb.net.cn/) CopyRight © 2012-2024 深圳市博思协创网络科技有限公司 版权所有 [![]()粤ICP备14082021号](https://beian.miit.gov.cn/) 广州:广州市华景路37号(华景软件园)暨南大学科技大厦6楼(整层) 深圳:深圳市福田区泰然四路29号天安创新科技广场一期A座1204 上海:上海市浦东新区金新路58号1602室 微信扫码 和创始人交个朋友 联系我们 售前咨询 [186 6662 7370](tel:18666627370) 预约演示 [185 8882 0121](tel:18588820121) ![]() 微信扫码 添加专属顾问 回到顶部 ![](https://static.53ai.com/assets/static/images/loading.svg) 加载中... 扫码咨询 ![]() ![]() [预约演示](https://work.weixin.qq.com/ca/cawcde2599cf74e2d9) [微信咨询](https://work.weixin.qq.com/ca/cawcdefb661890e885) [电话咨询](tel:400-838-1185)
Readable Markdown
推荐语 深度学习模型选型指南:从CNN到Transformer,一文掌握主流模型架构与应用场景。 核心内容: 1. 模型架构与具体模型的本质区别解析 2. CNN、Transformer等主流架构的典型应用场景 3. 根据业务需求选择最佳模型的实战方法论 ![](https://static.53ai.com/assets/static/images/avatar.jpg) 杨芳贤 53AI创始人/腾讯云(TVP)最具价值专家 沿着 AI 的发展脉络,本系列文章从Seq2Seq到RNN,再到Transformer,直至今日强大的GPT模型,我们将带你一步步深入了解这些关键技术背后的原理与实现细节。无论你是初学者还是有经验的开发者,相信读完这个系列文章后,不仅能掌握Transformer的核心概念,还能对其在整个NLP领域中的位置有一个全面而深刻的认识。那就让我们一起开始这段学习之旅吧! *** 在深度学习的语境里“模型”是一个高频出现的词汇,我们听说过识别手写数字的 CNN 模型,处理自然语言的 Transformer 模型,还有能写文章、做对话的 GPT 模型,这么多模型我们在解决业务问题时候应该如何做选型? 模型与模型架构 仔细观察还会发现一个问题 —— GPT 模型只有一个,而 CNN、Transformer 却有很多,比如 ResNet、VGG 属于 CNN 家族,BERT、GPT 又都和 Transformer 相关,这些概念之间究竟是怎样的关系? 我们首先需要了解机器学习中两个关键概念——模型架构(Model Architecture)与具体模型(Trained Model)的区别。就像建筑设计中「蓝图」与「建成的房子」的关系 ——CNN 和 Transformer 是模型架构,类似于可复用的「设计蓝图」,允许开发者根据需求调整细节(如层数、参数),从而衍生出无数具体实现;而 GPT 则是基于 Transformer 蓝图构建并训练完成的「成品模型」,是前者的一个典型实例。 以之前讨论的手写数字分类任务为例: ``` model = keras.Sequential([    keras.Input(shape=(28, 28, 1)),  # 输入层(图像尺寸)    keras.layers.Conv2D(32, (3, 3), activation='relu'),  # 卷积层    keras.layers.MaxPooling2D((2, 2)),  # 池化层    keras.layers.Flatten(),  # 展平层    keras.layers.Dense(128, activation='relu'),  # 全连接层    keras.layers.Dense(10, activation='softmax')  # 输出层]) ``` 这里定义的是架构,描述了模型的层次、各层的类型、连接方式以及数据流动的路径。它是模型的 “骨架”,决定了模型如何处理输入数据、提取特征以及生成输出。 ``` # 训练模型model.compile(optimizer='adam',              loss='sparse_categorical_crossentropy',              metrics=['accuracy'])model.fit(    train_images.reshape(-1, 28, 28, 1), train_labels,     epochs=5, batch_size=32,    validation_data=(val_images.reshape(-1, 28, 28, 1), val_labels)) ``` 当上述架构通过`model.fit()`训练后,学习到具体的权重和偏置,也就产生了包含具体参数的模型,能够对新图像进行分类预测。因此可以这样理解 - 模型架构是模型的 “设计图纸”,决定了模型的结构和计算逻辑(无参数)。 - 模型是架构经过训练后的 “实例”,包含可学习的参数,能够实现具体的预测功能。 常见模型架构类型 > 个人理解工程同学首先要对常见的模型眼熟,比如目标检测任务能联想到 CNN、YOLO,这样 AI 就能帮大家开写代码了 ### 卷积神经网络 (Convolutional Neural Networks, CNNs) CNNs 通过卷积操作高效提取数据的局部空间特征,特别适用于具有网格状结构的数据,如图像。 典型模型: - LeNet-5:早期的 CNN,用于手写数字识别。 - AlexNet:在 ImageNet 竞赛中显著提升图像分类性能,推动深度学习的发展。 - VGGNet:通过加深网络(如 VGG16、VGG19)提升性能。 - ResNet (Residual Networks):引入残差模块,解决深层网络的梯度消失问题。 - EfficientNet:通过复合缩放方法优化模型规模与性能平衡。 - YOLO(You Only Look Once):为目标检测设计,提供了图像分类、目标检测、实例分割、关键点检测等任务支持 ### 循环神经网络 (Recurrent Neural Networks, RNNs) RNNs 通过其循环结构处理序列数据,能够捕捉时间上的依赖关系,适用于需要处理时序信息的任务。 典型模型: - 标准RNN:基础循环网络,存在梯度消失问题。 - 长短期记忆网络 (Long Short-Term Memory, LSTM):引入门控机制,解决梯度消失问题。 - 门控循环单元 (Gated Recurrent Units, GRU):结构更简洁,计算效率更高,功能类似于LSTM。 - 双向 RNN (Bi-directional RNNs):双向处理序列,提高信息捕捉能力。 ### Transformer 模型 Transformer 基于自注意力机制,能够并行处理整个序列,擅长捕捉长距离依赖关系,广泛应用于 NLP 和计算机视觉领域。 典型模型: - Transformer (原始模型):用于机器翻译任务。 - BERT (Bidirectional Encoder Representations from Transformers):预训练语言模型,用于多种 NLP 任务。 - GPT (Generative Pre-trained Transformer) 系列:用于文本生成、对话系统等。 - Vision Transformer (ViT):将 Transformer 应用于图像分类。 - DETR (DEtection TRansformer):用于目标检测任务。 ### 生成对抗网络 (Generative Adversarial Networks, GANs) GANs 通过生成器与判别器的对抗训练,实现高质量数据的生成,广泛应用于生成任务和数据增强。 典型模型: - 原始 GAN:最基础的生成对抗框架。 - DCGAN (Deep Convolutional GAN):结合卷积神经网络提升图像生成效果。 - StyleGAN:生成高质量的人脸图像,并可控制样式特征。 - CycleGAN:实现无监督的图像到图像转换,如马到斑马。 - BigGAN:大规模GAN模型,提升生成图像的质量与多样性。 ### 图神经网络 (Graph Neural Networks, GNNs) GNNs 专为处理图结构数据设计,通过节点间的连接关系传递和聚合信息,适用于复杂的关系数据。 典型模型: - Graph Convolutional Networks (GCNs):基于图卷积操作进行特征提取。 - Graph Attention Networks (GATs):引入注意力机制,动态分配邻居节点的权重。 - GraphSAGE:通过采样邻居节点,实现大规模图数据的高效训练。 ### 总结 不同架构因设计原理的差异,在数据处理、特征提取和任务适配上各有专攻,适用于不同类型的任务: - 计算机视觉:CNN、ResNet、ViT(Vision Transformer) - 自然语言处理:RNN、LSTM、GRU、Transformer(如 BERT、GPT) - 生成任务:GAN、VAE - 图结构数据:GNN、GCN - 序列与时间数据:RNN、LSTM、GRU、Transformer 开始选择模型 拿到业务需求、收集数据、确定目标、选择模型架构,就可以开始进行模型训练了,但在机器学习开发的日常实践中,完全 从零开始训练模型的情况已越来越少,大多数开发者会基于任务需求与数据特性,优先选择在预训练模型基础上进行微调优化。这种站在巨人肩膀上的策略,既充分利用了大规模数据预训练积累的通用特征表示,又能通过轻量化的适配过程快速满足特定场景需求。 ### 预训练模型 预训练模型(Pre-trained Models)是在特定模型架构基础上,通过在大规模通用数据集上进行初步训练,学习到通用特征或知识,设定了具体参数的神经网络模型。 比如基于 Transformer 架构的 BERT、GPT 系列模型,基于 CNN 架构的 ResNet-101、VGG16 等,都是预训练模型。这些预训练模型覆盖了自然语言处理、计算机视觉、音频处理、多模态任务和推荐系统等多个领域。开发者可以在 Hugging Face Hub、PyTorch Hub、TensorFlow Hub等平台,获取这些预训练模型。 Hugging Face Hub:https://huggingface.co/models PyTorch Hub:https://pytorch.org/hub/ TensorFlow Hub:https://www.tensorflow.org/hub > 现在回头看 GPT (Generative Pre-trained Transformer) 是不是知道大概是什么意思了。 ### 微调 Fine-tuning 因为预训练模型一般使用通用数据集训练,为了更好的支持业务需求,开发者会对预训练模型进行微调。微调是指在预训练模型上,针对特定任务或特定数据集,进行少量参数的调整和训练,以使模型更好地适应新的任务需求。 随着模型规模的不断增大和应用场景的多样化,出现了多种微调方法,以提高效率、减少计算资源消耗或提升模型性能。 #### 1\. 标准微调(Standard Fine-tuning) 标准微调是最基本的微调方法,即将预训练模型在特定任务的数据集上进行全量参数的进一步训练。通常情况下,微调时会采用较低的学习率,以避免破坏预训练模型中学到的通用特征。 - 优点:简单直接,效果较好,尤其适用于目标任务与预训练任务相似的情况。 - 缺点:大模型全量微调计算资源消耗高,可能导致过拟合,尤其在目标任务数据量较小时。 2\. 监督微调(Supervised Fine-Tuning, SFT) 监督微调是在标准微调基础上,利用有标注数据进行进一步训练,旨在提升模型在特定监督任务上的表现。SFT 通常应用于需要明确标签的任务,如分类、序列标注等。 - 自然语言处理:文本分类、命名实体识别、机器翻译等。 - 计算机视觉:图像分类、目标检测、图像分割等。 3\. 低秩适配(Low-Rank Adaptation, LoRA) LoRA 是一种 PEFT 的微调方法,通过在预训练模型的权重矩阵中引入低秩矩阵来适配新任务,而无需大幅调整原有模型的参数。这种方法能够显著减少微调过程中新增的参数量,同时保持或提升模型性能。 > 在矩阵理论中,秩(Rank)指的是矩阵中线性无关行或列的最大数量。一个矩阵的秩决定了其线性独立性的程度。 > > 满秩矩阵:如果一个 m×n 矩阵的秩 r 等于其最小维度 min⁡(m,n),则称其为满秩矩阵。 > > 低秩矩阵:如果一个 m×n 矩阵的秩 r满足 r≪min⁡(m,n),即远小于其最小维度,则称其为低秩矩阵。 - 低秩矩阵:在保持模型表现的同时,通过引入低秩矩阵在特定层(如 Transformer 的自注意力层)中调整权重。 - 参数冻结:预训练模型的原始参数冻结,仅训练新增的低秩矩阵参数。 4\. 知识蒸馏(Knowledge Distillation) 知识蒸馏是通过将大型复杂模型(教师模型)的知识传递给小型高效模型(学生模型),以实现模型压缩和性能优化的技术。尽管知识蒸馏主要用于模型压缩,但它也可以作为微调的一种补充技术,进一步提升模型在特定任务上的表现。 基本原理: - 教师模型:在大规模数据集上训练好的高性能模型。 - 学生模型:结构更简单、参数更少的模型,旨在模仿教师模型的行为。 - 蒸馏过程:通过让学生模型学习教师模型的输出(如软概率分布、特征表示等),传递教师模型的知识。 小小成本就能干大事,2025 年初 DeepSeek-R1 横空出世,671B 参数,训练仅消耗 278.8 万 GPU 小时,成本约为 GPT-4 的 1/200。是不是可以理解为什么 OpenAI 会公开质疑 DeepSeek 可能通过蒸馏 “窃取” 其技术成果。 > 当然已被《DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning》打脸 > > https://arxiv.org/abs/2501.12948 Hugging face Hugging Face提供了 模型 + 数据集 + 工具 + 社区 的一站式 AI 开发者平台,无论是想快速调用预训练模型的新手,还是需要大规模分布式训练的企业,都能在平台上找到对应的解决方案: - 海量预训练模型:提供超过 10 万 + 预训练模型,支持 NLP、计算机视觉、语音处理、多模态等任务,覆盖分类、生成、翻译、摘要、问答等多种场景。 - 丰富的公开数据集:收录超 5 万 + 公开数据集,涵盖文本、图像、语音、表格等类型,如 IMDB 影评、MNIST、COCO、维基百科等,支持一键加载。 - 数据处理工具:提供 datasets 库,支持数据清洗、预处理、分拆(如训练集 / 验证集 / 测试集),兼容多种格式(CSV、JSON、Parquet 等)。 - 快速部署演示:通过 “Hugging Face Spaces”,用户可直接在浏览器中部署模型演示(Demo),支持 Gradio、Streamlit、HTML 等界面,无需复杂服务器配置。 - 开源生态:核心库(Transformers、Datasets 等)完全开源,社区贡献活跃,文档丰富,适合研究者、开发者和企业使用。 学习使用的预训练模型及数据集都可以在 Hugging face 获取,也可以瞅瞅 ModelScope。 使用预训练模型 IMDB 影评数据集包含 5 万条电影评论(2.5 万训练/2.5 万测试),标注为正面/负面情感,是情感分析领域的标杆数据集。 - 文本长度适中(平均 200-300 词),适合验证模型的长文本理解能力。 - 已完成预处理(去除 HTML 标签、统一格式),可直接使用。 接下来我们使用预训练的 bert-base-uncased 模型,对 IMDB 电影评论数据集进行情感分析,也就是判断评论是积极的还是消极的 > 因为需要下载 Hugging face 的数据集与预训练模型,代码本地运行需要保证对 Hugging face 的访问畅通。 ### 导入必要的库 ``` import torchfrom torch.utils.data import Dataset, DataLoaderfrom torch.optim import AdamWfrom transformers import BertTokenizer, BertForSequenceClassification, get_linear_schedule_with_warmupfrom datasets import load_datasetimport numpy as npfrom sklearn.metrics import accuracy_score, f1_score ``` - torch: PyTorch 的核心库。 - Dataset, DataLoader: Dataset 用于定义数据集,DataLoader 用于批量加载数据。 - AdamW: 一种基于 Adam 优化器的变体,添加了权重衰减(weight decay)。 - Transformers: Hugging Face 提供的预训练模型库 - BertTokenizer 用于分词 - BertForSequenceClassification 用于序列分类任务 - get\_linear\_schedule\_with\_warmup 是学习率调度器,线性递减并带有预热阶段 - datasets: Hugging Face 的数据集库,load\_dataset 用于加载各种公开数据集。 - accuracy\_score, f1\_score: sklearn 提供的评估指标,用于计算准确率和 F1 分数。 ### 定义数据集类 IMDBDataset 继承自 PyTorch 的 `Dataset` 类,用于封装 IMDB 数据集: ``` # 自定义数据集类:将 IMDB 数据集转换为 PyTorch 可用的格式class IMDBDataset(Dataset):    """    自定义数据集类,用于处理IMDB电影评论数据        参数:        dataset: Hugging Face数据集对象        tokenizer: BERT 分词器        max_length: 序列最大长度    """    def __init__(self, dataset, tokenizer, max_length):        self.dataset = dataset          # 原始数据集        self.tokenizer = tokenizer      # BERT分词器        self.max_length = max_length    # 序列最大长度        def __len__(self):        """返回数据集中样本的数量"""        return len(self.dataset)        def __getitem__(self, idx):        """获取指定索引的数据样本并进行预处理"""        # 获取文本和标签        text = self.dataset[idx]['text']        label = self.dataset[idx]['label']                # 使用BERT分词器对文本进行编码        encoding = self.tokenizer.encode_plus(            text,            add_special_tokens=True,      # 添加[CLS]和[SEP]特殊标记            max_length=self.max_length,   # 最大序列长度            padding='max_length',         # 填充到最大长度            truncation=True,              # 截断超长序列            return_tensors='pt'           # 返回PyTorch张量        )                # 返回模型所需的输入格式        return {            'input_ids': encoding['input_ids'].flatten(),              # 输入ID            'attention_mask': encoding['attention_mask'].flatten(),    # 注意力掩码            'labels': torch.tensor(label, dtype=torch.long)            # 标签        } ``` ### 加载 IMDB 数据集 使用 `load_dataset` 从 Hugging Face 的数据集库中加载 IMDB 数据集: ``` print("1. 数据准备阶段")print("正在加载 IMDB 数据集...")# 从 Hugging Face 加载 IMDB 电影评论数据集imdb_dataset = load_dataset('imdb')print("成功加载 IMDB 数据集") ``` ### 划分训练集和验证集 使用 Hugging Face 数据集库自带的 `train_test_split` 方法,将训练集划分为训练集和验证集,比例为 80% 训练,20% 验证。 ``` # 将训练集分割为训练集和验证集(80%-20%分割)print("划分训练集和验证集...")train_val_split = imdb_dataset['train'].train_test_split(test_size=0.2, seed=42)train_data = train_val_split['train']# train_test_split 验证集被命名为 'test'val_data = train_val_split['test']print(f"训练集样本数: {len(train_data)}, 验证集样本数: {len(val_data)}") ``` ### 加载分词器和模型 ``` # 2. 模型初始化阶段print("2. 模型初始化阶段")print("加载 BERT 模型和分词器...")# 加载预训练的BERT分词器和模型tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2)print("成功加载 BERT 模型和分词器") ``` - 分词器 (BertTokenizer): - 加载预训练的 bert-base-uncased 分词器,该分词器将文本分割成小的词片段,并将其转换为对应的词汇表索引。 - uncased 表示分词器会将文本转换为小写,忽略大小写信息。 - 模型 (BertForSequenceClassification): - 加载预训练的 bert-base-uncased 模型,并在顶部添加一个用于序列分类的全连接层。 - num\_labels=2 表示分类任务有两个类别(正面和负面)。 `bert-base-uncased` 模型,包含 1.1 亿个参数,每个参数通常以 32 位浮点数(FP32) 存储,每个 FP32 占 4 字节,下载和占用磁盘空间 440M 左右。 ### 定义数据集和数据加载器 使用前面定义的 `IMDBDataset` 类,将训练集、验证集和测试集封装为 PyTorch 数据集对象。 ``` # 设置序列最大长度并创建数据集对象max_length = 128print(f"创建数据集对象,序列最大长度: {max_length}")train_dataset = IMDBDataset(train_data, tokenizer, max_length)val_dataset = IMDBDataset(val_data, tokenizer, max_length)test_dataset = IMDBDataset(imdb_dataset['test'], tokenizer, max_length) ``` `max_length=128` 指定每条文本的最大长度为 128 个 token,超出部分会被截断,未达到的部分会被填充。 ``` # 创建数据加载器batch_size = 16print(f"创建数据加载器,批次大小: {batch_size}")train_dataloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)val_dataloader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False)test_dataloader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False) ``` `shuffle=True` 表示每个 epoch 前会打乱数据,增强模型的泛化能力。 ### 定义优化器和学习率调度器 ``` # 设置优化器和学习率调度器print("配置优化器和学习率调度器")learning_rate = 2e-5optimizer = AdamW(model.parameters(), lr=learning_rate)# 计算总训练步数num_epochs = 3total_steps = len(train_dataloader) * num_epochs# 创建学习率调度器,在训练过程中逐步降低学习率scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps=0, num_training_steps=total_steps) ``` - 使用 AdamW 优化器,根据损失函数的梯度信息,调整模型参数(如权重、偏置),以最小化损失函数。 - get\_linear\_schedule\_with\_warmup 创建一个线性学习率调度器,该调度器会在训练过程中逐步调整学习率,帮助模型更好地收敛 - num\_warmup\_steps=0: 无预热阶段,从一开始就使用线性递减。 - num\_training\_steps=total\_steps: 总训练步数,等于每个 epoch 的步数乘以 epoch 数。 ### 设备设置 检查是否有可用的 GPU(`cuda`),如果有,则使用 GPU 加速训练,否则使用 CPU。 ``` # 设置运行设备(GPU/CPU)device = torch.device('cuda'if torch.cuda.is_available() else'cpu')print(f"运行设备: {device}")model.to(device)  # 将模型移动到指定设备 ``` > 如果没有 GPU 预计需要 3 小时左右跑完。 ### 训练模型 训练三轮,每一轮中先进行训练,再进行验证,计算训练损失、验证损失和验证准确率。如果当前验证准确率超过之前的最佳值,更新 `best_val_accuracy` 并保存模型的状态字典到 `best_model.pth。` ``` # 3. 模型训练阶段print("\n3. 模型训练阶段")print(f"开始训练,总周期数: {num_epochs}")best_val_accuracy = 0for epoch in range(num_epochs):    print(f"\n开始第 {epoch + 1}/{num_epochs} 个训练周期")        # 训练模式    model.train()    total_train_loss = 0    print("训练中...")    for batch in train_dataloader:        # 将数据移动到指定设备        input_ids = batch['input_ids'].to(device)        attention_mask = batch['attention_mask'].to(device)        labels = batch['labels'].to(device)                # 清除之前的梯度        optimizer.zero_grad()                # 前向传播        outputs = model(input_ids, attention_mask=attention_mask, labels=labels)        loss = outputs.loss        total_train_loss += loss.item()                # 反向传播        loss.backward()                # 更新参数        optimizer.step()        scheduler.step()  # 更新学习率        # 计算平均训练损失    avg_train_loss = total_train_loss / len(train_dataloader)        # 验证模式    print("验证中...")    model.eval()  # 设置为评估模式    val_predictions = []    val_true_labels = []    total_val_loss = 0    with torch.no_grad():  # 不计算梯度        for batch in val_dataloader:            # 将数据移动到指定设备            input_ids = batch['input_ids'].to(device)            attention_mask = batch['attention_mask'].to(device)            labels = batch['labels'].to(device)                        # 前向传播            outputs = model(input_ids, attention_mask=attention_mask, labels=labels)            loss = outputs.loss            total_val_loss += loss.item()                        # 获取预测结果            logits = outputs.logits            preds = torch.argmax(logits, dim=1)                        # 收集预测结果和真实标签            val_predictions.extend(preds.cpu().tolist())            val_true_labels.extend(labels.cpu().tolist())        # 计算验证指标    avg_val_loss = total_val_loss / len(val_dataloader)    val_accuracy = accuracy_score(val_true_labels, val_predictions)    print(f'第 {epoch + 1} 个周期: 训练损失 = {avg_train_loss:.4f}, 验证损失 = {avg_val_loss:.4f}, 验证准确率 = {val_accuracy:.4f}')        # 保存最佳模型    if val_accuracy > best_val_accuracy:        best_val_accuracy = val_accuracy        print(f"发现更好的模型,保存模型权重 (准确率: {val_accuracy:.4f})")        torch.save(model.state_dict(), 'best_model.pth') ``` 前向传播(Forward Propagation)和反向传播(Backward Propagation)是深度学习中两个至关重要的概念,它们共同构成了神经网络模型训练的核心流程 - 前向传播是指将输入数据(代码中的 input\_ids 和 attention\_mask)依次通过神经网络的各个层,经过一系列的线性变换和非线性激活函数处理,最终得到模型的预测输出。 - 反向传播是在得到损失值之后,通过链式法则计算损失函数对模型中每个参数的梯度。通过计算梯度,可以知道应该如何调整模型的参数,使得损失函数的值减小,从而提高模型的性能。 ``` 第 1 个周期: 训练损失 = 0.3398, 验证损失 = 0.2854, 验证准确率 = 0.8792发现更好的模型,保存模型权重 (准确率: 0.8792)第 2 个周期: 训练损失 = 0.1799, 验证损失 = 0.2949, 验证准确率 = 0.8864发现更好的模型,保存模型权重 (准确率: 0.8864)第 3 个周期: 训练损失 = 0.0822, 验证损失 = 0.3687, 验证准确率 = 0.8888发现更好的模型,保存模型权重 (准确率: 0.8888) ``` ### 模型评估 ``` # 4. 模型评估阶段print("\n4. 模型评估阶段")# 加载训练过程中保存的最佳模型print("加载最佳模型权重...")model.load_state_dict(torch.load('best_model.pth'))# 在测试集上评估模型print("在测试集上评估模型...")model.eval()  # 设置为评估模式predictions = []true_labels = []with torch.no_grad():  # 不计算梯度    for batch in test_dataloader:        # 将数据移动到指定设备        input_ids = batch['input_ids'].to(device)        attention_mask = batch['attention_mask'].to(device)        labels = batch['labels'].to(device)                # 前向传播        outputs = model(input_ids, attention_mask=attention_mask)        logits = outputs.logits        preds = torch.argmax(logits, dim=1)                # 收集预测结果和真实标签        predictions.extend(preds.cpu().tolist())        true_labels.extend(labels.cpu().tolist())# 计算评估指标accuracy = accuracy_score(true_labels, predictions)f1 = f1_score(true_labels, predictions)print(f'测试集准确率: {accuracy:.4f}')print(f'测试集F1分数: {f1:.4f}') ``` ### 自定义测试 自定义一个测试函数: ``` # 定义情感预测函数:用于对新文本进行情感分析def predict_sentiment(text, tokenizer, model, max_length=128, device='cpu'):    """    使用训练好的BERT模型对文本进行情感分析        参数:        text: 要分析的文本字符串        tokenizer: BERT分词器        model: 训练好的BERT模型        max_length: 序列最大长度        device: 运行设备('cpu'或'cuda')            返回:        包含情感预测结果的字典    """    # 预处理文本    encoding = tokenizer.encode_plus(        text,        add_special_tokens=True,        max_length=max_length,        padding='max_length',        truncation=True,        return_tensors='pt'    )    # 将张量移动到指定设备    input_ids = encoding['input_ids'].to(device)    attention_mask = encoding['attention_mask'].to(device)    # 预测阶段    model.eval()  # 设置为评估模式    with torch.no_grad():  # 不计算梯度,节省内存        outputs = model(input_ids, attention_mask=attention_mask)        logits = outputs.logits        # 转换为概率值        prob = torch.softmax(logits, dim=1).squeeze().cpu().numpy()    # 解析结果    negative_prob = prob[0]  # 负面情感概率    positive_prob = prob[1]  # 正面情感概率    sentiment = 'positive'if positive_prob > 0.5else'negative'  # 情感判断        # 返回预测结果    return {        'text': text,        'sentiment': sentiment,        'negative_prob': f'{negative_prob:.4f}',        'positive_prob': f'{positive_prob:.4f}'    } ``` 对自定义文本进行测试: ``` # 5. 自定义文本测试print("\n5. 自定义文本测试")print("对自定义文本进行情感分析...")custom_text = "This film is a masterpiece! The cinematography and soundtrack are unparalleled."print(f"输入文本: {custom_text}")result = predict_sentiment(custom_text, tokenizer, model, device=device)print(f"预测结果: {result['sentiment']} (积极概率: {result['positive_prob']}, 消极概率: {result['negative_prob']})") ``` 输出: ``` 测试集准确率: 0.8857测试集F1分数: 0.88425. 自定义文本测试对自定义文本进行情感分析...输入文本: This film is a masterpiece! The cinematography and soundtrack are unparalleled.预测结果: positive (积极概率: 0.9983, 消极概率: 0.0017) ``` ### done! ``` # 程序完成print("\n程序执行完毕!") ```
Shard16 (laksa)
Root Hash336105317631279416
Unparsed URLcom,53ai!www,/news/LargeLanguageModel/2025072446057.html s443