1. 先把"模型"说清楚
在机器学习里,模型就是一个函数。
- 输入 :我们手头的特征向量 x=(x1,x2,...,xn)x=(x_1,x_2,\dots ,x_n)x=(x1,x2,...,xn)。
- 输出 :模型预测的结果 y^\hat{y}y^。
最常见的模型是线性模型:
y^=w1x1+w2x2+⋯+wnxn+b \boxed{\hat{y}=w_1x_1+w_2x_2+\dots +w_nx_n+b} y^=w1x1+w2x2+⋯+wnxn+b
这里 wiw_iwi 是权重,bbb 是偏置。
如果是分类问题,我们往往把 y^\hat{y}y^ 通过一个激活函数(如 Sigmoid 或 Softmax)映射到 0--1 或类别上。
2. "学到规律"到底是做什么?
我们给定一组真实标签 yyy,希望模型的预测 y^\hat{y}y^ 与真实值尽量接近。
这就像我们把模型当成一台自动调音的乐器:
- 目标:让音调(误差)尽量小。
- 过程:反复微调(改参数)来逼近正确音调。
数学上,我们用 损失函数(Loss)来量化预测与真实值之间的差距。
2.1 损失函数
- 回归 :最常用的是均方误差(MSE)
L(w,b)=1m∑i=1m(y^(i)−y(i))2 L(w,b)=\frac{1}{m}\sum_{i=1}^{m}\big(\hat{y}^{(i)}-y^{(i)}\big)^2 L(w,b)=m1i=1∑m(y^(i)−y(i))2
这里 mmm 是样本数。 - 分类 :交叉熵(Cross‑Entropy)
L(w,b)=−1m∑i=1m[y(i)logp^(i)+(1−y(i))log(1−p^(i))] L(w,b)=-\frac{1}{m}\sum_{i=1}^{m}\Big[ y^{(i)}\log \hat{p}^{(i)}+(1-y^{(i)})\log (1-\hat{p}^{(i)}) \Big] L(w,b)=−m1i=1∑m[y(i)logp^(i)+(1−y(i))log(1−p^(i))]
其中 p^(i)\hat{p}^{(i)}p^(i) 是模型给出的正类概率。
2.2 目标函数
训练的真正目标是 最小化 损失函数:
minw,b L(w,b) \min_{w,b}\; L(w,b) w,bminL(w,b)
这一步骤叫做 优化(Optimization)。
3. 梯度下降------最小化的"手推车"
假设我们已经把损失函数写好了,如何让 w,bw,bw,b 变得更好呢?
答案是 梯度下降(Gradient Descent)。
3.1 梯度是什么?
梯度是一个向量,记录了损失函数在每个参数方向上的变化率。
- 方向:损失 增加 的方向。
- 方向相反:损失 减少 的方向。
如果把损失函数画成一座山,梯度就是指向山顶的坡度,而我们想去山脚。
3.2 梯度下降公式
给定当前参数 (w,b)(w,b)(w,b),梯度 ∇L\nabla L∇L 指向损失增大的方向,沿着负梯度方向更新参数:
w←w−η∂L∂w,b←b−η∂L∂b w \leftarrow w - \eta \frac{\partial L}{\partial w}, \qquad b \leftarrow b - \eta \frac{\partial L}{\partial b} w←w−η∂w∂L,b←b−η∂b∂L
- η>0\eta>0η>0 是 学习率(Learning Rate),决定每一步走多远。
- ∂L∂w\frac{\partial L}{\partial w}∂w∂L 是梯度的分量,说明如果把 www 变一点,损失会怎样变化。
3.3 学习率的意义
- 太大:可能越过最优点,甚至发散(跌得太快)。
- 太小:收敛速度慢,训练时间长。
常见做法:
- 固定学习率(最简单)。
- 学习率衰减(每过一段时间减小)。
- 自适应优化器(如 Adam、RMSProp)自动调整学习率。
3.4 计算梯度的技巧
对线性回归来说,梯度可以直接推导:
∂L∂wj=2m∑i=1m(y^(i)−y(i))xj(i) \frac{\partial L}{\partial w_j} = \frac{2}{m}\sum_{i=1}^{m}(\hat{y}^{(i)}-y^{(i)})x_j^{(i)} ∂wj∂L=m2i=1∑m(y^(i)−y(i))xj(i)
∂L∂b=2m∑i=1m(y^(i)−y(i)) \frac{\partial L}{\partial b} = \frac{2}{m}\sum_{i=1}^{m}(\hat{y}^{(i)}-y^{(i)}) ∂b∂L=m2i=1∑m(y^(i)−y(i))
在深度学习里,梯度往往借助 链式法则 (Chain Rule)和 反向传播(Backpropagation)逐层算。
4. 批量、随机与小批量
在梯度下降里,每一次迭代我们都需要计算梯度。
如果用全部 mmm 个样本来算梯度,叫做 批量梯度下降(Batch GD)。
- 优点:梯度方向更准确。
- 缺点:每步耗时很久,尤其是大数据。
为此我们引入两种改进策略:
方式 | 说明 | 适用场景 |
---|---|---|
随机梯度下降(SGD) | 每次只拿一个样本来更新(或者用 1 条样本做梯度) | 训练数据量极大,计算资源有限 |
小批量梯度下降(Mini‑batch GD) | 每次拿 (b) 条样本(典型 32、64、128 条)来估计梯度 | 常规深度学习训练,兼顾速度与准确性 |
SGD 里的梯度不再是精确的方向,而是一个噪声估计。 这就像我们在爬山时,只看眼前的小石块,偶尔会走到错路,但总体还是能往下走。
小批量的做法在保持梯度方向相对准确的同时,显著提升了训练效率。
5. 目标函数的形状------凸与非凸
训练的效果很大程度取决于损失函数的几何形状。
5.1 凸函数
如果损失函数在整个参数空间是 凸 的,意味着:
- 任何两点连线都位于函数曲面之上。
- 所有局部最小点其实都是全局最小点。
对线性回归(MSE)来说,损失是一个二次函数,满足凸性。
这就是单层线性回归可以用 解析解 直接求得最优参数的原因:
w∗=(XTX)−1XTy w^*=(X^TX)^{-1}X^Ty w∗=(XTX)−1XTy
这里 XXX 是特征矩阵,XTX^TXT 是转置。
但当模型变复杂(如多层网络、非线性激活)后,损失往往变成 非凸 的,存在多个局部最小点,梯度下降只能找到其中一个。
5.2 非凸情况的挑战
- 局部最优:梯度下降可能停在一个不全对的点。
- 梯度消失/爆炸:在深层网络里,梯度随层数递归时会变得极小或极大。
解决办法:
- 初始化技巧(比如 Xavier、He 初始化)。
- 正则化(L1、L2)平滑曲面。
- 归一化特征(Feature Scaling)让不同维度的梯度同等重要。
- 使用更复杂的优化器(Adam 等)来避免梯度消失/爆炸。
6. 正则化------让模型更稳健
正则化是给损失函数额外添加一项,让模型的参数不要"太大",从而抑制过拟合。
Lreg(w,b)=L(w,b)+λR(w) L_{\text{reg}}(w,b)=L(w,b)+\lambda R(w) Lreg(w,b)=L(w,b)+λR(w)
- L2 正则(Ridge)
R(w)=12∑j=1nwj2 R(w)=\frac{1}{2}\sum_{j=1}^{n}w_j^2 R(w)=21j=1∑nwj2
- L1 正则(Lasso)
R(w)=∑j=1n∣wj∣ R(w)=\sum_{j=1}^{n}|w_j| R(w)=j=1∑n∣wj∣
λ>0\lambda>0λ>0 控制正则的强度。
- L2 让权重趋向 0,但不为 0;
- L1 还能让某些权重直接变为 0,从而实现特征选择。
7. 训练流程总结
把之前的所有元素放在一起,完整的训练流程是:
- 定义模型
y^(i)=f(x(i);w,b) \hat{y}^{(i)}=f(x^{(i)};w,b) y^(i)=f(x(i);w,b) - 构造损失
L(w,b)=1m∑i=1mℓ(y^(i),y(i)) L(w,b)=\frac{1}{m}\sum_{i=1}^{m} \ell(\hat{y}^{(i)},y^{(i)}) L(w,b)=m1i=1∑mℓ(y^(i),y(i)) - 计算梯度
∇w,bL \nabla_{w,b} L ∇w,bL - 参数更新 (梯度下降)
w←w−η∂L∂w,b←b−η∂L∂b w \leftarrow w - \eta \frac{\partial L}{\partial w},\quad b \leftarrow b - \eta \frac{\partial L}{\partial b} w←w−η∂w∂L,b←b−η∂b∂L - 重复 直到停止准则(比如迭代次数、损失变化阈值、验证集性能不再提升)。
下面我们把这五个步骤用一段 完整的"线性回归"示例 展示出来。
8. 线性回归的训练流程
步骤 | 说明 | 关键公式 |
---|---|---|
1. 参数初始化 | 给 w,bw,bw,b 设定初始值(常常设为 0 或随机小数) | w(0)=0, b(0)=0w^{(0)}=\mathbf{0},\; b^{(0)}=0w(0)=0,b(0)=0 |
2. 预测 | 用当前参数计算所有样本的预测值 | y^(i)=wTx(i)+b\hat{y}^{(i)}=w^Tx^{(i)}+by^(i)=wTx(i)+b |
3. 损失 | 计算当前预测误差 | L=1m∑i(y^(i)−y(i))2L=\frac{1}{m}\sum_{i}(\hat{y}^{(i)}-y^{(i)})^2L=m1∑i(y^(i)−y(i))2 |
4. 梯度 | 计算梯度(对每个 wjw_jwj 和 bbb) | ∂L∂wj=2m∑i(y^(i)−y(i))xj(i)\frac{\partial L}{\partial w_j}=\frac{2}{m}\sum_i(\hat{y}^{(i)}-y^{(i)})x_j^{(i)}∂wj∂L=m2∑i(y^(i)−y(i))xj(i); ∂L∂b=2m∑i(y^(i)−y(i))\frac{\partial L}{\partial b}=\frac{2}{m}\sum_i(\hat{y}^{(i)}-y^{(i)})∂b∂L=m2∑i(y^(i)−y(i)) |
5. 更新 | 按负梯度方向移动参数 | w(t+1)=w(t)−η∂L∂ww^{(t+1)}=w^{(t)}-\eta\frac{\partial L}{\partial w}w(t+1)=w(t)−η∂w∂L; b(t+1)=b(t)−η∂L∂bb^{(t+1)}=b^{(t)}-\eta\frac{\partial L}{\partial b}b(t+1)=b(t)−η∂b∂L |
6. 循环 | 重复 2--5 直到停止 | 迭代次数 TTT,或 ΔL<ϵ\Delta L<\epsilonΔL<ϵ |
8.1 细化示例:房价预测
- 特征 :x=(面积,卧室数,房龄)x=(\text{面积,卧室数,房龄})x=(面积,卧室数,房龄)。
- 标签 :房价 yyy。
假设我们收集了 1000 户房子,每户有 3 个特征。
- 把所有 x(i)x^{(i)}x(i) 放进 XXX 矩阵,yyy 放进 YYY。
- 初始化 w=(0,0,0),b=0w=(0,0,0), b=0w=(0,0,0),b=0。
- 迭代 500 次,每次更新 w,bw,bw,b。
- 训练结束后,使用测试集验证 MSE。
这整个过程就是:
- 损失函数只用算式表达,
- 梯度用偏导数给出,
- 参数更新用微积分的"走梯度"公式实现。
9. 进一步:多层网络与反向传播
在线性回归之外,最常见的深度学习模型是 多层感知机(MLP):
h(1)=σ1(W(1)x+b(1))h(2)=σ2(W(2)h(1)+b(2)) ⋮y^=σL(W(L)h(L−1)+b(L)) \begin{aligned} h^{(1)} &= \sigma_1(W^{(1)}x+b^{(1)})\\ h^{(2)} &= \sigma_2(W^{(2)}h^{(1)}+b^{(2)})\\ &\;\;\vdots\\ \hat{y} &= \sigma_L(W^{(L)}h^{(L-1)}+b^{(L)}) \end{aligned} h(1)h(2)y^=σ1(W(1)x+b(1))=σ2(W(2)h(1)+b(2))⋮=σL(W(L)h(L−1)+b(L))
- σk\sigma_kσk 是激活函数(ReLU、tanh 等)。
- W(k),b(k)W^{(k)},b^{(k)}W(k),b(k) 是第 kkk 层的权重和偏置。
9.1 损失函数
对于回归仍用 MSE,分类用交叉熵。
损失是 y^\hat{y}y^ 与 yyy 的差异。
9.2 反向传播(Backpropagation)
我们需要计算所有层参数的梯度。
链式法则给出:
∂L∂W(k)=∂L∂h(k)∂h(k)∂W(k) \frac{\partial L}{\partial W^{(k)}} = \frac{\partial L}{\partial h^{(k)}} \frac{\partial h^{(k)}}{\partial W^{(k)}} ∂W(k)∂L=∂h(k)∂L∂W(k)∂h(k)
下面给出一个简化的公式:
δ(k)=((W(k+1))Tδ(k+1))⊙σk′(a(k)) \delta^{(k)} = \big((W^{(k+1)})^T \delta^{(k+1)}\big)\odot \sigma_k'(a^{(k)}) δ(k)=((W(k+1))Tδ(k+1))⊙σk′(a(k))
- δ(k)\delta^{(k)}δ(k) 是第 kkk 层的误差项,
- a(k)=W(k)h(k−1)+b(k)a^{(k)}=W^{(k)}h^{(k-1)}+b^{(k)}a(k)=W(k)h(k−1)+b(k) 是线性输入,
- ⊙\odot⊙ 表示逐元素乘积。
最终梯度为:
∂L∂W(k)=δ(k)(h(k−1))T,∂L∂b(k)=δ(k) \frac{\partial L}{\partial W^{(k)}} = \delta^{(k)} (h^{(k-1)})^T,\qquad \frac{\partial L}{\partial b^{(k)}} = \delta^{(k)} ∂W(k)∂L=δ(k)(h(k−1))T,∂b(k)∂L=δ(k)
这套公式就是 反向传播 的数学核心。
9.3 梯度下降更新
与线性回归一样,使用负梯度更新所有层的参数:
W(k)←W(k)−η∂L∂W(k),b(k)←b(k)−η∂L∂b(k) W^{(k)} \leftarrow W^{(k)}-\eta\frac{\partial L}{\partial W^{(k)}},\quad b^{(k)} \leftarrow b^{(k)}-\eta\frac{\partial L}{\partial b^{(k)}} W(k)←W(k)−η∂W(k)∂L,b(k)←b(k)−η∂b(k)∂L
10. 训练的收敛与性能评估
训练完成后我们用 验证集 或 测试集 来评估模型性能。
常见指标有:
指标 | 公式 | 用途 |
---|---|---|
MSE | 1m∑i(y^(i)−y(i))2\frac{1}{m}\sum_i(\hat{y}^{(i)}-y^{(i)})^2m1∑i(y^(i)−y(i))2 | 回归任务 |
MAE | 1m∑i∣y^(i)−y(i)∣\frac{1}{m}\sum_i |\hat{y}^{(i)}-y^{(i)} |m1∑i∣y^(i)−y(i)∣ | 对异常值更鲁棒 |
交叉熵 | −1m∑i[ylogp^+(1−y)log(1−p^)]-\frac{1}{m}\sum_i[y\log\hat{p}+(1-y)\log(1-\hat{p})]−m1∑i[ylogp^+(1−y)log(1−p^)] | 分类任务 |
准确率 | 预测正确数m\frac{\text{预测正确数}}{m}m预测正确数 | 分类评估 |
如果验证集指标在训练后不再提升,通常会提前停止(Early Stopping),这是一种基于数学的停止准则。
11. 学习率与自适应学习率
学习率 η\etaη 是训练中的核心超参数。
- 小 η\etaη:梯度下降步长小,训练慢但更稳。
- 大 η\etaη:步长大,可能越过最优点。
自适应学习率优化器如 Adam 在每个参数上维护自己的学习率:
mt=β1mt−1+(1−β1)gt,vt=β2vt−1+(1−β2)gt2 m_t = \beta_1 m_{t-1} + (1-\beta_1)g_t,\quad v_t = \beta_2 v_{t-1} + (1-\beta_2)g_t^2 mt=β1mt−1+(1−β1)gt,vt=β2vt−1+(1−β2)gt2
- gt=∇Lg_t=\nabla Lgt=∇L 是当前梯度。
- m^t=mt1−β1t\hat{m}_t=\frac{m_t}{1-\beta_1^t}m^t=1−β1tmt,v^t=vt1−β2t\hat{v}_t=\frac{v_t}{1-\beta_2^t}v^t=1−β2tvt。
- 更新公式
θt+1=θt−ηm^tv^t+ϵ \theta_{t+1} = \theta_t - \eta \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} θt+1=θt−ηv^t +ϵm^t
这过程:
- 用指数衰减的移动平均代替直接梯度,
- 通过分母平滑避免梯度震荡。
12. 训练的收敛性与理论证明
在 凸 损失下,梯度下降的收敛速度可以用梯度 Lipschitz 常数 LLL 估算:
LLip=max eigenvalue(XTX) L_{\text{Lip}} = \max \text{ eigenvalue}(X^TX) LLip=max eigenvalue(XTX)
如果 η<2LLip\eta < \frac{2}{L_{\text{Lip}}}η<LLip2,梯度下降收敛至全局最优。
在 非凸 情况下,理论上只能证明 局部收敛 或 概率收敛(如 SGD 的随机梯度噪声理论)。
但在实践中,深度网络往往能够得到相对好的解,因为:
- 参数空间维度大,局部最小点在表面上"接近",
- 训练过程的噪声(SGD)能让网络跳出某些局部陷阱。
13. 训练停止准则的数学阈值
我们需要明确什么时候"停止"。
标准 | 表达式 | 说明 |
---|---|---|
迭代次数 | t=Tt=Tt=T | 预设最大迭代数 |
损失阈值 | L<ϵL<\epsilonL<ϵ | 损失足够小 |
损失变化 | ∣Lt−Lt−1∣<δ|L_{t}-L_{t-1}|<\delta∣Lt−Lt−1∣<δ | 损失变化趋近 0 |
验证集不提升 | Vt−Vt−1<γV_{t}-V_{t-1} < \gammaVt−Vt−1<γ | 监控验证集性能 |
这些都是数值阈值,完全可以在代码中用数学公式实现。
14. 小结
在机器学习中,训练是一个数学优化问题:
- 模型 用函数 f(x;θ)f(x;\theta)f(x;θ) 表示,
- 损失 用目标函数 ℓ(y^,y)\ell(\hat{y},y)ℓ(y^,y) 计算,
- 梯度 用偏导数 ∇θL\nabla_{\theta} L∇θL 给出,
- 参数更新 用微积分的"负梯度步进"公式实现,
- 正则化 与 特征归一化 等技术保证曲面更好。
所有这些步骤都可以在数学推导里得到完整的闭式或迭代式表达,如果把整个训练流程写成一连串的 公式与变量 ,并使用微积分 (偏导、链式法则)与线性代数(矩阵运算、逆矩阵)来实现,就能得到一个完整的训练过程。