大模型通识 / AI 理论基础
6. 概率、预测与损失:模型怎样知道自己需要改进
原文备份 · 第 7 / 14 篇 · 查看极客时间原知识库 ↗
本篇目录 · 9 节
来源:AI 理论基础
复习助手收到一篇前端笔记。两个分类模型都选了“前端”,但内部给出的结果不同:
模型甲:前端 0.51,数据库 0.49
模型乙:前端 0.99,数据库 0.01
如果只数答案对不对,它们这一次都得一分。如果最后发现标签其实是“数据库”,它们又都错一次。这样的计分方式,没有表达两组预测之间的差别。
训练时,我们往往希望获得更细的反馈:模型给目标类别分配了多少概率,预测偏离目标有多远,这种错误该计多大的代价。损失函数就是把这些要求变成可计算数值的一种方法。
本篇会把概率、类别预测、误差与损失分开,再用两个小算例把它们连起来。所有概率和记录均为教学构造,不是真实模型测试。你只需要会四则运算;对数公式会给出直觉与数值表,不要求先学高等数学。
概率分布表达什么,最终答案又是什么
先约定一个简化任务:每篇笔记只能属于“前端”或“数据库”中的一个类别。暂时不处理混合主题,也不把这两个类别当作所有真实笔记的完整分类体系。
模型可以为两个候选分别给出概率。下面是同一篇笔记的三种假想输出:
| 输出 | 前端 | 数据库 | 若总选概率较高的类别 |
|---|---|---|---|
| 甲 | 0.51 | 0.49 | 前端 |
| 乙 | 0.99 | 0.01 | 前端 |
| 丙 | 0.20 | 0.80 | 数据库 |
在这种互相排斥、从中选一的设置中,各概率不能为负,总和为 1。这一整组概率就是候选类别上的概率分布。0.8 可以写成 80%。
概率分布和选出的类别是两个层次。甲与乙选出的类别相同,但分布不同;把分布压缩为一个类别,会丢掉一部分信息。
还要区分概率与普通分数。第 02 篇的分类器可以算出 -1,这个数只是中间分数,不是负概率。有些模型先计算不受 0 到 1 限制的分数,再通过适当变换得到概率。例如 Softmax 可以把一组分数转成非负且总和为 1 的分布;其具体公式现在可以先不展开。《动手学深度学习》:分数、Softmax 与分类概率
因此,看到一个数字时,先问它表示什么。检索相似度、分类分数、类别概率和聊天回答里写出的“可信度”,不能只因为都能显示成小数就互换。
模型给出 80%,不等于每一次都有现实保证
概率输出描述的是模型基于当前输入作出的估计,不是模型直接读到了现实中的确定答案。
怎样判断这种估计可信?一种检查方式是观察一批类似预测:如果模型把许多样本属于前端的概率都报在 0.8 附近,那么在与使用场景相符、数量足够的样本中,实际属于前端的比例是否也接近 80%?这种预测概率与实际频率的对应关系,涉及概率校准,calibration。scikit-learn:概率校准
这里要看一批样本,不能因为某一篇“80% 前端”的笔记恰好是数据库,就单凭这一次证明模型概率有问题。同样,也不能因为一次猜对,就证明它的概率一直可靠。
模型可能报得过于确定。假设它把一批样本的前端概率都报成 0.99,实际只有大约六成是前端,那么这些概率就没有准确反映这批数据上的情况。换了来源或使用场景以后,原来观察到的对应关系也未必保持。
对聊天模型还要多分清一步:让它在答案后写“我有 90% 的把握”,首先得到的是一句生成文本。除非另外定义并验证了这类报告的含义,否则不能直接把它等同于经过校准的答案正确概率。
这并不是说概率输出没有价值,而是说:概率的数值、它是否校准,以及某次结论是否正确,需要分别检查。
损失函数:把“这次表现怎样”变成一个数
损失,loss,是按照指定规则,对预测与目标之间的不符进行计分。损失函数,loss function,就是产生这个分数的规则。下面使用的损失都按“越小越好”设计。
为什么不总用“答错记 1,答对记 0”?这种规则很直观,第 02 篇穷举少量参数时就足够使用。但在许多需要逐步调整参数的模型里,它给出的信息比较粗:前端概率从 0.51 提高到 0.99,类别没变,计分也完全不变。
如果我们希望训练能利用这些变化,就需要更细的目标。分类概率常用交叉熵一类损失;预测阅读时长这样的数值,则可以用平方误差等损失。选什么规则,要结合输出形式和希望惩罚的错误。
损失函数本身并不会自动判断用户满意不满意,也不会负责确认标签是不是事实。它按照你给出的目标计算。标签错了,降低相对于这个标签的损失,甚至可能让模型朝错误方向调整。
先看容易手算的情况:预测时长差了多少
假设我们要预测阅读两篇笔记的时长,已核实的目标与预测如下:
| 笔记 | 目标时长 | 预测时长 | 预测减目标 |
|---|---|---|---|
| A | 6 分钟 | 4 分钟 | -2 分钟 |
| B | 10 分钟 | 12 分钟 | +2 分钟 |
如果直接把两个带符号的误差求平均,得到 (-2+2)÷2=0,但模型显然没有两篇都预测准确。正负相抵掩盖了偏离。
一种做法是把每个误差平方,再求平均:
A 的平方误差:(-2)² = 4
B 的平方误差:(+2)² = 4
平均平方误差:(4 + 4) ÷ 2 = 4
这叫作均方误差,Mean Squared Error,MSE。这里的结果单位是分钟的平方,不能把数值 4 直接读成“平均错了 4 分钟”。Google:平方误差与均方误差
平方还会改变对大误差的重视程度:错 4 分钟的平方误差是 16,错 2 分钟是 4,前者是后者的四倍。假如某个样本时长因为采集错误变得特别大,它就可能对这种损失产生较大影响。这也把本篇与数据质量联系起来。
平方并不是唯一选择。例如取误差绝对值,也能避免正负相抵。我们暂时不比较所有损失,只需理解:损失函数规定了怎样把不同程度的错误算进目标里。
分类时,为什么给正确类别的概率很重要
回到笔记分类。对于每个样本只有一个目标类别的常见分类任务,可以取出模型分配给这个目标类别的概率,记作 p,再计算:
单个样本的交叉熵损失 = -ln(p)
这里 ln 表示自然对数。你可以暂时把这条公式看成一条换算规则:目标概率越接近 1,损失越接近 0;目标概率越接近 0,损失越大。它也常被称作对数损失。多个样本可以再对各自的损失求平均。scikit-learn:Log loss 的定义与自然对数
不用亲手计算对数,先看这张数值表:
| 分配给目标类别的概率 p | 损失 -ln(p),约数 |
|---|---|
| 0.99 | 0.010 |
| 0.90 | 0.105 |
| 0.60 | 0.511 |
| 0.50 | 0.693 |
| 0.40 | 0.916 |
| 0.10 | 2.303 |
| 0.01 | 4.605 |
关键是取目标类别的概率,不是每次取最大的那个数。
例如,一篇笔记的目标标签是数据库,模型给出“前端 0.99、数据库 0.01”。这次用于计算的 p 是 0.01,损失约为 4.605。它没有因为“对某个类别很确定”而受到奖励;它非常确定地偏向了错误类别,反而付出较大损失。
如果同一篇改成“前端 0.60、数据库 0.40”,最终仍可能选错前端,但损失降为约 0.916。模型至少给目标类别留下了更多概率。
这里“对”或“错”始终是相对于提供的标签而言。损失不会越过标签,直接检查现实事实。
从数学上说,当 p 趋近 0 时,-ln(p) 会越来越大。实际软件需要用稳定的数值计算处理极小概率;本篇用的概率都严格大于 0,不要求读者处理这些实现细节。
正确率相同,损失仍然可以不同
用两篇笔记比较两个候选模型。每行括号内的顺序都是 [前端概率, 数据库概率],两者都采用“选概率较高类别”的规则。
| 样本 | 目标类别 | 模型甲 | 模型乙 |
|---|---|---|---|
| A | 前端 | [0.60, 0.40] | [0.99, 0.01] |
| B | 数据库 | [0.60, 0.40] | [0.99, 0.01] |
两个模型都把两篇归为前端,因此都只答对 A,正确率均为 50%。但它们的平均损失不同:
甲:(-ln(0.60) - ln(0.40)) ÷ 2 ≈ 0.714
乙:(-ln(0.99) - ln(0.01)) ÷ 2 ≈ 2.308
甲在这个损失下更好。乙在 A 上很小的损失,没有抵消它在 B 上极大的损失。
这不是建议模型永远输出 0.5,也不是让模型“尽量模糊”。如果模型真能区分这两篇,把 A 的前端概率、B 的数据库概率都提高到 0.99,平均损失就会约为 0.010。目标是让概率分配符合数据,而不是统一提高或降低所有回答的确定程度。
这个例子还说明,损失与正确率回答的是不同问题。正确率只看最终类别对了多少;这里的交叉熵还关心模型给目标分配了多少概率。因此训练损失下降时,正确率未必立刻上升;反过来,也不能只凭正确率相同就断言两个概率模型完全一样。
语言模型也在对概率分配计分
第 03 篇把一句话切成教学单位:
我 用 卡片 复习 概念
在“我 用 卡片”之后,原句目标是“复习”。训练时,模型会对可能的下一个 Token 分配概率,再依据“复习”对应目标的概率计算损失。常见的自回归语言建模会在多个预测位置汇总这种负对数概率。《动手学深度学习》:语言模型的交叉熵目标
这里沿用教学切分,不代表真实分词器一定把“复习”当作单个 Token。它只帮助你看出:把“前端、数据库”换成更多可能的文本单元,概率与目标之间的比较思路仍然存在。
也正因为如此,Token 概率不等于整段回答的事实正确概率。“答案是”可能是很容易续写的开头,后面的日期却可能写错;一个目标位置概率提高,也不能独立证明整张复习卡片已经准确、完整、适合学习。
在原文中找出目标,再计算损失,使训练可以规模化进行;实际应用是否可靠,还需要任务层面的检查。
训练目标与用户目标,为什么会有距离
复习助手的用户可能关心:卡片是否忠于原文,题目能否帮助复习,是否遗漏关键条件,生成后能不能正确保存。一个文本预测损失很难单独覆盖所有这些要求。
即使只做分类,也可能存在不同代价。例如,把正常邮件误放进垃圾箱与漏掉一封广告,对用户造成的影响未必一样。是否在训练中加权、怎样选择最终决策阈值、哪些情况需要确认,都属于另外的设计选择,不能期待一个默认平均损失自动包含它们。
可以把训练与检查的分工画出来:
输入 → 模型 → 预测
│
目标标签 ──────┤
↓
按损失函数计分
↓
训练算法据此调整参数
另用未参与训练与调试的材料,检查实际任务是否完成。
损失是训练算法的重要依据,不是用户满意度的同义词。训练集损失下降,也只说明模型在当前目标和这些样本上的得分改善了;它对新资料是否有效,仍要看独立评估。第 09 篇会解释泛化,第 12 篇会继续讲任务指标。
当你看到一条下降的训练曲线,可以具体追问:用的是什么损失、算在什么数据上、是否与之前采用相同单位和平均方式,以及真实使用的问题有没有改善。脱离这些条件,不同任务的损失数字不能直接排大小。
理解检查:你会选择哪个数字
- 某样本标签是数据库,模型输出“前端 0.9、数据库 0.1”。计算本篇的单样本交叉熵,应取 0.9 还是 0.1?损失约为多少?
- 两次时长预测误差分别是 -3 分钟和 +3 分钟。均方误差是 0、3 还是 9?
- 两个模型正确率一样,交叉熵是否一定相同?
- 聊天模型写下“我有 90% 把握”,能否直接认为它每十次这样的回答会对九次?
- 训练损失降低,是否足以证明复习卡片的事实更准确、保存功能也正常?
第 1 题: 取目标类别数据库的概率 0.1,损失约为 2.303。取最大概率 0.9 会把“对错误类别很确定”误算成好的预测。
第 2 题: 是 9,因为 ((-3)²+3²)÷2=9,单位为分钟的平方。带符号平均为 0 并不表示没有误差。
第 3 题: 不一定。两个模型可以作出相同类别选择,却给目标分配不同概率;前面的甲乙例子就是反例。
第 4 题: 不能直接这样解释。这首先是一句输出文本,需要另外验证其报告与实际正确率的关系,不能因为格式像概率就认为已经校准。
第 5 题: 不足以。需要检查损失的定义、所用数据及任务结果。事实准确性要对照资料核实,保存功能要读取实际保存结果,它们不会仅靠训练曲线得到证明。
现在,我们已经知道输入怎样表示、预测怎样计分。下一篇先打开模型内部,看看神经网络如何用多层计算把输入变成输出;再下一篇才会把这些计算与损失连接起来,解释梯度下降、反向传播和参数更新。
上一篇:05|模型怎样表示信息:从数字、向量到学到的特征
下一篇:07|神经网络与深度学习:多层计算怎样形成能力
返回:第一部分大纲