这次我把《动手学深度学习》第一章读完了。
先说一下,我为什么会突然翻这本书。
更直接的原因是,前面我在做一个从零学习 AI 的小项目。
写一个小项目去用,去学习ai(所谓干中学)
写到训练循环时,代码里开始出现这些东西:
_, loss = model(x, y) |
loss.backward() |
optimizer.step() |
loss 到底是什么? |
为什么 loss 低就代表模型预测得更好? |
loss.backward() 到底在根据什么更新参数? |
再具体一点,是为了看懂这行代码:
loss = F.cross_entropy(logits_for_loss, targets_for_loss) |
这行代码背后其实是在回答:
模型预测下一个 token 错了多少? |
这个“错了多少”的数字是怎么算出来的? |
当时我一路追下去,就追到了:
logits |
softmax |
真实 token 的概率 |
-log(probability) |
cross entropy loss |
让我的codex老师给我解释,越解释越晕
所以我才去翻《动手学深度学习》。
为了理解
模型如何知道自己错了? |
模型如何根据错误修改参数? |
第一章它先把机器学习问题的大框架铺开了
机器学习到底在解决什么问题? |
一个问题为什么叫监督学习? |
回归和分类到底差在哪? |
搜索、推荐、标注这些又算什么? |
无监督学习和强化学习又和监督学习有什么区别? |
我之前看这些词的时候,很容易把它们当成一堆名词背。
但读完第一章以后,我现在更愿意先问一个更朴素的问题:
模型训练的时候,到底拿到了什么反馈? |
模型最后要输出什么东西? |
这篇文章就按这个思路,把第一章里关于机器学习问题类型的部分整理一下。
0.先说我的理解:机器学习不是先背模型名
以前我一听机器学习,脑子里会先冒出这些词:
线性回归 |
决策树 |
神经网络 |
Transformer |
强化学习 |
聚类 |
这些当然都重要。
但如果一开始就背模型名,很容易乱。
因为真正写项目时,我们首先遇到的不是:
我要用什么模型? |
而是:
我手里有什么数据? |
我有没有标签? |
我要预测的是一个数,一个类别,多个标签,还是一个排序? |
模型预测错了以后,我怎么知道它错了? |
这些问题回答清楚以后,模型选择才有意义。
所以我现在会先把机器学习问题拆成两层:
第一层:训练反馈是什么? |
第二层:输出结果长什么样? |
第一层决定它大概属于监督学习、无监督学习还是强化学习。
第二层决定它在监督学习里更像回归、分类、标注、搜索还是推荐。
1.监督学习:训练数据里有标准答案
《动手学深度学习》第一章里说,监督学习擅长在“给定输入特征”的情况下预测标签。
这句话看起来简单,但其实很关键。
监督学习最核心的结构是:
输入特征 -> 标签 |
比如:
房子的面积、卧室数量、位置 -> 房价 |
图片像素 -> 猫/狗 |
病人的检查指标 -> 是否有风险 |
文章内容 -> 文章标签 |
这里的“标签”,就是训练时给模型看的标准答案。
模型不是凭空学。
它是看了很多这样的样本:
输入 A -> 正确答案 A |
输入 B -> 正确答案 B |
输入 C -> 正确答案 C |
然后慢慢学出一个规律。
以后来了一个新输入,模型就根据学到的规律给出预测。
所以监督学习的关键不是“模型多高级”,而是:
你有没有足够好的 输入-标签 数据。 |
这里也能解释为什么标注很贵。
因为很多时候数据本身没有天然标签。
比如图像分类:
一张图片是不是猫? |
一张 CT 图像是不是癌症? |
一段语音对应哪一句文字? |
这些标签往往要人工标。
如果标签错了,模型就会被错误答案带偏。
所以监督学习里,数据质量经常比模型名字更重要。
2.回归:输出是一个数值
第一章讲回归时,用了房价预测的例子。
比如一个房子的特征是:
面积 |
卧室数量 |
浴室数量 |
到市中心距离 |
模型要预测的是:
这个房子大概多少钱? |
这里的输出是一个数字。
这就是回归。
我现在对回归的记法很简单:
只要问题在问“多少”,大概率就是回归。 |
比如:
房价是多少? |
电影评分是多少? |
明天下雨量是多少? |
病人住院时间是多少天? |
接口平均响应时间是多少毫秒? |
这些问题的答案不是“属于哪一类”,而是一个连续数值。
所以回归模型关心的是:
预测值和真实值差多少? |
比如真实房价是 300 万,模型预测 310 万。
这不是完全错。
它是有误差。
回归问题通常就是希望这个误差越小越好。
3.分类:输出是一个类别
分类解决的是另一种问题:
这个东西属于哪一类? |
比如:
图片是猫还是狗? |
邮件是垃圾邮件还是正常邮件? |
手写数字是 0 到 9 中的哪一个? |
这个用户会不会流失? |
这里模型输出的不是一个连续数值,而是一个类别。
如果只有两个类别,就是二分类。
比如:
是 / 否 |
猫 / 狗 |
有风险 / 无风险 |
如果有多个类别,就是多分类。
比如:
数字 0-9 |
新闻类别 |
商品类目 |
游戏装备类型 |
这里容易踩一个坑:
分类模型输出的往往不是直接“答案”,而是每个类别的概率。 |
比如猫狗分类:
猫: 0.9 |
狗: 0.1 |
我们通常取概率最大的类别作为答案。
但这不代表所有场景都应该这么干。
第一章里举了毒蘑菇的例子。
如果模型说:
这张图是毒蘑菇的概率只有 20% |
按普通分类思路,好像可以判断“不是毒蘑菇”。
但现实里我们不会吃。
因为错一次的代价可能非常大。
所以分类问题不只是看准确率。
有时候还要看:
错判的代价是什么? |
宁愿错杀还是宁愿放过? |
这点在医疗、风控、安全场景里尤其重要。
4.标注问题:不一定只有一个标签
分类还有一个变体,叫标注问题,也可以理解成多标签分类。
普通分类常常默认:
一个输入只能属于一个类别。 |
比如一张手写数字图,它要么是 0,要么是 1,要么是 2。
但很多真实问题不是这样。
比如一篇技术博客,可以同时有多个标签:
机器学习 |
Python |
深度学习 |
数据处理 |
工程实践 |
这些标签不是互斥的。
一篇文章可以既是机器学习,也是 Python,也是工程实践。
这就不是普通的“选一个类别”。
它更像:
从一堆候选标签里,选出所有适合的标签。 |
这也是我对标注问题的理解:
分类是选一个。 |
标注是可以选多个。 |
如果放到我自己的博客场景里,一篇文章可能同时被打上:
LLM |
RAG |
Agent |
Docker |
学习笔记 |
这就是一个很自然的多标签问题。
5.搜索和推荐:输出不是一个答案,而是一组排序结果
搜索和推荐这部分,我觉得是第一章里很容易被低估的内容。
因为它不像回归和分类那么“教科书式”。
但真实产品里,搜索和推荐非常常见。
搜索问题不是简单地问: