第2讲 机器学习(一)
线性分类
逻辑回归
广义线性模型把输出经连接函数 \(g\) 变成输入的线性函数:
\(g\) 应单调、可微且存在逆函数。对数线性回归取 \(g(y)=\ln y\),于是 \(y=e^{w^Tx+b}\);对数几率回归取
就是逻辑回归。Logistic 函数也称 Sigmoid 函数:
它最早用于19世纪资源受限的人口增长研究,后来用于二分类和神经网络激活函数。若事件发生概率为 \(p=\sigma(x)\),其胜算为 \(p/(1-p)\),对数胜算恰为
Sigmoid 单调递增,是关于 \((0,0.5)\) 中心对称的平滑 S 形曲线;\(x\to+\infty\) 时趋于 \(1\),\(x\to-\infty\) 时趋于 \(0\)。其导数可直接由函数值表示:
逻辑回归先计算
其中 \(q\) 是属于正类的预测概率。还可引入位置和斜率参数:
\(\mu\) 决定曲线中心,\(k\) 控制中心附近的斜率。
二分类交叉熵是逻辑回归的目标函数。真值 \(p\in\{0,1\}\)、正类预测概率为 \(q\) 时,
当 \(p=1\) 时,\(q=1,0.5,0\) 对应损失 \(0,\log 2,+\infty\);当 \(p=0\) 时,\(q=1,0.5,0\) 对应损失 \(+\infty,\log 2,0\)。它是一般交叉熵
在二分类、真值为退化概率分布时的特例。
逻辑回归训练采用梯度下降:初始化 \(w_0,b_0\),每轮计算损失及 \(\partial L/\partial w,\partial L/\partial b\),再更新
课件用学生复习时长预测是否通过考试。20个时长为
对应标签
拟合模型
并最小化全部样本的 BCE,数值解为 \(\mu\approx2.7,s\approx0.67\)。分类决策面是 \(w^Tx+b=0\),\(w\) 是决策面的法向量,\(b\) 是偏置。
感知机
Rosenblatt 于1957年提出感知机。给定 \(D=\{(x_i,y_i)\}_{i=1}^{N}\),其中 \(x_i\in\mathbb R^d,y_i\in\{1,-1\}\),模型为
感知机和逻辑回归都是直接拟合分类面的鉴别式模型。误分类点满足 \(y(w^Tx+b)<0\)。单纯统计误分类点个数不可导,因此把误分类点到分类面的等效距离相加:
对误分类点,
故随机梯度更新为
三种线性模型可归纳为:
| 模型 | 任务 | 映射 | 目标函数 |
|---|---|---|---|
| 线性回归 | 回归 | \(w^Tx+b\) | MSE 或误差平方和 |
| 逻辑回归 | 分类 | \(\sigma(w^Tx+b)\) | 二分类交叉熵 |
| 感知机 | 分类 | \(\operatorname{sign}(w^Tx+b)\) | 误分类点到分类面的等效距离 |
感知机能够学习 AND:四个输入 \((0,0),(0,1),(1,0),(1,1)\) 的标签依次为 \(0,0,0,1\),它们线性可分。异或数据在这四个输入上的标签依次为 \(0,1,1,0\),二维平面中不存在一条直线把两类完全分开,所以单个感知机或逻辑回归模型不能解决 XOR。增加一个不使用偏置、采用 ReLU 的隐含层,就能手工构造出
| \(x_1\) | \(x_2\) | \(h_1\) | \(h_2\) | \(y\) |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 0.5 |
| 1 | 0 | 1 | 0 | 0.5 |
| 1 | 1 | 0 | 0 | 0 |
这里正类输出为 \(0.5\) 而不是真值 1,但取合适阈值即可完成 XOR 判决。
神经网络
从生物神经元到人工神经元
人脑包含100亿个以上神经元和1000亿个以上神经胶质细胞。神经元接收、处理和传送信息:神经元内部主要是电传导,神经元之间通过突触形成神经回路,主要是化学传导;神经回路是脑内信息处理的基本单位。
McCulloch 与 Pitts 于1943年提出人工神经元数学模型,抽象了神经元的兴奋、抑制、空间整合、阈值与固定时滞。“全或无”法则是:低于刺激阈值不响应,高于阈值后,不论刺激强弱都产生相同幅值的神经脉冲。
人工神经元先线性加权,再非线性激活:
若令 \(x_0=1,w_0=b\),则 \(z=w^Tx\)。课件把 \(b=-\rho\) 与生物神经元的响应阈值 \(\rho\) 对应。
神经网络发展中的几个节点是:1957年的感知机使用阶跃激活;Minsky 与 Papert 在1969年指出单层感知机不能处理 XOR 等线性不可分问题;Werbos(1974)以及 Rumelhart、Hinton、Williams、LeCun(1986)推动误差反向传播算法,它利用链式法则计算模型参数的梯度。
常用激活函数如下:
| 函数 | 定义与导数 | 特点 |
|---|---|---|
| 阈值函数 | \(f(z)=1\)(\(z>0\)),否则为 \(0\) | 输出 \([0,1]\) |
| 符号函数 | \(f(z)=1\)(\(z>0\)),否则为 \(-1\) | 输出 \([-1,1]\) |
| Sigmoid | \(\sigma(z)=1/(1+e^{-z})\),\(\sigma'=\sigma(1-\sigma)\) | 非零中心;饱和区梯度消失 |
| Tanh | \(\tanh z=(e^z-e^{-z})/(e^z+e^{-z})\),\(f'=1-\tanh^2z\) | 零中心;饱和区梯度消失;常用于 RNN |
| ReLU | \(f(z)=\max(0,z)\) | 正半轴梯度有效,缓解梯度消失;非零中心;负半轴截断可能产生“死亡神经元” |
| Leaky ReLU/PReLU | \(f(z)=z\)(\(z>0\)),否则为 \(\alpha z\) | 保留部分负值信息 |
SiLU 又称 Swish,由 Google Brain 于2017年引入:
多层感知机及表示能力
多层感知机在输入层与输出层之间增加一个或多个隐含层。每个节点与前层所有节点连接的层称全连接层、线性层或密集层,非线性激活紧随线性变换。它是前馈神经网络 FFN。
输入维数为 \(d\)、隐含层有 \(n\) 个节点、输出层有 \(m\) 个节点时,参数量为
大模型中的单个专家也可用 FFN 实现。DeepSeek-V3 总参数量为 671B,Transformer 共61层,前3层采用普通 FFN,后58层采用混合专家 MoE;单次推理只激活 37B 参数。每个 MoE 层的单个专家包含三个线性层,特征维数依次为 \(2048\to10944\to2048\to10944\)。三个线性层含偏置的参数量分别为
合计 \(67263872\)。MoE 的动态路由由线性层与 Softmax 组成多路门控。
神经网络的非线性表示能力体现在三方面:
- 一个隐含层、节点数可任意增加、使用阈值激活的网络,可以实现任意二值逻辑函数。
- 万能近似定理指出,一个隐含层、节点数可任意增加、使用 S 形非线性激活的网络,可以一致逼近紧集上的连续函数,或按范数逼近紧集上的平方可积函数。
- 二分类中,一个隐含层可模拟二维特征空间中的任意凸多边形决策面,多层网络还能表示更复杂的边界。
没有非线性激活时,多层线性变换仍等价于一次线性变换。以两个隐含节点为例,
只有把 \(a_1,a_2\) 改为 \(\sigma(w_ix+b_i)\),网络才获得非线性。
课件给出一个训练后的 XOR 网络。批量增广输入为
隐含层权重和输出层权重为
隐含层输出的四列分别对应四个输入:
经 ReLU 后,输出层线性结果为
取阈值 \(0.5\),判决为 \((0,1,1,0)\)。隐含层把原本线性不可分的数据变换成线性可分的表示。
增加隐含节点可以更好地拟合正弦波和复杂曲线;增加层数和节点数可进一步提升拟合能力。分类问题中,线性层和非线性激活相当于改变数据表示,例如把直角坐标中的问题变换到类似极坐标的表示,使三分类决策面更易分开。
从模板匹配看,一个分类神经元计算图像向量 \(x\) 与模板 \(w\) 的内积
像素较少的“1”和像素较多的“8”会造成内积尺度差异,因此还要加入偏置和激活函数。横向增加输出节点可以增加模式类别;纵向增加层次可以先提取局部模式,再把局部模式组合成更复杂的整体。
回归与分类目标函数
回归任务可选:
以及 Smooth \(L_1\):
二分类使用 BCE;多分类通常使用 Softmax 加交叉熵。对 logits \(z=(z_1,\ldots,z_C)^T\),
例如
当 \(C=2\) 时,Softmax 可化成对两个 logits 之差使用 Sigmoid,因此是逻辑回归的推广。其导数为
若真值类别为 \(i\),one-hot 向量 \(y^\ast\) 只有第 \(i\) 项为 \(1\),则交叉熵为
手写数字识别有 \(C=10\) 类。数字9的 one-hot 真值是 \((0,0,0,0,0,0,0,0,0,1)^T\)。初始输出若为均匀分布,损失
训练后若输出为 \((0.02,0,0,0,0,0,0.03,0,0,0.95)^T\),损失为
Softmax 与交叉熵合并后,对 logits 的梯度特别简单:
当 \(C=2\) 且 \(y_1=1-y_0,q_1=1-q_0\) 时,
正好回到 BCE。PyTorch 的 CrossEntropyLoss 已同时包含 Softmax 和交叉熵,真值可用类别序号或 one-hot 形式表示。
误差反向传播与样本选取
多层感知机训练的基本步骤是:初始化参数并设定批量大小、学习率等超参数;前向计算各层线性变换、激活值、预测与损失;再沿计算图反向应用链式法则,求损失对输出层、隐含层和全部参数的导数;最后用梯度下降更新参数,重复到满足终止条件。
按每次计算梯度使用的样本数量,可分为三种方法:
- 批量梯度下降 BGD 使用全部样本,速度慢,数据量大时还会占用过多内存:
- 原始随机梯度下降 SGD 每次随机选一个样本,梯度方差大,损失震荡明显:
- Mini-batch SGD 每次随机选 \(N_b\) 个样本,在效率和稳定性之间折中:
一个含单隐层的分类网络,前向计算可写成“输入—线性层—Sigmoid—线性层—Softmax—交叉熵”;反向传播则从交叉熵开始,依次求对预测、logits、输出层权重、隐含层输出、隐含层激活前状态和第一层参数的导数。
非线性回归的完整计算例
继续使用苹果产量与降雨量数据。先标准化降雨量与苹果产量:
网络有两个 Sigmoid 隐含节点:
课件展示的一组训练后参数为
\(w_2<0\) 会把第二个 Sigmoid 的方向反转;两个经伸缩、平移的 S 形曲线叠加后形成非线性拟合。
为了展示一次参数更新,取 batch size 为1,使用第一个标准化样本 \(x=-0.55,y=-0.53\),并随机初始化
前向计算得到
课件保留两位小数后给出的局部导数为
沿两条路径应用链式法则,得到
为了便于手算,课件暂取 \(\eta=1\),实际常取 \(10^{-4}\) 到 \(0.01\)。一次更新为
不同随机初始化会得到不同曲线;模型容量过大时可能把少量训练点逐个“记住”而过拟合;换用 ReLU 后,拟合形状也会随激活函数改变。
批量矩阵计算与矩阵求导
设一个分类 MLP 有两个 ReLU 隐含层,宽度分别为 \(d_1,d_2\),输出类别数为 \(C\)。输入一个含 \(m\) 个 \(d\) 维样本的批量 \(X\in\mathbb R^{m\times d}\):
反向传播时必须保持矩阵维度和乘法顺序正确。例如
课件采用如下求导约定。标量 \(y\) 对列向量 \(x=(x_1,\ldots,x_n)^T\) 的导数仍为列向量:
因此,若 \(y=a^Tx\),则
若 \(y=x^TAx\),则
标量对矩阵的导数与原矩阵同形。若 \(y=a^TXb\),则
若 \(y=\operatorname{tr}(X)\),则
向量 \(y=(y_1,\ldots,y_m)^T\) 对向量 \(x=(x_1,\ldots,x_n)^T\) 的导数按课件约定排成 \(n\times m\) 矩阵:
对 \(y=W^Tx\),有
非线性分类与泛化
字符与背景的两分类样本在原特征空间中线性不可分。逻辑回归训练100轮或1000轮仍不能完全分开;MLP 则可使用一层8节点 ReLU、一层32节点 ReLU、两层各8节点 ReLU,或两层各8节点 Tanh 得到非线性边界。层数、宽度和激活函数都会改变决策面。
训练损失更低不保证模型更好。课件比较了损失 \(0.125\) 与 \(0.000\) 的两个模型,后者的边界更曲折、未必有更好的泛化能力。防止过拟合的方法包括在目标函数中加入模型复杂度惩罚,以及当验证集误差不再下降时提前停止。
PyTorch 极简流程
课件附录把 PyTorch 训练流程压缩为六步:
- 张量:torch.tensor 可由标量、向量、矩阵和高维列表建立0维、1维、2维和3维张量;dim 查看维数,shape 查看各维大小。形状为 \((2,3)\) 的张量可 reshape 为 \((3,2)\),shape[0]、shape[1] 分别给出相应维度。
- 自动求导:令 \(x=2\) 且 requires_grad=True,
调用 backward 后可从 x.grad 取得梯度。 3. 构建数据集:示例生成 \(X\in\mathbb R^{100\times10}\) 和100个二分类标签,按 \(0.8\) 比例划分为80个训练样本、20个测试样本。 4. 搭建网络:自定义模块可设置 \(10\to5\) 的线性层、ReLU 和 \(5\to2\) 的线性层,并在 forward 中规定数据流;也可用 Sequential 按顺序组合模块,无须另写 forward。 5. 损失与优化:用 CrossEntropyLoss 和 SGD;训练循环依次执行清梯度、前向计算、计算损失、loss.backward 和 optimizer.step。PyTorch 默认累加梯度,因此通常每步先 zero_grad;梯度累加也可在内存有限时用多个小批量模拟大批量,或在多任务学习中汇总多个损失的梯度。 6. 测试:在 no_grad 环境下前向计算,按 argmax 得到类别,并统计正确率;课件示例测试张量形状为 \((20,2)\),准确率为 \(60.00\%\)。
PyTorch 官方入门教程还依次涵盖 Quickstart、Tensors、Datasets and DataLoaders、Transforms、Build Model、Automatic Differentiation、Optimization Loop,以及 Save/Load/Use Model。
思考与探究
- Sigmoid 导数的最大值是多少?
- 怎样扩展感知机,使其可以解决 XOR?
- 多层感知机的非线性表示能力由哪些因素决定?
- 初始化多层感知机时,能否把全部参数设为0?
- 定义
证明 \(\operatorname{RealSoftMax}(a,b)>\max(a,b)\);证明对 \(\lambda>0\),
并证明 \(\lambda\to\infty\) 时左式趋于 \(\max(a,b)\);把定义推广到两个以上的数,并给出 SoftMin 的定义。
