跳转至

第2讲 机器学习(一)

线性分类

逻辑回归

广义线性模型把输出经连接函数 \(g\) 变成输入的线性函数:

\[ g(y)=w^Tx+b,\qquad y=g^{-1}(w^Tx+b). \]

\(g\) 应单调、可微且存在逆函数。对数线性回归取 \(g(y)=\ln y\),于是 \(y=e^{w^Tx+b}\);对数几率回归取

\[ g(y)=\ln\frac{y}{1-y}, \]

就是逻辑回归。Logistic 函数也称 Sigmoid 函数:

\[ \sigma(x)=\frac{1}{1+e^{-x}}. \]

它最早用于19世纪资源受限的人口增长研究,后来用于二分类和神经网络激活函数。若事件发生概率为 \(p=\sigma(x)\),其胜算为 \(p/(1-p)\),对数胜算恰为

\[ \operatorname{logit}(p)=\ln\frac{p}{1-p}=x. \]

Sigmoid 单调递增,是关于 \((0,0.5)\) 中心对称的平滑 S 形曲线;\(x\to+\infty\) 时趋于 \(1\)\(x\to-\infty\) 时趋于 \(0\)。其导数可直接由函数值表示:

\[ \sigma'(x)=\sigma(x)\bigl(1-\sigma(x)\bigr). \]

逻辑回归先计算

\[ z=w^Tx+b,\qquad q=\sigma(z), \]

其中 \(q\) 是属于正类的预测概率。还可引入位置和斜率参数:

\[ f(x)=\frac{1}{1+e^{-k(x-\mu)}}, \]

\(\mu\) 决定曲线中心,\(k\) 控制中心附近的斜率。

二分类交叉熵是逻辑回归的目标函数。真值 \(p\in\{0,1\}\)、正类预测概率为 \(q\) 时,

\[ L_{\mathrm{BCE}}=-p\log q-(1-p)\log(1-q). \]

\(p=1\) 时,\(q=1,0.5,0\) 对应损失 \(0,\log 2,+\infty\);当 \(p=0\) 时,\(q=1,0.5,0\) 对应损失 \(+\infty,\log 2,0\)。它是一般交叉熵

\[ H(P,Q)=-\sum_{x_i\in X}p(x_i)\log q(x_i) \]

在二分类、真值为退化概率分布时的特例。

逻辑回归训练采用梯度下降:初始化 \(w_0,b_0\),每轮计算损失及 \(\partial L/\partial w,\partial L/\partial b\),再更新

\[ w_t=w_{t-1}-\eta\frac{\partial L}{\partial w}, \qquad b_t=b_{t-1}-\eta\frac{\partial L}{\partial b}. \]

课件用学生复习时长预测是否通过考试。20个时长为

\[ \begin{aligned} x={}&(0.50,0.75,1.00,1.25,1.50,1.75,1.75,2.00,2.25,2.50,\\ &2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50), \end{aligned} \]

对应标签

\[ y=(0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1). \]

拟合模型

\[ q(x)=\frac{1}{1+e^{-(x-\mu)/s}} \]

并最小化全部样本的 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\}\),模型为

\[ \hat y=\operatorname{sign}(w^Tx+b), \qquad \operatorname{sign}(z)= \begin{cases} 1,&z>0,\\ -1,&z\le0. \end{cases} \]

感知机和逻辑回归都是直接拟合分类面的鉴别式模型。误分类点满足 \(y(w^Tx+b)<0\)。单纯统计误分类点个数不可导,因此把误分类点到分类面的等效距离相加:

\[ L(w,b)=\sum_{x\in D}\max\left(0,-y(w^Tx+b)\right). \]

对误分类点,

\[ \frac{\partial L}{\partial w}=-yx,\qquad \frac{\partial L}{\partial b}=-y, \]

故随机梯度更新为

\[ w\leftarrow w+\eta yx,\qquad b\leftarrow b+\eta y. \]

三种线性模型可归纳为:

模型 任务 映射 目标函数
线性回归 回归 \(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 的隐含层,就能手工构造出

\[ h_1=\operatorname{ReLU}(x_1-x_2),\qquad h_2=\operatorname{ReLU}(-x_1+x_2),\qquad y=\frac12(h_1+h_2). \]
\(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年提出人工神经元数学模型,抽象了神经元的兴奋、抑制、空间整合、阈值与固定时滞。“全或无”法则是:低于刺激阈值不响应,高于阈值后,不论刺激强弱都产生相同幅值的神经脉冲。

人工神经元先线性加权,再非线性激活:

\[ z=w^Tx+b,\qquad \hat y=f(z). \]

若令 \(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年引入:

\[ \operatorname{SiLU}(x)=x\,\sigma(x). \]

Sigmoid、Tanh、ReLU、Leaky ReLU、SiLU 和阶跃函数曲线

多层感知机及表示能力

多层感知机在输入层与输出层之间增加一个或多个隐含层。每个节点与前层所有节点连接的层称全连接层、线性层或密集层,非线性激活紧随线性变换。它是前馈神经网络 FFN。

输入维数为 \(d\)、隐含层有 \(n\) 个节点、输出层有 \(m\) 个节点时,参数量为

\[ (d+1)n+(n+1)m. \]

大模型中的单个专家也可用 FFN 实现。DeepSeek-V3 总参数量为 671B,Transformer 共61层,前3层采用普通 FFN,后58层采用混合专家 MoE;单次推理只激活 37B 参数。每个 MoE 层的单个专家包含三个线性层,特征维数依次为 \(2048\to10944\to2048\to10944\)。三个线性层含偏置的参数量分别为

\[ 2048\times10944+10944=22424256, \]
\[ 10944\times2048+2048=22415360, \]
\[ 2048\times10944+10944=22424256, \]

合计 \(67263872\)。MoE 的动态路由由线性层与 Softmax 组成多路门控。

神经网络的非线性表示能力体现在三方面:

  • 一个隐含层、节点数可任意增加、使用阈值激活的网络,可以实现任意二值逻辑函数。
  • 万能近似定理指出,一个隐含层、节点数可任意增加、使用 S 形非线性激活的网络,可以一致逼近紧集上的连续函数,或按范数逼近紧集上的平方可积函数。
  • 二分类中,一个隐含层可模拟二维特征空间中的任意凸多边形决策面,多层网络还能表示更复杂的边界。

没有非线性激活时,多层线性变换仍等价于一次线性变换。以两个隐含节点为例,

\[ a_1=w_1x+b_1,\qquad a_2=w_2x+b_2, \]
\[ \hat y=w_3a_1+w_4a_2+b_3 =(w_1w_3+w_2w_4)x+(w_3b_1+w_4b_2+b_3). \]

只有把 \(a_1,a_2\) 改为 \(\sigma(w_ix+b_i)\),网络才获得非线性。

课件给出一个训练后的 XOR 网络。批量增广输入为

\[ X= \begin{bmatrix} 1&1&1&1\\ 0&0&1&1\\ 0&1&0&1 \end{bmatrix}, \]

隐含层权重和输出层权重为

\[ W^{(1)}= \begin{bmatrix} -0.78&0.78&0.78\\ 0.52&0.42&0.48 \end{bmatrix}, \qquad w^{(2)}=(0.23,-1.03,0.51)^T. \]

隐含层输出的四列分别对应四个输入:

\[ H=\begin{bmatrix}0&0&0&0.78\\0.52&1.00&0.94&1.42\end{bmatrix}. \]

经 ReLU 后,输出层线性结果为

\[ z=(0.4952,0.74,0.7094,0.1508). \]

取阈值 \(0.5\),判决为 \((0,1,1,0)\)。隐含层把原本线性不可分的数据变换成线性可分的表示。

增加隐含节点可以更好地拟合正弦波和复杂曲线;增加层数和节点数可进一步提升拟合能力。分类问题中,线性层和非线性激活相当于改变数据表示,例如把直角坐标中的问题变换到类似极坐标的表示,使三分类决策面更易分开。

从模板匹配看,一个分类神经元计算图像向量 \(x\) 与模板 \(w\) 的内积

\[ \operatorname{net}=w_1x_1+\cdots+w_dx_d. \]

像素较少的“1”和像素较多的“8”会造成内积尺度差异,因此还要加入偏置和激活函数。横向增加输出节点可以增加模式类别;纵向增加层次可以先提取局部模式,再把局部模式组合成更复杂的整体。

回归与分类目标函数

回归任务可选:

\[ L_2=\frac12\sum_i(y_i-\hat y_i)^2, \qquad L_1=\sum_i|y_i-\hat y_i|, \]

以及 Smooth \(L_1\)

\[ L=\sum_iL_i,\qquad L_i= \begin{cases} \frac12(y_i-\hat y_i)^2,&|y_i-\hat y_i|<1,\\ |y_i-\hat y_i|-\frac12,&\text{其他}. \end{cases} \]

二分类使用 BCE;多分类通常使用 Softmax 加交叉熵。对 logits \(z=(z_1,\ldots,z_C)^T\)

\[ q_i=\operatorname{softmax}(z_i) =\frac{e^{z_i}}{\sum_{j=1}^{C}e^{z_j}}. \]

例如

\[ \operatorname{softmax}(1,2,3)^T=(0.090,0.245,0.665)^T. \]

\(C=2\) 时,Softmax 可化成对两个 logits 之差使用 Sigmoid,因此是逻辑回归的推广。其导数为

\[ \frac{\partial q_i}{\partial z_j} =q_i\bigl(\delta_{ij}-q_j\bigr) = \begin{cases} q_i(1-q_i),&i=j,\\ -q_iq_j,&i\ne j. \end{cases} \]

若真值类别为 \(i\),one-hot 向量 \(y^\ast\) 只有第 \(i\) 项为 \(1\),则交叉熵为

\[ L=-\sum_{j=1}^{C}y_j^\ast\log q_j=-\log q_i. \]

手写数字识别有 \(C=10\) 类。数字9的 one-hot 真值是 \((0,0,0,0,0,0,0,0,0,1)^T\)。初始输出若为均匀分布,损失

\[ L=-\log 0.1=\log 10=2.3026. \]

训练后若输出为 \((0.02,0,0,0,0,0,0.03,0,0,0.95)^T\),损失为

\[ L=-\log0.95=0.0513. \]

Softmax 与交叉熵合并后,对 logits 的梯度特别简单:

\[ \frac{\partial L}{\partial z}=q-y^\ast. \]

\(C=2\)\(y_1=1-y_0,q_1=1-q_0\) 时,

\[ L=-y_0\log q_0-(1-y_0)\log(1-q_0), \]

正好回到 BCE。PyTorch 的 CrossEntropyLoss 已同时包含 Softmax 和交叉熵,真值可用类别序号或 one-hot 形式表示。

误差反向传播与样本选取

多层感知机训练的基本步骤是:初始化参数并设定批量大小、学习率等超参数;前向计算各层线性变换、激活值、预测与损失;再沿计算图反向应用链式法则,求损失对输出层、隐含层和全部参数的导数;最后用梯度下降更新参数,重复到满足终止条件。

按每次计算梯度使用的样本数量,可分为三种方法:

  • 批量梯度下降 BGD 使用全部样本,速度慢,数据量大时还会占用过多内存:
\[ \theta\leftarrow\theta-\eta\nabla_\theta L(\theta). \]
  • 原始随机梯度下降 SGD 每次随机选一个样本,梯度方差大,损失震荡明显:
\[ \theta\leftarrow\theta-\eta\nabla_\theta L(\theta,x_i,y_i). \]
  • Mini-batch SGD 每次随机选 \(N_b\) 个样本,在效率和稳定性之间折中:
\[ \theta\leftarrow\theta-\eta\frac1{N_b} \sum_{i=1}^{N_b}\nabla_\theta L(\theta,x_i,y_i). \]

一个含单隐层的分类网络,前向计算可写成“输入—线性层—Sigmoid—线性层—Softmax—交叉熵”;反向传播则从交叉熵开始,依次求对预测、logits、输出层权重、隐含层输出、隐含层激活前状态和第一层参数的导数。

非线性回归的完整计算例

继续使用苹果产量与降雨量数据。先标准化降雨量与苹果产量:

\[ x=(67,88,134,43,96),\quad \operatorname{mean}(x)=85.60,\quad \operatorname{std}(x)=33.98, \]
\[ x'=(-0.55,0.07,1.42,-1.25,0.31), \]
\[ y=(56,81,119,22,103),\quad \operatorname{mean}(y)=76.20,\quad \operatorname{std}(y)=38.47, \]
\[ y'=(-0.53,0.12,1.11,-1.41,0.70). \]

网络有两个 Sigmoid 隐含节点:

\[ a_1=\sigma(w_1x+b_1),\qquad a_2=\sigma(w_2x+b_2), \]
\[ \hat y=w_3a_1+w_4a_2+b_3. \]

课件展示的一组训练后参数为

\[ w_1=2.46,\ b_1=-0.05,\quad w_2=-1.82,\ b_2=-1.53,\quad w_3=1.30,\ w_4=-1.98,\ b_3=-0.10. \]

\(w_2<0\) 会把第二个 Sigmoid 的方向反转;两个经伸缩、平移的 S 形曲线叠加后形成非线性拟合。

为了展示一次参数更新,取 batch size 为1,使用第一个标准化样本 \(x=-0.55,y=-0.53\),并随机初始化

\[ w_1=0.76,\ b_1=-0.23,\quad w_2=0.83,\ b_2=0.92,\quad w_3=-0.15,\ w_4=0.14,\ b_3=-0.34. \]

前向计算得到

\[ a_1=0.34,\qquad a_2=0.61,\qquad \hat y=-0.31, \]
\[ L=(\hat y-y)^2=(-0.31+0.53)^2\approx0.05. \]

课件保留两位小数后给出的局部导数为

\[ \frac{\partial L}{\partial\hat y}=0.43,\quad \frac{\partial\hat y}{\partial b_3}=1,\quad \frac{\partial\hat y}{\partial w_3}=0.34,\quad \frac{\partial\hat y}{\partial w_4}=0.61, \]
\[ \frac{\partial\hat y}{\partial a_1}=-0.15,\qquad \frac{\partial\hat y}{\partial a_2}=0.14, \]
\[ \frac{\partial a_1}{\partial w_1}=-0.12,\quad \frac{\partial a_1}{\partial b_1}=0.22,\quad \frac{\partial a_1}{\partial x}=0.17, \]
\[ \frac{\partial a_2}{\partial w_2}=-0.13,\quad \frac{\partial a_2}{\partial b_2}=0.24,\quad \frac{\partial a_2}{\partial x}=0.20. \]

沿两条路径应用链式法则,得到

\[ \begin{aligned} \frac{\partial L}{\partial w_1}&=0.01,& \frac{\partial L}{\partial b_1}&=-0.01,& \frac{\partial L}{\partial w_2}&=-0.01,\\ \frac{\partial L}{\partial b_2}&=0.01,& \frac{\partial L}{\partial w_3}&=0.15,& \frac{\partial L}{\partial w_4}&=0.26,& \frac{\partial L}{\partial b_3}&=0.43. \end{aligned} \]

为了便于手算,课件暂取 \(\eta=1\),实际常取 \(10^{-4}\)\(0.01\)。一次更新为

\[ \begin{aligned} w_1&:0.76\to0.75,& b_1&:-0.23\to-0.22,\\ w_2&:0.83\to0.84,& b_2&:0.92\to0.91,\\ w_3&:-0.15\to-0.30,& w_4&:0.14\to-0.12,\\ b_3&:-0.34\to-0.77. \end{aligned} \]

不同随机初始化会得到不同曲线;模型容量过大时可能把少量训练点逐个“记住”而过拟合;换用 ReLU 后,拟合形状也会随激活函数改变。

批量矩阵计算与矩阵求导

设一个分类 MLP 有两个 ReLU 隐含层,宽度分别为 \(d_1,d_2\),输出类别数为 \(C\)。输入一个含 \(m\)\(d\) 维样本的批量 \(X\in\mathbb R^{m\times d}\)

\[ H_1=\operatorname{ReLU}\left(X(W^{(1)})^T+b_1\right) \in\mathbb R^{m\times d_1}, \]
\[ H_2=\operatorname{ReLU}\left(H_1(W^{(2)})^T+b_2\right) \in\mathbb R^{m\times d_2}, \]
\[ Z=H_2W^T+b\in\mathbb R^{m\times C}, \qquad Y=\operatorname{softmax}(Z). \]

反向传播时必须保持矩阵维度和乘法顺序正确。例如

\[ \frac{\partial L}{\partial H_2} =\frac{\partial L}{\partial Z}W, \qquad \frac{\partial L}{\partial W} =\left(\frac{\partial L}{\partial Z}\right)^TH_2. \]

课件采用如下求导约定。标量 \(y\) 对列向量 \(x=(x_1,\ldots,x_n)^T\) 的导数仍为列向量:

\[ \frac{\partial y}{\partial x} =\left(\frac{\partial y}{\partial x_1},\ldots, \frac{\partial y}{\partial x_n}\right)^T. \]

因此,若 \(y=a^Tx\),则

\[ \frac{\partial y}{\partial x}=a. \]

\(y=x^TAx\),则

\[ \frac{\partial y}{\partial x}=(A+A^T)x. \]

标量对矩阵的导数与原矩阵同形。若 \(y=a^TXb\),则

\[ \frac{\partial y}{\partial X}=ab^T. \]

\(y=\operatorname{tr}(X)\),则

\[ \frac{\partial y}{\partial X}=I. \]

向量 \(y=(y_1,\ldots,y_m)^T\) 对向量 \(x=(x_1,\ldots,x_n)^T\) 的导数按课件约定排成 \(n\times m\) 矩阵:

\[ \left(\frac{\partial y}{\partial x}\right)^T = \begin{bmatrix} \frac{\partial y_1}{\partial x_1}&\cdots&\frac{\partial y_m}{\partial x_1}\\ \vdots&\ddots&\vdots\\ \frac{\partial y_1}{\partial x_n}&\cdots&\frac{\partial y_m}{\partial x_n} \end{bmatrix}. \]

\(y=W^Tx\),有

\[ \left(\frac{\partial y}{\partial x}\right)^T=W. \]

非线性分类与泛化

字符与背景的两分类样本在原特征空间中线性不可分。逻辑回归训练100轮或1000轮仍不能完全分开;MLP 则可使用一层8节点 ReLU、一层32节点 ReLU、两层各8节点 ReLU,或两层各8节点 Tanh 得到非线性边界。层数、宽度和激活函数都会改变决策面。

训练损失更低不保证模型更好。课件比较了损失 \(0.125\)\(0.000\) 的两个模型,后者的边界更曲折、未必有更好的泛化能力。防止过拟合的方法包括在目标函数中加入模型复杂度惩罚,以及当验证集误差不再下降时提前停止。

PyTorch 极简流程

课件附录把 PyTorch 训练流程压缩为六步:

  1. 张量:torch.tensor 可由标量、向量、矩阵和高维列表建立0维、1维、2维和3维张量;dim 查看维数,shape 查看各维大小。形状为 \((2,3)\) 的张量可 reshape 为 \((3,2)\),shape[0]、shape[1] 分别给出相应维度。
  2. 自动求导:令 \(x=2\) 且 requires_grad=True,
\[ y=x^3+2x+1=13,\qquad \frac{\mathrm dy}{\mathrm dx}=3x^2+2=14. \]

调用 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。

思考与探究

  1. Sigmoid 导数的最大值是多少?
  2. 怎样扩展感知机,使其可以解决 XOR?
  3. 多层感知机的非线性表示能力由哪些因素决定?
  4. 初始化多层感知机时,能否把全部参数设为0?
  5. 定义
\[ \operatorname{RealSoftMax}(a,b)=\log(e^a+e^b). \]

证明 \(\operatorname{RealSoftMax}(a,b)>\max(a,b)\);证明对 \(\lambda>0\)

\[ \lambda^{-1}\operatorname{RealSoftMax}(\lambda a,\lambda b)>\max(a,b), \]

并证明 \(\lambda\to\infty\) 时左式趋于 \(\max(a,b)\);把定义推广到两个以上的数,并给出 SoftMin 的定义。

评论