线性神经网络:从回归到分类
本章来源:本文整理自《动手学深度学习》(zh.d2l.ai)第 3 章《线性神经网络》,原书作者 Aston Zhang、李沐、Zachary C. Lipton、Alexander J. Smola。
本章讲什么
这一章是第一个完整的模型。我们从最简单的情况出发:假设输出和输入之间是线性关系。虽然真实世界很少是纯线性的,但线性模型是所有深度学习的地基——理解了它,你就能理解神经网络是怎么学习、怎么优化的。
本章讲两个模型:
- 线性回归:预测连续数值("有多少"),比如房价。
- softmax 回归:处理分类问题("哪一个"),比如识别手写数字。
线性回归
模型是什么
线性回归假设目标(标签)可以表示为特征的加权和再加上一个偏置。用直觉的话说:房子的价格 ≈ 面积权重 × 面积 + 卧室数权重 × 卧室数 + ... + 基础价。
这里的**权重(weight)**决定每个特征对预测的影响大小,**偏置(bias)**是全部特征为零时的基准预测值,保证模型有足够的表达力。
怎么判断模型好坏:损失函数
我们需要一个数字来衡量"预测得有多差"。对回归问题,最常用的是平方误差:预测值和真实值之差的平方。为什么用平方?因为大的偏差会受到更大的惩罚——预测差 10 比差 1 的损失大 100 倍,这符合我们的直觉。
怎么找到好参数:梯度下降
找到让损失最小的权重,需要优化算法。线性回归有个少见的便利:它有解析解——可以直接用公式算出最优参数。但绝大多数深度学习模型没有这个待遇,必须用数值方法。
最核心的数值方法是梯度下降:反复做两件事——计算损失对每个参数的梯度(损失往哪个方向变化),然后往损失减小的方向迈一小步。迈的步子大小叫学习率(learning rate)。
实践中几乎都用它的变体:小批量随机梯度下降(minibatch SGD)。它每次随机抽一小批样本,用这批样本的平均梯度来更新参数,而不是算完全部数据。这样做既高效又有随机性——随机性有时候还能帮助跳出不好的局部位置。批量大小和学习率都是超参数(手动设定、不随训练更新)。
为什么平方误差有道理:极大似然估计
平方误差不是凭空来的。如果我们假设观测噪声服从正态分布(钟形曲线),那么"最小化均方误差"和"对模型做极大似然估计"是等价的——选择让观测数据出现概率最大的参数。
这个洞察很重要:优化目标和对概率的假设是相通的。后面 softmax 回归的交叉熵损失,也是同样的思路推导出来的。
训练一个模型的标准流程
不管什么模型,训练都是这个循环:
- 随机初始化参数;
- 取一小批样本;
- 前向计算:模型给出预测;
- 计算损失;
- 反向传播:算出每个参数的梯度;
- 更新参数(朝损失减小的方向走一步);
- 重复,直到损失足够低。
这个"读数据 → 算损失 → 反向传播 → 更新"的循环,是所有深度学习模型的通用骨架。
softmax 回归
线性回归解决"有多少",分类问题则要回答"哪一个"。比如识别手写数字 0-9、判断图片是猫还是狗。
标签怎么表示:独热编码
类别之间通常没有自然的顺序(不能说"猫 < 狗 < 鸟"),所以不能直接用整数 1、2、3 编码,那会人为引入不存在的顺序关系。统计学家发明的办法是独热编码(one-hot encoding):用一个长度等于类别数的向量表示类别,所属类别的位置是 1,其余都是 0。比如 3 个类别中,第二类就是 [0, 1, 0]。
模型怎么输出:softmax
分类需要为每个类别输出一个值。我们自然希望这些值能被当作概率来理解——非负、加起来等于 1。但网络直接算出的原始分数(叫 logit)可能为负、总和也不是 1,不满足概率的要求。
softmax 函数专门解决这个问题:先对每个原始分数取指数(保证非负),再除以所有分数的总和(归一化),让输出成为一个合法的概率分布。而且 softmax 不会改变大小次序——原来分数最高的类别,归一化后概率仍然最大,所以预测时取概率最大的类别即可。
怎么衡量分类的损失:交叉熵
分类任务最常用的损失是交叉熵(cross-entropy)。它同样来自极大似然思想:最大化观测数据的似然,等价于最小化负对数似然,而负对数似然在分类问题中正是交叉熵。
要理解交叉熵,需要一点点信息论:
- 熵:一个概率分布里蕴含的信息量。如果所有事件都几乎确定(比如"太阳明天升起"),熵很低;如果结果很难猜,熵很高。熵也可以理解为"编码来自该分布的数据所需的最少信息量"。
- 交叉熵:用错误的"主观概率"去描述真实分布时,平均要多惊讶多少。真实分布和预测分布越接近,交叉熵越小。模型预测得越准,交叉熵损失越低。
有趣的是,交叉熵损失的梯度形式是"模型分配的概率减真实独热标签",和回归里"预测减真实"的形式一致——两种损失在数学上非常对称。
数值稳定性:一个工程上的坑
直接按数学定义实现 softmax 会踩到数值稳定性的坑:当某个原始分数很大时,取指数会上溢成无穷大;分数很小时,取指数会下溢成零。解决办法是一个经典技巧:先把所有分数减去它们的最大值再做指数(因为分子分母同时平移,结果不变),并且把 softmax 和交叉熵合并成一个整体来计算。这也是为什么实践中推荐直接使用框架内置的交叉熵损失,不要在它外面再套一层 softmax。
数据集:Fashion-MNIST
图像分类需要基准数据集。MNIST(手写数字)太简单,原书改用 Fashion-MNIST——10 类服装图像(T 恤、裤子、套衫、连衣裙、外套、凉鞋、衬衫、运动鞋、包、短靴),训练集 6 万张、测试集 1 万张,每张 28×28 灰度图。用它的意义在于:训练集和测试集严格分开,测试集绝不参与训练,只用来评估模型的泛化能力。
小结
- 线性回归假设输出是输入的加权和,用平方误差衡量好坏,用(小批量)梯度下降寻找最优参数。
- 最小化均方误差等价于高斯噪声假设下的极大似然估计。
- softmax 回归用独热编码表示类别、用 softmax 把原始分数变成概率、用交叉熵衡量损失。
- 所有深度学习模型共享同一个训练骨架:读数据 → 前向 → 算损失 → 反向传播 → 更新。
关键术语
| 术语 | 一句话解释 |
|---|---|
| 线性回归 | 假设输入输出为线性关系的最简单回归模型 |
| 权重 / 偏置 | 特征对预测的影响大小 / 全特征为零时的基准值 |
| 平方误差 | 预测与真实之差的平方,回归常用损失 |
| 解析解 | 用公式直接算出的最优参数(线性回归独有) |
| 梯度下降 | 沿损失减小的方向迭代更新参数的优化方法 |
| 小批量随机梯度下降 | 每次用一小批样本估计梯度再更新,最常用 |
| 学习率 / 超参数 | 更新步长 / 手动设定不随训练更新的量 |
| 极大似然估计 | 选择使观测数据出现概率最大的参数 |
| 独热编码 | 用 0/1 向量表示类别,避免人为引入顺序 |
| logit | softmax 前的原始分数 |
| softmax | 把原始分数变成合法概率分布的函数 |
| 交叉熵 | 分类常用损失,衡量两个概率分布的差异 |
| 熵 | 概率分布蕴含的信息量 |
| 泛化 | 模型在没见过的数据上表现好的能力 |