CS230课程讲座-02-人工智能项目决策与核心学习方法

34 阅读43分钟

往期文章链接🔗:

第一篇:

一文带你掌握深度学习,成为AI时代的构建者

大家好,我是用AI技术赋能超级个体的实践者,目前感兴趣的领域是LLM中的Agent智能体的开发,本文是基于CS230的课堂笔记整理的第四篇,它是一门将深度学习理论与实践紧密结合的“硬核”课程,是进入AI领域的一张重要“名片”, 废话不多说,请看正文内容

一、开篇介绍

我是Kian Caton-Fourouche,与Andrew共同创建并讲授CS230这门课程。本学期我将负责约一半的线下课程。在斯坦福大学之外,我投身产业界,创办了Workera公司,该公司利用人工智能技术评估技能水平。鉴于CS230历届学生中不乏创办人工智能初创企业的人才,我通常会在课程中融入大量产业界的实例。因此,大家可以期待这些课堂讲座不仅包含在线视频中已涵盖的学术内容,还会带来产业界的专属见解。今年我们将共同探讨的主题包括人工智能项目中的决策制定(这也是我们今天的重点)。我希望大家在今天的讲座结束后,既能感受到学习的乐趣,体验到互动的氛围,又能掌握更有效的人工智能项目决策方法——通过了解深度学习研究人员、工程师和科学家在产业界解决问题时的决策思路来实现这一目标。

image.png

本学期后续的线下课程还将涵盖其他主题:对抗性攻击与防御(今天若时间允许可能会涉及部分内容)、深度强化学习(目前在市场上非常热门,极具学习价值),以及随着课程深入,当大家掌握了神经网络的相关知识后,我们还将探讨检索增强生成智能体Agent多智能体系统等实用性极强的内容。

今天的讲座将分为三个部分,若时间充裕可能会扩展为四个部分:

首先简要回顾本周在线课程中关于神经元网络层深度神经网络的内容;

接着深入探讨一系列监督学习项目,包括昼夜图像分类、触发词检测(这是大家在课程结束时需要独立完成的项目)以及人脸验证(我们还将了解人脸验证算法的多种变体);

第三部分聚焦自监督学习和弱监督学习(即便现在不了解这些术语也无需担心,我们会一同学习),其中会重点讨论嵌入技术——嵌入是当今众多人工智能系统的核心连接纽带,掌握它至关重要;

最后,若时间允许,我们将探讨对抗性攻击与防御,随着越来越多的人工智能系统投入实际应用,了解如何防御这些系统以及通过攻击手段反推防御方法都变得尤为重要。

讲座过程中欢迎大家随时提问,我们希望营造尽可能轻松的对话式氛围。

二、本周内容回顾:传统监督学习基础

2.1 监督学习的核心逻辑

image.png 本周我们学习的核心内容是传统监督学习中人工智能从数据中学习的基本方式。可以将其理解为:给定一个输入(例如这张困惑猫咪的小图片)和一个输出(在这个案例中,输出是0到1之间的数值,1表示图片中有猫,0表示没有猫)。

我通常会从两个方面来描述模型:

一是架构,它本质上是模型的蓝图或骨架;

二是参数。模型的参数数量可多可少,像OpenAI、DeepMind等机构研发的模型,参数数量甚至可达数十亿。

当人工智能模型部署到实际环境中(例如ChatGPT的运行),本质上是云端存储着两个文件:一个描述模型架构,另一个描述该架构对应的参数。通过调用这两个文件,就能完成推理过程并获得输出结果。这背后的原理虽然远比这复杂,但神经网络的核心组成部分确实是架构和经过训练的参数。

2.2 模型的学习过程:梯度下降优化

模型的学习通过梯度下降优化实现:首先将猫咪图片输入未经过训练的模型,此时模型的预测结果很可能是错误的(例如预测图片中没有猫,输出为0)。接着,我们使用损失函数将预测结果与真实标签(图片中确实有猫)进行对比。由于两者差距较大,损失函数会产生一个惩罚值。为了向参数反馈调整方向,我们通过梯度下降更新参数——简单来说,就是告诉参数“应该稍微向右调整”或“应该稍微向左调整”,直到预测值与真实标签足够接近。我们会使用批量数据(数百万张猫咪图片和其他图片)重复这一过程,不断向模型反馈调整信息,直到参数校准完成,模型能够准确识别图片中的猫。这些内容大家在在线视频中已经学过,关于这个学习过程,有人有疑问吗?没有的话,我们继续往下讲。

2.3 监督学习的可变量调整

在这个基础框架中,有多个部分可以灵活调整,这也是我们课程中会深入探讨的内容:

image.png

  1. 输入数据类型:输入不一定是图像,还可以是文本(如与ChatGPT对话时的输入)、音频、视频、结构化数据(如电子表格和数值)等。我们会在课程中看到多种输入类型的案例,以及它们对模型架构的影响。
  2. 输出结果类型:输出也不一定是0和1这样的分类结果。例如,若要预测猫咪的年龄,这就属于回归任务非分类任务。后续课程中我们还会学习生成任务——事实上,第四讲将重点介绍扩散模型、生成对抗网络等,在这些模型中,输出通常比输入更大(例如输入一张低分辨率的猫咪图片,输出一张高分辨率的同款猫咪图片),这种“输出大于输入”的情况可能会让人觉得有些反直觉。
  3. 模型架构:大家目前正在学习的是基础的多层感知机(也称为全连接神经网络)。到课程结束时,大家将熟悉多种架构,包括循环神经网络(RNN)卷积神经网络(CNN) 、Transformer模型等。这些架构本质上都基于大家现在学习的基础神经网络,只是在堆叠方式上有所不同。
  4. 损失函数:损失函数是今天课程以及整个课程的重点内容。它负责向模型反馈“预测正确与否”以及“该如何调整”,设计优秀的损失函数是一门艺术。优秀的深度学习研究人员在设计损失函数时往往极具创造力。例如,YOLO(You Only Look Once,而非“You Only Live Once”)算法的损失函数初看非常复杂,但这种设计是有其合理性的。课程结束时,大家将对如何设计优秀的损失函数形成更清晰的直觉。
  5. 其他可调部分:还包括神经网络中的激活函数、梯度下降循环中使用的优化器,以及训练算法时涉及的超参数等。

2.4 神经元的工作原理

理解神经元的最简单方式是结合经典的逻辑回归算法:以猫咪图片为例,在计算机科学中,机器通过三个通道(RGB,对应红、绿、蓝三种颜色)读取图像。我们将这些颜色数值整理成一个向量,输入到神经元中。神经元包含两个部分:线性部分(W^T X + B,其中W是权重,B是偏置)和激活函数(本案例中使用Sigmoid函数,它能将任意数值映射到0到1之间,因此输出结果可以表示概率)。在这个例子中,输出概率为0.73,高于0.5,说明模型认为图片中有猫(1表示有猫,0表示没有猫)。

2.5 从二分类到多分类的调整

我们先来看一个问题,帮助大家快速进入状态:如何将这个“检测图片中是否有猫”的二分类算法,修改为能够检测多种动物(如猫、狗、长颈鹿)的算法?需要对神经网络做哪些调整?

没错,大家提到的核心调整是修改输出层,使其数量与要检测的动物种类相匹配。还有人补充一下吗?对,输入数据也需要调整——我们需要收集狗、长颈鹿以及其他相关场景的图片数据。除此之外,还有一个关键点:为每种动物添加一个神经元,这些神经元相互独立,各自专注于检测一种动物。

在实际项目中,我们发现一个常见错误:人们添加了新的数据,却忘记调整标签。那么标签需要如何调整呢?显然,不能再使用0和1这样的二分类标签了。大家知道这种新的标签形式叫什么吗?

是的,我们会使用独热向量(one-hot vector)或多热向量(multi-hot vector)。独热向量意味着我们会创建一个长度为3的向量(对应三种动物):如果图片中是猫,标签可能为[0,1,0](假设第二个神经元负责检测猫)。而在有多只动物同时出现在图片中的场景(虽然猫和长颈鹿同时出现的情况较少,但猫和狗同时出现很常见),我们会使用多热向量:例如图片中有猫和狗,标签可能为[1,1,0]。我之所以强调这一点,是因为在很多实际项目中,人们修改了数据却忽略了标签调整,最终疑惑为什么模型无法正常工作。

2.6 课程常用符号与模型容量的概念

在本课程中,我们会使用特定的上标和下标符号:当看到A₁⁽¹⁾这样的表示时,方括号中的上标表示所在的网络层(此处为第一层),下标表示神经元的索引,A代表激活值。因此,A₃⁽¹⁾表示第一层第三个神经元的输出。以此类推,第二层的表示方法类似,最终我们会得到预测概率。

模型的“容量”(capacity)是一个重要概念:网络越深,容量越大。这意味着,如果将一百万张猫咪图片和一百万张非猫咪图片输入一个浅层网络,它可能没有足够的容量来学习数据中的规律——它的灵活性不足。而深层网络(例如拥有十亿参数的Transformer模型)在面对同样的数据集时,反而可能出现过拟合现象:它不会学习“什么是猫”的通用特征,而是会死记硬背这一百万张图片,因为它的容量远远超过了数据集的需求。因此,理解输入数据的数量、复杂性和多样性,对于选择合适容量的模型至关重要。

2.7 神经网络的特征编码过程

为了让大家更直观地理解神经网络内部的工作机制,我们以一个经过人脸图像数据集训练的三层浅层网络为例(暂时不关注具体任务,人脸数据集可用于人脸验证、人脸识别、人脸聚类等多种任务)。如果我们拆解这个网络,观察每个神经元的工作状态,会发现一个规律:浅层网络更擅长编码低复杂度特征,而深层网络更擅长编码高复杂度特征。

具体来说:第一层的神经元直接接收像素输入,因此它们擅长整合像素信息——例如,第一个神经元可能擅长检测对角线边缘,第二个擅长检测垂直边缘,第三个擅长检测水平边缘。进入网络中间层后,神经元接收的是第一层的输出(已经是稍复杂的特征),因此它们更擅长识别更高层次的特征,如眼睛、鼻子、耳朵(因为多个边缘可以组合成类似圆形的结构,而眼睛正是这种结构)。网络越深,越接近具体任务(本案例中的人脸分析),最后几层的神经元会专注于识别面部的整体特征——因为它们接收的是更高复杂度的信息。

这个概念就是“编码”(encoding),我们之前也提到过“嵌入”(embedding)。这一点非常重要,因为训练神经网络时,我们需要确保它真正“理解”所处理的内容,而这是观察模型工作状态的一种有效方式。本学期后期,我们会有一整节课专门探讨神经网络的解释与可视化。此外,这些编码和嵌入在实际应用中也极具价值——例如在搜索任务中,神经网络能够将信息编码为具有明确意义的向量,通过计算向量之间的距离,我们可以找到相似的概念并建立关联,或区分不同的概念。

2.8 核心概念总结

以上是今天的热身内容,我们用了15分钟回顾了本周的核心知识点,同时学习了几个新术语:模型(model)、架构(architecture)、参数(parameters)。这里补充两个关键概念的区别:特征工程(feature engineering)与特征学习(feature learning)。

image.png

**特征工程(feature learning)**是深度学习出现之前常用的方法:

例如,为了检测人脸,我们需要手动设计一个专门检测眼睛的算法,再设计一个检测嘴巴的算法,然后将它们组合起来。而深度学习采用的是端到端学习(end-to-end learning) :我们让数据自己“说话”,通过训练模型自动学习特征,这就是特征学习。这种方式无需我们手动告诉模型“眼睛是检测人脸的重要特征”,模型会自行发现这些规律。

编码与嵌入的区别在于:

编码是指任何形式的向量表示,而嵌入特指具有明确意义的编码——即两个编码向量之间的距离能够反映它们所代表概念的关联程度(距离近表示概念相似,距离远表示概念不同)。我们还讨论了独热向量和多热向量的应用场景。

热身部分到此结束,接下来我们将深入探讨监督学习项目,通过实际案例共同分析决策过程。

三、监督学习项目案例分析

3.1 案例一:昼夜图像分类

3.1.1 问题定义

image.png

给定一张图像,将其分类为“白天”或“夜晚”。这是一个开放性问题,我们暂时忽略基础模型的存在(不依赖ChatGPT等工具),深入探讨问题的核心逻辑——尽管这是一个简化案例,但其中的决策思路对实际项目极具参考价值。

3.1.2 数据收集与任务界定

首先思考:为了解决这个问题,我们需要收集哪些数据?大家提出的思路很有价值,例如通过分析像素行之间的差异(若相邻像素行的差异较大,可能意味着存在明显的颜色变化,更可能是白天)——这就是特征工程的思路,非常好。还有人提到收集大量图像数据,一半为白天场景,一半为夜晚场景。

这里有一个关键问题:如何确定启动项目所需的图像数量?一种可行的方法是迭代式收集——先从10张图像开始,逐步增加数据量。但更重要的是,我们需要先明确任务的边界:任务的复杂度直接决定了数据的需求量。

例如,如果任务限定为“检测某一个特定公园的昼夜状态”,那么数据收集会相对简单,只需在该公园的不同时间段拍摄图像即可;但如果任务是“检测全球任意地点、任意气候条件下的昼夜状态”,则需要极其多样化的图像数据,数据量也会大幅增加。Andrew曾提到这是一个颇具挑战性的问题,核心原因就在于任务边界的界定——任务越宽泛,复杂度越高,所需的数据量和模型容量就越大。

3.1.3 任务的难点分析

我们进一步思考:哪些场景会让这个分类任务变得异常困难?大家提到的室内图像就是一个典型案例——例如在室内拍摄一张包含屏幕的照片,如何判断拍摄时间是白天还是夜晚?虽然照片中的时钟可能提供线索,但时钟显示的AM/PM信息并不足以完全确定(例如,人们的穿着可能暗示天气冷暖,但这种线索并不绝对)。此外,阴雨天的场景(白天可能光线昏暗,接近夜晚)、极昼地区(如挪威北部、瑞典,太阳长时间不落下)、黎明和黄昏(昼夜过渡阶段,光线特征不明显)等,都会增加分类的难度。

更重要的是,我们需要明确“白天”和“夜晚”的定义——这是一个语义层面的问题。看似简单的分类任务,在实际场景中可能会因为边界模糊而变得异常复杂。事实上,即便是当今的基础模型,在某些极端场景下也无法准确完成这个任务。

3.1.4 图像分辨率的决策方法

假设我们已经收集了10,000张图像,包含多种场景以覆盖不同情况。结合之前讨论的模型容量概念:如果任务相对简单(如特定地点的昼夜分类),一个小容量模型就足够;如果需要处理大量边缘案例,则需要更大容量的模型和更多数据。

接下来的关键决策是:

选择什么分辨率的图像作为模型输入?

如何确定合适的分辨率,以及分辨率为何如此重要?

大家提到的“保持数据集中图像分辨率的一致性”是一个重要原则——虽然我们可以通过脚本将高分辨率图像缩小,但放大低分辨率图像会更困难。分辨率的选择直接影响模型性能:分辨率过低会导致信息丢失(例如,图像中的时钟可能因分辨率太低而无法识别);分辨率过高则会增加计算成本(训练模型需要更多资源,迭代速度会变慢)。在人工智能项目中,分辨率的选择对效率和成本至关重要。

如何在10分钟内快速确定合适的分辨率?一个非常实用的方法是:以人类为“代理”进行测试。这也是我们过去常用的方法——将图像打印成不同分辨率,让朋友判断是否能区分“白天”和“夜晚”。当分辨率低于某个阈值时,人类无法准确判断,这个阈值就是我们选择的最低分辨率。我们最终确定的分辨率是64×64×3(强调“3”是因为颜色信息对昼夜分类至关重要——蓝天等颜色特征能有效区分白天和夜晚。本学期后期我们会发现,在某些强化学习任务中,移除颜色信息不会影响模型性能,但会简化训练过程,但本案例显然不适用)。

这种以人类为代理的测试方法虽然简单,但在实际项目中极具价值——当你需要验证某个假设,而没有现成的模型或工具时,人类的直觉判断是最好的参考。

3.1.5 模型设计决策

模型的输出:很明确,是二分类结果(0表示夜晚,1表示白天)。

输入层与网络结构:图像大小是否会影响输入层?

答案是:理论上不会——你可以将任意大小的图像输入到只有三个神经元的输入层。但深度学习本质上是一门工程学科,需要实践经验和技巧。对于二分类任务,网络结构通常是“高维输入→低维输出”——即通过浅层网络进行边缘检测,再通过深层网络提取高层特征,最终输出分类结果。本学期第四周我们会学习输出大于输入的场景(如生成任务),届时网络结构会有所不同。这些技巧在产业界非常有价值——这也是为什么Meta等公司会高薪聘请有丰富经验的研究人员,他们掌握的这些“小技巧”往往能极大提升项目效率。

激活函数与损失函数:最后一层的激活函数选择Sigmoid(将输出映射到0到1之间,符合概率表示需求)。损失函数选择逻辑损失(logistic loss),也称为二元交叉熵损失(binary cross-entropy loss) ——这是大家本周在在线视频中学习的内容。

3.1.6 硬件资源的影响

有同学问:硬件资源(如内存带宽、缓存大小)会影响这些决策吗?

答案是:影响非常大。假设你现在用笔记本电脑训练模型,就需要在性能和效率之间做权衡。

产业界的核心思路是:优先保证迭代速度——如果一个模型需要一年才能训练完成,你将无法进行任何优化迭代,因此必须通过调整分辨率、简化模型等方式减少训练时间。例如,将图像分辨率从64×64提升到65×65,计算时间可能会翻倍(具体取决于硬件和模型结构)。

3.1.7 案例总结

这个案例虽然简单,但有两个关键点值得大家记住,并应用到自己的项目中:

一是通过“代理项目”积累经验(例如,记住这个案例中人类测试对分辨率决策的帮助,以及数据量与任务复杂度的关系),这能帮助你在未来的项目中更快做出决策;

二是人类实验的重要性——在产业界,当你需要快速验证假设时,人类实验是最直接、最有效的方法。

3.2 案例二:触发词检测

3.2.1 问题背景与场景

大家都熟悉Alexa、Siri等智能助手——它们通常处于持续监听状态,当听到触发词(如“Alexa”“Hey Siri”“Okay Google”)时,会启动后续的交互流程。这些系统的核心设计思路是“模型级联”(cascade of models),目的是兼顾能量效率和性能:

image.png

  1. 第一层是“活动检测模型”(activity detection):这是一个极其轻量化的模型,仅负责检测环境中是否有声音信号。因为持续运行重量级模型会消耗大量能量,所以第一层模型的作用是“筛选”——只有检测到声音时,才会调用后续模型。
  2. 第二层是“触发词检测模型”:这是我们本次案例的重点。该模型仅专注于识别特定的触发词,当检测到触发词时,会调用更复杂、能耗更高的模型(负责理解用户的具体需求)。
  3. 后续模型:根据用户需求执行具体任务(如设置计时器、在线购物等)。早期这些任务由多个独立模型分别处理,现在则更多采用端到端的设计,但模型级联的核心思路仍被广泛应用。

本次案例的问题定义:给定一段 10 秒的音频,检测其中是否包含触发词“activate”。假设我们从零开始构建这个系统,该如何设计?

3.2.2 数据收集与预处理

首先思考数据收集:大家提到的“音频预处理”是关键步骤——音频本质上是一系列频率信号,我们需要通过傅里叶变换等方法将其转换为模型可处理的格式。此外,序列长度也很重要——“activate”这个词的发音有最小时长(不可能在 10 毫秒内说完),因此音频序列的长度需要足够覆盖触发词的完整发音。

具体的收集方法:我们可以使用手机等设备录制数据——例如在校园内邀请人们说出“activate”这个词,同时也录制其他词语(如“deactivate”“kitchen”“lion”等)作为负样本。选择触发词时需要注意:应选择在日常语言中不常用的词,否则智能助手会频繁误触发(亚马逊在设计 Alexa 时就曾围绕触发词的选择进行过大量讨论,Alexa 虽然不是完美的,但相对来说在日常语言中出现频率较低)。

3.2.3 数据分布的重要性

数据的分布对模型性能至关重要——如果仅在校园内收集数据,可能会存在明显的局限性:

  1. 口音差异:我和Andrew早期构建的模型就曾出现过问题——我的德国朋友无法触发模型,原因是我们的数据集中缺乏德语口音的发音样本。后来我们专门收集了德语口音的数据,模型性能才得到改善。
  2. 年龄差异:校园内的人群以年轻人为主,而不同年龄群体的发音频率存在差异(年轻人的发音频率通常与老年人不同),这会影响模型的识别效果。
  3. 语速差异:不同语言背景的人语速不同,这会导致触发词在音频序列中的长度和位置发生变化,模型需要适应这种差异。
  4. 性别差异:男性和女性的发音频率分布不同,数据集中需要包含足够的男性和女性样本。
  5. 背景噪音:斯坦福校园的环境相对安静,而在纽约等城市的地铁中,背景噪音会严重干扰触发词的识别。如果数据集中缺乏噪音样本,模型在实际环境中会表现不佳。

3.2.4 输入输出设计与人类实验

输入:

10秒音频片段(包含负样本词语、正样本词语“activate”和背景噪音)。关于音频的采样率(类似图像的分辨率),如果没有语音处理的专业知识,可以参考GitHub上类似项目的超参数——人类语音的采样率有通用标准,这些项目的参数通常可以直接复用。

输出设计:

最初的想法是输出0或1(0表示没有触发词,1表示有触发词)。但我们通过一个人类实验发现,标签设计对模型学习效率的影响极大:

实验设计:

准备三段10秒的音频样本,告知大家第一段和第三段包含目标词(但不告知目标词是什么,模拟模型初始状态),让大家猜测目标词。第一次实验采用“仅标记是否包含目标词”的标签方式,几乎没有人能猜对目标词;第二次实验采用“标记目标词在音频中出现位置”的标签方式,大家的猜测准确率大幅提升。

这个实验的启示是:

第一种标签方式虽然标注成本低,但模型需要更多数据(可能是1000倍)才能学会识别触发词;

第二种标签方式虽然标注成本稍高,但模型的学习效率会极大提升。

因此,在实际项目中,我们应优先选择能帮助模型快速学习的标签方式——只要标注成本的增加幅度远小于模型学习效率的提升幅度。

3.2.5 标签平衡与模型设计

标签平衡问题:如果采用“仅标记是否包含触发词”的标签方式,数据集中的负样本(不包含触发词)会远多于正样本(包含触发词),导致模型出现“偏向性”——总是预测0,虽然准确率很高,但完全无法识别触发词。解决这个问题的工程技巧是:设计更平衡的标签策略(如标记触发词的出现位置,增加正样本的标签密度)。

模型架构与损失函数:由于音频是序列数据,模型通常选择循环神经网络(RNN,大家后续会学习)。激活函数采用Sigmoid,且在每个时间步都有输出(对应音频的每个时刻)。损失函数仍使用二元交叉熵,但会在每个时间步计算损失——即让模型逐时刻预测是否属于触发词的一部分。

3.2.6 高效数据生成策略

手动标注大量音频数据成本极高,我们可以通过以下方法高效生成数据:

image.png

  1. 构建三个数据库:

    ①正样本库(包含不同人、不同口音说出的“activate”);

    ②负样本库(包含“deactivate”等其他词语);

    ③背景噪音库(可从YouTube等平台获取免费的背景噪音音频,成本极低)。

  2. 编写Python脚本:随机从三个库中抽取片段,合成10秒的音频样本(例如,将背景噪音作为基础,随机插入2个负样本词语和1个正样本词语,且确保词语不重叠)。由于脚本负责插入词语,因此可以自动标注触发词的出现位置——无需手动标注。

  3. 数据增强:通过调整音频的频率、速度(加速或减速)等方式,进一步扩充数据集。

    通过这种方法,我们仅用 3 小时就收集了数百万个训练样本:校园内录制的数千个“activate”样本、数万个其他词语样本,以及无限的背景噪音样本,通过脚本合成即可生成海量数据。需要注意的是,测试集必须手动标注,且样本需尽可能接近真实场景(不能使用合成数据)

    训练集用于模型学习

    测试集用于验证模型在真实环境中的性能。

3.2.7 架构搜索与专家建议

架构搜索是项目中的重要环节,但如今的频率已低于过去(更多时候会基于基础模型进行微调)。本课程的重点是让大家理解底层原理,因此我们会详细讲解架构设计的思路。在产业界,架构选择往往取决于项目约束——例如,若模型需要在浏览器中运行,就需要设计轻量级架构;若有充足的硬件资源,则可以使用更复杂的模型。

一个重要的经验是:多向专家请教。我在研究生时期,曾因选择了错误的架构而浪费了大量时间,后来一位资深博士生告诉我,某种架构在语音任务中必然会失败——他的经验帮我节省了数月的工作量。因此,大家在项目中遇到问题时,应主动向助教咨询,他们的经验能为你提供宝贵的指导。

3.2.8 案例总结

这个案例的核心启示:

① 数据收集与标签设计策略对项目成败至关重要;

② 人类实验是验证假设的有效工具;

③ 充分利用专家建议,避免重复造轮子。

3.3 案例三:人脸验证

3.3.1 问题定义

某学校希望使用人脸验证技术验证学生身份,应用场景包括餐厅、体育馆、游泳池等设施。传统的身份验证方式是:学生刷卡,屏幕显示学生照片,工作人员人工对比照片与学生本人。我们的目标是构建一个自动化系统:学生刷卡时,摄像头拍摄学生本人照片,系统自动对比数据库中的学生照片与摄像头照片,验证是否为同一人。

image.png

3.3.2 数据收集与预处理

基础数据集:学校已有的学生身份证照片(每个学生至少有一张)。但仅靠这些照片远远不够,我们还需要:

  1. 同一学生的多张照片:涵盖不同角度、不同时间、不同表情、不同发型(如有无胡须、戴帽子/眼镜等)的场景——因为这些因素都会影响人脸的外观。
  2. 图像预处理:对所有照片进行裁剪,确保人脸居中——这样可以让模型训练的图像与摄像头拍摄的图像(通常人脸居中)保持一致,提升识别准确率。
  3. 分辨率选择:人脸验证需要识别眼睛颜色、面部轮廓等细节特征,因此分辨率需高于昼夜分类任务。我们选择的分辨率是 412×412×3——机场安检等更严格的场景,分辨率会更高(甚至需要识别虹膜特征)。

3.3.3 传统方法的局限性:像素级对比

在深度学习出现之前,人脸验证的传统方法包括特征工程(手动设计 10 个用于识别人脸的特征,如眼睛间距、鼻子形状等,通过过滤器提取这些特征并进行对比)和像素级对比(直接比较两张照片的像素值)。但像素级对比存在明显缺陷:

  1. 光照影响:同一人脸在不同光照下,像素值差异极大(如一张照片中左上角像素明亮,另一张中该位置像素昏暗),但这种差异对人脸识别毫无意义,反而会干扰对比结果。
  2. 背景差异:两张照片的背景可能完全不同,像素级对比会将背景差异误判为人脸差异。
  3. 几何变换:人脸在照片中的位置(平移)、大小(缩放)、角度(旋转)等发生变化时,像素级对比会完全失效——例如,同一人脸在照片中偏移 3 个像素,像素级对比的结果会截然不同。
    1. 外观变化:发型、胡须、眼镜等外观变化会导致像素值发生显著变化,但这些变化不应影响身份验证结果。

3.3.4 深度学习方案:基于编码的人脸验证

深度学习的核心思路是利用“编码”(encoding)提取人脸的语义特征,而非依赖像素级特征。具体流程如下:

    1. 模型训练:训练一个深度神经网络,使其能够将人脸图像转换为具有语义意义的向量(编码)。网络浅层提取低层次特征(如边缘),深层提取高层次特征(如眼睛、鼻子等面部器官),更深处的特征则直接与身份识别相关。
    1. 编码生成:将数据库中的学生身份证照片输入网络,生成对应的编码向量并存储;当学生刷卡时,摄像头拍摄的照片也输入同一网络,生成实时编码向量。
    1. 距离计算与阈值判断:计算两个编码向量之间的距离(如欧氏距离)。

如果距离小于设定的阈值,则认为是同一人,允许进入;

否则拒绝。阈值的选择需根据场景调整

——机场安检的阈值会更严格(距离要求更小),而学校餐厅的阈值可以相对宽松。

例如,我们通常将阈值设定为 0.5,如果两个向量的距离为 0.4(小于阈值),则验证通过。

3.3.5 关键技术:三元组损失(Triplet Loss)

模型训练的核心是设计合适的损失函数,其中最常用的是三元组损失(Triplet Loss)——该方法来自 2015 年的 FaceNet 论文(Chautetal 等人提出),至今仍被广泛应用。

image.png

三元组损失的设计思路:构建由“锚点(Anchor)、正样本(Positive)、负样本(Negative)”组成的三元组样本:

  • • 锚点(A):一张人脸图像(如学生 A 的身份证照片)。
  • • 正样本(P):与锚点是同一人的另一张图像(如学生 A 的生活照)。
  • • 负样本(N):与锚点是不同人的图像(如学生 B 的身份证照片)。

损失函数的目标是:最小化锚点与正样本之间的编码距离,同时最大化锚点与负样本之间的编码距离。用公式表示为:

minimize( distance(enc(A), enc(P)) ) - maximize( distance(enc(A), enc(N)) )。

为了避免模型训练的不稳定性,通常会在公式中加入一个间隔参数 α(确保锚点与正样本的距离至少比锚点与负样本的距离小 α)。

通过这种方式训练的模型,会自动学习到“同一人的不同图像具有相似编码,不同人的图像具有不同编码”的规律——无需手动设计任何人脸特征。

3.3.6 数据增强与单样本问题

数据增强:如果某个学生只有一张照片,可以通过镜像翻转、旋转、裁剪、调整光照等数据增强方法,生成该学生的多张“虚拟样本”,用于构建三元组。

单样本问题:如果无法通过数据增强生成足够的样本,后续课程中我们会学习其他方法(如度量学习的变体),即使只有一张样本也能完成身份验证。

3.3.7 从人脸验证到人脸识别与聚类

image.png

人脸验证(Verification)与人脸识别(Identification)的区别:

  • • 人脸验证:一对一比对(如刷卡后,将摄像头照片与该学生的数据库照片比对),输出“是”或“否”。例如,欧洲机场的护照验证(插入护照后,比对护照照片与实时照片)。
  • • 人脸识别:一对多比对(无需刷卡,将摄像头照片与数据库中所有学生的编码向量比对),直接识别出身份。例如,美国的全球入境系统(无需出示护照,摄像头直接识别身份)。

基于人脸验证的模型,只需简单调整即可实现人脸识别:将数据库中所有学生的图像转换为编码向量并存储;当学生进入场景时,摄像头拍摄的照片生成编码向量,通过 **K 近邻算法(K-Nearest Neighbors, KNN)**在数据库中查找最相似的向量。

例如,选择 K=3,如果最相似的 3 个向量都来自同一个学生,则认为识别成功。

人脸聚类(Face Clustering) :手机相册的“自动归类人脸”功能就是典型的人脸聚类——将所有照片的编码向量通过 K 均值聚类(K-Means)算法分组,同一组的向量对应同一个人。这进一步体现了编码向量的价值——它能将语义相似的样本自动聚集在一起。

3.3.8 案例总结

本案例的核心知识点:

① 编码网络在语义特征提取中的作用;

② 三元组损失的设计思路与应用;

③ 人脸验证、识别、聚类的内在联系与实现方法。

FaceNet 论文是该领域的经典文献,很多学生在项目中都会参考,建议大家课后阅读。

image.png

四、自监督学习与弱监督学习

4.1 自监督学习:无需人工标注的学习方式

4.1.1 核心动机

监督学习的最大局限性是“标注成本高”——无论是昼夜分类、触发词检测还是人脸验证,都需要大量人工标注的数据。而在实际场景中,存在海量的无标注数据(如互联网上的野生人脸图像)。**自监督学习(Self-Supervised Learning)**的核心目标是:无需人工标注,让模型从数据本身的模式中学习特征。

4.1.2 核心思路:利用数据增强构建监督信号

自监督学习的关键是“从数据中自动生成监督信号”——通过数据增强方法,为同一样本创建多个变体,让模型学习“这些变体属于同一概念”。例如:

image.png

  1. 图像旋转:将一张狗的图像旋转 90 度,虽然像素发生了变化,但它仍然是同一只狗。我们让模型学习“旋转后的图像与原始图像的编码向量应尽可能相似”,通过这种方式,模型会自动学习到狗的语义特征(而非依赖像素级特征)。
  2. 图像补全:将一张人脸图像的一半遮挡,另一张人脸图像遮挡另一半,让模型学习“这两张图像的编码向量应相似”——模型需要理解人脸的完整结构,才能完成这个学习任务。
  3. 其他数据增强方式:添加噪声、裁剪、平移等,都可以用于构建自监督的学习信号。

这种方法被称为对比学习(Contrastive Learning) ——核心是“拉近相似样本的编码距离,拉远不同样本的编码距离”。Sinclair 论文就是对比学习在人脸领域的经典应用,它将 FaceNet 的“监督三元组”替换为“自监督样本对”,仅使用无标注数据就训练出了性能优异的人脸编码模型。这也是现代基础模型能够基于数十亿无标注图像训练的核心原因——通过简单的脚本生成样本对,即可实现大规模训练。

4.2 自监督学习的跨模态应用

自监督学习不仅适用于图像,还广泛应用于其他模态:

  1. 文本领域:GPT 系列模型的核心训练任务是“下一个token预测”(Next-Token Prediction)——给定一个句子,预测下一个单词。这是典型的自监督学习:无需人工标注,只需从互联网上抓取大量文本,即可自动生成训练样本。通过这个简单的任务,模型会自动学习到语言的语法、语义,甚至是现实世界的知识。
  2. 音频领域:通过“遮挡部分音频片段,预测被遮挡的内容”实现自监督学习——类似图像补全的思路,模型需要理解音频的序列模式才能完成预测。
  3. 生物领域:对蛋白质结构或 DNA 序列进行遮挡,预测被遮挡的部分,让模型学习生物序列的内在规律。
  4. 自动驾驶领域:对视频帧进行处理(如遮挡、打乱顺序),让模型学习交通场景的时空模式。

4.3 涌现行为(Emergent Behaviors)

自监督学习的一个神奇之处是“涌现行为”——模型在完成简单训练任务的过程中,会自发形成一些未被明确教授的能力。例如:

image.png

  1. 句子“我给自己倒了一杯____”:模型会预测“茶”“咖啡”“水”等单词。通过这个任务,模型会自发学习到“倒”的动作对象通常是液体,且液体需要用杯子盛放——这些都是模型未被明确教授的知识。
  2. 句子“法国的首都是____”:模型会预测“巴黎”。通过大量文本的训练,模型会自发学习到这个现实世界的事实。
  3. 句子“她用____解锁了手机”:模型会预测“指纹”“人脸”“密码”等。这表明模型理解了这些事物的共同功能——解锁手机。
  4. 句子“猫追逐____”:模型会预测“狗”“球”等。这体现了模型的概率推理能力——它知道猫可能追逐多种事物。
  5. 句子“如果下雨,我应该带____”:模型会预测“雨伞”。这表明模型具备了简单的逻辑推理能力——理解“下雨”与“带雨伞”之间的因果关系。

涌现行为是大规模自监督学习的核心价值所在——我们无需为每个任务单独训练模型,只需通过一个简单的自监督任务,模型就能自发形成多种复杂能力。本学期后期,我们会在深度强化学习的课程中进一步探讨涌现行为(如 AlphaGo 自发学习到人类从未使用过的围棋策略)。

4.4 弱监督学习:利用自然配对的跨模态学习

现实世界中,不同模态的数据往往存在自然的配对关系——这些配对不是人工标注的,而是天然存在的,利用这种配对进行学习的方式称为弱监督学习(Weakly Supervised Learning) 。弱监督学习的核心目标是“连接不同模态的表示空间”,让不同模态的相似概念在向量空间中处于相近的位置。

4.4.1 常见的自然配对案例

  1. 图像与文本:Instagram 等平台的图片及其caption(标题)、新闻报道中的图片与文字——这些都是自然的图像-文本配对。通过学习这些配对,模型可以实现“根据文本搜索图片”或“根据图片生成文本”。
  2. 音频与视频:YouTube 视频的音频轨道与视频画面——例如,狗吠的音频与狗吠的视频画面天然配对。通过学习这些配对,模型可以实现“根据音频生成视频”或“根据视频分离音频”。
  3. 视频与文本:电影的字幕与视频画面——字幕是文本,视频是图像序列,两者天然配对。通过学习这些配对,模型可以实现“视频内容摘要”或“根据文本查找视频片段”。
  4. 音乐与文本:歌曲的歌词与旋律——歌词是文本,旋律是音频,两者天然配对。通过学习这些配对,模型可以实现“根据歌词生成旋律”或“根据旋律匹配歌词”。
  5. 医学影像与报告:超声图像与医生的诊断报告——两者天然配对,通过学习这些配对,模型可以实现“根据医学影像生成诊断建议”。

4.4.2 跨模态连接的核心:共享嵌入空间

弱监督学习的关键是构建“共享嵌入空间”——将不同模态的数据(如文本、图像、音频)转换到同一个向量空间中,使得语义相似的概念(无论属于哪种模态)在空间中距离相近。Meta 的 ImageBind 论文提出了一个核心见解:大多数模态都可以通过一个中间模态(如图像)相互连接——例如,热成像数据可以与图像连接,图像可以与文本连接,因此热成像数据可以通过图像间接与文本连接。

image.png

ImageBind 的演示案例充分体现了这种跨模态连接的价值:

输入文本“鼓”,可以找到相似的鼓的图像和鼓的音频;

输入狗吠的音频,可以找到相似的狗的图像。

这种共享嵌入空间是近年来人工智能领域的重大创新之一,它为多模态应用(如跨模态搜索、多模态生成)奠定了基础。

4.5 核心概念总结

本部分我们学习了自监督学习和弱监督学习的核心思路:

自监督学习通过数据增强自动生成监督信号,无需人工标注;

弱监督学习利用现实世界中不同模态的自然配对,构建共享嵌入空间。

关键技术包括对比学习(图像自监督)、下一个token预测(文本自监督),

核心概念包括涌现行为、共享嵌入空间。文本通常是跨模态连接的核心枢纽,因为它能与大多数模态建立自然配对。

五、课程总结与后续安排

今天我们学习了大量内容:

从传统监督学习的基础原理,到三个经典监督学习项目(昼夜分类、触发词检测、人脸验证)的决策思路与核心技术,

再到自监督学习和弱监督学习的创新方法。我们深入探讨了模型架构、损失函数、数据收集与标注、编码与嵌入等关键概念,

这些内容将为大家后续的项目实践和深入学习奠定坚实基础。

由于时间限制,我们今天未能覆盖对抗性攻击与防御的内容,这部分将在两周后讲解——届时大家已经掌握了更多神经网络的相关知识,能够更好地理解这一主题。

image.png

希望大家课后回顾今天的案例,思考如何将这些决策思路应用到自己的项目中。如果有任何疑问,欢迎随时向助教或我咨询。

以上就是课程的全部内容啦,假如你对我的文章感兴趣,请关注我,假如你觉得对你有帮助,就分享给更多的朋友,和点赞,有任何关于AI方面的疑问也欢迎私信我一起交流