我设计了一系列的实战任务串联大模型的技术演进脉络,并运用大量视觉语言,使用数百张插图帮助读者对LLM学习过程中的主要概念和流程建立直观认识,降低理解的难度。
亲手制作的数百幅全彩插图,给你提供极致视觉化呈现,让所有的技术难点都可视化、易理解。
本文是其中一个章节的节选,完整版包含更多实战项目和深度内容。
📘整本书已免费开源,欢迎阅读完整版:阅读全文
神经网络启蒙:PyTorch 入门实战
本章我们将正式迈入神经网络的大门,从零开始构建并训练你的第一个神经网络模型。通过本次任务,你将会了解神经网络模型的基本结构、训练流程,并掌握如何使用深度学习框架 PyTorch 快速搭建并进行训练一个多参数回归模型。
任务背景
你是一名程序员。自从上次与小美合作,成功教会机器人制作柠檬水后,你的无人柠檬水摊位生意渐火。看着账户里稳定增长的收入,一个更大胆的想法浮现出来:如果只卖经典原味柠檬水,市场天花板显而易见;但如果能让机器人学会开发多种口味的特调柠檬水,必将大大提升产品的吸引力和营收潜力。
你尝试在基础柠檬水中加入薄荷叶、百香果、黄瓜片或少许玫瑰盐,以创造不同的风味。薄荷带来清凉感,黄瓜增加清新的后韵,而一点点玫瑰盐则能神奇地提升整体的层次感——但这些配料之间会相互影响,如何平衡它们才是真正的艺术。
你不断尝试各种配比组合,邀请顾客品尝并记录评分,逐步优化配方。然而,这种试错过程漫长且成本高昂。于是你想:如果能训练一个模型,自动根据配料配比预测顾客评分,问题便可迎刃而解。
最少必要知识
神经网络概论
PyTorch 基础
任务鸟瞰
本次的任务是:训练一个模型,根据薄荷叶、百香果、黄瓜片和玫瑰盐的配比,预测顾客对柠檬水的评分。
预测一杯柠檬水的口感评分,看似简单,实则受到多种参数的复杂影响。薄荷叶的多少、黄瓜片的厚薄、玫瑰盐的用量……这些细微变量都在悄然塑造着最终的口感体验。面对如此纷繁的因素,我们难以通过手动方式去管理每一个参数,因为很难精确描述它们与口感评分之间的复杂关系。
此时,不妨观察人类如何对柠檬水进行评分,并尝试从生物神经元的机制中汲取灵感。
神经网络
在大脑中,神经元是信息处理的基本单元。一个神经元会接收外界的刺激信号,神经突触根据输入信号的重要性进行加权处理;当加权后的信号总和超过某个阈值时,神经元被激活,产生输出信号。
神经元工作过程可分为两步:
加权求和:对多个输入信号进行加权融合;
点火激活:若加权和超过阈值,则触发输出。
当我们品尝柠檬水并给出评分时,大脑中的神经元正在进行类似处理。味觉、嗅觉等感官接收到的特征信息(薄荷的清香、黄瓜的清爽、玫瑰盐的风味等)被传递至相关神经元,经过加权整合,最终形成对口感的综合评判,即评分。
我们可以将上述过程抽象为人工神经元模型。单个神经元的计算可表示为:**输出 = 激活函数(Σ(权重 × 输入) + 偏置)**。
计算的过程如下图所示:
其中:
:输入信号
:权重
:偏置(可视为阈值)
:加权求和
σ:激活函数
:输出信号
更进一步,我们可以将神经元结构表示为数学公式: σ
模型结构
由大量神经元相互连接形成的系统称为神经网络(Neural Network)。本次任务我们使用神经网络,构建一个用于预测柠檬水评分的模型,学习三种配料与评分之间的关系。其模型结构如下:
本次的任务也是一个简单的多参数回归模型,所以我们只它使用一个神经网络层构建模型即可,这个神经网络层有3个输入和1个输出。
开发神经网络模型和机器学习模型一样,通常也遵循以下四个步骤:数据准备、模型定义、模型训练与模型评估。下文将依此流程组织内容。在开始之前,我们先配置环境,避免因为环境不同而导致程序不能复现。
环境配置
安装依赖
!pip install --upgrade dsxllm -i https://pypi.org/simple环境版本
from dsxllm.util import show_version show_version()本书愿景: +------+--------------------------------------------------------+ | Info | 《动手学大语言模型》 | +------+--------------------------------------------------------+ | 作者 | 吾辈亦有感 | | 哔站 | https://space.bilibili.com/3546632320715420 | | 定位 | 基于'从零构建'的理念,用实战帮助程序员快速入门大模型。 | | 愿景 | 若让你的AI学习之路走的更容易一点,我将倍感荣幸!祝好😄 | +------+--------------------------------------------------------+ 环境信息: +-------------+--------------+------------------------+ | Python 版本 | PyTorch 版本 | PyTorch Lightning 版本 | +-------------+--------------+------------------------+ | 3.12.12 | 2.10.0 | 2.6.1 | +-------------+--------------+------------------------+数据准备
数据集下载
如果你想要亲自动手复现运行结果,可以点击此链接下载相关数据集。
点击下载数据集
观察数据
加载并预览数据集前5行,了解数据结构。
# 读取数据 import pandas as pd # 读取训练集数据 train_data_frame = pd.read_csv('./dataset/craft_lemonade_train.csv') train_data_frame[:5]| 薄荷叶 | 黄瓜片 | 玫瑰盐 | 顾客评分 | |
|---|---|---|---|---|
| 0 | 9 | 10 | 6 | 8.60 |
| 1 | 10 | 9 | 7 | 8.90 |
| 2 | 5 | 3 | 7 | 4.80 |
| 3 | 3 | 4 | 6 | 4.10 |
| 4 | 4 | 9 | 2 | 5.25 |
从输出结果可以看到数据包含四个字段:薄荷叶、黄瓜片、玫瑰盐(输入特征)和 顾客评分(目标值)。我们需要将每一条训练数据转化成<输入特征, 目标值>数据对的形式。
定义数据加载方法
根据文件路径加载csv数据,分离出输入特征与对应的目标值标签。
def load_data(file_path): # 读取 csv 数据 data_frame = pd.read_csv(file_path) # 将DataFrame数据转换为列表格式 features = data_frame[['薄荷叶', '黄瓜片', '玫瑰盐']].values.tolist() target_scores = data_frame[['顾客评分']].values.tolist() return features, target_scores加载训练集和评估集
加载训练数据和评估数据,并打印训练集和评估集的样本数量,确认数据加载成功。
train_features, train_targets = load_data('./dataset/craft_lemonade_train.csv') val_features, val_targets = load_data('./dataset/craft_lemonade_val.csv') print(f"训练数据集样本数量:{len(train_features)}") print(f"评估数据集样本数量:{len(val_features)}")训练数据集样本数量:800 评估数据集样本数量:200模型定义
PyTorch 核心概念
要构建并训练一个神经网络模型,离不开强大的深度学习框架。PyTorch 以其灵活性、Python 友好的设计而广受欢迎,它提供了直观的接口来构建和调试复杂神经网络,是目前入门人工智能的主流选择之一。
为了顺利搭建柠檬水评分预测模型,我们需要了解以下 PyTorch 的核心概念:
| 概念 | 说明 |
|---|---|
| 张量(Tensor) | PyTorch 中数据的基本单元,配料配比、评分等参数都需转换为张量。 |
| 网络层(Layer) | 模型处理数据的基本模块,需明确其输入输出维度。 |
| 模型(Model) | 多个网络层的有序堆叠,形成完整的神经网络模型。 |
Pytorch详细教程可参考:https://www.runoob.com/pytorch/pytorch-basic.html
柠檬水评分预测模型的模型结构
本次任务我们使用 PyTorch 训练一个预测 3 种配料与顾客评分之间关系的神经网络模型。
回顾一下模型结构:
柠檬水评分预测模型的代码实现
定义一个继承自nn.Module的柠檬水评分模型类LemonadeRatingModel,这是 PyTorch 中定义神经网络模型的标准方式。
import torch import torch.nn as nn # 定义柠檬水评分预测模型,继承自 nn.Module,这是PyTorch中定义神经网络的标准方式 class LemonadeRatingModel(nn.Module): def __init__(self): super(LemonadeRatingModel, self).__init__() # 创建一个线性层:接受3个输入特征(薄荷叶、黄瓜片、玫瑰盐)并输出1个值(顾客评分) self.rating_predictor_layer = nn.Linear(in_features=3, out_features=1, bias=False) def forward(self, input_features): # 前向计算,定义数据在网络中的流动方式,预测顾客评分,forward 方法会被自动调用 predicted_rating = self.rating_predictor_layer(input_features) return predicted_rating自定义模型时, 需要重写模型的__init__和forward方法,分别完成模型的初始化和前向计算。
__init__():定义模型的参数和层结构,创建一个拥有 3 个输入特征,1 个输出特征的线性层(Linear)。forward():定义数据在网络中的流动方式,通过前向计算根据输入特征预测顾客评分。
线性层
在 PyTorch 中,线性层(Linear Layer)是最基础、最常用的神经网络层之一,由于它的每一个神经元都接收来自上一层所有神经元的输入信号,并与每个输入都有一个独立的权重进行连接,所以也称它为“全连接层”。
在PyTorch中,线性层由
torch.nn.Linear类实现。它的主要参数有:
in_features:输入特征的数量(即输入的维度)
out_features:输出特征的数量(即输出的维度)