Parametric Approach
我们将图像(例如,一个
32x32x3
的像素矩阵)输入一个数学函数,这个函数由一组可学习的参数(或称为权重)W
控制。函数的目标是输出每个类别的得分,得分最高的类别即为模型的预测结果 。Linear Classifier
最简单的参数化函数就是线性函数。线性分类器通过一个简单的线性映射将输入图像的像素值转换为类别得分 。
其数学表达式为:

- x:输入图像的所有像素,被展平成一个单一的列向量(例如,
3072x1
) 。
- W:权重矩阵(例如,
10x3072
,其中10是类别数) 。
W
是模型需要学习的核心参数。- b:偏置向量(例如,
10x1
),允许决策边界在空间中平移,增加模型的灵活性 。
- 输出:一个包含10个类别得分的向量 。
Interpreting a Linear Classifier
Algebraic Viewpoint
从代数的角度看,线性分类器就是一个简单的矩阵乘法和向量加法 。输入图像的每个像素值都根据权重矩阵
W
进行加权求和,最后加上偏置b
,得到每个类别的最终得分 。
Visual Viewpoint
我们可以将权重矩阵
W
的每一行都“重塑”成一张与输入图像同样大小的图片。这样,每一行就构成了一个对应类别的“模板”(template) 。分类过程可以看作是模板匹配:模型将输入图像与这10个模板进行逐一比对(通过点积运算),匹配度最高的模板所对应的类别就是预测结果。
然而,这种方法的局限性在于,每个类别只有一个模板,它难以捕捉到同一类别物体的多种形态。例如,一个“马”的模板可能是数据集中所有马的平均样子,可能会出现一个有两个头的模糊图像,因为它试图同时代表朝左和朝右的马 。

Geometric Viewpoint
从几何的角度看,输入图像的
3072
个像素值可以被视为一个3072
维空间中的一个点。线性分类器的公式 在这个高维空间中为每个类别都定义了一个超平面(hyperplane) 。这个空间被这些超平面分割成不同的决策区域 。当一个新的图像点落入某个区域时,模型就将其判定为该区域对应的类别。因此,线性分类器只能创建线性的决策边界。

Loss Function
我们已经定义了评分函数,但如何判断一组权重
W
是好是坏呢?这就需要损失函数。损失函数用于量化模型预测的准确性:- 低损失 = 模型表现好
- 高损失 = 模型表现差
对于整个数据集,总损失是所有单个样本损失的平均值:
Multiclass SVM Loss / Hinge Loss
SVM损失的核心思想是:正确类别的得分应该比所有其他错误类别的得分高出一个安全的边界值(margin,通常设为1)。
对于第
i
个样本,其损失函数定义如下 :- 是第
j
个(错误)类别的得分。
- 是正确类别的得分。

如果正确类别的得分已经比某个错误类别的得分高出1以上,那么该错误类别产生的损失就为0。否则,就会产生一个正的损失值。
Example

特点:SVM损失是一个“知足”的函数。一旦满足了边界条件(例如,正确类别的得分比其他类别高出1),它就不再关心得分的具体数值,损失即为0,并且对得分的微小变化不再敏感 。
Cross-Entropy Loss / Softmax Classifier
交叉熵损失则从概率的角度来评估模型。它首先通过Softmax函数将原始的类别得分转换成一个概率分布 :
Softmax函数能将任意实数得分转换为一个总和为1、每个值都在0到1之间的概率分布。然后,损失函数被定义为
正确类别的负对数概率 :
目标:最大化正确类别的概率,等价于最小化它的负对数概率。特点:交叉熵损失是一个“追求完美”的函数。它永远不会对结果完全满意。即使正确类别的概率已经很高(如0.99),它仍然会努力将其推向1,这意味着它会持续调整权重,让正确得分更高,错误得分更低 。


Regularization
一个模型在训练数据上表现完美,但在未见过的测试数据上表现很差,这种现象称为过拟合(Overfitting)。这通常是因为模型过于复杂,学到了训练数据中的噪声和偶然特征。
正则化是一种用于防止过拟合、提升模型泛化能力的技术。它通过在损失函数中增加一个惩罚项来实现,这个惩罚项会对模型的复杂度进行限制。
- 是正则化惩罚项。
- 是一个超参数,用于控制正则化的强度。
L2 正则化 (Weight Decay)
L2正则化是最常见的正则化方法。它的惩罚项是所有权重
W
的平方和:L2正则化倾向于让权重的值更小、更分散。它会惩罚大的权重值,鼓励模型找到一个更平滑、更简单的决策边界,从而避免过分依赖少数几个输入特征。
L1 正则化 (Lasso)
L1正则化的惩罚项是所有权重
W
的绝对值之和:L1正则化的一个重要特性是它能产生稀疏(sparse)的权重矩阵,即许多权重值会变为精确的零。这相当于在模型训练过程中自动进行了特征选择,因为它会完全忽略掉那些不重要的输入特征。
Optimization
优化是寻找能使损失函数最小化的权重 W 的过程。
计算梯度
为了最小化损失,优化算法通常会“沿着斜坡”下降。梯度指向函数最陡峭的上升方向,因此梯度的反方向就是最陡峭的下降方向。
计算梯度主要有两种方法:
- 数值梯度 (Numeric Gradient):这是一种近似方法,计算慢,但易于编写。其计算复杂度为O(维度数量)。
- 解析梯度 (Analytic Gradient):这是精确的、快速的方法,但实现起来容易出错。
在实践中,我们总是使用解析梯度,并通过数值梯度来进行梯度检查(gradient check)以验证其实现的正确性。
梯度下降算法
梯度下降 (Gradient Descent)
该方法通过迭代地朝着负梯度方向更新权重。
代码实现:
当样本数量N很大时,计算整个批次的梯度成本非常高。
随机梯度下降 (Stochastic Gradient Descent, SGD)
为了解决批量梯度下降的高成本问题,SGD通过使用一小部分随机抽样的数据(称为“minibatch”)来近似计算损失和梯度。常见的minibatch大小为32, 64, 或 128。
代码实现:
SGD面临一些挑战:
- 如果损失函数在不同方向上的变化率差异很大,SGD会在平缓的方向上进展缓慢,同时在陡峭的方向上抖动。
- SGD可能会卡在梯度为零的局部最小值或鞍点。
- 来自minibatch的梯度可能带有噪声。
SGD + Momentum
该方法引入了一个“速度”项
v
,它累积了过去梯度的移动平均值。这有助于在相关方向上加速SGD并抑制振荡。参数rho
充当“摩擦力”,通常设为0.9或0.99。代码实现:
两种方法:

Nesterov Momentum
这是动量法的一个变体。它不是在当前位置计算梯度,而是在由当前速度决定的“前瞻”位置 计算梯度。这种“预见性”的步骤通常能提升性能。
代码实现:
AdaGrad
AdaGrad是一种自适应学习率方法,它根据每个维度上梯度的历史平方和来调整学习率。这会减缓在梯度大的方向上的更新,并加速在梯度小的方向上的更新。
代码实现:
RMSProp
RMSProp被称为“Leaky AdaGrad”,它使用梯度平方的指数移动平均来代替AdaGrad中的累加和。这可以防止学习率单调递减至过小。
代码实现:
Adam
Adam可以看作是RMSProp和动量法的结合。它同时追踪梯度的一阶矩(均值,类似动量)和二阶矩(未中心的方差,类似RMSProp)。Adam还包含一个偏差修正步骤,以解决力矩估计在初始阶段偏向于零的问题。
代码实现:
对于很多模型,使用
beta1=0.9
,beta2=0.999
,学习率为 1e-3
或 5e-4
的Adam是一个很好的起点。权重衰减 vs. L2 正则化
对于Adam等自适应优化器,L2正则化和权重衰减(Weight Decay)并不等价。AdamW是Adam的一个变体,它使用解耦的权重衰减,通常能带来更好的性能。AdamW被推荐作为新问题的“默认”优化器。

二阶优化
梯度下降等方法是一阶优化技术,因为它们只使用一阶导数(梯度)。二阶优化方法还会使用二阶导数(Hessian矩阵)来构建损失函数的二次近似,从而可能更直接地跳到最小值点。
牛顿法的参数更新公式为:
然而,对于大型模型来说,计算Hessian矩阵是不现实的,因为它有 O(N2) 个元素,求逆需要 O(N3) 的时间。像L-BFGS这样的拟牛顿方法会近似计算Hessian的逆,但它们在全批量更新模式下效果最好,不适用于深度学习中常见的随机小批量设置。
实践建议
- 在很多情况下,Adam是一个很好的默认选择。
- SGD+Momentum有时可能比Adam表现更好,但可能需要更多的调参工作。
- 如果可以进行全批量更新,可以尝试L-BFGS。