写在前面

本文梳理机器学习与深度学习中的基础概念,包括激活函数、梯度下降、神经网络结构以及反向传播。理解这些内容后,可以进一步学习常见网络模型及其训练过程。

机器学习的三大任务

  • Regression(回归):根据历史数据预测一个数值。

  • Classification(分类):从有限个类别中选出最匹配的一个或多个。

  • Structured Learning(结构化学习):输入和输出都是有结构的对象,例如翻译任务的输入和输出都是一段文字。

激活函数

作用:引入了非线性能力,让神经网络可以逼近任意复杂的函数。

如果没有激活函数,无论神经网络有多少层,都只能解决“线性”问题。

激活函数 数学公式 & 形状 核心特点 主要用途
Sigmoid 输出范围 (0, 1) 优点:平滑,输出可以解释为“概率”。 致命缺点梯度消失(两端的导数几乎为0,导致深层网络无法更新)。 由于它的“概率”特性,主要用于二分类的输出层。隐藏层几乎不再使用。
Tanh 输出范围 (-1, 1) 优点:均值为0,收敛速度通常比Sigmoid快。 缺点:依然存在梯度消失问题。 在某些传统的RNN(循环神经网络)中偶尔见到,但现在已不太常用。
ReLU 输出范围 [0, +∞) 优点计算极快(就是一个取最大值);能有效缓解梯度消失问题,是当前最流行的选择。 缺点:可能会导致“神经元死亡”(输入为负时,梯度为0,该神经元永远不会被激活)。 绝大多数深度网络的隐藏层(CNN、ResNet、Transformer的FFN层等)的首选默认激活函数。

模型输出 = 特征 + 权重 + 偏置

特征:输入给模型的数据。它可以是原始数据,也可以是上一层神经网络处理后的输出。

权重:由训练得出,权重是连接输入与输出的参数,它决定了每个特征对最终输出的影响程度

偏置:由训练得出,偏置是一个与输入无关的偏移量,它让模型能够上下平移决策边界。

梯度下降(Gradient Descent)

符号 含义 作用
$w^0$ 当前权重 现在的位置
$w^1$ 更新后的权重 下一步的位置
$\eta$(红色) 学习率(Learning Rate) 控制步长大小
$\frac{\partial L}{\partial w}$ 损失对权重的梯度 指示最陡上升方向
减号 梯度反方向 因为我们要最小化损失

从公式中不难得出,在学习率不变的情况下,切线越接近垂直,梯度下降的速率越快,更快收敛。当下降到极小值点时,完成收敛。

二维平面下的梯度下降

在 (w,b) 参数空间中,通过对损失函数L求偏导,从而沿着损失函数的等高线山坡一步步走向谷底,最终找到使损失最小的最优参数。并且可以得出下降方向(通过-指向下降方向)是与等高线垂直的,这样能够以最快速度到达谷底。

其中高度为损失函数得出的值,曲面的最低点就是拟合最好的权重和偏置取值。

复杂函数 = 常数 + ∑ 多个简单函数的叠加

函数越多,拟合成的曲线与原函数更接近。

神经网络

将多个激活函数组合成网:多个输入 x1,x2,x3 ,3个 Sigmoid函数拟合,每个神经元连接所有输入。

符号 颜色 含义
$x_1, x_2, x_3$ 🟡 黄色 输入特征
$w_{ij}$ 🔵 蓝色 权重(第 $i$ 个神经元对第 $j$ 个输入的权重)
$b_1, b_2, b_3$ 🟢 绿色 隐藏层偏置(每个神经元一个)
$r_1, r_2, r_3$ 加权求和结果(线性变换)
$\sigma$(S型曲线) 🔵 蓝色圆 Sigmoid 激活函数
$a_1, a_2, a_3$ 🟡 黄色 隐藏层输出(激活后的值)
$c_1, c_2, c_3$ 🔴 红色 输出层权重(连接隐藏层到输出)
$b$(底部) 🟢 绿色 输出层偏置
$y$ 🟡 黄色 最终输出

我们可以通过矩阵运算简化表达式:

Batch、Epoch 与 Update

Batch(批次):由于数据量太大,一次性处理所有样本计算开销过高,所以将数据分成多个小批次处理。

Epoch(轮次):1 Epoch = 所有训练数据都被模型看过一次

Update(参数更新):每处理完一个 batch,计算一次损失,更新一次参数。这里有1000次Update。Update 次数 = Batch 数量 × Epoch 数

为什么需要多层神经元

单层 多层
需要指数级神经元才能表示复杂函数 每层在前层基础上学习,逐层抽象
只能学简单模式 底层学边缘→中层学纹理→高层学物体

例子:识别”猫”

  • 第1层:检测边缘、颜色
  • 第2层:组合边缘成耳朵、眼睛
  • 第3层:组合成完整猫头

→ 深层用更少参数完成同样任务,效率更高。

补充概念

机器学习 = 定义带参数的模型(Step 1)+ 用数据衡量模型好坏(Step 2)+ 自动优化找到最优参数(Step 3),循环迭代直到收敛。

hyperparameters:不是由机器学习而成而是由我们自主选择的参数,如把数据量分为多少组。

model bias:模型预测的值与真实值之间的差距

过拟合(Overfitting):模型太复杂 → 记住了训练数据的细节和噪声 → 泛化能力差

深度学习的基本概念

核心要点

“深度”的含义:隐藏层数量多(hidden layer>=3),通过多层隐藏层,实现不同特征的提取。

在深度学习中,你不需要告诉网络”什么是重要特征”,网络自己会通过多层隐藏层,从原始数据中逐层抽象出有用的特征表示。即原始数据进去,自动特征出来,分类结果输出——端到端学习。

深度学习框架可以分为输入层、隐藏层、输出层:

输入层

是用于输入原始数据,输入的数据按照一定的顺序排列。例如,如果是图像,就需要依次按第一个像素点、第二个像素点输入;如果你是预测房价的话,你就要依次输入房子面积、所在城市区域、地铁以及楼层等数据,并且要按照顺序输入,不能错位。

输入层节点数 = 数据维度。例如:

  • 房价预测(面积、楼层、房龄、距地铁)→ 4个节点
  • 16×16 手写数字图片 → 256个节点(每个节点对应一个像素)
  • 28×28 图片 → 784个节点

隐藏层

是”自动特征提取器”,用于提取不同的特征,例如识别狗的图片,浅层隐藏层学到边缘和纹理,中层学到耳朵、鼻子、眼睛等部件,深层隐藏层学到完整的狗脸轮廓。

输出层

根据隐藏层的输出进行判断,可以根据任务分为以下类型。

任务类型 输出层设计 例子
多分类 多个神经元 + Softmax 手写数字 0~9(10个输出)
二分类 1个神经元 + Sigmoid 是猫/不是猫(1个输出)
回归 1个神经元(无激活) 预测房价(输出连续数值)

例如,一张16×16的图像,上面标着数字0——9,那么它的输入是一张16×16=256的输入,它的输出是0~9的输出,它输入与输出是不相等的,但是我们可以通过输入层、隐藏层、输出层实现对数字的辨识。

输入和输出都可以抽象化为向量,方便显卡进行运算。

场景 说明
输入层(原始数据) 像素值是 0~255 的灰度值,房价是连续数值
输出层(One-hot标签) 数字”3”的标签 → [0,0,0,1,0,0,0,0,0,0]
输出层(Softmax预测) [0.1, 0.05, 0.05, 0.6, ...],总和为1

反向传播(Backpropagation)

我们知道,要实现梯度下降,需要计算相应的偏导数。通过高等数学的学习,我们可以知道,偏导数可以通过链式法则拆分为多个偏导数,而我们的目的就是通过拆分计算出值。

对激活函数的前面和后面分开进行处理,可以分为两个部分,Forward pass 从前向后处理,计算出最后的损失; backward pass 在计算出损失 C 后,再向前传播:

  • Forward Pass:输入 → 网络 → 得到预测输出 → 算出损失 C
    • 最终预测结果和损失 C
    • 每一层的”局部梯度”(存在内存里,后面要用)
  • Backward Pass:从损失 C 出发,往回传梯度
    • 计算每一层的 “上游梯度” ∂C/∂z

即每个参数的最终梯度 = 自己这层的局部梯度 × 从后面传回来的全局梯度。

Forward Pass

下图所示是前向传播,通过输入层输入的原始数据计算相应的偏导数。

通过推导,我们可以得知在激活函数前的参数 Z 对 W1权重 和 W2 权重的偏导数就是输入的数据 X1、X2。即我们解决了最终梯度的前半部分偏导数Z对权重W的偏导。

前向传播例子如下图:

Backward Pass

接下来我们需要解决C对Z的偏导。由于损失C依赖于输出节点的值,因此我们需要从后向前传播计算。一个神经元的输出如果分叉到多个下游,反向传播时各条路径的梯度会”汇聚相加”,然后统一乘以激活函数的导数,继续往回传。

例如下图,W3和W4所处的两个神经元节点都是前一个节点的下游,因此我们在计算反向传播时,需要将两个下游的梯度相加,再乘以激活函数的导数,得出 C 对 Z 的偏导。

例如,当前神经元节点连接的是输出层,而我们知道损失函数 C 与输出层的各个参数直接相关,因此我们能很方便地得出输出层的每一个节点与损失函数的偏导数值,从而再根据 backward pass 计算出上一个节点 C 对 Z 的偏导数。

当前如果神经元节点连接的是下一层隐藏层而非输出层,那么该节点的损失 Cz 的偏导数无法直接求得——因为 C 与该节点之间还隔着若干层网络。我们必须先计算输出层的梯度,再逐层反向接力传递,才能最终得到该节点的 ∂zC 。因此,直接正向计算某个隐藏层的 ∂z/∂C 是十分困难的。

正因如此,我们将计算拆分为两部分:先通过 Forward Pass 从前向后计算局部梯度 ∂w/∂z 并保存中间结果;再通过 Backward Pass 从损失 C 出发,将梯度从后向前逐层传播,计算 ∂z/C 。两者通过链式法则相乘,即可高效得到 ∂w/C ,从而完成梯度下降。

总结

深度学习通过多层神经网络自动提取特征,并利用前向传播计算预测与损失,再通过反向传播和梯度下降更新权重与偏置。激活函数为网络引入非线性能力,而 Batch、Epoch 和学习率等超参数共同影响模型的训练过程。