AI训练与推理:从零到精通的实战指南
一、AI是什么三个圈的关系首先理清三个经常混用的词人工智能让机器模仿人类智能的学科/目标。比如让电脑“看懂”图片、“听懂”语言。机器学习实现AI的主要方法——不直接编写规则而是让机器从数据中自己学习规律。深度学习机器学习的一个分支使用“神经网络”这种结构目前大模型如ChatGPT都属于它。打个比方人工智能是“学会开车”这个目标机器学习是“通过大量练习来学会开车”这个方法深度学习是“用模拟人脑的神经网络来练习”这种具体技术。二、模型是什么模型可以理解为一个“超级复杂的数学公式”它有很多可调节的旋钮参数。最初这个公式输出的结果是随机的、毫无意义的。训练就是不断调整这些旋钮让公式的输出越来越接近我们想要的结果。三、训练 —— 让模型“上学”训练是消耗算力、数据、时间的阶段目标是让模型从数据中学会知识。1. 准备教材数据比如你想训练一个“识别猫”的模型就需要准备成千上万张图片有些图片标着“这是猫”有些标着“这不是猫”2. 学习过程前向传播给模型看一张猫的图片它随机猜一个结果比如“60%是猫”。计算损失对比正确答案100%是猫算出“错误有多大”。这个误差叫损失。反向传播把误差反向传回模型告诉每个“旋钮”“你该往左拧一点还是往右拧一点”。优化实际拧动旋钮更新参数让下次预测更准。这个过程重复几百万甚至几十亿次模型慢慢从“胡猜”变成“一眼认出猫”。3. 训练的关键要素数据质量比数量更重要。垃圾进垃圾出。算力GPU显卡是主力因为神经网络的计算非常适合并行处理。算法包括模型结构、优化方法等决定了学习效率。超参数比如学习速度每次拧旋钮的幅度设置不当会导致学不会或学崩。四、推理 —— 让模型“工作”训练完成后模型参数固定下来不再变化。推理就是使用训练好的模型做实际预测。训练造一个“专家”费时费力推理请专家回答问题快速、低成本比如ChatGPT训练阶段用海量文本花费几个月、数千万美元训练出基础模型。推理阶段你输入一句话模型几秒内生成回复。这个回复过程就是推理。推理时模型不再反向传播、不再学习只是根据输入快速计算一次输出。五、直观类比学骑自行车阶段类比AI对应初始状态从未骑过车一上车就倒随机初始化的模型训练一次次摔倒根据摔倒方向调整身体平衡计算损失反向传播更新参数训练完成已经形成肌肉记忆不再需要刻意调整模型参数固定可以部署使用推理之后每次骑车出行快速平稳地到达目的地输入新数据输出预测结果六、为什么有时会搞混“训练”和“推理”因为在一些简单场景里界限会模糊在线学习模型边用边学比如推荐系统实时更新训练和推理交替进行。微调一个已经训练好的大模型你用少量数据再稍微训练一下让它适应你的场景。但在主流的大模型应用中绝大多数情况下训练是AI公司/实验室做的事推理是普通用户使用AI时的体验七、一个具体例子让AI看懂数字假设你要训练一个识别手写数字0-9的模型。1.数据几万张28x28像素的图片每张已标好是哪个数字MNIST数据集。2.模型结构一个简单的神经网络输入层784个像素输出层10个数字。3.训练输入一张“3”的图片模型输出[0.1, 0.05, 0.02, 0.6, 0.03, …] 表示认为可能是3的概率60%正确答案应该是[0,0,0,1,0,…]损失函数计算出差距反向传播调整参数重复几万次后模型对“3”的识别准确率接近99%4.推理用户画一个潦草的数字模型一次前向传播输出概率最高的数字。八、最简单的训练推理代码用Python和PyTorch识别手写数字的完整示例可以实际运行看看训练时损失如何下降、推理时如何输出结果——这样会比纯理论更直观。1.环境准备如果你还没有安装 PyTorch先运行pip install torch torchvision matplotlib2.完整代码import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms import matplotlib.pyplot as plt # 1. 准备数据下载 MNIST 手写数字数据集 transform transforms.Compose([ transforms.ToTensor(), # 图片转为张量像素值归一化到 [0,1] transforms.Normalize((0.5,), (0.5,)) # 标准化到 [-1,1]加速收敛 ]) # 训练集60000张图片 trainset torchvision.datasets.MNIST(root./data, trainTrue, downloadTrue, transformtransform) trainloader torch.utils.data.DataLoader(trainset, batch_size64, shuffleTrue) # 测试集10000张图片用于推理演示 testset torchvision.datasets.MNIST(root./data, trainFalse, downloadTrue, transformtransform) testloader torch.utils.data.DataLoader(testset, batch_size1, shuffleTrue) # batch_size1 方便逐张推理 # 2. 定义模型一个简单的全连接神经网络 class SimpleNN(nn.Module): def __init__(self): super(SimpleNN, self).__init__() self.fc1 nn.Linear(28*28, 128) # 输入层28x28784个像素 - 隐藏层128个神经元 self.fc2 nn.Linear(128, 64) # 隐藏层128 - 64 self.fc3 nn.Linear(64, 10) # 输出层10个神经元对应数字0-9 self.relu nn.ReLU() # 激活函数 def forward(self, x): x x.view(-1, 28*28) # 将28x28图片展平成784维向量 x self.relu(self.fc1(x)) x self.relu(self.fc2(x)) x self.fc3(x) # 最后一层不用 softmax因为损失函数会内部计算 return x # 实例化模型 model SimpleNN() # 定义损失函数和优化器 criterion nn.CrossEntropyLoss() # 交叉熵损失适合多分类 optimizer optim.Adam(model.parameters(), lr0.001) # 3. 训练阶段 print(开始训练...) epochs 5 # 训练5轮可增加但为了快速演示先用5轮 for epoch in range(epochs): running_loss 0.0 for images, labels in trainloader: # 前向传播计算模型输出 outputs model(images) # 计算损失 loss criterion(outputs, labels) # 反向传播 优化 optimizer.zero_grad() # 清空之前的梯度 loss.backward() # 反向传播计算梯度 optimizer.step() # 更新参数 running_loss loss.item() print(f第 {epoch1} 轮结束平均损失: {running_loss / len(trainloader):.4f}) print(训练完成) # 4. 推理阶段随机取一张测试图片让模型预测 print(\n开始推理演示...) # 从测试集中取一张图片 dataiter iter(testloader) image, label next(dataiter) # 模型推理不需要计算梯度加快速度 with torch.no_grad(): output model(image) predicted torch.argmax(output, dim1) # 取概率最高的类别 # 显示图片和预测结果 plt.imshow(image.squeeze(), cmapgray) plt.title(f真实标签: {label.item()} | 模型预测: {predicted.item()}) plt.axis(off) plt.show() # 额外再测试几张看看准确率 correct 0 total 0 with torch.no_grad(): for images, labels in testloader: outputs model(images) _, predicted torch.max(outputs, 1) total labels.size(0) correct (predicted labels).sum().item() print(f\n在测试集上的准确率: {100 * correct / total:.2f}%)3.代码流程解析1. 数据准备使用MNIST数据集包含 0~9 的手写数字图片每张 28×28 灰度图。训练集 60000 张测试集 10000 张。数据加载器DataLoader会将数据分批送入模型batch_size64。2. 模型定义定义了一个3 层全连接网络也叫多层感知机 MLP输入层784 个像素隐藏层 1128 个神经元隐藏层 264 个神经元输出层10 个神经元对应 0~9 的得分激活函数用ReLU让网络能学习非线性关系。3. 训练过程关键outputs model(images) # 前向传播输入图片得到10个分数 loss criterion(outputs, labels) # 计算预测分数与真实标签的差距 loss.backward() # 反向传播计算每个参数的梯度 optimizer.step() # 根据梯度更新参数每看完一批图片64 张就更新一次参数。训练 5 轮epoch后损失会明显下降模型学会识别数字。4. 推理过程with torch.no_grad():表示不记录梯度推理时不需要反向传播节省内存和计算。输入一张新图片模型直接输出 10 个分数取最大值对应的索引即为预测的数字。最后统计了模型在 10000 张测试集上的准确率通常在95%~97%左右。5.运行结果同时会弹出一张图片显示模型对某张手写数字的预测结果大概率与真实标签一致。如下图所示感兴趣的小伙伴快去试试吧