第一章 课程准备

在本地环境的机器安装

第二章 构造大模型问答系统

在这里插入图片描述

大模型的问答工作流程

下面以“ACP is a very”为输入文本向大模型发起一个提问,下图展示从发起提问到输出文本的完整流程。
在这里插入图片描述
大模型的问答工作流程有以下五个阶段:

  • 第一阶段:输入文本分词化

  分词(Token)是大模型处理文本的基本单元,通常是词语、词组或者符号。我们需要将“ACP is a very”这个句子分割成更小且具有独立语义的词语(Token),并且为每个Token分配一个ID。如有需要,你可以使用Tokenizer API计算Token。
在这里插入图片描述
ACP is a very被分割成①ACP、②" is"、③" a"、④" very" 共四个Token,注意:空格也会编码。

  • 第二阶段:Token向量化

  计算机只能理解数字,无法直接理解Token的含义。因此需要将Token进行数字化转换(即转化为向量),使其可以被计算机所理解。Token向量化会将每个Token转化为固定维度的向量。

  • 第三阶段:大模型推理

  大模型通过大量已有的训练数据来学习知识,当我们输入新内容,比如“ACP is a very”时,大模型会结合所学知识进行推测。它会计算所有可能Token的概率,得到候选Token的概率集合。最后,大模型通过计算选出一个Token作为下一个输出,即第⑤个Token。

  这就解释了为什么当询问公司的项目管理工具时,模型无法提供内部工具的建议,这是因为其推测能力是基于已有的训练数据,对它未接触的知识无法给出准确的回答。因此,在需要答疑机器人回答私域知识时,需要针对性地解决这一问题,在本小节第3部分会进一步阐述。

  • 第四阶段:输出Token

  由于大模型会根据候选Token的概率进行随机挑选,这就会导致“即使问题完全相同,每次的回答都略有不同”。为了控制生成内容的随机性,目前普遍是通过temperature和top_p来调整的。

  例如,下图中大模型输出的第一个候选Token集合为“informative(50%)”、“fun(25%)”、“enlightening(20%)”、“boring(5%)”。通过调整temperature或top_p参数,将影响大模型在候选Token集合中的选择倾向,如选择概率最高的“informative”。你可以在本小节 2.2 中进一步了解这两个参数。
在这里插入图片描述
特别地,“informative”会被继续送入大模型,用于生成候选Token。这个过程被称为自回归,它会利用到输入文本和已生成文本的信息。大模型采用这种方法依次生成候选Token。

  • 第五阶段:输出文本

  循环第三阶段和第四阶段的过程,直到输出特殊Token(如,end of sentence,即“句子结束”标记)或输出长度达到阈值,从而结束本次问答。大模型会将所有生成的内容输出。当然你可以使用大模型的流式输出能力,即预测一些Token立即进行返回。这个例子最终会输出“ACP is a very informative course.”。

RAG 严格限制大模型使用外部检索到的知识,仅发挥其信息整合与表达力,避免“幻觉”和知识过期问题。

上下文工程的核心技术

它是构建可靠、高效大模型应用的一系列关键技术的总和,主要包括:

  • RAG (检索增强生成):从外部知识库(如公司文档)中检索信息,为模型提供精准的回答依据。
  • Prompt (提示词工程):通过精心设计的指令,精确地引导模型的思考方式和输出格式。
  • Tool (工具使用):赋予模型调用外部工具(如计算器、搜索引擎、API)的能力,以获取实时信息或执行特定任务。
  • Memory (记忆机制):为模型建立长短期记忆,使其能够在连续对话中理解历史上下文。

2.2 RAG

  上下文工程(Context Engineering),专注于为大模型的“上下文窗口”填充恰到好处的信息,以引导其完成特定任务。如果信息太少,模型会“不知道”;如果信息太多或无关,模型的性能会下降,成本也会增加

RAG-Retrieval Augment Generation的工作流程

  1. 建立索引有四个步骤,分别是①文档解析、②文本分段、③文本向量化和④存储索引

  2. 检索生成有连个步骤,分别是①检索、②生成

2.3 优化提示词

Meta Prompting:这种让你和模型一起“讨论”如如何优化提示词本身的方法,就叫做Meta Prompting。

维度 推理模型 通用模型
设计目标 专注于逻辑推理、多步问题求解、数学计算等需要深度分析的任务 面向通用对话、知识问答、文本生成等广泛场景
训练数据侧重 大量数学题解、代码逻辑、科学推理数据集增强推理能力 覆盖百科、文学、对话等多领域海量数据
典型输出特征 输出包含完整推导步骤,注重逻辑链条的完整性 输出简洁直接,侧重结果的自然语言表达
响应速度 复杂推理任务响应较慢(需多步计算) 常规任务响应更快(单步生成为主)

推理模型还是通用模型?如何选择?以下是一些推荐:

  • 明确的通用任务:对于明确定义的问题,通用模型一般能够很好地处理。
  • 复杂任务:对于非常复杂的任务,且需要给出相对更精确和可靠的答案,推荐使用推理模型。这些任务可能有:
    • 模糊的任务:任务相关信息很少,你无法提供模型相对明确的指引。
    • 大海捞针:传递大量非结构化数据,提取最相关的信息或寻找关联/差别。
    • 调试和改进代码:需要审查并进一步调试、改进大量代码。
  • 速度和成本:一般来说推理模型的推理时间较长,如果你对于时间和成本敏感,且任务复杂度不高,通用模型可能是更好的选择。

当然你还可以在你的应用中结合使用两种模型:使用推理模型完成Agent的规划和决策,使用通用模型完成任务执行。

2.5 优化RAG应用提升问答准确度

优化方向

  1. 让检索引擎召回更多的文档切片,默认是2
index = rag.load_index()
query_engine = index.as_query_engine(
    streaming=True,
    # 一次检索出 5 个文档切片,默认为 2
    similarity_top_k=5
)

单纯的提高召回数量并不是一个好办法,因为这样还不如找回整个文本,召回过多会降低模型的效率和准确性

2 给大模型结构更清晰的参考消息
在实际应用中,文档的组织结构对检索效果有着重要影响。想象一下,同样的信息,放在一个结构清晰的表格中和散落在一段普通文字里,哪个更容易查找和理解?显然是前者。大语言模型也是如此。当把原本在表格中的信息转换成普通文本时,虽然信息本身没有丢失,但结构性却降低了。

推荐使用markdown,因为它:

  • 结构清晰,层次分明
  • 语法简单,易于阅读和维护
  • 特别适合RAG(检索增强生成)场景下的文档组织

3 熟悉RAG的工作流程
RAG(Retrieval Augmented Generation,检索增强生成)是一种结合了信息检索和生成式模型的技术,能够在生成答案时利用外部知识库中的相关信息。它的工作流程可以分为几个关键步骤:解析与切片、向量存储、检索召回、生成答案等。接下来,将从 RAG 中的每一个环节入手,尝试优化 RAG 的效果。
在这里插入图片描述

文档准备阶段

  在传统的客服系统中,客服人员会根据用户所提问题,积累知识库,并共享其他客服人员参考。在构建RAG应用时,这一过程同样不可缺少。

  • 意图空间:我们可以把用户提问背后的需求绘制成点,这些点组成了一个用户意图空间。
  • 知识空间:而你沉淀在知识库文档中的知识点,则构成了组成一个知识空间。这里的知识点,可以是一个段落、或者一个章节。
    当我们将意图空间和知识空间投影到一起,会发现两个空间存在交集和差异。这些区域分别对应了我们后续三个优化策略。
  1. 重叠区域:
    • 即可以依靠知识库的内容来回答用户问题的部分,这是RAG应用效果保障的基础。
    • 对于这部分用户意图,你可以通过优化内容质量、优化工程和算法,不断提升回答质量
  2. 未被覆盖的意图空间:
    • 因为缺乏知识库内容的支撑,大模型容易输出“幻觉”回答。例如,公司新增了一个“数据分析部门”,但知识库中没有相关文档,不论如何改进工程算法,RAG应用都无法准确回答这一问题。
    • 你需要做的是主动补充缺漏的知识,不断跟进用户意图空间的变化
  3. 未被利用的知识空间:
    • 召回不相关知识点可能会干扰大模型的回答。
    • 因此,需要你优化召回算法避免召回无关内容。此外,你还需要定期查验知识库,剔除无关内容。
      在这里插入图片描述

  在尝试优化工程或算法之前,你应该有限构建一套可以持续收集用户意图的机制。通过系统化采集真实用户需求来完善知识库的内容,并邀请对用户意图有深刻理解的领域专家参与效果评估,形成“数据采集-知识更新-专家验证”的闭环流程,保障RAG应用的效果。
当你准备好这些,就可以进一步优化RAG应用的各个环节了。

文档解析与切片阶段

首先,RAG应用会解析你的文档内容,然后对文档内容进行切片。
大模型在回答问题时拿到的文档切片如果缺少关键信息,会回答不准确;如果拿到的文档切片非关联信息过多(噪声),也会影响回答质量。即过少或过多的信息,都会影响模型的回答效果。
因此,在对文档进行解析与切片时,需要确保最终的切片信息完整,但不要包含太多干扰信息。

2.6

2.7 微调

  前面的课程中,介绍了如何搭建一个答疑机器人,并尝试通过优化提示词和构建RAG(Retrieval-augmented Generation)、扩展插件等方式提升其能力。不过你可能会发现,你一直在模型外围"打补丁"——这些方法本质上都是通过外部工具增强模型表现,而模型本身的知识边界和推理能力并未发生根本性改变。本节将带你走进大模型的"内功修炼场",通过微调(Fine-tuning)技术直接提升模型的底层能力。

  当面对特定领域的深度需求时,比如小学数学题的精准解析,靠提示工程和 RAG 往往力不从心。针对题目中涉及的运算优先级规则、应用题单位换算逻辑等细节,模型需要建立结构化的知识体系。这时微调就展现出独特优势——通过向模型“定向投喂”由DeepSeek-R1生成的数学题解题范例,你能让模型学习DeepSeek-R1在数学题方面的知识,掌握数学思维范式,甚至自主发现解题规律。

由DeepSeek-R1生成的数学题解题范例,这里的范例是需要人工筛选的

生成
优质样本
新题
原始R1
海量解题样本
人工筛选
微调数据集
模型微调
专项增强型R1
结构化输出
错误率下降60%

任务设计

  如何解决数学问题一直是大模型发展的一个重要方向,正好你的智能助手也需要具备基础计算能力。为了方便对模型进行微调,你可以选定一个小参数的开源模型qwen2.5-1.5b-instruct作为你的基准模型。

首先,你需要下载模型,并将其加载到内存中:

在这里插入代码片

可以直接试一试它在数学题上的效果(答案是:可收萝卜648千克):

在这里插入代码片
Starting from v4.46, the `logits` model output will have the same type as the model (except at train time, where it will always be FP32)
在一块底边长18米,高6米的三角形菜地里种萝卜。如果每平方米收萝卜12千克,这块地可收萝卜多少千克?
正确答案是:可收萝卜648千克
-----------大模型回答-------------
首先,我们需要计算出这块三角形菜地的面积。给定的是一个直角三角形,其底边长为18米,高(即垂直于底边的边)为6米。 对于直角三角形,其面积可以通过底边乘以高再除以2来计算: \[ \text{面积} = \frac{\text{} \times \text{}}{2} = \frac{18 \, \text{} \times 6 \, \text{}}{2} = 54 \, \text{平方米}
------------回答结束--------------

  可以发现似乎你的模型并不能很好的计算这个简单的数学问题,模型知道三角形的面积公式,但却无法利用知识准确计算出萝卜的重量。
  当然使用RAG(Retrieval-Agumented Generation)的效果是一样的,经过前面的学习,你知道RAG更像是开卷考试,但你从来没有见过数学考试开卷能提升成绩,因为提高数学能力的核心在于提高学生的逻辑推理和计算能力而非知识检索。
  所以为了直接提升你答疑机器人在简单数学问题上的能力,你必须使用模型微调来提高模型的逻辑推理能力。(计算能力可以通过引入“计算器”插件来增强)

计算能力可以通过引入“计算器”插件来增强指的是将AI模型在解决数学问题时涉及到的纯数值运算部分,交给一个外部专门的计算工具来处理,以确保计算的精确性,从而让AI模型能够专注于提升其更核心的逻辑推理能力。 这是一种“让专业的人(工具)做专业的事”的策略,目的是显著提升AI在数学问题解答上的最终准确性和可靠性。

微调原理

模型如何学习

  • 机器学习 - 通过数据寻找规律
      在传统编程工作中,你通常是知道明确的规则,并将这个规则编写成函数的形式,例如: f ( x ) = a x f(x)=ax f(x)=ax。其中 a a a 是已知的确定性值(也称为参数或权重)。这里的函数,就是一个简单的算法模型,它能根据输入 x x x来计算(预测)输出 y y y。然而实际情况中,你更有可能事先不知道明确规则(参数),但可能知道一些现象(数据)。
      机器学习的目标,就是帮助你通过数据(训练集),来尝试找到(学习)这些参数值,这一过程被称为训练模型。

  • Loss Function & Cost Function - 量化评估模型表现
      要找到最合适的参数,你就需要有办法来度量当前所尝试的参数是否合适。为了更好理解,可以假设你现在需要评估模型 f ( x ) = a x f(x)=ax f(x)=ax中的参数 a 是否合适。

Loss Function 损失函数
  你可以用训练集的每一个样本 x i x_i xi对应的实际结果值 ,与模型预测结果值 f ( x i ) f(x_i) f(xi)相减,来评估模型在 x i , y i x_i,y_i xi,yi这一条数据上的表现。这个评估误差的函数被称为 Loss Function(损失函数,或误差函数): L ( y i , f ( x i ) ) = y i − a x i L(y_i,f(x_i))=y_i-ax_i L(yi,f(xi))=yiaxi
  直接计算差值时可能会有正有负,这会导致在汇总损失时产生正负值相互抵消,低估了总损失。为了解决这一问题,你可以考虑将差值的平方,作为损失: L ( y i , f ( x i ) ) = ( y i − a x i ) 2 L(y_i,f(x_i))=(y_i-ax_i)^2 L(yi,f(xi))=(yiaxi)2。同时,平方值能够放大误差的影响,有利于你找到最合适的模型参数。

在实际应用中,对于不同的模型,可能会选择不同的计算方法来作为 Loss Function。其实误差也是一个主观定义的概念,只是在我们日常生活中通常使用的是绝对值误差。

Cost Function 代价函数
  为了评估模型在整个训练集上的表现,你可以计算所有样本的损失平均值(即均方误差,Mean Squared Error,MSE)。这种用于评估模型在所有训练样本上的整体表现的函数,被称为 Cost Function(代价函数,或成本函数)。

对于包含 m m m 个样本的训练集,代价函数可以表示为: J ( a ) = 1 m = ∑ i = 1 m ( y i − a x i ) 2 J(a)=\frac{1}{m}=\sum_{i=1}^m (y_i-ax_i)^2 J(a)=m1=i=1m(yiaxi)2

在实际应用中,对于不同的模型,也可能会选择不同的计算方法来作为 Cost Function。

  有了 Cost Function,寻找模型合适的参数的任务,就可以等效为寻找 Cost Function 最小值(即最优解)的任务。找到 Cost Function 的最小值,意味着该位置的参数 a a a 取值,就是最合适的模型参数取值。

  如果将 Cost Function 绘制出来,寻找最优解的任务,其实就是寻找曲线或曲面的最低点。
在这里插入图片描述

实际项目中,人们经常会将代价函数、损失函数两个概念混用,在后续内容中的代码,我们也会沿用这一工程习惯,将代价函数称为损失函数(loss function)。

  • 梯度下降算法 - 自动地寻找最优解
      在前面的曲线中,你可以肉眼观察到最低点。但在实际应用中,模型通常参数很多,其 Cost Function 通常是高维空间中的复杂曲面,无法通过直接观察来找到最优解。因此,你需要一种自动化的方法,来寻找最优参数配置。
      梯度下降算法是最常见的方法之一。一种常见的梯度下降算法实现是,先在曲面(或曲线)上随机选择一个起点,然后通过不断小幅度调整参数,最终找到最低点(对应最优参数配置)。
    在这里插入图片描述
    训练模型时,你需要训练程序能自动地不断调整参数,最终让 Cost Function 的值逼近最低点。所以梯度下降算法,需要能自动地控制两点:①调整参数的方向,以及②调整参数的幅度

调整参数的方向
  如果 Cost Function 是一条 U 型曲线,可以很直观地看到,参数的调整应该是朝着曲线斜率绝对值变低的方向,也就是越来越平坦的方向。
在这里插入图片描述

  如果 Cost Function 是一个三维坐标系下的曲面,参数的调整方向,同样是朝着越来越平坦的位置。但曲面的某一点上,下降的方向并不唯一。为了尽快地找到最低点,你应该朝着最陡峭的方向相反方向移动。
在这里插入图片描述

  在数学中,梯度指向了以曲面上的某个点为起点,上升最快的方向,其反方向则是下降最快的方向。

  为了在最短时间内找到曲面最低点,调整参数的方向,应该朝着梯度的反方向,也就是上面两个图中的绿色箭头方向。

对于二维坐标系的曲线 f(a),某点的梯度就是该点的斜率。 对于三维坐标系里的曲面 f(a,b),某点的梯度是由该点在 a、b
轴方向上的斜率值组成的二维向量。这表明了函数在各个输入变量方向上的变化率,并指向了增长最快的方向。计算曲面上一个点在某一个轴方向上的斜率的过程,也被称为求偏导。

调整参数的幅度
确定了调整参数的方向后,需要确定调整参数的幅度。

按照固定步长调整参数,是最容易想到的办法,但这可能会导致你始终无法找到最低点,而是在最低附近震荡。

比如下图,你按照固定步长为 1.5 来调整参数,就会出现在最低值附近反复震荡,无法进一步逼近最低点的情况。
在这里插入图片描述

为了避免这一问题,接近最低点时,应该调低调整幅度。越接近最低点,斜率会越小,因此你可以不再使用固定步长,而是使用当前位置的斜率作为调整幅度。
在这里插入图片描述

  但也有些 Cost Function 曲线非常陡峭,直接使用斜率也可能导致你跨过最低点反复震荡。为此,你可以使用斜率的同时,对斜率乘以一个系数,来调节步长。这个系数,被称为 Learning Rate(学习率)。

Learning Rate 的选择,对于训练效果和效率尤为重要:
在这里插入图片描述

较小的学习率,虽然会让你耗费很多计算资源和时间,但其实有助于你更加逼近最低点。实际的模型训练工程中,也会尝试动态地调整学习率。比如百炼的模型微调功能中,提供了学习率调整策略,它允许你配置学习率线性递减、或者按照曲线来递减。阿里云的 PAI 还提供了 AutoML 工具,它可以帮助你自动找到更合适的 Learning Rate。

  • 更多模型训练工程中会用到的参数

batch size
  在寻找 Cost Function 最低点的过程中,每一次计算梯度(各方向上的斜率),然后根据该梯度更新模型参数,准备进行下一次计算和更新的过程,被称为一个训练步骤(training step)。

  前文的介绍中,每个训练步骤是计算某一个点的梯度,然后进行参数更新(SGD Single Gradient Descent => Batch Gradient Descent)。你也可以将 batch size 设置为 n ,基于 n 个样本(mini-batch)平均梯度,进行参数更新。较大的 batch size 能加速训练过程,但对资源消耗也会更大,同时过大的 batch size 也可能导致模型泛化性能下降等问题。选择合适的 batch size 是一个权衡的过程,它取决于可用的硬件资源、训练时间和期望的模型性能等因素。实践中,通常也需要通过实验来确定最适合特定任务的 batch size。

eval steps
  因为训练集通常数量很大,人们通常不会在对训练集进行完整的迭代后,再使用验证集做评估(evaluation),而是会选择每间隔多少个训练步骤,就用验证集进行一次评估。这个间隔步骤数,通常是通过 eval_steps 参数来控制。

epoch
  对训练集进行一次完整的迭代,被称为一个 epoch。实际训练过程中,你并不能保证在一个 epoch 内就一定能找到 Cost Function 的最优解(最低点),所以很多训练框架会支持配置训练轮次,如训练框架 swift 中提供的 num_train_epochs 参数。

  过小的 epoch 值可能会导致训练结束时,还没有找到最优模型参数。过大的 epoch 值会导致训练时间过长以及资源浪费。

  寻找合适的 epoch 的常见方法是早停法(Early Stopping):在训练启动前,并不预设一个 epoch 值(或者设置一个较大值),然后在训练过程中,定期使用验证集评估模型表现。当模型在验证集表现不再提升(或者开始下降)时,自动停止训练。

  当然,早停法并不是唯一的解法,业界还有很多其他方法,来确定合适的 epoch 值,如动态调整学习率,根据验证集损失的变化来决定学习率的增减,从而间接影响训练的 epoch 数。

  • 神经网络–万能复杂函数逼近器

机器学习面临的问题:

  在文本生成任务中,输入 x x x和输出 y y y一般都有非常多的维度,你无法直接看出他们之间的规律,该怎么办?

比如:“鲁迅原名是什么?”→“周树人”,实际的过程是如下;

输入鲁迅...
One-hot编码7x5000维度
嵌入层
压缩为7x768维
神经网络计算规律
输出层扩展为3x50000维
取最高概率词

  聪明的数学家们找到了一个万能函数逼近器——神经网络(多层),它也成为了当前复杂机器学习任务的基础。
在这里插入图片描述
  一层神经网络一般表示为 Y = σ ( W ⋅ X ) Y=\sigma(W\cdot X) Y=σ(WX),大写的输入 X X X和输出 Y Y Y分别表示它们是多维的, σ \sigma σ是激活函数, W W W是假定的函数 f f f的参数。 k k k层神经网络可以表示为 Y = σ ( W k ⋯ σ ( W 2 σ ( W 1 ⋅ X ) ) ) Y=\sigma(W_k\cdots\sigma(W_2\sigma(W_1\cdot X))) Y=σ(Wkσ(W2σ(W1X)))
  激活函数是神经网络中引入非线性变换的关键组件,用于决定神经元是否被激活并传递信息。比如最常用的激活函数ReLU可以写成:
R e L U ( i n p u t ) = m a x ( i n p u t , 0 ) = { i n p u t 当  i n p u t > 0 0 当  i n p u t ≤ 0 ReLU(input)=max(input,0)=\begin{cases} input &\text{当 } input \gt 0\\ 0 &\text{当 } input \le 0 \end{cases} ReLU(input)=max(input,0)={input0 input>0 input0

i n p u t > 0 input \gt 0 input>0 时,神经元不激活;当 i n p u t ≤ 0 input \le 0 input0时,神经元激活,开始向输出传递信息。
一层神经网络展开后可以写成这样:(假设 X 为 3 × 2 X为3\times2 X3×2维矩阵, Y 为 2 × 2 Y为2\times2 Y2×2维矩阵)
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/50df767b463b40b7ad68c76ad7d4052a.png
σ ( W 2 × 3 ⋅ X 3 × 2 ) = σ ( [ w 1 , 1 w 1 , 2 w 1 , 3 w 2 , 1 w 2 , 2 w 2 , 3 ] × [ x 1 , 1 x 1 , 2 x 2 , 1 x 2 , 2 x 3 , 1 x 3 , 2 ] ) = σ ( [ w 1 , 1 × x 1 , 1 + w 1 , 2 × x 2 , 1 + w 1 , 3 × x 3 , 1 w 1 , 1 × x 1 , 2 + w 1 , 2 × x 2 , 2 + w 1 , 3 × x 3 , 2 w 1 , 1 × x 1 , 1 + w 1 , 2 × x 2 , 1 + w 1 , 3 × x 3 , 1 w 1 , 1 × x 1 , 1 + w 1 , 2 × x 2 , 1 + w 1 , 3 × x 3 , 1 ] ) ) = [ m a x ( 0 , ∑ k = 1 3 w 1 , k × x k , 1 ) m a x ( 0 , ∑ k = 1 3 w 1 , k × x k , 2 ) m a x ( 0 , ∑ k = 1 3 w 2 , k × x k , 1 ) m a x ( 0 , ∑ k = 1 3 w 2 , k × x k , 2 ) ] ) = [ y 1 , 1 y 1 , 2 y 2 , 1 y 2 , 2 ] ) = Y 2 × 2 \sigma(W_{2\times3}\cdot X_{3\times2})=\sigma(\begin{bmatrix} w_{1,1} & w_{1,2} & w_{1,3} \\ w_{2,1} & w_{2,2} & w_{2,3} \end{bmatrix} \times \begin{bmatrix} x_{1,1} & x_{1,2} \\ x_{2,1} & x_{2,2} \\ x_{3,1} & x_{3,2} \end{bmatrix}) \\ = \sigma(\begin{bmatrix} w_{1,1}\times x_{1,1} + w_{1,2}\times x_{2,1} + w_{1,3}\times x_{3,1} & w_{1,1}\times x_{1,2} + w_{1,2}\times x_{2,2} + w_{1,3}\times x_{3,2} \\ w_{1,1}\times x_{1,1} + w_{1,2}\times x_{2,1} + w_{1,3}\times x_{3,1} & w_{1,1}\times x_{1,1} + w_{1,2}\times x_{2,1} + w_{1,3}\times x_{3,1} \end{bmatrix}) ) \\ = \begin{bmatrix} max(0,\sum_{k=1}^{3}w_{1,k \times} x_{k,1}) & max(0,\sum_{k=1}^{3}w_{1,k \times} x_{k,2}) \\ max(0,\sum_{k=1}^{3}w_{2,k \times} x_{k,1}) & max(0,\sum_{k=1}^{3}w_{2,k \times} x_{k,2}) \end{bmatrix}) =\begin{bmatrix} y_{1,1} & y_{1,2} \\ y_{2,1} & y_{2,2} \end{bmatrix}) =Y_{2 \times2} σ(W2×3X3×2)=σ([w1,1w2,1w1,2w2,2w1,3w2,3]× x1,1x2,1x3,1x1,2x2,2x3,2 )=σ([w1,1×x1,1+w1,2×x2,1+w1,3×x3,1w1,1×x1,1+w1,2×x2,1+w1,3×x3,1w1,1×x1,2+w1,2×x2,2+w1,3×x3,2w1,1×x1,1+w1,2×x2,1+w1,3×x3,1]))=[max(0,k=13w1,k×xk,1)max(0,k=13w2,k×xk,1)max(0,k=13w1,k×xk,2)max(0,k=13w2,k×xk,2)])=[y1,1y2,1y1,2y2,2])=Y2×2
同时万幸的是,梯度下降法在高维度、复杂的函数上一样有效。
在这里插入图片描述

现在你已经有了王牌组合:
能够逼近任意复杂函数的工具——神经网络 + 能够拟合数据规律、学习函数参数的方法 ——梯度下降法


特性 预训练 微调
目标 学习通用特征 适应特定任务
数据 大规模通用数据 小规模任务相关数据
训练方法 自监督/无监督 有监督
参数更新 所有参数可训练 部分或全部参数可训练
应用场景 基础模型构建 特定任务优化

值得一提的是,预训练一般通过自监督/无监督方式学习 ,学习的数据来自互联网上的海量文本(如维基百科、书籍、网页),让模型自己从数据中找规律或“猜答案。” 这种学习方式因为其数据无需人工标注,省去了大量人力成本,天然适用于海量数据的学习。

而微调通过有监督学习 ,需要针对特定任务的小规模标注数据(如情感分类的标注评论、医疗文本的标注数据),并用标注数据直接教模型完成任务。这种学习方式由于人工标注成本高,难以扩展为海量数据,因此更适合有明确场景目标的模型训练,所需要的样本数量通常只有几千或几万条。

因此,你可以通过如下方式 快速、低成本 地构建自己的大模型应用:

第一步:直接选择预训练模型(如Qwen、DeepSeek、GPT),这样可以节省从零训练一个模型的综合成本。

第二步:根据自己的实际场景,微调模型,通常只需要构建几千条适用于实际场景的标注数据,因为训练数据总 Tokens 数大大降低,使得训练时间有效缩减,从而进一步降低训练成本。

通过微调可以缩短训练时间,但是微调模型对显存的需求是否也能降低呢?

模型参数量是影响显存需求的主要原因,从调整参数量的大小这个角度,可以把微调分为全参微调与高效微调。

全参微调(Full Fine-Tuning) 是在预训练模型的基础上进行全量参数更新的优化方法。该方法通过复用预训练模型已习得的通用知识,避免了从头训练(Pretraining)所有参数所需的海量计算资源和数据,从而显著降低训练成本。同时,由于所有参数均可调整,能最大程度适配下游任务,避免因部分参数冻结导致的性能下降。然而,对于大模型而言,全参微调本身仍需要较高的训练成本(需更新全部参数、存储梯度及优化器状态),对计算资源和数据规模的要求依然较高。

高效微调技术(PEFT) 通过调整少量参数,显著降低大模型微调的计算成本,同时保持性能接近全参训练。典型方法包括Adapter Tuning、Prompt Tuning 和 LoRA。其中,LoRA 因仅需训练适配的小参数矩阵(即低秩矩阵,仅需原模型0.1%-1%的参数),成为资源受限场景下的首选方案。以下重点解析 LoRA 如何以极低参数量实现高效微调。

微调实践

模型训练的状态与指标

训练模型,和人的学习考试过程非常相似。

模型要经过三套题目的考验,产生两个指标,来确定模型训练所处于的状态。它们分别是:

三套题目:

  • 训练集:课程练习册,带详细答案解析,模型会反复练习,并基于损失函数产生
    训练损失(training loss)
    训练损失越小,说明模型在你给它的练习册上表现更好。
    结合本节 2.1 模型如何学习中讲到的梯度下降方法,模型会基于训练损失来更新自己的参数。
    θ n e w = θ o l d − α ⋅ ∇ θ L o s s ( θ ) θ_{new} = θ_{old} - α \cdot \nabla_θLoss(θ) θnew=θoldαθLoss(θ)

  • 验证集:模拟考试题,模型每学习一段时间,就会测试一次,并基于损失函数产生
    验证损失(evaluation loss)
    验证损失就是用于评估模型训练的效果。验证损失越小,说明模型在模拟考试中表现越好。

  • 测试集:考试真题。模型在测试集上的准确率用于评估最终的模型表现。

模型训练的三个状态:

训练损失不变,甚至变大:说明训练失败。
你可以理解为模型在训练集(练习册)上没有学习到知识,说明模型的学习方法有问题。

训练损失和验证损失都在下降:说明模型欠拟合。
你可以想象成模型在训练集(练习册)上的学习有进步,验证集(模拟考试)的表现也变好了,但还有更多的进步空间。这时候你应该让模型继续学习。

训练损失下降但验证损失上升:说明模型过拟合。
你可以理解为模型只是背下了训练集(练习册),在模型考试中遇到了没背过的题反而做不来了。这种场景需要通过一些方法去抑制模型的背题倾向,比如再给它20本练习册,让它记不住所有的题,而是逼它去学习题目里面的规律。

3.2 基准模型考试
在开始模型微调前,先来看看基准模型在测试集上的表现如何。

第三章 总结与展望

资料

考试

24年我有了自己的孩子,

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐