模型是一个函数:

将现实问题转化成数学问题(Encoder编码器,通过求解数学问题来得到现实世界的解决方案(Decoder解码器。

模型是一个函数,根据输入的数据(可以是文本、图像、语音、视频等)和一组参数(通常表示为权重)来预测输出。这里的输入和权重都是以数学形式(如矩阵和张量)表示的。

1. 输入数据:在深度学习中,原始数据(如文字、图片等)需要被转换成模型可以处理的数学形式。这通常意味着将数据编码为数值矩阵或张量。例如,文本可能被转换为词嵌入(word embeddings)或词频矩阵(term-frequency matrices),而图像则可能被转换为像素值矩阵。

2. 网络结构:模型的具体形式是由其网络结构决定的。在深度学习中,这通常是一个由多层神经元组成的神经网络。每一层都对输入数据进行某种转换,最终产生一个预测输出。

3. 参数训练:模型中的参数是未知的,需要通过训练来确定。训练过程通常涉及优化算法,如梯度下降(gradient descent),用于最小化预测输出与实际标签之间的差异(即损失函数)。

4. 输出类型:根据任务的不同,模型的输出可以是多种形式的:

  • 二分类问题:输出为0或1(例如,垃圾邮件检测)。
  • 多分类问题:输出为一系列标签中的一个(例如,图像分类)。
  • 回归问题:输出为一个连续数值(例如,房价预测)。
  • 序列生成:输出为下一个词或字符的概率分布(例如,语言模型)。

5. 模型应用:一旦模型被训练好,它就可以用于对新数据进行预测。这些预测可以用于各种实际应用,如推荐系统、自动驾驶、语音识别等。

Training(模型训练)

本质是AI世界的‘科学烹饪实验’——以数据为食材原料,用超参数作配方比例,借验证集做品控质检,将‘玄学炼丹’的试错过程,淬炼成‘可复现的精密工程’。
模型训练是用数据喂AI,通过算法调参数,让它从‘瞎猜’到‘精准预测’的过程。

  • 数据(Data):模型的课本+练习题,用于学习。类似学生通过刷题(训练数据)掌握知识点,通过模拟考(验证集)检验水平。
  • 参数(Weights):模型的大脑神经元连接强度,训练中不断调整。类似学生解题时调整解题思路(参数),使答案更接近标准答案(真实标签)。
  • 损失函数(Loss):衡量模型答案与真实答案的差距。类似学生答错题扣分(Loss升高),答对加分(Loss下降)。
  • 优化器(Optimizer):调整参数的学习方法,如梯度下降=查漏补缺。类似学生根据错题本(梯度)调整学习策略(参数),优先补薄弱科目(高Loss方向)。
  • 正则化(Regularization):防止AI死记硬背的记忆抑制器。类似学生做题时强制理解原理(L1/L2正则化),而非机械背诵。

模型训练的本质是通过参数(解题思路)不断试错、用损失函数(扣分机制)量化差距、靠优化器(错题本复盘法)迭代策略、借正则化(防机械背诵规则)强化泛化,最终在验证集(模拟考)中交出高分答卷的过程。

为什么需要Training(模型训练)?模型像一张白纸(随机初始化参数),无法完成任何任务,Training让模型逐步学会从输入到输出的正确映射,让模型从‘文盲’变成‘学霸’。

人类学习:通过「课本+练习题+考试」掌握知识。
模型训练:通过「数据+优化算法+验证集」调整参数,使模型输出接近真实答案。

模型训练中的常见问题与解决方案如下:

  • Loss不下降:模型学不会,像学生听天书。大概率是数据质量差、模型架构错误、学习率过大。这时候需要清洗数据、换模型、调小学习率。
  • 过拟合:训练集满分,测试集翻车,像学生只背题库。大概率是数据量不足、模型复杂度过高。这时候需要增加数据、简化模型、加正则化。
  • 训练速度慢:模型学得慢,像学生走神。大概率是Batch Size过大、硬件算力不足。这时候需要减小Batch Size、换GPU、分布式训练。
  • 梯度爆炸/消失:模型学崩了,像学生疯癫/昏迷。大概率是网络层数过深、激活函数选择不当。这时候需要加梯度裁剪、换激活函数(如ReLU→LeakyReLU)、残差连接。

Training(模型训练)如何进行技术实现?模型训练按‘数据预处理→架构搭建→参数调优→迭代验证’四步走。

  1. 数据预处理 → “喂数据”(模型的“九年义务教育”阶段,先清洗、标注、划分数据集)
  2. 架构搭建 → “搭脑回路”(选择Transformer模型架构,初始化参数)
  3. 参数调优 → “刷题+改错”(损失函数扣分→优化器改参数→正则化防死记,模型的“高三冲刺”模式)
  4. 迭代验证 → “周考+月考”(验证集监控过拟合,测试集“毕业考”定生死,模型的“高考质检局”)

PyTorch如何实现Training(模型训练)?PyTorch通过定义模型结构(继承nn.Module并实现前向传播),配置损失函数(如MSELoss)与优化器(如Adam),在训练循环中反向传播更新参数(通过loss.backward()和optimizer.step()),同时利用DataLoader 实现数据批量加载与预处理,最终通过迭代优化使模型拟合数据。

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
import math

# 参数配置
input_dim = 10       # 输入特征维度
output_dim = 1       # 输出维度(回归任务)
seq_length = 5       # 序列长度
batch_size = 32
num_epochs = 50      # 增加训练轮次
learning_rate = 0.001
d_model = 64         # 模型维度
nhead = 4            # 注意力头数
dim_feedforward = 256 # 前馈网络维度
# 生成虚拟数据(带时序特征)
X = torch.randn(1000, seq_length, input_dim) * torch.arange(1, seq_length+1).view(1, -1, 1)
y = X.mean(dim=(1,2)).unsqueeze(-1)  # 目标:带时序权重的均值回归
# 数据标准化
X = (X - X.mean()) / X.std()
y = (y - y.mean()) / y.std()
# 封装为DataLoader
dataset = TensorDataset(X, y)
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True, num_workers=2)
class TransformerEncoderRegressor(nn.Module):  
  def __init__(self):    
      super().__init__()        
      self.input_proj = nn.Linear(input_dim, d_model)        
      # Transformer编码器(参考网页7架构)        
      encoder_layer = nn.TransformerEncoderLayer(            
           d_model=d_model,            
           nhead=nhead,            
           dim_feedforward=dim_feedforward,            
           batch_first=True  # PyTorch 1.9+特性     
   )        
self.encoder = nn.TransformerEncoder(encoder_layer, num_layers=3)        

# 输出层(带特征聚合)       
 self.output_layer = nn.Sequential(
             nn.Linear(d_model * seq_length, 128),            
             nn.ReLU(),            
             nn.Dropout(0.1),           
              nn.Linear(128, output_dim)     
   )      
     # 位置编码(参考网页4实现)        
     self.pos_encoder = PositionalEncoding(d_model, dropout=0.1)  
       def forward(self, src):      
       # 输入投影 [batch, seq, d_model]       
        src = self.input_proj(src) * math.sqrt(d_model)       
         # 添加位置编码       
          src = self.pos_encoder(src)      
            # 编码处理 [batch, seq, d_model]        
            memory = self.encoder(src)        
            # 特征聚合 [batch, seq*d_model]        
            flattened = memory.view(memory.size(0), -1)  
                  return self.output_layer(flattened)

class PositionalEncoding(nn.Module):   
 """网页4位置编码实现(适配batch_first格式)"""   
  def __init__(self, d_model: int, dropout: float = 0.1, max_len: int = 5000):        
super().__init__()      
  self.dropout = nn.Dropout(p=dropout)      
    position = torch.arange(max_len).unsqueeze(1)        
    div_term = torch.exp(torch.arange(0, d_model, 2) * (-math.log(10000.0) / d_model))       
     pe = torch.zeros(max_len, d_model)        
     pe[:, 0::2] = torch.sin(position * div_term)        
     pe[:, 1::2] = torch.cos(position * div_term)       
      self.register_buffer('pe', pe.unsqueeze(0))  # [1, max_len, d_model]    
      def forward(self, x):       
       x = x + self.pe[:, :x.size(1), :]      
         return self.dropout(x)# 初始化模型model = TransformerEncoderRegressor()criterion = nn.MSELoss()optimizer = optim.AdamW(model.parameters(), lr=learning_rate, weight_decay=1e-4)scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, 'min', patience=5)# 训练循环(带验证)for epoch in range(num_epochs):    model.train()  
           total_loss = 0    
           for batch_X, batch_y in dataloader:     
              optimizer.zero_grad()        
         outputs = model(batch_X)       
          loss = criterion(outputs, batch_y)      
            loss.backward()       
             # 梯度裁剪(网页7实践)        nn.utils.clip_grad_norm_(model.parameters(), 1.0)        
             optimizer.step()       
              total_loss += loss.item()    
              avg_loss = total_loss / len(dataloader)    
              scheduler.step(avg_loss)   
               print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {avg_loss:.4f}, LR: {optimizer.param_groups[0]["lr"]:.2e}')
               # 测试推理test_input = torch.randn(3, seq_length, input_dim)  # 批量推理测试model.eval()with torch.no_grad():    prediction = model(test_input)print('Test predictions:', prediction.squeeze().tolist())

模型微调(fine-tune)

微调(fine-tune)通过使用在大数据上得到的预训练好的模型来初始化自己的模型权重,从而提升精度。这就要求预训练模型质量要有保证。微调通常速度更快、精度更高。当然,自己训练好的模型也可以当做预训练模型,然后再在自己的数据集上进行训练,来使模型适用于自己的场景、自己的任务。

迁移学习(Transfer Learning)

当我们训练好了一个模型之后,如果想应用到其他任务中,可以在这个模型的基础上进行训练,来作微调网络。这也是迁移学习的概念,可以节省训练的资源以及训练的时间。

迁移学习的一大应用场景就是模型微调,简单的来说就是把在别人训练好的基础上,换成自己的数据集继续训练,来调整参数。Pytorch中提供很多预训练模型,学习如何进行模型微调,可以大大提升自己任务的质量和速度。

假设我们要识别的图片类别是椅子,尽管ImageNet数据集中的大多数图像与椅子无关,但在ImageNet数据集上训练的模型可能会提取更通用的图像特征,这有助于识别边缘、纹理、形状和对象组合。 这些类似的特征对于识别椅子也可能同样有效。

负迁移问题:

​​​​负迁移(Negative Transfer)指的是,在源域上学习到的知识,对于目标域上的学习产生负面作用。

  • 数据问题:源域和目标域压根不相似,谈何迁移?
  • 方法问题:源域和目标域是相似的,但是,迁移学习方法不够好,没找到可迁移的成分。

为什么要微调

因为预训练模型用了大量数据做训练,已经具备了提取浅层基础特征和深层抽象特征的能力。

对于图片来说,我们CNN的前几层学习到的都是低级的特征,比如,点、线、面,这些低级的特征对于任何图片来说都是可以抽象出来的,所以我们将他作为通用数据,只微调这些低级特征组合起来的高级特征即可,例如,这些点、线、面,组成的是园还是椭圆,还是正方形,这些代表的含义是我们需要后面训练出来的。

如果我们自己的数据不够多,泛化性不够强,那么可能存在模型不收敛,准确率低,模型泛化能力差,过拟合等问题,所以这时就需要使用预训练模型来做微调了。注意的是,进行微调时,应该使用较小的学习率。因为预训练模型的权重相对于随机初始化的权重来说已经很不错了,所以不希望使用太大的学习率来破坏原本的权重。通常用于微调的初始学习率会比从头开始训练的学习率小10倍。

如果我们自己的数据不够多,泛化性不够强,那么可能存在模型不收敛,准确率低,模型泛化能力差,过拟合等问题,所以这时就需要使用预训练模型来做微调了。注意的是,进行微调时,应该使用较小的学习率。因为预训练模型的权重相对于随机初始化的权重来说已经很不错了,所以不希望使用太大的学习率来破坏原本的权重。通常用于微调的初始学习率会比从头开始训练的学习率小10倍。

过拟合

所谓过拟合(overfitting),指的是模型在训练集上表现的很好,但是在交叉验证集合测试集上表现-般,也就是说模型对未知样本的预测表现一般,泛化(generalization)能力较差

数据少,数据类似程度高:可以只修改最后几层或者最后一层进行微调。
数据少,数据类似程度低:冻结预训练模型的前几层,训练剩余的层。因为数据集之间的相似度较低,所以根据自身的数据集对较高层进行重新训练会比较有效。
数据多,数据类似程度高:这是最理想的情况。使用预训练的权重来初始化模型,然后重新训练整个模型。这也是最简单的微调方式,因为不涉及修改、冻结模型的层。
数据多,数据类似程度低:微调的效果估计不好,可以考虑直接重新训练整个模型。如果你用的预训练模型的数据集是ImageNet,而你要做的是文字识别,那么预训练模型自然不会起到太大作用,因为它们的场景特征相差太大了。

五种主流训练方式

预训练(Pretraining)→ 监督微调(SFT)→ 强化学习人类反馈(RLHF/PPO)→ 直接偏好优化(DPO)→ 继续预训练(CPT)

预训练(Pretraining)

主流采用自回归语言建模(Next-Token Prediction)(GPT系列)或掩码语言建模(MLM)(BERT系列):

  • 自回归:模型基于前文预测下一个词,逐步生成完整文本,适配生成式任务;
  • 掩码建模:随机掩盖文本中部分词汇,让模型预测被掩盖内容,适配理解式任务。

监督微调(Supervised Fine-Tuning,SFT)

在预训练模型 基础上,使用人工标注的指令-响应对数据进行有监督训练,让模型学会理解并执行人类指令,实现“指令-响应”的精准对齐,是模型从“通用”到“可用”的关键一步。

本质是迁移学习+监督学习:冻结预训练模型大部分参数(或用LoRA/QLoRA轻量化微调),仅更新少量参数,让模型学习“输入指令→输出标准回答”的映射关系,损失函数 为交叉熵损失。

强化学习 人类反馈(Reinforcement Learning from Human Feedback,RLHF)

在SFT模型基础上,引入人类反馈作为奖励信号,通过强化学习优化模型,让输出更符合人类偏好(如更有用、更安全、更自然),解决SFT“只会模仿、不懂好坏”的问题。

  • 阶段1:SFT基础训练:先让模型具备基础指令遵循能力;
  • 阶段2:奖励模型(Reward Model,RM)训练:用SFT模型生成同一指令的多个回答,人类标注“优劣排序”,训练RM模型学习“打分能力”(判断回答好坏);
  • 阶段3:PPO强化学习优化:以RM的打分作为奖励,用**近端策略优化(PPO)**算法更新模型,同时加入KL散度约束,防止模型偏离SFT基础能力太远。

直接偏好优化(Direct Preference Optimization,DPO)

RLHF的轻量化替代方案,直接利用人类偏好数据优化模型,无需训练独立RM、无需PPO强化学习,以更低成本实现与RLHF相当的偏好对齐效果。

基于数学洞察:RLHF的最优策略可通过“偏好对比数据”直接推导,无需显式奖励建模。核心是对比学习:对同一指令,给定“更优回答(y+)”和“更差回答(y-)”,通过特殊损失函数,直接最大化y+的生成概率、最小化y-的概率,同时用参考模型(SFT模型)约束更新幅度。

继续预训练(Continued Pre-Training,CPT)

在通用预训练模型基础上,针对特定领域/场景的海量无监督数据,再次进行自监督预训练,让模型深度融合领域知识,解决通用模型“领域知识不足、专业输出不精准”的问题。

与预训练逻辑一致,采用自回归/掩码建模,但数据聚焦垂直领域(如医疗、金融、工业、法律),让模型学习领域术语、逻辑、规范,强化领域理解与生成能力。

  • 模型训练 (Model Training): 通过数据迭代调整模型参数,以最小化预测误差的过程。
  • 参数 / 权重 (Parameters / Weights): 模型内部可调节的变量,类似于神经元之间的连接强度。训练就是调整这些数字。
  • 损失函数 (Loss Function): 衡量模型预测与真实值差距的数学公式,是模型优化的方向标。
  • 优化器 (Optimizer): 用于更新模型参数以降低损失值的算法(如Adam)。
  • 梯度下降 (Gradient Descent): 一种寻找最优参数的数学方法,形象比喻为“在迷雾中沿着最陡峭的坡度下山”,以找到误差的最低点。
  • 反向传播 (Backpropagation): 将输出端的误差反向传递回网络每一层,以计算每个参数需要如何调整的算法机制。
  • 自监督学习 (Self-Supervised Learning): LLM的主要训练方式,利用文本本身(如遮盖掉一部分词)作为标签来训练,无需人工标注。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐