跳到主要内容

输出「是 / 不是」— 准确率会骗人,而且它当不了训练目标

这一章讲三件事: 输出从一个数换成一个判断之后,模型的最后一层要怎么改; 「对错」这件事要怎么量才不骗自己;以及为什么最直觉的那个指标(准确率) 恰恰是最不能拿来训练的东西它在全书链条里的位置: 第 02~04 章的输出一直是个实数(秒数、房价)。 从这一章起,输出变成一个类别 —— 后面十七章里绝大多数模型都是分类模型, 认数字、认口令、认一句话是好评还是差评、判断这一步棋好不好,统统落回这一章的三样东西: 概率输出、交叉熵、和那张配方表。

1. 先看现象:一个 95 分的废模型

假设你要做一个钓鱼网站检测器:给一个网站,答「是」或「不是」。 这类只有两个答案的任务,叫二分类。上线之后有人来汇报:「准确率 95%。」

听起来不错。但如果一百个网站里本来就只有五个是钓鱼网站呢?

一个什么都不学的模型,对每个网站都答「不是钓鱼网站」:
95 个正常网站 → 答对
5 个钓鱼网站 → 答错
准确率 = 95 / 100 = 95%

图说:它一个钓鱼网站都没抓到,却拿了 95 分。
这不是抬杠 —— 现实里正例本来就少:多数网站不是钓鱼网站,多数零件没有缺陷。

书对这个现象的评语是:准确率并不是非常好的系统度量指标;高准确率听起来总是不错, 但同样也很具有迷惑性。监控它固然是好,但不能将其用作损失函数1

这一章就是把这句话拆成两半来讲: 前一半(第 4~6 节)讲该拿什么代替它当指标; 后一半(第 7 节)讲该拿什么代替它当训练目标——那是两个完全不同的问题。

2. 顶层全景

一个网站的 30 个特征
↓ 两层隐藏层(和第 04 章一样,sigmoid)
一个数,范围不受限 比如 1.386
↓ ⚡ 输出层的 sigmoid:把它挤进 0~1 ⚡
0.8 ← 读作:「模型认为它是钓鱼网站的可能性是 0.8」
↓ 和阈值比大小(默认 0.5,但这个数是你挪的)
判决:是

── 训练时走另一条路 ──
0.8 和正确答案 1 → 交叉熵 → 梯度 → 反传

不能用准确率,原因见第 7 节

图说:推断和训练在最后一步分岔。推断看阈值,训练看交叉熵 ——
这两件事在回归任务里是同一个东西(都用均方误差),在分类任务里不是。

数据集是钓鱼网站数据集:30 个特征,约 5500 个训练样例、5500 个测试样例, 其中约 45% 是真的钓鱼网站2。所有特征的取值都在同一个小区间里(−1、0、1), 所以这一章不需要第 03 章那道标准化手续3

3. 输出层为什么要加 sigmoid

模型结构和第 04 章几乎一样:两个隐藏层,都用 sigmoid。只有一处不同: 最后一层也加了 sigmoid,而不是像房价模型那样什么都不加4

model.add(tf.layers.dense({units: 1, activation: 'sigmoid'}));
model.compile({optimizer: 'adam', loss: 'binaryCrossentropy', metrics: ['accuracy']});

为什么? 因为最后一层做的是矩阵乘法加偏差,它吐出来的数可以是任何实数—— 可能是 −17,也可能是 3000。而我们想要的是一个概率,必须落在 0 到 1 之间。 第 04 章说过 sigmoid 是个挤压函数,正好干这个5

书给了两个理由说明为什么要输出概率而不是直接输出 0 或 16:

理由说明
它带着模型的把握程度0.5 = 完全拿不准;0.6 = 倾向于「是」但没底;0.99 = 非常确定。直接吐 0/1 就把这个信息丢了
它可微,能训练这一条要到第 7 节才说得清 —— 但记住:这才是真正的原因

判成哪一类,取决于你把线划在哪儿。 默认划在 0.5,可这个数不是天定的: 往下挪,模型会更爱说「是」;往上挪,它会更谨慎7第 6 节整节都在讲这条线该划在哪。

4. 一个数不够看:摊成四格表

这一节回答:该拿什么代替准确率。

分类的结果只有四种可能,把它们各自的次数填进一张表,这张表叫混淆矩阵8:

模型说「是」 模型说「不是」
实际是钓鱼网站 4 2
实际不是钓鱼网站 1 93

图说:这四个数是书里假想的一组结果,不是实测值。四个格子各有名字 ——
左上叫真正例(抓对了)、右上叫假负例(漏报了)、
左下叫假正例(误报了)、右下叫真负例(正确地放过了)。

从这四个数能读出三个指标,其中后两个是这一节的主角: 模型说「是」的那些里,真是的占几成,这个比例叫精确率; 真正是钓鱼网站的那些里,被它抓到几成,这个比例叫召回率。9

指标怎么算这组数算出来它回答什么问题
准确率(4 + 93) / 10097%「一百个里判对了几个」
精确率4 / (4 + 1)80%「模型说是钓鱼的那些里,真是的占几成」
召回率4 / (4 + 2)66.7%「真正的钓鱼网站里,被它抓到了几成」

准确率 97%,可召回率只有 66.7%——三个钓鱼网站里放跑了一个。 这就是第 1 节那个 95 分废模型的一般化版本:准确率把「漏报」和「误报」搅在一起, 而这两种错在现实里的代价常常差得很远。

这两个指标是可以互相骗的

书特意点破了作弊法,因为它能让你真正记住这两个数各自的软肋10:

  • 想要高精确率? 把阈值提到 0.95,只在极有把握时才说「是」。 精确率会上去,但会漏掉一大堆真的钓鱼网站,召回率崩掉;
  • 想要 100% 召回率? 对所有网站一律说「是」。 召回率计算里根本不含误报,所以它直接满分——代价是精确率烂到不能看

所以书的结论是:在真实的二分类问题上,很难同时把两个都做高; 如果容易,那说明你这个问题一开始就不需要机器学习10

书里那个模型的实测成绩: 训练 400 轮之后,在阈值 0.5 上, 精确率 96.8%、召回率 92.9%11

5. 承重节的前一半:阈值该划在哪儿

上一节留了个尾巴:精确率和召回率是此消彼长的,而挪的就是那条阈值线那这条线该划在哪儿?

书给的答案是:先把所有可能的划法一次画出来,再根据业务去挑一个点。

做法是这样的:把阈值从 0 一路调到 1,每调到一个位置就算一次,得到一对数, 画成图上的一个点;所有点连起来就是一条曲线。 这条曲线叫 ROC 曲线 (全称是「受试者操作特征曲线」,来自早期雷达学,今天几乎没人用全称了)12

两根轴分别是13:

纵轴 = 真正例率 = 真正例 / (真正例 + 假负例) ← 这就是召回率,换了个名字
横轴 = 假正例率 = 假正例 / (假正例 + 真负例) ← 「误报的概率」

一个模型在训练过程中的四条曲线:
▲ 真正例率
1.0 │ ╭────── 轮次 400:很靠左上角
│ ╭─╯
│ ╭─╯ ╭──── 轮次 005
│ ╱ ╭──╯
│╱ ╭──╯ ╱
│ ╱ ╱ 轮次 001:几乎是对角线 = 和瞎猜一样
│╱ ╱
0.0 └────────────▶ 假正例率
0.0 1.0

图说:曲线越往左上角靠,模型越好 —— 左上角意味着「误报几乎为零,同时几乎不漏」。
完全随机的模型落在那条对角线上。

把整条曲线压成一个数,就是曲线下面积(area under the curve,常缩写成 AUC)。 它的量感有现成的参照物14:

AUC什么水平
0.5瞎猜(那条对角线)
0.981这一章那个钓鱼检测模型训完之后的成绩
1.0理论上的完美,现实里到不了

回到「线划在哪」这个问题。 书说得很实在:这不是一个技术问题,是一个业务问题15:

  • 线划低一点: 宁可误报也别漏。适用于「漏掉一个钓鱼网站就要赔客户钱、丢合同」;
  • 线划高一点: 宁可漏也别误报。适用于「错杀正常网站会被用户投诉」。

每一个阈值都是那条曲线上的一个点。你要做的是根据代价挑一个点,而不是找一个「正确答案」。

6. 主走查:一个网站,从 30 个数走到一条曲线

这一章的每个承重机制,在这条走查上各占一步。 ⚠ 第 3 步那个 0.8 是为演示编的,不是书里的实测值;第 4~7 步那四个数是书里的假想矩阵; 第 8、9 步是书里的实测成绩。

发生了什么具体的数 / 状态
1拿到一个网站的 30 个特征每个特征取值是 −1、0 或 1(比如「用的是 IP 地址而不是域名吗」)
2穿过两个 sigmoid 隐藏层,到达最后一层得到一个不受范围限制的数
3⚡ 输出层的 sigmoid 把它挤进 0~1 ⚡0.8(演示值)
4和阈值 0.5 比大小0.8 > 0.5 → 判「是钓鱼网站」
5把 100 个测试网站的判决摊成四格表真正例 4 / 假负例 2 / 假正例 1 / 真负例 93
6读准确率(4 + 93) / 100 = 97%看着很好
7读精确率和召回率4/5 = 80%;4/6 ≈ 66.7%三个里漏了一个
8把阈值从 0 扫到 1,每个位置画一个点得到一条 ROC 曲线;训练越久,曲线越贴左上角
9把曲线压成一个数AUC = 0.981(瞎猜是 0.5)
10挑一个阈值上线没有标准答案:漏报贵就把线划低,误报贵就把线划高

这条走查里最该记住的是第 6 步和第 7 步的落差:同一批结果, 一个指标说 97 分,另一个说漏掉了三分之一。

7. 承重节:为什么不能拿准确率当训练目标

这一节是本章的地基。上面六节都在讲「怎么看」,这一节讲「拿什么训」—— 而这两件事在分类任务里必须分开。

先看现象:换成准确率当损失,训练一步也走不动

回想第 02 章:训练靠梯度。梯度是「朝哪挪,损失变化最快」。 如果梯度处处是零,优化器就完全不知道该往哪挪,权重一动不动。

准确率恰恰就是这样。

为什么

要算准确率,必须先把 0.8 这个概率变成一个判决。这一步靠的是拿它和阈值比大小, 写成函数是一级台阶:

输出
1 │ ┌──────────────
│ │
│ │ ← 这一整段是平的,斜率 = 0
0 │──────┘
└──────┼──────────────▶ 概率
0.5

在这一点上不可导

图说:除了跳变的那一点之外,这个函数处处可导 —— 但导数**永远是 0**。

反向传播是一路往回乘的(第 02 章手算过)。链条上只要有一个环节是零, 乘到最后全是零16。所以:

拿准确率(或者精确率、召回率、假正例率、AUC)当损失函数, 模型在权重空间里完全得不到「往哪挪能变好」的信息。16

注意这句话的范围:上面那五个指标全都有这个毛病,因为它们全都要先阈值化。 它们对理解模型很有用,对训练模型毫无用处17

所以换成交叉熵

二元交叉熵的算法只有两行18:

if 正确答案是 1(是钓鱼网站): 损失 = −log(模型给出的概率)
else 损失 = −log(1 − 模型给出的概率)

这里的 log 是以 e(约 2.718)为底的自然对数。

用一句话说它在干什么:它只盯着一件事——你给正确答案打了多少概率。 打得越接近 1,损失越小;打得越接近 0,损失飙到很大。

它凭什么比均方误差好? 书拿一张表回答,关键在最后两行19:

正确答案模型给的概率二元交叉熵均方误差
10.12.3020.81
10.50.6930.25
10.90.1000.01
10.990.0100.0001
10.9990.0010.000001
11.000

看均方误差那一列:从 0.9 到 0.99,它从 0.01 掉到 0.0001——只剩百分之一。 这意味着当模型已经答到 0.9 时,均方误差几乎不再推它往 1 走了, 书管这个叫「边际效应递减」19。而交叉熵同一步是从 0.100 掉到 0.010,只掉了十分之一, 它还在使劲推

所以这一章要记住的分工是:

损失(交叉熵)是给优化器看的,指标(准确率、精确率、召回率、AUC)是给人看的。 回归任务里这两者常常是同一个东西(都用均方误差);分类任务里它们必须不同20

8. 三个类别以上:再改两处

这一节回答:从「是 / 不是」变成「三选一」要改什么。

书换的例子是鸢尾花数据集:150 朵花、3 个亚属、每朵测 4 个数 (花瓣长宽、萼片长宽)。三个亚属各 50 个样本,数量正好均衡21

改动一:标签不能编成 0 / 1 / 2

最省事的想法是把三个亚属编号成 0、1、2。书说不行,理由很硬22:

编号自带大小顺序,而这个顺序是你随手定的。 编成 0/1/2 等于告诉模型 「山鸢尾更接近变色鸢尾,而不是弗吉尼亚鸢尾」——现实里未必如此。 神经网络内部全是乘法和加法,它对数的大小和顺序天生敏感,你等于凭空给它加了一条要学的假规律。

正解叫 one-hot 编码(直译是「仅一位有效」):每个类别一个格子, 属于哪一类就哪一格是 1,其余全是 023:

标签 0(山鸢尾) → [1, 0, 0]
标签 1(变色鸢尾) → [0, 1, 0]
标签 2(弗吉尼亚) → [0, 0, 1]

图说:三个格子之间没有任何大小关系 —— 这正是我们要的。
代价是标签从 1 个数变成 3 个数,但这点开销可以忽略。

改动二:输出层从 sigmoid 换成 softmax

二分类时输出一个概率就够了(另一类的概率是 1 减它)。三分类要输出三个概率, 而且它们必须加起来等于 1——sigmoid 做不到这件事,因为它是逐个元素独立算的。

softmax 就是专为这件事设计的,它只做两步24:

① 每个数各自取自然指数(e 的多少次方)—— 保证全都变成正数
② 每个数各自除以「所有数的指数之和」 —— 保证加起来等于 1

书里的实例:最后一层原始吐出来的是 [−3, 0, −8]
过一遍 softmax 之后是 [0.0474, 0.9523, 0.0003]

验算:0.0474 + 0.9523 + 0.0003 = 1.0000 ✓
再看顺序:输入里 0 最大、−8 最小;输出里对应的位置也是最大和最小 ✓

图说:它保三件事 —— 每个数落在 0~1、全体加起来是 1、大小顺序不变。
于是这三个数才能被当成「模型给三个类别各自分配的概率」来读。

要从这三个概率得到一个判决,取最大的那个的位置,这个动作叫 argMax25。 上面这组的最大值在第 1 号位置,所以判「变色鸢尾」。

损失也跟着换:分类交叉熵

它是二元交叉熵在两类以上的推广,而且更简单26:

分类交叉熵 = −log(模型给「正确的那个类别」打的概率)

正确答案 [0, 1, 0],模型给出 [0.2, 0.5, 0.3]
→ 只看第 1 位:−log(0.5) = 0.693

这里有一个反直觉但很重要的性质:除了正确类别那一位,其余各位怎么变都不影响损失。 书用同一张表证明了这件事27:

正确答案模型给出的概率分类交叉熵均方误差
[0, 1, 0][0.2, 0.5, 0.3]0.6930.127
[0, 1, 0][0.0, 0.5, 0.5]0.6930.167
[0, 1, 0][0.0, 0.9, 0.1]0.1050.006
[0, 1, 0][0.1, 0.9, 0.0]0.1050.006

第 1、2 行:正确那一位都是 0.5,交叉熵完全一样,而均方误差变了。 交叉熵只问一件事——你给对的那个答案打了多少分

顺带:多分类的混淆矩阵

二分类的四格表推广到多分类,是一个 [类别数, 类别数] 的方阵: 第 i 行第 j 列的数,是「实际属于 i 类、却被判成 j 类」的样例数。 所以对角线上是判对的,对角线以外全是错的28

书给了一个训练早期的实例:24 个样例错了 8 个,准确率约 66.7%。 但矩阵比这个数字多说了一件事——第 2 类的花全被误判成了第 1 类或第 3 类, 而第 1、3 两类判得都对29这个信息准确率里一个字都没有。

9. 那张要用一辈子的配方表

书把前面所有东西压成了一张三行的表30:

任务类型输出层激活函数训练用的损失函数给人看的指标
回归(输出一个实数)不加(线性)meanSquaredErrormeanAbsoluteError和损失一样
二分类(是 / 不是)sigmoidbinaryCrossentropy准确率;另加精确率、召回率、ROC、AUC
多分类(三选一)softmaxcategoricalCrossentropy准确率;另加混淆矩阵

这张表不是记忆题,它每一行都是前面推出来的: 输出层的激活函数负责把输出约束成该有的样子(概率、和为 1); 损失函数负责给出可用的梯度;指标负责让人看懂。

这张表到最后一章(第 22 章)还会再出现一次,那里会补上「多标签」那一行的完整版。

10. 顺带:优化器换成了 adam

第 02 章用的 sgd 有个缺点:「挪一丁点」里那个「一丁点」是固定的。 学习率给小了收敛慢,给大了会在权重空间里来回打转31

adam 的做法是让这个步长自己会变:按每个权重最近的梯度历史, 自动调大调小,而且每个权重各调各的。 书给出的实际好处是:对很多模型收敛更好,而且对你选的学习率没那么挑剔31

书还列了六个可选的优化器,并且很坦白地说:该选哪个,这个领域至今没有共识; 实践中先用 adamrmsprop,有富余算力就把它当超参数一起调32

11. 作者的判断与证据

书里给了证据的:

  • 准确率会骗人。 5% 正例时,永远猜「不是」也有 95%——这是算术,不是观点1
  • 准确率当不了损失。 因为要先过台阶函数,而它的导数处处为零16
  • 交叉熵比均方误差更「不松手」。 有一整张对照表:概率 0.9 时, 交叉熵 0.100 对均方误差 0.01;到 0.99 时是 0.010 对 0.000119
  • 分类交叉熵只看正确类那一位。 表里第 1、2 行给出了可验证的反例27
  • 模型的实测成绩: AUC 0.981;400 轮时精确率 96.8%、召回率 92.9%1114

属于作者判断、书里没给证据的:

  • 「如果两个指标容易同时做高,那说明你这个问题一开始就不必用机器学习。」10 这是经验之谈。
  • 「实践中先选 adamrmsprop。」 书自己说这个领域没有共识32
  • 「保留一部分冗余信息,对目前的模型而言是可以容忍的。」 这是对钓鱼数据集不做特征筛选的一句取舍说明3

判断(我们的,不是书里的): 这一章最容易被略过、却最值钱的一句,是 「损失是给优化器看的,指标是给人看的」。这条区分在回归任务里被掩盖了 (两者常是同一个函数),所以很多人到分类任务才第一次遇到它,而且往往误以为是 「交叉熵是更好的准确率」。它们根本不是同一类东西:一个要可微,一个要可读。 如果错,会错在: 如果某天出现了既可微又直接反映业务代价的损失函数, 这条区分就会松动——事实上第 07 章那个自定义损失函数已经在往这个方向走了。

12. 边界与局限

  • 多标签任务本章一个字没讲。 一张图里同时有人、有车、有动物,该怎么输出? 书只在脚注里划清了它和多分类的区别,机制留到第 22 章那张完整配方表33
  • 类别不均衡只被点到为止。 书指出了「正例远少于负例」这个现象, 但没有讲重采样、加权损失这些常用对策
  • 精确率–召回率曲线只提了名字。 书说它和 ROC 曲线概念类似,就不赘述了34
  • 阈值怎么挑,书给的是原则不是方法。 「看业务代价」是对的,但没有可操作的算法。
  • 鸢尾花数据集太干净。 书自己承认 40 轮就接近完美准确率, 原因是数据量小、类别边界清楚35——它证明不了什么,只是用来演示 one-hot 和 softmax
  • 本章仍然没有解决过拟合。 钓鱼模型训了 400 轮,书没有讨论它是不是训过头了。 这条线在第 11 章收口。

13. 可带走的

  1. 准确率会骗人。 正例只占 5% 时,一个永远猜「不是」的废模型也有 95%;
  2. 把结果摊成四格表:真正例 / 假负例 / 假正例 / 真负例。 精确率 = 说是的里真是的比例;召回率 = 真是的里抓到的比例;
  3. 精确率和召回率此消彼长,挪的是那条阈值线;而且两个都能被单独作弊;
  4. 把每个阈值画成一个点连成 ROC 曲线,压成一个数就是 AUC:瞎猜 0.5,这个模型 0.981;
  5. 阈值划在哪是业务问题:漏报贵就划低,误报贵就划高;
  6. 准确率当不了训练目标。 它内部那个台阶函数导数处处为零,反传一路乘下来全是零;
  7. 换成交叉熵。 它只盯「你给正确答案打了多少概率」: −log(概率)。概率 0.9 时它给 0.100,而均方误差只给 0.01 —— 它推得更狠;
  8. 三个类别以上,标签要 one-hot,不能编成 0/1/2 —— 编号自带大小顺序,那是凭空加的假规律;
  9. 输出层换 softmax:每个数先取指数(e 的这么多次方,保证全变正数), 再各自除以总和(这一步叫归一化,保证加起来是 1)。结果:每个数在 0~1、总和是 1、大小顺序不变。 [−3, 0, −8][0.0474, 0.9523, 0.0003];
  10. 背下那张配方表: 回归 → 线性 + 均方误差;二分类 → sigmoid + 二元交叉熵; 多分类 → softmax + 分类交叉熵。并且记住:损失给优化器看,指标给人看。

14. 原文地图

主题原书章原文位置
二分类的例子清单;多分类的例子清单第 3 章text/14-ch03.txt:253(搜「二分类」) · text/14-ch03.txt:263(搜「多分类」)
钓鱼网站数据集:30 特征、5500+5500、45% 正例第 3 章text/14-ch03.txt:281(搜「HAVING_IP_ADDRESS」) · text/14-ch03.txt:287(搜「45%的样例是正例」)
不必标准化的理由第 3 章text/14-ch03.txt:289(搜「一致的区间内」)
输出层加 sigmoid 的两个好处;阈值可挪第 3 章text/14-ch03.txt:296(搜「最后一层使用的是sigmoid」) · text/14-ch03.txt:300(搜「模型对它输出的类型的支持程度」)
四格表与三个指标第 3 章text/14-ch03.txt:407(搜「混淆矩阵」) · text/14-ch03.txt:428(搜「Accuracy = (#TP + #TN)」) · text/14-ch03.txt:438(搜「precision = #TP」) · text/14-ch03.txt:446(搜「recall = #TP」)
5% 正例时准确率 95% 的迷惑性第 3 章text/14-ch03.txt:432(搜「也能达到95%的准确率」)
两个指标各自的作弊法第 3 章text/14-ch03.txt:442(搜「非常保守地输出正例预测」) · text/14-ch03.txt:450(搜「100%的召回率」)
实测:精确率 96.8%、召回率 92.9%第 3 章text/14-ch03.txt:452(搜「96.8%」)
ROC 曲线的定义与两根轴第 3 章text/14-ch03.txt:460(搜「受试者操作特征曲线」) · text/14-ch03.txt:464(搜「假正例率」)
曲线推向左上角;AUC 0.5 / 0.981 / 1.0第 3 章text/14-ch03.txt:545(搜「推至左上角」) · text/14-ch03.txt:549(搜「0.981」)
阈值的业务权衡第 3 章text/14-ch03.txt:584(搜「阈值相对较低」) · text/14-ch03.txt:588(搜「权衡现实生活中的利弊」)
台阶函数导数处处为零第 3 章text/14-ch03.txt:603(搜「其导数永远是0」) · text/14-ch03.txt:607(搜「无法有效地计算梯度」)
二元交叉熵伪代码;与均方误差的对照表第 3 章text/14-ch03.txt:615(搜「binaryCrossentropy(truthLabel, prob)」) · text/14-ch03.txt:630(搜「边际效应递减」) · text/14-ch03.txt:662(搜「0.100」)
损失与指标在分类任务里必须不同第 3 章text/14-ch03.txt:690(搜「而对回归问题而言」)
鸢尾花数据集第 3 章text/14-ch03.txt:694(搜「鸢尾花数据集」)
one-hot 编码与「为什么不用整数」第 3 章text/14-ch03.txt:745(搜「one-hot」) · text/14-ch03.txt:751(搜「隐含的排序关系」)
softmax 定义与 [-3, 0, -8] 算例第 3 章text/14-ch03.txt:788(搜「softmax([x1, x2」) · text/14-ch03.txt:798(搜「0.9522698」) · text/14-ch03.txt:803(搜「总和为1」)
argMax第 3 章text/14-ch03.txt:809(搜「argMax」)
分类交叉熵与 0.693 算例、对照表第 3 章text/14-ch03.txt:829(搜「categoricalCrossentropy(oneHotTruth」) · text/14-ch03.txt:838(搜「0.693」) · text/14-ch03.txt:890(搜「不会影响分类交叉熵」)
多分类混淆矩阵与「第 2 类全被误判」第 3 章text/14-ch03.txt:896(搜「对角线上的元素」) · text/14-ch03.txt:902(搜「8个分类错误」)
三行配方表(表 3-7)第 3 章text/14-ch03.txt:946(搜「输出层激活函数」)
adam 与优化器清单第 3 章text/14-ch03.txt:306(搜「倍增因子」) · text/14-ch03.txt:386(搜「还没有达成共识」)

Footnotes

  1. 出处:「第 3 章」第 432 段(text/14-ch03.txt:432,搜「也能达到95%的准确率」)。原文的评语:「高准确率听起来总是不错,但同样也很具有迷惑性。监控该指标固然是好,但不能将其用作损失函数。」 2

  2. 出处:「第 3 章」第 275~287 段(text/14-ch03.txt:281,搜「HAVING_IP_ADDRESS」;text/14-ch03.txt:287,搜「45%的样例是正例」)。数据集出自 Rami M. Mohammad 等人的论文 "Phishing Websites Features"。

  3. 出处:「第 3 章」第 289 段(text/14-ch03.txt:289,搜「一致的区间内」)。同段还说:可以做特征相关性检查,但「保留一部分冗余信息,对目前的模型而言是可以容忍的」。 2

  4. 出处:「第 3 章」第 296 段与代码清单 3-5(text/14-ch03.txt:296,搜「最后一层使用的是sigmoid」)。

  5. 出处:「第 3 章」第 304 段(text/14-ch03.txt:304,搜「没有关于输出范围为[0, 1]的内在约束」)。

  6. 出处:「第 3 章」第 298~302 段(text/14-ch03.txt:300,搜「模型对它输出的类型的支持程度」;text/14-ch03.txt:302,搜「获得可微的损失函数」)。

  7. 出处:「第 3 章」第 456 段(text/14-ch03.txt:456,搜「不一定要正好为0.5」)。

  8. 出处:「第 3 章」表 3-2 与表 3-3,第 390~423 段(text/14-ch03.txt:407,搜「混淆矩阵」)。四个格子的数(4 / 2 / 1 / 93)是原书标明的假想矩阵。

  9. 出处:「第 3 章」第 426~449 段(text/14-ch03.txt:428,搜「Accuracy = (#TP + #TN)」;text/14-ch03.txt:441,搜「4 / (4 + 1) = 80%」;text/14-ch03.txt:449,搜「66.7%」)。

  10. 出处:「第 3 章」第 442 与 450~452 段(text/14-ch03.txt:442,搜「非常保守地输出正例预测」;text/14-ch03.txt:450,搜「100%的召回率」;text/14-ch03.txt:452,搜「一开始就不必使用机器学习模型」)。 2 3

  11. 出处:「第 3 章」第 452 段(text/14-ch03.txt:452,搜「96.8%」)。原文说明这是 400 个训练轮次后、阈值取 0.5 时的结果。 2

  12. 出处:「第 3 章」第 460 段(text/14-ch03.txt:460,搜「受试者操作特征曲线」)与第 537~543 段(text/14-ch03.txt:539,搜「来获得不同的分类结果」)。

  13. 出处:「第 3 章」第 464~470 段(text/14-ch03.txt:464,搜「假正例率」;text/14-ch03.txt:470,搜「TPR和召回率的定义完全相同」)。

  14. 出处:「第 3 章」第 549 段(text/14-ch03.txt:549,搜「0.981」)。原文:随机预测的 AUC 是 0.5,Γ 形理想曲线是 1.0。 2

  15. 出处:「第 3 章」第 582~588 段(text/14-ch03.txt:584,搜「阈值相对较低」;text/14-ch03.txt:588,搜「权衡现实生活中的利弊」)。

  16. 出处:「第 3 章」第 603 段(text/14-ch03.txt:603,搜「其导数永远是0」)。原文:反向传播经过阈值函数时,「上游的梯度值最终会和这些阶跃函数造成的全零导数相乘」。 2 3

  17. 出处:「第 3 章」第 607 段(text/14-ch03.txt:607,搜「无法有效地计算梯度」)。原文点名:精确率、召回率、假正例率和 AUC 都有同样的局限。

  18. 出处:「第 3 章」代码清单 3-8,第 615~620 段(text/14-ch03.txt:615,搜「binaryCrossentropy(truthLabel, prob)」)。原文脚注说明实际实现会给概率加一个很小的正数(比如 1e-6),避免 log(0) 变成无穷大。

  19. 出处:「第 3 章」表 3-5 与第 630 段(text/14-ch03.txt:630,搜「边际效应递减」;text/14-ch03.txt:662,搜「0.100」)。 2 3

  20. 出处:「第 3 章」第 690 段(text/14-ch03.txt:690,搜「而对回归问题而言」)。

  21. 出处:「第 3 章」第 694 段(text/14-ch03.txt:694,搜「鸢尾花数据集」)。数据由英国统计学家 Ronald Fisher 在 20 世纪初收集。

  22. 出处:「第 3 章」第 751 段(text/14-ch03.txt:751,搜「隐含的排序关系」)。

  23. 出处:「第 3 章」第 745 段(text/14-ch03.txt:745,搜「one-hot」)。

  24. 出处:「第 3 章」第 786~803 段(text/14-ch03.txt:788,搜「softmax([x1, x2」;text/14-ch03.txt:798,搜「0.9522698」;text/14-ch03.txt:803,搜「总和为1」)。

  25. 出处:「第 3 章」第 805~815 段(text/14-ch03.txt:809,搜「argMax」)。

  26. 出处:「第 3 章」代码清单 3-10,第 829~838 段(text/14-ch03.txt:829,搜「categoricalCrossentropy(oneHotTruth」;text/14-ch03.txt:838,搜「0.693」)。

  27. 出处:「第 3 章」表 3-6 与第 890 段(text/14-ch03.txt:890,搜「不会影响分类交叉熵」)。 2

  28. 出处:「第 3 章」第 896 段(text/14-ch03.txt:896,搜「对角线上的元素」)。

  29. 出处:「第 3 章」第 902 段(text/14-ch03.txt:902,搜「8个分类错误」)。

  30. 出处:「第 3 章」表 3-7,第 946~984 段(text/14-ch03.txt:946,搜「输出层激活函数」)。

  31. 出处:「第 3 章」第 306 段(text/14-ch03.txt:306,搜「倍增因子」)。原文:adam 对不同权重使用不同的倍增因子,并且「与 sgd 相比,adam 对学习率选择的依赖更小」。 2

  32. 出处:「第 3 章」信息栏 3-1 与第 386 段(text/14-ch03.txt:386,搜「还没有达成共识」)。表 3-1 列了 sgd、momentum、rmsprop、adadelta、adam、adamax 六个。 2

  33. 出处:「第 3 章」脚注 10,第 696 段(text/14-ch03.txt:696,搜「多标签」)。

  34. 出处:「第 3 章」第 590 段(text/14-ch03.txt:590,搜「精确率–召回率曲线」)。

  35. 出处:「第 3 章」第 894 段(text/14-ch03.txt:894,搜「近乎完美的准确率」)。原文归因于数据量不大、类别在特征空间里边界清晰。