CS231n Lecture 2 笔记:基于线性分类器的图像分类
图像分类任务Image Classification图像分类是计算机视觉的核心任务其核心逻辑非常直观给定一张图像从预先定义好的标签集合如狗、猫、卡车、飞机等中输出该图像对应的类别标签这是计算机视觉领域最基础、最经典的任务后续的目标检测、语义分割、实例分割、图像生成等高级任务都是以图像分类为基础发展而来掌握图像分类是进入计算机视觉领域的第一步。计算机视觉的核心难题 ——语义鸿沟Semantic Gap人类看到图像能直接理解其语义比如一眼认出是猫但计算机无法直接理解语义只能将图像看作0 到 255 之间的整数张量比如一张 800×600×3 的图像代表宽度 800、高度 600、RGB 三个通道的像素数值矩阵像素数值只是数字和语义没有直接关联这也是无法通过手动编写规则完成图像分类的根本原因。图像分类的第一个挑战视角变化Viewpoint variation当相机拍摄角度发生移动、旋转或倾斜时图像的所有像素值都会发生巨大改变但图像对应的语义类别并不会变化比如猫换个角度还是猫计算机仅通过像素数值无法识别这种视角变化下的同一物体这是图像分类需要解决的基础难题。图像分类的第二个挑战光照变化Illumination不同的光线条件强光、弱光、逆光、彩色光等会让同一物体的像素值产生极大差异比如白猫在强光下像素偏亮在暗光下像素偏暗但类别依然是猫计算机很难仅通过像素区分 “光照变化” 和 “类别变化”进一步增加了分类难度。图像分类的第三个挑战背景杂乱Background Clutter当目标物体被复杂的环境背景包围时目标的像素特征会被背景干扰计算机难以从杂乱的背景中提取出目标物体的有效特征比如猫躲在花丛、家具中时像素上和背景高度融合很容易被误分类这也是实际场景中图像分类的常见问题。图像分类的第四个挑战遮挡Occlusion目标物体被其他物体部分遮挡时只能看到局部像素但人类依然能识别类别计算机却因为缺失关键像素特征很难判断物体类别比如猫被杯子、书本挡住一半仅靠剩余像素很难精准分类这考验模型的特征提取与推理能力。图像分类的第五个挑战形变Deformation现实中的物体大多是非刚性的会发生姿态、形状的改变比如猫蜷缩、伸展、跳跃形变会导致像素分布完全不同但语义类别不变计算机需要学习到物体的本质特征而非固定的像素排列才能应对这种变化。图像分类的第六个挑战类内差异Intraclass variation同一类别下的不同物体像素特征可能差异极大比如不同品种、颜色、大小的猫像素分布完全不同但都属于 “猫” 这个类别模型需要学习类别内的共性特征忽略无关的个体差异才能实现精准分类。图像分类的第七个挑战上下文Context物体的语义会受到场景上下文的影响比如老虎出现在森林中是合理的出现在街道则不符合常识部分图像需要结合上下文才能判断类别单纯依赖局部像素会出现误判这是图像分类中更高级的语义理解难题。现代计算机视觉算法的基础 ——ImageNet 数据集ImageNet 是超大规模标注图像数据集包含数百万张图像和数千个类别推动了深度学习在计算机视觉领域的突破现代图像分类算法都是基于 ImageNet 等大规模数据训练而来彻底解决了传统方法无法应对的各类挑战。上图伪代码展示图像分类器的核心逻辑定义一个 classify_image 函数输入图像返回类别标签但和排序数字等简单算法不同图像分类没有明显的硬编码规则无法通过手动写 if-else、边缘检测等规则实现猫、狗等复杂类别的识别这也是必须使用机器学习 / 深度学习的核心原因。计算机视觉的传统尝试早期研究试图手动设计特征提取规则比如 Canny 算子检测边缘、提取角点特征再基于这些规则分类但现实中物体的边缘、角点会随视角、光照、形变变化手动规则无法覆盖所有情况最终证明传统人工设计特征的方法无法解决复杂图像分类问题。机器学习数据驱动方法这是解决图像分类的正确路径分为三个核心步骤第一步收集带标签的图像数据集图像 对应类别第二步用机器学习算法训练分类器让模型自动学习特征第三步用新图像测试分类器性能。标准代码范式train 函数输入图像和标签训练模型predict 函数用模型预测新图像的标签CIFAR10 等数据集就是典型的训练测试样本。最近邻分类器Nearest Neighbor Classifier最近邻分类器的核心逻辑训练阶段只需要记住所有训练数据和标签不需要进行任何计算预测阶段对于每一张测试图像找到训练集中和它最相似的图像直接复制该图像的标签作为预测结果本质是 “记忆 匹配” 的简单逻辑。最近邻分类器的工作流程左侧是带标签的训练数据鹿、鸟、飞机、猫、汽车等右侧是待预测的查询图像通过距离度量Distance Metric计算查询图像与所有训练图像的相似度找到最相似的训练图像输出其标签距离度量是判断相似度的核心依据。最近邻分类器的核心 ——L1 距离曼哈顿距离公式为 d₁(I₁,I₂)Σ|I₁ᵖ−I₂ᵖ|即对两张图像的每个像素做差值取绝对值再将所有像素的结果求和得到的数值就是两张图像的 L1 距离距离越小代表图像越相似这是最基础的像素级距离计算方式。上图给出了像素计算的示例直观展示距离计算过程。最近邻分类器的 NumPy 代码实现代码分为初始化、训练、预测三个部分初始化函数不做任何操作训练函数仅存储训练数据 Xtr 和标签 ytr预测函数遍历所有测试图像用 L1 距离计算测试图像与所有训练图像的距离找到距离最小的训练图像索引返回对应标签代码简洁直观完美体现最近邻 “记忆 匹配” 的核心。最近邻分类器的速度缺陷假设训练集有 N 个样本训练复杂度是 O (1)仅存储数据速度极快但预测复杂度是 O (N)每测一张图都要和 N 个训练图算距离这在实际应用中完全不可行因为工业界要求预测速度快、训练速度慢一点可以接受而最近邻预测速度随数据量增大急剧下降这是它的致命缺点。上图展示了 1 - 最近邻K1的分类效果示意图直观呈现最近邻分类器的决策边界决策边界呈现出不规则的锯齿状容易受到噪声样本的影响分类效果不够平滑为后续 K 近邻的改进做铺垫。如图介绍了K 近邻算法K-Nearest Neighbors, KNN它是最近邻的改进版本不再只看最近的 1 个样本而是选择距离最近的 K 个样本通过多数投票确定预测标签K 个样本中数量最多的类别就是结果页面展示了 K1、K3、K5 的决策边界对比K 越大决策边界越平滑过拟合风险越低。KNN 的两种核心距离度量L1 距离曼哈顿距离和L2 距离欧几里得距离L2 距离公式为 d₂(I₁,I₂)√[Σ(I₁ᵖ−I₂ᵖ)²]即像素差值平方和再开根号是图像处理中更常用的距离度量两种距离的选择会直接影响 KNN 的分类效果。用二维坐标示例对比 L1 和 L2 距离原点 O 到点 A、点 B 的 L1 距离相等L2 距离也相等同时解释两种距离的物理意义 ——L1 距离是沿网格线移动的距离像城市街区行走L2 距离是直线距离像乌鸦飞行直观展示两种距离的差异。再次对比 L1 和 L2 距离的决策边界同样是 K1 的情况下L1 距离的决策边界呈直角块状L2 距离的决策边界呈平滑曲线状距离度量的选择会改变模型的分类偏好L1 对坐标轴敏感L2 更适合无坐标轴偏好的图像数据。超参数Hyperparameters超参数Hyperparameters的概念K 值选多少用 L1 还是 L2 距离这些不是模型学习出来的参数而是人为提前设定的选择统称为超参数超参数没有通用最优解完全依赖具体任务和数据集必须通过实验测试才能找到最优值。第一种错误的超参数选择方法选择在训练集上表现最好的超参数。当 K1 时模型在训练集上的准确率一定是 100%每个训练样本的最近邻就是自己但这是过拟合模型完全记住了训练数据无法泛化到新数据在测试集上表现极差所以不能用训练集选超参数。第二种错误的超参数选择方法选择在测试集上表现最好的超参数这种方法属于 “数据泄露”相当于提前用测试集指导模型训练导致模型在测试集上的结果不真实无法反映模型在新数据上的泛化能力。正确的超参数选择方法将数据集划分为训练集train、验证集val、测试集test用训练集训练模型用验证集选择最优超参数最后用测试集评估模型最终性能验证集的作用是 “模拟新数据”保证超参数选择的公平性。进阶的超参数选择方法交叉验证Cross-Validation将数据集分成若干折如 5 折每次用一折作为验证集其余作为训练集重复多次后取平均结果这种方法适合小数据集但在深度学习中因为数据量大、训练成本高很少使用仅作为传统机器学习的常用方法。图像分类的经典数据集CIFAR10包含 10 个类别飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船、卡车5 万张训练图像1 万张测试图像所有图像都是 32×32 的彩色小图是入门图像分类、测试 KNN 和线性分类器的标准数据集由 Alex Krizhevsky 在 2009 年提出。CIFAR10 上 5 折交叉验证选择 K 值的结果图横轴是 K 值纵轴是分类准确率误差棒代表标准差从结果能看出 K≈7 时准确率最高直观证明交叉验证能有效找到最优超参数也说明超参数需要实验确定。基于像素距离的 KNN 绝对不会用于实际图像分类原因是像素距离不具备语义信息 —— 遮挡、平移 1 像素、染色的图像和原图的像素距离可能很大但语义完全一致像素距离无法反映图像的真实语义相似度这是 KNN 在图像领域的致命缺陷。总结图像分类的流程是用带标签的训练集学习在测试集预测KNN 通过 K 个最近邻的多数投票预测标签距离度量和 K 是核心超参数必须用验证集选择超参数测试集只能在最终评估时使用一次严禁提前参与训练或超参数选择。线性分类器Linear Classifier线性分类器的参数化思路输入是 32×32×3 的图像展平后是 3072 维的数值向量通过函数 f (x,W) 映射输出 10 个数值分别代表 10 个类别的得分。线性分类器的基础公式f(x,W)Wx即权重矩阵 W 乘以输入向量 x直接得到类别得分这是最简单的线性映射没有偏置项是理解线性分类的基础形式。完善的线性分类器公式加入偏置项 b最终公式为f(x,W)Wxb输入 x 是 3072×1 的向量权重 W 是 10×3072 的矩阵偏置 b 是 10×1 的向量矩阵乘法后加上偏置最终输出 10×1 的类别得分向量每个数值对应一个类别的置信度。偏置项 b 的作用是让分类面可以平移不被强制绑在原点上。没有 b所有分类超平面都必须穿过坐标原点很多数据根本分不对。线性分类器与神经网络的关系神经网络就是多层线性分类器叠加非线性激活函数线性分类器是单层神经网络多层线性分类器组合后就能解决线性不可分的问题是深度学习的基础组件。用极简示例讲解线性分类计算输入是 4 个像素的图像展平为一维向量输出 3 个类别猫、狗、船的得分通过权重矩阵 W 和偏置 b 的线性计算得到每个类别的分数分数最高的类别就是模型预测结果。从视觉视角解释线性分类器权重矩阵 W 的每一行都可以可视化成一个 “类别模板”比如飞机对应的权重行可视化后看起来像飞机的轮廓猫对应的权重行可视化后像猫的轮廓线性分类器本质是用模板匹配的方式计算得分。从几何视角解释线性分类器在高维像素空间中每个类别对应一个超平面线性分类器通过超平面将不同类别的样本分割开比如汽车分类器、飞机分类器、鹿分类器都是高维空间中的一个线性超平面这是线性分类的几何本质。而这也恰恰说明了偏置项 b 的作用是让分类面可以平移不被强制绑在原点上。没有 b所有分类超平面都必须穿过坐标原点很多数据根本分不对。线性分类器的局限性它只能分割线性可分的数据对于第一 / 三象限、环形分布、多模态分布等线性不可分的数据线性分类器完全无法正确分类这也是需要叠加多层网络和非线性激活的原因。训练线性分类器的两个核心步骤第一步定义损失函数量化模型对训练数据的预测误差损失越小模型预测越准第二步优化找到能最小化损失函数的参数 W 和 b这是所有参数化模型训练的通用逻辑。深度学习中多分类交叉熵损失的通用公式符号说明m一个 batch 里的样本总数比如 batch_size128就代表有 128 张图。n类别总数比如 CIFAR-10 有 10 个类别ImageNet 有 1000 个类别。yk(i)第i个样本的真实标签这里是one-hot 编码—— 比如第i张图是猫第 3 类那y(i)就是一个长度为 10 的向量只有第 3 个位置是 1其余全是 0。pk(i)模型对第i个样本预测的第k类概率也就是 Softmax 层的输出所有类别的概率和为 1。−m1对所有样本的损失取平均得到这个 batch 的平均误差方便我们做梯度下降优化。这个公式的字面意思是把 batch 里每一个样本、每一个类别的「真实标签 × 预测概率的对数」全部加起来取平均再取负就是我们要优化的交叉熵损失。一句话理解模型训练时我们只关心 “真实类别的预测概率”它越大损失就越小如果真实类别的概率趋近于 1损失就趋近于 0。Softmax 分类器Softmax 分类器也叫多项式逻辑回归是线性分类器中最常用的多分类版本核心作用是将线性输出的原始分数转化为 0 到 1 之间、总和为 1 的概率值方便直观理解分类置信度。Softmax 函数的核心公式sf (xᵢ;W) 是原始得分P (Yk|Xxᵢ)eˢᵏ / Σⱼeˢʲ通过指数函数将得分转为非负数再归一化保证概率和为 1完美符合概率的数学定义。Softmax 的损失函数Lᵢ -logP (Yyᵢ|Xxᵢ)即对正确类别的概率取负对数损失越小代表正确类别的概率越大模型预测越准这种损失也叫交叉熵损失是多分类任务的标准损失。将 Softmax 公式与损失函数结合得到完整的损失表达式Lᵢ -log (eˢʸⁱ / Σⱼeˢʲ)模型训练的目标就是最小化这个损失从而最大化正确类别的概率。模型越不准损失越大模型越准损失越小。我们的目标让损失降到最低。继续用刚才的例子真实标签是猫模型给猫的概率只有13%0.13损失Li−log(0.13)≈2.0如果模型预测很准猫概率 99%Li−log(0.99)≈0.01问题 1Softmax 损失的最小值 / 最大值是多少最小值0 模型 100% 正确-log (1)0最大值无穷大模型完全错误概率趋近 0-log (0)→∞问题 2模型刚初始化时损失大约是多少刚初始化时所有分数差不多概率≈1 / 类别数损失 -log(1/C) log(C)比如 CIFAR-1010 类初始化损失 ≈ log (10) ≈ 2.3。总结交叉熵损失是分类任务最常用的损失函数。它衡量模型预测概率与真实标签的差距。公式损失 -log (真实类别的概率)。目标让损失尽可能接近 0。