斯坦福-CS230-深度学习笔记-全-
斯坦福 CS230 深度学习笔记(全)
001:第一讲 课程介绍与安排 🎓


在本节课中,我们将学习斯坦福大学CS230深度学习课程的总体介绍、课程安排以及深度学习领域的基本概况。课程由吴恩达(Andrew Ng)和Kian Katanforoosh共同讲授,采用翻转课堂的形式,旨在帮助学生掌握深度学习的前沿知识并具备实际应用能力。
课程团队介绍 👥
首先,我们来认识一下教学团队。本课程的联合讲师是Kian Katanforoosh,他也是本课程所使用的Coursera深度学习专项课程的联合创建者之一。课程协调员是Swati Dube,她负责协调CS230以及其他相关课程,确保课程顺利进行。联合顾问是Euns Mauri,他与Kian共同创建了大量在线课程内容,同时也是CS229课程的助教负责人。此外,我们还有两位联合助教Abagu以及一个庞大的助教团队,其中约一半的助教曾担任过CS229课程的助教,他们的专业领域涵盖医疗健康、机器人学、计算生物学等多个方向。希望在本季度的项目工作中,大家能从助教团队那里获得宝贵的建议、帮助和指导。
深度学习为何兴起? 📈

上一节我们介绍了课程团队,本节中我们来看看深度学习为何在近期迅速兴起。深度学习的基本思想已经存在了几十年,那么它为何现在才开始爆发呢?
主要原因在于数据规模和计算能力的增长。过去几十年,随着社会的数字化,我们收集的数据越来越多。例如,智能手机和电脑的普及、医疗影像的数字化、供应链记录的电子化等都产生了海量数据。然而,传统的机器学习算法(如逻辑回归、支持向量机、决策树等)的性能在数据量达到一定程度后会趋于平缓。
相比之下,神经网络的性能会随着网络规模和数据的增长而持续提升。最初,我们只能训练小型神经网络,性能有限。随着计算能力,特别是GPU计算的发展,我们现在能够训练非常庞大的神经网络,从而在许多应用上达到很高的准确率。GPU计算能力的普及,使得曾经只有大型研究实验室才能负担的计算资源,现在可以通过云服务以较低成本获得。
此外,深度学习的兴起还得益于算法创新和大量的研发投入。早期由数据和计算规模驱动,现在则形成了由算法创新和大量投资共同推动的良性循环。
课程目标与独特之处 🎯
在了解了深度学习兴起的背景后,我们来看看CS230课程的具体目标。本课程主要有两个目标:
- 使学生成为深度学习算法的专家,掌握前沿技术并具备深厚的理论知识。
- 使学生掌握将这些算法应用于实际问题的能力。
与传统学术课程不同,本课程不仅教授技术工具,更注重传授如何使这些算法真正有效的实践知识。在软件工程中,资深工程师与初级工程师的区别不仅在于语法知识,更在于系统架构、抽象定义等高层次判断。同样,在机器学习领域,除了理解算法原理,高效地决策(例如,是应该收集更多数据还是调整超参数)能极大地提升团队效率。本课程旨在系统性地传授这类知识,帮助学生未来领导团队时能更高效地指导工作。
为了帮助大家更好地掌握这些实践原则,吴恩达撰写了一本名为《Machine Learning Yearning》的手册,旨在将机器学习从一门“黑科技”转变为系统的工程学科。感兴趣的同学可以通过指定网站获取草稿。
课程形式与行业影响 💡
接下来,我们了解一下本课程独特的教学形式及其希望带来的行业影响。CS230采用“翻转课堂”模式。这意味着学生需要在家观看由DeepLearning.ai制作并托管在Coursera平台上的高质量视频,完成在线练习和测验。这样,宝贵的课堂时间(每周三的讲座和周五的助教讨论课)就可以用于更深度的互动、讨论和进阶内容的学习。这种模式旨在提供比单纯在线学习更深入的知识和实践机会。
深度学习正在像一百年前的电力一样,变革着几乎所有行业。它不仅是大型科技公司的核心,更在医疗健康、土木工程、机械、宇宙学等传统非CS领域展现出巨大潜力。本课程希望学生毕业后,不仅能加入拥有成熟AI团队的公司,更能将AI技术带入那些尚未被AI触及的领域,创造更大的价值。
要成为一个真正的“AI公司”,仅仅在现有业务中添加几个神经网络是远远不够的。这就像购物中心拥有网站并不等于它就是互联网公司一样。真正的互联网公司会围绕互联网的优势来组织团队和工作方式,例如进行广泛的A/B测试、拥有快速的迭代周期、将决策权下放给工程师和产品经理。同样,未来的顶尖AI团队需要擅长战略性的数据获取、构建统一的数据仓库、敏锐地发现自动化机会,并定义新的岗位角色(如机器学习工程师、AI产品经理)。本课程将探讨如何有效地在AI时代组织团队,这些原则将帮助大家在未来开展更有价值的工作。
斯坦福机器学习课程体系 🔄
在斯坦福,有多门机器学习课程可供选择,学生常常会问应该选哪一门。CS229(机器学习)是其中最数学化的课程,深入探讨算法的数学推导。CS229A(应用机器学习)数学内容较少,更侧重于实践,是机器学习最易上手的入门课程。CS230则介于两者之间,它专注于深度学习这一当前最热门的机器学习子集,在数学深度上比CS229浅,但比CS229A深,并且最侧重于实践应用和“如何实现”的知识。这三门课程内容各有侧重,重叠不多,学生甚至可以同时选修两门。通常,学生会先学习CS229或CS230作为基础,然后再深入学习计算机视觉、自然语言处理等更专精的领域。
课程结构与每周安排 📅
现在,让我们跟随Kian来详细了解CS230课程的具体结构和安排。在线课程内容分为五个部分(对应Coursera上的五个子课程):
- 神经网络基础:从神经元、层到深度网络。
- 优化深度神经网络:学习调优网络、提升性能的方法。
- 机器学习项目策略:学习AI团队的工作方式,如何诊断和改进算法。
- 卷积神经网络:专注于图像和视频处理。
- 序列模型:专注于自然语言处理、语音识别等。
课程将使用“C2M3”这样的记号,代表“课程2,模块3”。详细的课程大纲和日程(包括期中考试和期末海报展示日期)已发布在课程网站上。
以下是CS230学生典型一周的学习生活:
- 在线学习:学习两个模块的内容,包括观看约3小时的视频、完成测验和编程作业(使用Jupyter Notebook)。
- 课堂讲座:参加一次1.5小时的线下讲座,内容是在线课程没有的进阶主题。
- 助教讨论课:参加一次约1小时的周五讨论课,与助教和其他同学交流,并为项目组队。
- 个性化指导:每周与助教进行15分钟的一对一会议,跟进项目进展。
编程作业和测验的截止时间是每周三上午11点(上课前30分钟)。请注意,务必遵循CS230课程网站公布的截止日期,而非Coursera平台显示的日期,因为课程网站上的日期为同学们预留了迟交日。
从课程二开始,我们将使用Mentimeter工具进行课堂互动和签到。
评分标准与课程项目 🏆
课程的评分比例如下:
- 课堂参与:2%
- 在线测验:8%
- 编程作业:25%
- 期中考试:30%
- 期末项目:35%


积极参与Piazza论坛讨论可以帮助其他同学,也可能获得额外加分。
本课程的核心之一是实践项目。在整个学期中,所有学生都将通过编程作业完成一系列有趣的应用,例如:
- 手语识别
- “快乐小屋”人脸情绪识别门禁
- 实时目标检测(使用YOLO算法)
- 足球守门员射门预测
- 自动驾驶中的汽车检测
- 人脸识别
- 艺术风格迁移
- 爵士音乐生成
- 莎士比亚风格文本生成
- 智能输入法下一个词预测
- 日期格式标准化(机器翻译的简化版)
- 触发词检测


除了这些规定的编程作业,学生还需要组建团队,在10周内完成一个自选的深度学期项目。过去学生的项目非常出色,例如:
- 黑白图像上色
- 根据图片预测自行车价格
- 使用序列模型检测地震前兆信号
- 根据原子结构预测原子能量
- 医疗领域的脑瘤图像分割
我们期待在本季度末,大家能对自己的项目成果感到自豪,并在期末海报展示会上精彩呈现。
本周任务清单 ✅
最后,以下是大家在本周需要完成的任务:
- 创建Coursera账户:根据发送到斯坦福邮箱的邀请完成注册。如果未收到,请在Piazza上私信助教。
- 完成在线课程:在下周三上午11点前,完成课程一(C1)的前两个模块(C1M1和C1M2),包括所有视频、测验和编程作业。
- 组建项目团队:在本周五结束前,找到1-3名项目队友(特殊情况下可4人),并填写团队信息表单,以便助教分配指导老师。
- 参加助教讨论课:本周五将举行第一次助教讨论课(项目指导将从下周开始)。


本节课中我们一起学习了CS230深度学习课程的总体框架、深度学习兴起的原因、课程独特的实践导向教学目标以及翻转课堂的形式。我们还了解了课程的具体结构、评分方式、丰富的实践项目以及本周需要完成的任务。希望大家能充分利用课程资源,在接下来的十周里深入学习,并最终完成令人骄傲的实践项目。
002:监督学习、自监督学习与弱监督学习 🧠


在本节课中,我们将学习三种核心的机器学习范式:监督学习、自监督学习和弱监督学习。我们将通过具体的案例研究,探讨如何为不同任务设计模型架构、损失函数和数据策略。课程将涵盖从简单的图像分类到复杂的多模态嵌入系统,帮助你理解现代AI系统背后的决策过程。
第一部分:课程回顾与核心概念 🔄
上一节我们介绍了神经网络的基础。本节中,我们来看看如何将这些基础概念应用到实际项目中。
模型、架构与参数
一个AI模型可以看作是两个核心部分的组合:
- 架构:模型的蓝图或骨架。
- 参数:架构中需要学习的数值,可能从几个到数十亿个不等。
在部署时,你通常调用两个文件:一个描述架构,另一个存储参数。
学习过程:梯度下降
模型通过梯度下降优化进行学习。其过程可以概括为以下步骤:
- 输入数据(如图片)通过未训练的模型,得到初始预测。
- 使用损失函数比较预测值与真实标签(ground truth)。
- 损失函数计算出的误差(惩罚)通过反向传播,指导参数更新。
- 参数根据梯度方向进行微小调整(例如,向左或向右移动)。
- 在大量数据批次上重复此过程,直到模型预测准确。
神经网络的内部运作
在一个训练良好的神经网络中,不同层学习不同复杂度的特征:
- 浅层神经元:擅长编码低复杂度特征,如边缘和角落(例如,对角线、垂直线)。
- 中层神经元:组合低级特征,检测更复杂的模式(例如,眼睛、鼻子、耳朵等部件)。
- 深层神经元:接近最终任务,检测高级语义特征(例如,整张脸或特定物体)。
这种分层特征提取的过程称为编码。当编码具有语义意义,即向量空间中的距离反映概念相似性时,我们称之为嵌入。嵌入是许多现代AI系统的“结缔组织”,对于搜索、推荐等任务至关重要。
特征工程 vs. 特征学习
- 特征工程:深度学习之前的主流方法,需要手动设计和提取特征(例如,专门检测眼睛的算法)。
- 特征学习:深度学习的核心,模型通过端到端训练,直接从数据中自动学习有用的特征。
标签表示:独热编码与多热编码
- 独热编码:用于单标签分类。例如,在猫、狗、长颈鹿三分类中,“猫”的标签是
[1, 0, 0]。 - 多热编码:用于多标签分类。例如,图片中同时有猫和狗,则标签为
[1, 1, 0]。
一个常见的项目错误是增加了数据类别,却忘记相应调整标签格式。
第二部分:监督学习案例研究 📊
现在,让我们将上述概念应用到具体的监督学习项目中。
案例1:昼夜图像分类 🌇🌃
任务:给定一张图像,判断它是白天还是夜晚拍摄的。
项目启动决策
以下是启动此类项目时需要考虑的关键问题:
- 数据收集:需要多少图像?从哪里获取?任务定义(如特定地点 vs. 全球通用)直接影响数据需求和复杂度。
- 输入分辨率:选择
64x64x3(RGB)是一个不错的起点。可以通过“人类代理实验”确定最低有效分辨率,即让人在不同分辨率下判断昼夜,找到其性能开始下降的阈值。 - 模型输出:二分类,输出0(夜晚)或1(白天)。最后一层使用 Sigmoid 激活函数,将输出压缩到0-1之间,代表概率。
- 模型架构:对于此简单任务,一个较浅的卷积神经网络可能就足够了。
- 损失函数:使用二元交叉熵损失。
核心收获:
- 建立“代理项目”经验库,有助于未来快速决策。
- 在项目初期,利用“人类实验”验证假设(如分辨率、颜色重要性)是高效的方法。
案例2:触发词检测 🎤
任务:给定一段10秒的音频,检测其中是否出现特定触发词(如“激活”)。
关键挑战与策略
这是一个序列任务,比图像分类更复杂。
- 数据策略:关键在于数据收集和标注策略。
- 合成数据:可以创建三个数据库——正面词(“激活”)、负面词(其他词)、背景噪音。通过脚本随机混合生成训练数据,并自动生成标签。
- 真实测试集:测试集需使用真实场景下人工标注的数据。
- 标注方案:简单的“整个音频段一个标签”会导致正负样本极不平衡。更好的方案是在音频时间序列上标注,在触发词出现的时间步标记为1,其余为0。这为模型提供了更清晰的信号。
- 模型与损失:通常使用循环神经网络。在每一时间步使用Sigmoid激活,并计算序列化的二元交叉熵损失。
核心收获:
- 数据策略(收集、合成、标注)对项目成功至关重要。
- 通过人类实验快速验证不同标注方案的优劣。
- 积极寻求领域专家(如语音处理专家)的建议,可以避免走弯路。
案例3:人脸验证与识别 👤
任务:
- 验证:判断两张人脸图片是否属于同一个人(1:1比对)。
- 识别:从数据库中找出给定人脸图片的身份(1:N搜索)。
- 聚类:将未标注的人脸图片按身份分组。
从像素比对到编码比对
直接进行像素比对会受光照、姿态、背景、遮挡等因素影响。解决方案是使用编码网络。
- 将两张图片输入同一个深度神经网络。
- 从网络中间层(如128维)提取特征向量(编码)。
- 计算两个编码之间的距离(如欧氏距离)。
- 若距离小于阈值,则判定为同一人。
如何训练编码网络?三元组损失
目标是:同一个人的编码应接近,不同人的编码应远离。
三元组损失是实现此目标的经典方法:
- 数据:构建三元组
(锚点图片A, 正样本P, 负样本N)。P与A是同一人,N是不同人。 - 损失函数:最小化
A与P的距离,同时最大化A与N的距离。公式如下:
L(A, P, N) = max(||f(A) - f(P)||² - ||f(A) - f(N)||² + α, 0)
其中 f() 是编码函数,α 是间隔参数,确保正负样本对之间保持一定距离。
扩展到识别与聚类
- 识别:将数据库中人脸图片预先编码并存储。查询时,计算查询图片的编码,在数据库中进行K近邻搜索,找到最相似的编码。
- 聚类:获得所有人脸图片的编码后,使用K均值等聚类算法自动分组。
核心收获:
- 理解了编码网络和三元组损失的设计思想。
- 掌握了人脸验证、识别、聚类任务之间的区别与联系。
第三部分:自监督学习与弱监督学习 🚀
上一节我们探讨了需要大量标注数据的监督学习。本节中我们来看看如何利用未标注或弱标注数据进行学习。
自监督学习:让数据自己教自己
核心思想:通过设计辅助任务,从无标签数据本身生成监督信号。
对比学习(图像领域)
例如,SimCLR 方法:
- 对同一张图片进行两次不同的数据增强(如裁剪、旋转、颜色抖动),得到两个视图。
- 通过编码网络将两个视图映射为向量。
- 设计损失函数,使同一图片产生的两个向量相似,而不同图片的向量不相似。
这样,模型无需人工标签,就能学习到有意义的图像表示。
下一词预测(文本领域)
例如,GPT 系列模型:
- 任务:给定一段文本,预测下一个词/标记是什么。
- 为什么是自监督的?训练数据来自海量无标注文本。通过滑动窗口,上下文作为输入,下一个词作为预测目标,自动构成了数万亿个训练样本。
涌现行为
通过简单的自监督目标(如对比学习、下一词预测)在大规模数据上训练,模型会展现出涌现行为——即未被明确编程或标注的能力。
- 例子:在“我给自己倒了杯___”的预测中,模型学会了“液体”、“可饮用”、“容器”等概念及其关系。
弱监督学习:利用自然存在的配对
有些任务需要连接不同模态的数据(如图像-文本),但获得精确的配对标注成本高昂。
弱监督学习利用自然发生的配对数据:
- 图像-文本:互联网上大量图片附带的描述、标题、ALT文本。
- 视频-音频:电影、视频自然包含的音轨。
- 视频-字幕:电影的内嵌字幕。
- 蛋白质结构-功能:科学文献中自然关联的描述。
多模态嵌入:共享的向量空间
通过在海量的弱配对数据上训练,我们可以将不同模态(图像、文本、音频、视频等)映射到同一个共享的向量空间。
- 例如:在 ImageBind 等模型中,“狗”的文本向量、狗叫的音频向量、狗的照片向量在空间中会非常接近。
- 意义:这使得跨模态检索、生成和理解成为可能(例如,用文字搜索图片或声音)。
总结 🎯
本节课中我们一起学习了:

- 监督学习:通过带有明确标签的数据训练模型。我们深入研究了三个案例(昼夜分类、触发词检测、人脸验证),探讨了数据策略、标注方案、损失函数(如三元组损失)和模型选择的关键决策点。
- 自监督学习:通过设计辅助任务(如对比学习、下一词预测),让模型从无标签数据中自行学习有意义的表示。这催生了强大的预训练模型和涌现能力。
- 弱监督学习:利用自然界中已存在的弱配对数据(如图文配对)来训练模型,特别是用于构建连接不同模态的共享嵌入空间,这是实现多模态AI的基石。


理解这些范式及其应用场景,将帮助你在未来的AI项目中做出更明智的技术选型和架构设计决策。
003:深度学习项目全流程 🚀


在本节课中,我们将一起探讨一个深度学习项目的完整生命周期。与传统的软件工程不同,AI项目涉及代码和数据,而数据中往往充满了未知。因此,深度学习开发是一个高度实验性和迭代的过程。我们将通过构建一个面部识别门禁系统的具体例子,来了解从问题定义到模型部署与维护的各个关键步骤。
概述:AI项目与传统软件项目的区别
传统软件项目中,你编写代码并完全控制其行为。但在AI项目中,除了代码,你还依赖于用于训练算法的数据。你几乎无法预知数据中会包含哪些“奇特”的内容。例如,在构建面部识别系统时,你很难提前知道光照条件、发型、面部表情或眼镜等因素会如何影响系统性能。
因此,机器学习开发更像是一个探索过程:你必须先构建一个系统,观察其表现,然后通过分析发现数据中的问题,并据此调整代码或数据来提升系统性能。这不仅适用于深度学习系统,也适用于基于大语言模型(LLM)的现代AI应用。
项目全流程概览
构建一个有效的深度学习系统,其工作远不止训练模型。一个典型的流程包括以下几个关键步骤:
- 明确问题:定义你要解决的具体问题。
- 获取数据:收集用于训练和评估的数据。
- 设计模型:选择合适的模型架构。
- 训练模型:使用数据对模型进行训练。
- 迭代优化:分析结果,并循环改进模型或数据。
- 部署系统:将训练好的模型集成到实际应用中。
- 监控与维护:持续跟踪系统性能,应对数据分布变化。
接下来,我们将以构建面部识别门禁系统为例,详细探讨这些步骤。
第一步:明确问题与获取数据 🎯

我们的目标是构建一个面部识别系统,用于决定是否为一扇门解锁。例如,应用于家庭或企业办公室,甚至与门禁卡结合使用,防止卡片被盗用。
一个常见的架构是孪生网络。该网络接收两张图片作为输入,其任务是判断这两张图片是否为同一个人。系统部署时,会预先录入授权人员的照片(注册图片)。当有人靠近时,系统会实时拍摄一张照片,并与所有注册图片进行比对,以决定是否放行。
如何快速获取数据?
假设法律不允许从互联网下载数据,作为一家初创公司的CTO,你将如何获取训练数据?以下是一些可能的思路:
- 使用视频流服务(如监控录像或Zoom会议)中的图像。
- 在公共场所(如食堂)架设摄像头,邀请路人自愿拍照。
- 请朋友、家人或同事提供他们的照片。
- 联系学校(如斯坦福)通过邮件征集照片。
核心原则:速度优先。在项目初期,尤其是对于首次接触的应用,快速获取数据、快速训练模型、快速发现问题的迭代速度,是成功的关键预测因素。与其花费数月追求“完美”数据集,不如在一两天内先收集一个“可用”的数据集,开始训练,然后通过错误分析来指导下一步更精准的数据收集工作。当然,如果你有相关经验或文献支持,知道需要特定规模的数据才能奏效,则可以提前进行更大规模的数据投资。
第二步:设计、训练与迭代循环 🔄
在获取初步数据后,我们进入一个核心的快速开发循环:设计模型 -> 训练模型 -> 分析结果,并不断迭代。
模型设计:从简单开始
在部署环节,我们面临一个具体问题:持续将视频流发送到云端进行面部识别可能成本过高或速度太慢。因此,我们需要一个前置的“视觉活动检测”模块,它运行在本地低功耗设备上,用于快速判断摄像头前是否出现了人脸,只有出现人脸时才触发云端的高成本识别。
以下是两种实现VAD的方案:
- 非机器学习方法:检测图像中像素变化的数量是否超过阈值
epsilon。这是一个只需几行Python代码就能实现的简单规则。 - 小型神经网络:训练一个轻量级神经网络来检测是否有人脸出现。
如何选择?再次考虑速度。方案一的实现极其快速(可能只需20分钟),而方案二则需要更多时间(数小时甚至更久)。在实践中,许多团队会从方案一开始,因为它能让你最快地将系统运行起来,并立即观察到真实场景下的问题(例如,风吹动的树叶或路过的小猫可能误触发)。这些发现会为你优化系统(例如转向方案二,或增加“选择清晰帧”的逻辑)提供宝贵的实证依据。
错误分析与数据工程
当模型表现不佳时,关键在于通过错误分析找出问题所在。例如,如果系统难以识别戴帽子的人,那么你就需要收集更多戴帽子的人脸数据。盲目地收集更多“各种”数据通常是低效且昂贵的。成功的AI项目需要系统地设计数据,针对模型表现薄弱的子类别进行有针对性的数据增强或收集。这对于前沿的大语言模型训练同样适用——提升编码能力需要的是高质量的代码相关数据,而非低质量的随机网络聊天数据。
第三步:部署、监控与维护 🛡️
当模型训练满意后,我们需要将其部署为可用的服务。这可能涉及将模型托管在云端,并构建API供应用程序调用。
应对变化的世界:数据漂移与概念漂移
部署后最大的挑战之一是现实世界会不断变化,导致数据漂移(输入数据分布变化)或概念漂移(输入与输出之间的关系变化)。例如:
- 季节变化:冬天人们围围巾,夏天戴太阳镜。
- 地域变化:在加州训练的系统,在德州可能因交通灯样式不同而失效。
- 社会变化:新闻事件、新明星、新产品会导致用户搜索模式改变。
因此,机器学习工程师的工作不仅是让模型在测试集上表现良好,更是要构建一个在现实中持续工作的系统。当系统在实际应用中表现不佳时,不应以“测试集分数高”为借口,而应深入探究原因并修复问题。
建立监控体系
为了应对变化,需要建立监控系统来跟踪关键指标。一个有效的方法是:
- 集体头脑风暴:与团队一起尽可能列出所有可能出错的情况和数据可能变化的方式。
- 创建丰富仪表板:基于这些假设,创建大量监控指标(如:识别延迟、用户重复验证次数、通过/拒绝比率等),并绘制其随时间变化的趋势图。
- 观察与筛选:运行一段时间后,你会发现许多指标很稳定或无趣,从而聚焦到少数几个关键指标上。
- 设置警报:为关键指标设定正常范围,一旦越界便触发警报,以便及时介入调查。
简单模型(如方案一的像素变化检测)由于其规则简单,参数极少,往往对数据漂移更加鲁棒。而复杂的神经网络则更容易过拟合到训练数据的特定分布上,因此在数据分布变化时需要更多的维护和更新。
总结 📝

本节课我们一起学习了深度学习项目的完整生命周期。我们了解到,AI开发是一个高度迭代和实证性的过程,其核心循环是:快速构建、测量结果、分析错误、并针对性地改进(模型或数据)。我们特别强调了执行速度在项目初期的重要性,它能帮助你更快地发现未知问题。此外,部署并非终点,必须建立监控机制来应对真实世界中持续不断的数据变化,并通过定期维护来确保系统长期有效。记住,我们的目标是构建一个在现实中真正工作的系统,而不仅仅是一个在测试集上获得高分的模型。
004:对抗鲁棒性与生成模型 🛡️🎨


在本节课中,我们将要学习两个核心主题:对抗鲁棒性与生成模型。对抗鲁棒性研究如何防御针对AI模型的恶意攻击,而生成模型则探讨如何让AI创造新的内容,如图像、视频和文本。我们将从基础概念出发,逐步深入,确保初学者也能跟上。
对抗鲁棒性 🛡️
上一节我们介绍了课程的两个核心主题。本节中,我们来看看对抗鲁棒性。随着AI模型在日常生活中的应用越来越广泛,它们也更容易受到攻击。因此,主动构建防御机制变得至关重要,这使得对抗攻击与防御成为一个非常活跃的研究领域。
什么是对抗攻击?
对抗攻击是指通过精心设计的微小扰动来“欺骗”AI模型,使其做出错误预测。例如,在图像分类任务中,一个肉眼几乎无法察觉的微小改动,就可能导致模型将“猫”误判为“蜥蜴”。这就像是神经网络的“视觉错觉”。
如何构造对抗样本?
我们可以将构造对抗样本的过程视为一个优化问题。给定一个预训练好的模型,我们的目标是找到一个输入图像 x,使得模型的预测输出 ŷ(x) 尽可能接近我们想要的目标标签(例如“蜥蜴”)。
以下是构造对抗样本的基本步骤:
- 定义损失函数:我们希望最小化模型预测与目标标签之间的差异。一个常见的选择是均方误差(MSE):
L = (ŷ(x) - y_target)² - 固定模型参数:与训练模型时不同,我们不更新模型的权重和偏置。模型是预训练好且固定的。
- 优化输入像素:我们计算损失函数 L 相对于输入图像 x 的像素的梯度。然后,我们使用梯度下降法来更新 x 的像素值,而不是模型参数。
x_new = x_old - α * ∇ₓL - 迭代:重复步骤3,直到模型的预测接近目标标签。
通过这个过程,我们最终会得到一张新的图像 x。对于人类来说,x** 可能看起来像随机噪声或与原图(如猫)略有不同,但对于模型来说,它会被坚定地分类为“蜥蜴”。
更隐蔽的攻击:保持视觉真实性
一个更聪明且危险的攻击者,会希望生成的对抗样本在欺骗模型的同时,对人类来说仍然看起来是正常的。例如,一张看起来明明是“猫”的图片,却被模型识别为“蜥蜴”。
为了实现这一点,我们需要修改优化目标:
- 从真实图像开始:我们不再从随机噪声开始优化,而是从一张真实的“猫”图片 x_cat 开始。
- 修改损失函数:新的损失函数包含两个部分:
- 攻击目标:让预测接近“蜥蜴”标签。
- 真实性约束:让生成的图像 x 与原始猫图 x_cat 保持接近(例如,使用L2距离)。
L_total = (ŷ(x) - y_iguana)² + λ * (x - x_cat)²
其中 λ 是一个超参数,用于平衡攻击强度和视觉相似度。
通过优化这个组合损失函数,我们可以得到一张看起来仍然是猫,但模型会将其分类为蜥蜴的图像。
为什么神经网络容易受到攻击?
一个关键原因是输入数据的高维性。对于一张图片,其像素空间极其巨大。神经网络本质上在高维空间中学习决策边界。攻击者可以精心设计一个扰动向量,该向量在每个像素维度上的改动都很微小(人眼难以察觉),但这些微小的改动在高维空间中会累积起来,对模型的输出产生巨大的、非线性的影响。
一种著名且高效的单步攻击方法是 快速梯度符号法(FGSM):
x_adv = x + ε * sign(∇ₓ J(θ, x, y))
其中:
x_adv是对抗样本。x是原始输入。ε是一个小常数,控制扰动大小。sign(...)是符号函数。∇ₓ J是损失函数 J 相对于输入 x 的梯度。
这个方法的核心思想是,沿着使损失函数增大的梯度方向,对每个像素施加一个微小的扰动(ε 乘以梯度的符号),从而高效地制造出对抗样本。
如何防御对抗攻击?
研究人员提出了多种防御策略:
以下是几种主要的防御方法:
- 对抗训练:在训练过程中,主动将对抗样本(例如用FGSM生成的)加入到训练集中,并赋予其正确的标签。这迫使模型学习对这些扰动不敏感。
- 输入净化/安全网:在模型处理输入之前,先对输入进行检查和预处理,例如检测异常的像素模式或进行平滑处理,以滤除可能的对抗性扰动。
- 输出过滤:对模型的输出进行后处理,例如隐藏或混淆某些输出信息,增加攻击者计算有效梯度的难度。
- 红队测试:组建专门的团队,持续尝试以各种方法攻击自己的模型,从而发现漏洞并加以修复。
- 使用人类反馈的强化学习(RLHF):通过人类对模型输出的偏好进行训练,使模型的行为与人类价值观对齐,这可以在一定程度上抵御某些诱导模型输出有害内容的攻击。
后门攻击与提示注入
除了针对输入的扰动攻击,还有其他类型的攻击:
- 后门攻击:攻击者在训练数据中植入“触发器”(如特定的图案或文本),并将带有触发器的样本错误标注。模型训练后,会学习到“看到触发器就输出特定错误结果”的关联。在部署时,攻击者只需出示触发器,即可激活后门。
- 提示注入:主要针对大语言模型(LLMs)。攻击者通过精心设计的输入提示,试图覆盖或绕过系统预设的指令,从而诱导模型执行非预期的操作(如泄露信息、生成有害内容)。
生成模型 🎨
上一节我们探讨了如何攻击和防御模型。本节中,我们来看看生成模型,它让AI具备了创造力。生成模型的目标是学习真实数据的潜在分布,从而能够生成新的、类似的数据样本,如图像、视频、文本等。
生成对抗网络(GANs)
GANs的核心思想是让两个神经网络——生成器(G) 和 判别器(D)——通过对抗竞争进行学习。
- 生成器(G):接收一个随机噪声向量 z,并尝试生成一张逼真的图像 G(z)。它的目标是“欺骗”判别器。
- 判别器(D):接收一张图像,判断它是来自真实数据集还是生成器生成的假图像。它的目标是准确区分真假。
训练过程是一个“极小极大博弈”:
- 固定G,训练D更好地区分真假。
- 固定D,训练G生成更逼真的图像来欺骗D。
- 交替进行,直到判别器无法可靠地区分真假图像,此时生成器已能生成高质量样本。
生成器的损失函数(非饱和形式,有助于解决训练初期梯度消失问题)可以表示为:
L_G = - E[log(D(G(z)))]
这鼓励生成器生成让判别器给出高分(认为是真)的图像。
判别器的损失函数是一个标准的二元交叉熵:
L_D = - E[log(D(x_real))] - E[log(1 - D(G(z)))]
这鼓励判别器对真实图像给出高分,对生成图像给出低分。
GANs训练不稳定,且可能遇到模式崩溃问题,即生成器只学会生成少数几种样本,无法覆盖全部数据分布。
扩散模型
扩散模型是当前图像和视频生成领域的主流方法。其核心思想是通过一个“去噪”过程来生成数据。
训练过程(前向扩散与去噪学习):
- 前向扩散:对一张真实图像 x₀,逐步添加高斯噪声,经过 T 步后得到几乎完全是噪声的图像 x_T。这个过程是固定的、已知的。
x_t = √(1-β_t) * x_{t-1} + √β_t * ε_t, 其中ε_t ~ N(0, I) - 训练去噪模型:我们训练一个神经网络(通常是U-Net),它接收在时间步 t 的噪声图像 x_t 和时间步 t 作为输入,目标是预测出添加到 x₀ 上的噪声 ε。
L = E[|| ε - ε_θ(x_t, t) ||²]
由于我们在前向扩散中保存了每一步添加的真实噪声ε,因此这是一个有监督学习任务。
采样/生成过程(反向扩散):
- 从纯高斯噪声 x_T 开始。
- 对于从 T 到 1 的每一步 t:
- 用训练好的去噪模型预测噪声:
ε_θ(x_t, t) - 根据预测的噪声和噪声调度参数,计算
x_{t-1}(一个比x_t更清晰的图像)。
- 用训练好的去噪模型预测噪声:
- 重复步骤2,最终得到清晰的高质量图像 x₀。
为了降低计算成本,现代扩散模型(如Stable Diffusion)通常在潜空间中进行操作:
- 使用一个编码器将图像压缩到低维潜变量 z。
- 在潜空间 z 中进行上述扩散和去噪过程。
- 最后使用解码器将去噪后的潜变量 z₀ 重建为图像。
条件生成:通过在对噪声图像 x_t 和时间步 t 输入的基础上,额外输入文本提示的嵌入向量,模型可以学会根据文字描述生成对应的图像。视频生成模型(如Sora)则进一步扩展了这一点,将视频帧在时空维度上 patch 化并编码到潜空间,同时结合文本条件进行训练,从而生成连贯的视频。
总结 📚
本节课我们一起学习了对抗鲁棒性与生成模型两大主题。
在对抗鲁棒性部分,我们了解了:
- 对抗攻击如何通过微小扰动欺骗模型。
- 攻击方法如基于优化的攻击和快速梯度符号法(FGSM)。
- 防御策略包括对抗训练、输入净化和红队测试等。
- 其他攻击形式如后门攻击和提示注入。

在生成模型部分,我们探讨了:
- GANs 通过生成器与判别器的对抗博弈来学习数据分布,但存在训练不稳定和模式崩溃的问题。
- 扩散模型 通过学习和逆转一个逐步加噪的过程来生成数据,其训练更稳定,生成的多样性更好。
- 现代扩散模型通过在潜空间操作来提升效率,并通过条件控制实现基于文本描述的生成。




理解这些原理,将帮助你更好地应用现有的强大生成工具,并为未来构建更安全、更强大的AI系统打下基础。
005:深度强化学习 🎮


在本节课中,我们将学习深度强化学习。我们将首先了解强化学习的基本概念,然后探讨如何将深度学习与强化学习结合,构建能够做出良好决策序列的智能体。课程后半部分将聚焦于一个特定概念——基于人类反馈的强化学习,这是使大型语言模型与人类偏好对齐的关键技术。
概述
强化学习是关于让智能体通过与环境交互,学习做出良好决策序列的学科。与监督学习通过示例教学不同,强化学习通过经验教学。本节课我们将从基础概念开始,逐步构建深度强化学习模型,并探讨其在游戏、机器人控制等领域的应用。
强化学习动机与应用
上一节我们介绍了课程目标,本节中我们来看看强化学习的动机和一些令人印象深刻的应用。
强化学习近年来日益流行。DeepMind团队在《通过深度强化学习实现人类水平控制》这篇著名论文中展示,单一算法可以训练出在超过40-50款Atari游戏中超越人类表现的AI智能体。
后来,你可能听说过AlphaGo。这个算法在围棋游戏中击败并超越了人类表现。围棋是一个比国际象棋更复杂的游戏,从决策可能性和棋盘状态来看都更具挑战性。它在2017年被DeepMind团队解决。
另一篇来自DeepMind的重要论文表明,强化学习也可用于比国际象棋或围棋更复杂的策略游戏,例如涉及多个玩家协作或对抗的游戏。例如《星际争霸》或《Dota》,这些游戏需要长期和短期思考,开发能够协作对抗多个对手的系统非常困难。
最近,在2022年,随着ChatGPT的发布,一篇论文引入了基于人类反馈的强化学习概念,用于将语言模型与人类偏好对齐。我们稍后会讨论这一点。
所有这些都表明,强化学习使我们能够在各种任务中超越人类表现。
监督学习的局限性
第一个例子是围棋游戏。假设要求你用经典的监督学习解决围棋问题。你会收集什么数据?标签是什么?
一个方法是查看大量历史对局,希望是优秀棋手的对局。输入X是棋盘的当前状态,输出Y是棋盘的下一个状态。这本质上是在学习棋手选择的走法。如果对许多对局都这样做,智能体可能会更适应游戏并发展出更好的策略。
这种方法有哪些缺点或可以预见的不足?
首先,你可能无法看到棋盘所有可能的状态空间。围棋是一个双人游戏,玩家轮流在13x13的网格上放置黑白棋子,目标是包围对手的棋子。网格上的每个交叉点都有多种可能性:黑子、白子或空。在13x13的网格上,棋盘状态的可能性数量是天文数字,仅靠职业棋手的历史走法永远无法覆盖所有状态。国际象棋也存在同样问题。
另一个问题是,你甚至不知道某一步棋是否是好棋。也许那步棋并不好,但你却把它当作好棋来学习。其次,你实际上只获得了部分信息,你不知道棋手脑海中的想法和他们试图执行的策略。你只是在观察长期策略中的一个单一示例,不能期望模型猜测长期策略,因为它只是根据输入X和输出Y进行匹配训练。此时模型没有任何策略概念,它只是在每个决策点进行一次性观察。
其他问题还包括真实标签可能定义不清。即使是世界上最好的人类棋手,也不可能每天都下出最佳对局,而且他们的最佳对局也并非绝对真理。这造成了一个问题,因为你本质上是在训练一个与最佳目标存在一定偏差的模型,你永远无法超越最好的人类,而最好的人类也并非每个时刻都存在的最佳可能策略。
即使有一个由世界顶尖棋手组成的专家小组来决定每一步棋,你仍然有一个定义不清的真实标签。游戏状态太多,我们可能无法泛化。当我们遇到一个从未见过的棋盘状态时,因为模型没有接受过策略训练,我们可能会陷入困境。
这是一个强化学习的完美应用场景,因为强化学习就是关于延迟标签和做出良好的决策序列。
强化学习核心概念
如果你要用一句话记住强化学习是什么,那就是:做出良好的决策序列。
另一种看待它的方式是,经典监督学习和强化学习的区别在于:经典监督学习通过示例教学,而强化学习通过经验教学。你不仅仅是向模型展示猫和非猫的图片,而是让模型体验环境,直到它弄清楚哪些是最好的决策并从中学习。
以下是强化学习应用的一些例子:
- 游戏:我们已经讨论过。
- 自动驾驶:在驾驶中,你需要一种动态规划算法来制定策略。
- 机器人控制:教机器人从A点移动到B点,机器人需要为其每个关节的运动做出大量良好决策。
- 广告与营销:公司向你展示多个广告后才促成购买,这需要长期思考,因此有很多强化学习应用于营销、广告和实时竞价过程。
强化学习词汇
现在让我们围绕这个概念建立一些词汇。
在强化学习中,有一个智能体与环境交互。随着智能体与环境交互,它会执行某些动作,我们记为 A_t,其中 t 是时间步。环境会向你展示从时间步 t 转换到时间步 t+1 的状态。因此,在动作 A_t 的作用下,环境可能从状态 S_t 转换到 S_{t+1}。
状态更新发生后,智能体会观察到两样东西:一个观察 O_t 和一个奖励 R_t。智能体的目标当然是最大化奖励。
关于观察需要知道的一点是,有时观察等于状态。为什么我们可能需要两个概念而不是一个概念?为什么拥有状态和观察很重要?
因为在某些情况下,环境可能对用户不完全透明。例如,在国际象棋或围棋中,观察实际上等于状态,你在棋盘上看到所有信息。但在《英雄联盟》或《星际争霸》中,存在“战争迷雾”的概念,你只能看到地图的某些部分,直到你探索了一切或你的队友访问了其他部分。因此,观察实际上比环境状态的信息更少。
最后一个词汇是转换。当我提到转换时,我指的是从状态 t 到状态 t+1 的过程。这意味着我们处于状态 S_t,智能体采取动作 A,观察到 O_t 和奖励 R_t,然后转换到下一个状态 S_{t+1}。
一个实践示例:回收游戏
让我们来看一个强化学习算法的实际例子,并一起推导它。
这个例子叫做“回收有益”,因为它简单且能说明强化学习。假设我们有一个包含五个状态的小环境。有一个用棕色标记的起始状态,即状态2,这是我们的初始状态。
在左侧,你有状态1,这是一个垃圾桶。到达垃圾桶很好,因为你可以把手里的垃圾扔进去。在右侧,你可能会经过状态3(空),状态4(地上有一个巧克力包装纸,捡起来很好),然后到达状态5,那里有一个回收箱,它比垃圾桶更有价值,因为你可以回收,应该为此获得更好的奖励。
这就是我们的游戏。在这个游戏中,我们定义了一个与我们希望智能体学习的行为类型相关的奖励。奖励如下:将垃圾扔进普通垃圾桶奖励+2,捡起巧克力包装纸奖励+1,成功到达回收箱奖励+10。
目标是最大化回报。我们正式定义回报,但可以将其理解为最大化你在此旅程中做出决策时获得的奖励数量。
在这个特定游戏中,我们有五个状态,有三种类型的状态:棕色是初始状态,我们有普通状态,蓝色是终止状态。当你到达强化学习中的终止状态时,通常会结束游戏,结束一个回合。然后你开始另一个回合,回到起始状态或初始状态,重新开始。
我们智能体可能的动作非常简单:左和右。我们将添加一个重要规则:垃圾车三分钟后到达,从一个状态到另一个状态需要一分钟。为什么在游戏中添加这个规则很重要?否则,你可能会在状态3和状态4之间来回走动,收集一堆巧克力包装纸,却永远无法到达回收箱,这不是我们想要的。
长期回报与Q表
我们如何定义长期回报?长期回报将定义为 R,它是带有折扣的奖励总和。折扣是强化学习中一个非常重要的概念,也是一个非常自然的概念。你能想到折扣对人类来说代表什么吗?例如,金钱和时间的价值,或者机器人可能拥有的能量。你宁愿现在得到一美元,而不是十年后,因为存在通货膨胀等因素。强化学习中的折扣也是如此,如果你的策略耗时太长,你需要对其进行折扣,因为你的机器人在执行过程中可能会损失能量。

折扣可以变化,但通常保持在0到1之间。
如果折扣因子 γ 等于1,意味着时间长短无关紧要,只想最大化回报,那么最佳策略是什么?最佳策略是右、右、右,然后总奖励是11。这样我们就到达了终止状态,并获得11的奖励。
现在假设 γ 为0.9,情况会稍微复杂一些。我将引导你完成一个非常简单的算法,它允许我们确定最佳策略,并将数字放入一个矩阵中。例如,我们将定义一个 Q表。
Q代表价值函数,Q学习、Q*等术语都源于Q学习。假设我们有一个Q表,其大小为状态数乘以动作数,在我们的例子中是5行2列。Q表的每个条目本质上代表了在状态 S 采取动作 A 有多好。
如果我们有一个包含这些数字的表格,我们是否就解决了问题?在任意时刻,智能体只需查看表格:我处于状态3,查看第一列会告诉我动作1的价值,查看第二列会告诉我动作2的价值,这样我就有了做出决策所需的一切。这个表格确实是你想要找到的东西。
回溯算法与贝尔曼方程
现在,我们找到这个表格的方法是通过一种回溯算法,将环境编码为一棵树并遍历它。过程如下:我从状态S2开始,面前有两个选择:我可以向左走,获得即时奖励2;或者向右走,获得即时奖励0,并进入状态3。状态3不是终止状态,所以我可以从状态3开始进行同样的操作。在状态3,我有两个选择:向左走,奖励0,进入S2;或者向右走,获得即时奖励+1,进入S4。从S4开始,我又有两个选择:向左回到S3,奖励0;或者向右,获得惊人的奖励+10,并进入终止状态S5。
这是我的即时奖励地图,还不是我的折扣回报。现在我们要做的是回溯这棵树,以计算折扣回报。如果我在S3这里,我看到在S4可以获得即时奖励+1,我想计算当我在S3时能获得的最大回报。在S4,我最多可以获得+10,但我需要对其进行折扣。我的折扣是0.9,所以将10乘以0.9。这告诉我,从S4开始,我可以期望得到9,加上我从S3移动到S4时获得的即时奖励1,我可以将这个数字更新为10。这意味着从S3开始,你能期望的最好折扣回报是10,即 1 + 0.9 * 10。
现在让我们在S2进行同样的操作。在S2,我向左进入S1可以获得即时奖励2,或者向右进入S3可以获得即时奖励0。S1不值得,我们已经知道这一点,因为当我在S3时,实际上可以期望得到10,但我需要对其进行折扣,0.9 * 10 = 9,加上从S2到S3的即时奖励0,这告诉我从状态2(我们的初始状态)开始的折扣回报是9。
这是一个简单的回溯。现在我可以将这些值复制回Q表。我们基本上完成了游戏。此时,我们可以查看某一行,例如我处于状态3,查看Q表的第三行,看到我有两个选择:如果我向左回到S2,最终我的折扣回报将是8.1;如果我向右进入S4,我将得到10,因为我会得到 1 + 0.9 * 10 = 10。
这是一个玩具示例,但它告诉你,如果你能够回溯整个环境,你将能够构建一个庞大的Q表,并可以将其交给你的智能体来做出决策。
策略与贝尔曼最优性方程
强化学习中最重要的概念之一是黑板上的这个方程,称为贝尔曼最优性方程。通常你会看到它记为 Q*(s, a) = r + γ * max_{a'} Q*(s', a')。
让我为你解释这个方程,因为它非常重要。这个方程被称为最优性方程,因为你的最优Q表将遵循这个方程。这个方程可以应用于任何状态-动作对,并且仍然成立。

贝尔曼方程之所以是最优性方程的直觉在于:如果你有完美的Q函数(Q表),并且你处于某个状态 s,执行了某个动作 a,你将观察到一个奖励 r。由于你采取了一个动作,你将处于一个新状态 s',从这个新状态开始,你可以重复刚才的操作。因为你进行了回溯等操作,这个方程将成立,因为它是即时奖励加上折扣乘以你在下一个状态 s' 可以采取的最佳动作的价值。

这完全就是我们刚才所做的回溯。即时奖励加上折扣乘以你在下一个状态 s' 可以采取的最佳可能动作的价值。
我要介绍的最后一个词汇概念是策略。策略是一个函数,给定你的状态,它会告诉你该做什么。在Q学习中,这个策略定义为 argmax_{a} Q*(s, a)。本质上,它说的是:查看表格,查看某个状态 s,你想要的策略(即你应该做什么,这个函数告诉你最佳策略)就是查看所有可能的动作,选择具有最高Q值的那个动作。

这是一个非常简单的例子,但它是Q学习的核心。稍后你将广泛使用策略。虽然有很多强化学习算法,但理解策略这个概念很重要。在Q学习中,策略是给定状态下最佳Q值的argmax,它告诉你采取哪个动作,这是你需要理解的核心内容。
请记住这个贝尔曼方程,因为我们稍后会重用它。

从Q表到深度Q网络
这种方法(Q表)的主要问题是状态和动作空间可能非常庞大。拥有一个通过回溯发现的矩阵,并且每次你想执行一个动作时都必须查找给定状态的可能动作,这变得不可能。想象一下将这个算法用于围棋游戏,那里有如此多的状态和如此多的可能动作(你可以将棋子放在棋盘上的任何位置),你可以想象这个矩阵变得有多大,使用起来有多么不可能。
这就是我们的问题,也是深度学习发挥作用的时候。


我们将稍微不同地构建问题。我们将不再使用Q表,而是利用神经网络是通用函数逼近器这一事实,定义一个本质上是神经网络的Q函数。这个函数可以接受一个状态 s 和一个动作 a,并告诉你该动作在状态 s 下有多好。


因此,不再是在矩阵中查找,你只需在神经网络中进行一次前向传播,它就会给你答案。对于状态和动作很多的游戏来说,这感觉是一个更好的解决方案。
以下是相同的问题陈述:过去我们寻找一个Q表,这次我们将寻找一个神经网络。我们要做的一件事是将输出层定义为有两个输出。给定某个状态作为输入(可以将其视为一个独热编码向量),例如状态2编码为 [0, 1, 0, 0, 0]。如果你将这个状态传递给这个具有多个层的Q函数,它将给出两个输出:一个输出对应 Q(s, 动作右),另一个对应 Q(s, 动作左),因为这是两个动作。如果我们有更多动作,我们只需增加输出层,输出层中可能有更多神经元。
训练深度Q网络
最大的问题是:我们如何训练这个网络?因为我们不是在经典的监督学习中,我们没有标签。这是一个难题,但你会怎么做?鉴于我们没有传统的X和Y对,你将如何训练这个神经网络?记住,一开始这个神经网络会给你垃圾信息,它接受状态 s,可能会告诉你去左边或右边,但这完全是随机的。那么,你将如何调整它,使其能够做出真正好的决策?
我们目前对这个问题的了解有哪些?我们可以利用哪些游戏规则来估计什么是好的?我们拥有的一个东西是每个游戏的奖励结构,这绝对应该用来估计一个好的决策是什么样的。
问题是不是在每个状态你都能看到奖励。如果你看很多围棋对局,你可能在50步之后才能看到奖励。那么在这种情况下你该怎么做?
一种可能性是遍历游戏树,尝试每一个可能的动作,然后回溯。但在围棋中,你可以把棋子放在任何地方。这棵树一开始就有13x13种选择,然后呈指数级增长,这是不可行的。但如果有某些动作比其他动作更可能发生呢?我们真的需要探索整棵树吗?你如何确定哪个动作可能比另一个更好?
我们可以使用期望回报来估计。但如何在不至少遍历一次树的情况下知道期望回报呢?这正是我们将要做的,但我们将使用贝尔曼方程,因为关于这个问题我们知道两件事:我们知道奖励结构,我们也知道完美的Q函数将遵循我们已知的贝尔曼方程。最终,贝尔曼方程应该得到遵守,这意味着对于每个状态,如果你想知道给定动作下该状态的Q值,你将通过查看即时奖励加上折扣乘以从下一个状态开始所有动作中最佳Q值来获得。这个方程将被遵守。这些是我们仅有的信息,我们将大量使用它们来定义我们的标签,并模仿经典的监督学习方法。
我们有一个神经网络,它有 Q(s, 左) 和 Q(s, 右),代表在该状态下向左或向右有多好。我在屏幕右上角粘贴了贝尔曼方程。
我们将定义一个损失函数。为简单起见,因为这些是我们使用的标量值,我们可以使用L2损失(平方损失),它比较某个标签 y 和某个状态某个动作的Q值。我们希望最小化这个损失函数,意味着 y 和给定状态给定动作的Q值尽可能接近。
我们将利用奖励和贝尔曼方程。我们目前没有 y。在监督学习中,你有一张猫的图片,标签是1或0。这里我们没有 y,所以我们必须想出一个好的 y 的估计,实际上比随机更好。假设在此时,当我把状态 s 输入网络时,结果向左的Q值高于向右的Q值。这意味着在那一刻,Q函数告诉我向左比向右更好。这在开始时是随机的,完全随机。
我要做的是使用我观察到的向左的即时奖励,加上折扣项乘以基于我当前Q值在下一步可以采取的最佳动作的Q值,作为我的目标值 y。这非常重要。记住,这个目标是有偏差的,它不是一个完美的目标,但总比没有好。它不仅告诉我们向左有好的奖励,我们应该考虑这可能是一步好棋,因为我们看到了即时奖励,而且除此之外,我们还知道在训练结束时,Q值应该遵循贝尔曼方程。所以我们为什么不将目标设为贝尔曼方程呢?
因此,我们加上当你处于下一个状态时的折扣最大未来奖励。你处于状态 s,你向左走,现在你处于下一个状态 s'_左。你再次查看你的Q值并选择最好的一个,然后在这里加上那个数字。

在这个过程中实际上有两个前向传播路径。一个前向传播路径是你将状态 s 输入Q网络,查看向左和向右两个选项,然后你决定向左。然后你将这个值与目标 y 进行比较。但为了得到目标 y,我需要进行另一个前向传播:我采取向左的动作,执行它,得到一个下一个状态 s',我将这个 s' 输入Q网络,查看我拥有的两个选项,选择最好的一个,并在这里加上它(乘以折扣)。


根本上发生的是:我们有一个在开始时随机的Q网络,它从未观察过奖励,我们只知道在某个时刻它会达到一个完美的Q函数。但我们目前能做的最好的是说,作为
006:AI项目策略 🚀


在本节课中,我们将继续探讨AI项目策略。我们将通过两个具体的项目示例——构建一个语音激活设备和一个AI研究助手——来模拟在开发AI系统时可能遇到的真实场景。你将学习如何做出日常决策,例如如何收集数据、如何调试模型以及如何高效地迭代,这些技能对于项目的成功至关重要。
构建语音激活设备示例 🎤
上一节我们概述了课程目标,本节中我们来看看第一个具体项目:构建一个无需复杂Wi-Fi设置的语音控制台灯。假设这个台灯的名字叫“Robert”,用户只需说“Robert turn on”或“Robert turn off”即可控制它。
项目启动与文献调研
当你开始这样一个项目时,首要任务通常是进行文献调研。AI领域有大量的开源代码和研究论文,快速浏览多篇文献,而不是精读每一篇,能帮助你更快地找到最相关、最有效的架构和方法。此外,在完成初步工作后,礼貌地联系相关领域的专家寻求建议,也能显著加速你的学习过程。
数据收集策略
由于不存在现成的“Robert turn on”语音数据集,你需要自己收集数据。一个高效的方法是直接请求人们录制他们的语音,并明确告知用途以获得许可。虽然合成数据(如文本转语音)是一个选项,但它通常不是首选,因为合成数据与真实语音的分布可能存在差异,引入更多不确定性。
以下是一种将有限原始数据转化为大规模训练集的具体方法:
- 录制约100个长音频片段,其中包含“Robert turn on”的语音。
- 从每个长片段中滑动截取多个3秒的窗口。
- 将恰好包含“Robert turn on”结束时刻的窗口标记为正例(标签1),其余窗口标记为负例(标签0)。
通过这种方法,100个原始音频可以生成数千个训练样本。代码逻辑如下:
# 伪代码示例:从长音频生成训练窗口
for audio_clip in raw_audio_clips:
windows = sliding_window(audio_clip, window_size=3_seconds)
for window in windows:
if contains_phrase_end(window, phrase="Robert turn on"):
label = 1
else:
label = 0
training_examples.append((window, label))
处理不平衡数据集与过拟合
在实际训练中,你可能会遇到模型准确率很高(如97%),但却是通过始终预测“0”(即从未检测到指令)来实现的。这表明你的数据集严重不平衡,正例太少。
以下是几种解决不平衡问题的策略:
- 复制正例:在训练集中多次复制正例样本。
- 调整损失函数:在损失函数中给正例预测错误分配更高的权重。
- 减少负例:随机丢弃一部分负例样本(但可能会降低数据多样性)。
- 扩展正例窗口:不将正例严格定义为指令结束的瞬间,而是扩展为一个时间段(如指令结束后的0.5秒内),这能自动生成更多样化的正例。
如果模型在训练集上表现良好,但在开发集上表现不佳,则可能是过拟合。此时,可以尝试使用正则化技术或收集更多数据。对于语音识别,一种有效的合成数据方法是:将干净的“Robert turn on”录音与各种背景噪音(如空调声、咖啡馆嘈杂声)的音频波形相加,从而生成大量带背景噪音的训练样本。
迭代速度的重要性
AI项目的开发更像是一个调试过程:构建系统,发现它为何不工作,修复问题,然后重复。团队的迭代速度是决定竞争力的关键因素。一个能每天完成“训练-分析-修复”循环的团队,其产品性能随时间提升的速度,将远远超过迭代速度慢的团队。
构建AI研究助手管道示例 🔍
现在,我们来看一个更复杂的系统:一个能查询网络并生成研究报告的AI助手。这类系统通常是一个由多个组件串联而成的“管道”。
一个基础的研究助手管道可能包含以下步骤:
- 接收用户查询(如“展示关于黑洞的最新研究”)。
- 使用大语言模型(LLM)根据查询生成搜索关键词。
- 将关键词发送给网络搜索引擎。
- 获取返回的URL列表。
- 使用LLM筛选出最相关、最权威的网页进行抓取。
- 将抓取的网页内容输入给LLM,生成最终的研究报告。
管道系统的误差分析
对于这种多组件的管道,当整体性能不佳时,关键在于确定应该优化哪个组件。盲目地优化所有部分效率极低。
你需要进行系统性的误差分析:
- 收集一批(如20-100个)表现不佳的查询案例。
- 人工检查管道中每个中间步骤的输出。
- 记录下每个步骤出现问题的频率。
例如,你可以创建一个表格:
| 查询 | 生成的搜索词是否满意? | 搜索引擎结果是否满意? | 选择的抓取页面是否满意? | 最终报告是否满意? | 备注 |
|---|---|---|---|---|---|
| 黑洞研究 | 是 | 是 | 否 | - | 漏掉了NASA.gov,选择了非权威博客 |
| 租房还是买房 | 否 | - | - | - | 生成的搜索词不相关 |
| ... | ... | ... | ... | ... | ... |
通过分析,你可能会发现70%的问题出在“选择抓取页面”这一步,而只有5%的问题与搜索引擎本身有关。那么,你的优化精力就应该集中在改进页面筛选逻辑上,而不是尝试更换搜索引擎。这种有针对性的误差分析能避免团队浪费数周甚至数月的时间在错误的方向上。

总结 📝

本节课我们一起学习了AI项目开发中的核心策略。我们通过语音激活设备项目,探讨了从文献调研、数据收集与增强,到处理类别不平衡和过拟合等实际问题。随后,通过AI研究助手项目,我们学习了如何对多组件管道进行系统性的误差分析,以确定性能瓶颈并优先处理最关键的部分。掌握这些快速迭代、数据驱动决策和系统性调试的技能,是高效推进AI项目、在竞争中取得优势的关键。
007:增强大型语言模型应用 🚀



概述
在本节课中,我们将学习如何超越基础的大型语言模型,探索一系列增强其性能和应用能力的技术。我们将从提示工程开始,逐步深入到微调、检索增强生成以及构建自主的智能体工作流,旨在为你提供一个全面的工具箱,以便在实际项目中最大化LLM的效用。

1. 增强LLM的挑战与机遇 🤔
上一节我们介绍了课程的整体目标,本节中我们来看看增强大型语言模型所面临的核心挑战和机遇。
仅使用基础预训练模型存在诸多限制。以下是典型问题:
- 缺乏特定领域知识:模型可能未在特定领域(如农业病害识别)的数据上进行训练。
- 数据分布差异:模型在高质量数据上训练,但现实世界的数据质量可能参差不齐。
- 信息过时:模型训练数据存在截止日期,无法获取最新信息(如网络新词、时事)。
- 特定任务性能不足:模型虽知识广博,但在需要高精度、低延迟的企业级特定任务上可能表现不佳。
- 模型臃肿低效:为使用其2%的能力,却需要运行整个庞大模型。
- 难以控制:模型可能输出不符合社会规范或带有偏见的内容,控制其行为极具挑战性。
- 缺乏溯源能力:模型难以提供其回答所依据的具体来源,这在医疗、法律等领域至关重要。
- 风格与格式不一致:在需要严格遵循特定格式(如法律合同)的领域表现不佳。
- 上下文处理能力有限:模型的上下文窗口大小有限,难以处理超长文档或大量数据。
为了应对这些挑战,我们可以从两个维度思考改进LLM:一是提升基础模型本身(如从GPT-3.5升级到GPT-4),二是通过工程方法最大化现有模型的性能。本课程重点在于后者。
2. 提示工程方法 ✍️


上一节我们探讨了增强LLM的必要性,本节中我们将深入第一种优化方法:提示工程。
研究表明,经过提示工程培训的团队,在使用AI时能获得最佳绩效提升。提示工程不是一门独立的职业,而是一项每个人都应掌握的关键技能。

基础提示设计原则
一个简单的提示如“总结这份文档”可以大幅改进。例如:“用五个要点总结这份关于可再生能源的10页科学论文,重点关注关键发现及其对政策制定者的启示。”这个改进后的提示明确了受众、格式和焦点。
以下是优化单次提示的几种技巧:
- 提供示例:在提示中给出一个优秀输出的例子。
- 设定角色:使用“扮演…”句式,例如“扮演一位在达沃斯发表演讲的可再生能源专家”。
- 反思与批判:让模型生成输出后,再让其进行自我批判和修改。
- 思维链:鼓励模型逐步思考,将任务分解为明确的步骤。

零样本提示 vs. 少样本提示
- 零样本提示:不提供任何示例,直接要求模型完成任务。例如:“将这句话的语气分类为积极、消极或中性。”对于“产品还行,但我期望更高”这种句子,分类可能具有主观性。
- 少样本提示:在提示中提供几个示例,以对齐模型与你的期望。例如,在分类任务前,先给出几个已标注的例子。这能有效引导模型遵循你的分类标准。
提示链
将复杂任务分解为多个步骤,并通过链式调用串联起来,这比单一复杂提示更具优势。

示例:客户服务回复
- 单步提示:“阅读这条客户评论,并撰写一封专业的回复,承认其担忧、解释问题并提供解决方案。”
- 链式提示:
- 提示1:提取客户评论中提到的关键问题。
- 提示2:基于这些问题,起草回复大纲,要求承认担忧、解释原因、提供解决方案。
- 提示3:根据大纲撰写完整的专业回复。
链式提示的优势在于便于调试和优化。你可以独立测试每个步骤,找出性能瓶颈所在。
测试与评估提示
评估提示效果至关重要。初期可以进行人工评估,比较不同提示或工作流生成的输出。
为了规模化测试,可以使用自动化平台。一种有效的方法是引入LLM评委:
- 成对比较:让一个LLM判断两个输出中哪个更好。
- 单答案评分:让LLM根据给定的评分标准(如1-5分)对单个输出进行评分。
- 参考引导的成对比较:在提供参考标准的情况下进行比较。
- 基于量规的评分:提供详细的评分量规,让LLM评委依据量规打分。
3. 模型微调 ⚙️

上一节我们学习了不修改模型参数的提示工程方法,本节中我们来看看如果需要对模型“动手术”——即进行微调,会是怎样的情况。
尽管提示工程强大,但在某些情况下微调仍有价值。不过,需要谨慎对待微调,原因如下:
- 需要大量标注数据。
- 可能导致模型过拟合,丧失通用能力。
- 耗时且成本高昂。最大的问题在于,当你完成微调时,新一代的基础模型可能已经发布,其性能甚至超过了你的微调版模型。


因此,应尽可能避免微调。提示工程方法允许你直接替换为更新的基础模型,立即获得性能提升。

微调可能适用的场景包括:需要持续高精度输出的任务(如法律、科学解释),以及通用LLM在处理特定领域术语时存在困难的情况。
一个有趣的例子是,有人尝试用公司内部的Slack消息微调模型,希望模型能像员工一样交流。结果模型学会了“摸鱼”和推脱,而不是有效执行指令,这凸显了微调的风险。
4. 检索增强生成 🧠
上一节我们讨论了修改模型内部参数的微调,本节中我们转向另一种外部增强方法:检索增强生成。


RAG通过整合外部知识源(数据库、文档、API)来增强LLM,使其回答更准确、更新及时、有据可查,且无需重新训练模型。
RAG的工作原理
- 知识库准备:将文档通过嵌入模型转换为向量表示,并存入向量数据库。
- 查询处理:当用户提出查询时,同样将其转换为向量。
- 检索:在向量数据库中查找与查询向量最相关的文档片段(基于向量距离)。
- 增强生成:将检索到的相关文档与原始查询一起,放入一个精心设计的提示模板中,交给LLM生成最终答案。提示模板可要求模型注明答案出处。
进阶RAG技术
基础RAG在处理超长文档时可能遇到困难。研究人员提出了多种改进方法:
- 分块:将大文档分割成更小的、有意义的块(如按章节),并分别存储和检索。
- 假设性文档嵌入:先根据用户查询生成一个“假设”的答案文档,将其嵌入,然后用这个嵌入向量去检索真实文档。这有助于解决查询表述与文档内容不匹配的问题。
RAG领域的研究分支繁多,上述只是其中两种。核心思想是,RAG是一种在模型外部动态提供相关知识的技术。
5. 智能体工作流 🤖
上一节我们介绍了如何为LLM注入外部知识,本节中我们将探索如何让LLM从执行单一任务,扩展到处理多步骤的自主工作流,即智能体AI。
Andrew Ng将这一趋势称为“智能体工作流”,它本质上是将提示、工具、API调用等资源组合成一个多步骤流程。

从单步到多步:示例
- 单步(RAG):用户问:“你们的退款政策是什么?” 模型直接检索政策文档并回答。
- 智能体工作流:用户说:“我能为我的订单退款吗?” 智能体:1) 检索退款政策;2) 向用户索要订单号;3) 调用API查询订单详情;4) 确认是否符合退款条件并告知用户处理时间。
思维范式转变
构建智能体软件需要从确定性思维转向模糊性思维,并像管理者一样思考:
- 确定性 vs. 模糊性:传统软件处理结构化数据,流程确定;AI软件需处理自由格式的文本/图像,进行动态解释,容错和防御攻击的要求更高。
- 管理者思维:设计智能体工作流时,思考如果让一群人类完成这个产品,需要哪些角色(如设计师、营销经理、数据分析师),然后将这些角色对应为智能体或工具。
智能体的核心组件
一个智能体通常包含以下部分:
- 提示:优化过的指令。
- 上下文/记忆管理:
- 工作记忆:快速访问,存储当前对话相关的信息(如用户姓名)。
- 归档记忆:长期存储,访问较慢,存储历史信息(如用户生日)。
- 工具:智能体可以调用的API或函数(如航班搜索API、支付处理API)。
- 资源:智能体可以访问的数据源(如CRM系统)。
智能体可以具有不同级别的自主性:
- 低自主性:硬编码每个步骤。
- 中等自主性:硬编码可用工具,让智能体自行决定使用顺序。
- 高自主性:智能体自行决定步骤,甚至能创建新工具(如编写代码进行计算)。

模型上下文协议
MCP是一种旨在简化LLM与外部工具/数据源通信的协议。与为每个API单独编写调用说明相比,MCP提供了一种更标准化、可扩展的交互方式,允许智能体通过对话了解如何从MCP服务器获取所需信息。
6. 评估案例研究 📊

上一节我们设计了智能体工作流,本节中我们通过一个案例来探讨如何评估其是否有效工作。
案例:构建一个客户支持AI智能体,处理用户请求:“我需要更改订单#12345的送货地址,我搬新家了。”
设计流程
- 任务分解:模拟人类客服的工作流:提取信息 -> 数据库查询 -> 检查政策 -> 起草回复邮件 -> 发送邮件。
- 工作流设计:将分解后的任务映射到相应的技术组件(LLM、工具、记忆等)。

如何评估与改进
拥有LLM调用链的追踪能力对于调试至关重要。评估可以从多个维度进行:
- 端到端 vs. 组件级:既可以评估整体用户满意度,也可以单独评估每个组件(如信息提取、数据库更新、邮件草稿)的性能。
- 客观 vs. 主观:
- 客观指标:如“LLM是否提取了正确的订单ID?”可以通过代码自动检查。
- 主观指标:如“回复邮件的语气是否友好?”可以通过人工评分或LLM评委来评估。
- 定量 vs. 定性:
- 定量:成功率、延迟时间等。
- 定性:通过错误分析,查看幻觉、语气不匹配、用户困惑的具体案例。
通过混合使用这些评估方法,可以系统地定位问题并持续改进智能体工作流。
7. 多智能体工作流 👥
上一节我们评估了单个智能体,本节中我们来看看为什么以及如何构建多智能体系统。

当任务需要并行处理,或者希望复用已构建好的专用智能体时,多智能体系统就显示出优势。

示例:智能家居自动化
思考你需要为智能家居构建哪些智能体。可能的想法包括:
- 气候控制智能体
- 照明智能体
- 安全智能体
- 能源管理智能体
- 娱乐智能体
- 通知智能体
- 编排智能体(负责与用户交互并协调其他智能体)
多智能体系统的组织方式可以是扁平的(各智能体可直接通信),也可以是分层的(通过一个中央编排器协调)。智能体间的通信可以借鉴MCP协议。
多智能体工作流的优势包括便于调试、实现并行化以提升效率,以及促进智能体的专业化与复用。
8. AI未来展望 🔮
在本节课的最后,我们一起展望一下人工智能领域可能的发展趋势。
- 性能会停滞吗? 根据缩放定律,增加算力和数据能持续提升模型性能,但最终可能遇到瓶颈。未来的突破可能来自架构搜索,发现比Transformer更高效的模型结构。
- 多模态融合:整合文本、图像、音频、视频等多种模态的信息,能使得AI系统对世界的理解更加全面和深入,不同模态间的能力可以相互促进。
- 多种学习范式协同:人类的学习是监督、无监督、强化学习等多种方式的混合。未来的AI系统也可能综合运用这些范式,以达到更高效、更通用的学习效果。
- 类脑与非类脑研究并行:既有受人类大脑启发的研究(探寻生物神经网络的工作原理),也有不受生物学限制、纯粹追求计算效率的研究。两者都可能带来突破。
- 快速迭代的领域:AI技术迭代速度极快。掌握核心概念的广度,并保持快速深入学习特定新技能的能力,比死记硬背当前的最新技术细节更为重要。

总结
本节课中,我们一起学习了增强大型语言模型应用的全套技术栈。我们从基础的提示工程(零样本/少样本提示、思维链、提示链)出发,探讨了模型微调的利弊,深入了解了检索增强生成的原理。接着,我们进入了智能体AI的世界,学习了如何设计包含记忆、工具和资源的多步骤工作流,并通过案例研究了如何评估这些系统。最后,我们展望了多智能体协作以及AI未来的发展方向。希望这门课为你提供了足够的知识广度,让你在未来能够自信地深入任何需要的技术方向。
008:AI职业建议 🚀


在本节课中,我们将探讨在人工智能领域构建职业生涯的机遇与策略。课程将分为两部分:首先,吴恩达教授将分享他对当前AI行业趋势的见解;随后,特邀嘉宾劳伦斯·莫罗尼将深入分析就业市场现状,并提供实用的求职与发展建议。
第一部分:吴恩达教授的分享
今天我想和大家聊聊在AI领域的职业建议。往年我通常独自完成这部分讲座,但今天我打算先分享几点想法,然后邀请我的好友劳伦斯·莫罗尼来演讲。他专程从西雅图来到旧金山,将为我们分享他所观察到的广阔就业市场前景以及在AI领域发展的技巧。
前所未有的机遇 🎯
在交给劳伦斯之前,我想分享一个观点:现在绝对是投身AI、构建AI事业的最佳时机。

几个月前,社交媒体或传统媒体上出现了一些疑问:AI的发展是否在放缓?GPT-5有那么好吗?我认为它确实相当不错。但人们之所以提出这个问题,部分原因在于AI的基准是100%的完美答案。当你取得快速进展时,在某些点上你无法超越100%的准确率。
然而,最影响我思考的一项研究来自METR组织。他们研究了随着时间的推移,AI能够完成的任务的复杂性是如何变化的,其衡量标准是人类完成该任务所需的时间。几年前,也许GPT-2能完成人类只需几秒钟的任务,然后是四秒、八秒、一分钟、两分钟、四分钟等等。研究估计,AI能处理的任务时长每七个月翻一番。我认为,从这个指标来看,我对AI将持续进步感到乐观。以人类完成某件事所需时间来衡量的任务复杂性正在快速翻倍。同一项研究还指出,AI编码能力的翻倍时间甚至更短,大约70天。过去需要我10分钟、20分钟编写的代码,AI现在能完成得越来越多。
更强大与更快速的双重主题 ⚡
我认为现在是一个黄金时期,原因主要有两个主题:更强大和更快速。
在座的各位现在都能构建比地球上任何人在一年前所能构建的更强大的软件,这得益于AI构建模块,包括大模型、检索增强生成、工作流、语音AI,当然还有深度学习。事实证明,许多大语言模型对深度学习有基本的理解。如果你提示前沿模型为你实现一个Transformer网络,它在帮助你快速使用这些构建模块方面做得相当不错。因此,我们现在拥有非常强大的构建模块,这些在一两年前要么非常困难,要么根本不存在。你现在可以构建地球上其他人,甚至是技术最先进的人都无法完成的软件。
同时,借助AI编码,你编写软件的速度比以往任何时候都快得多。我个人发现,紧跟工具前沿非常重要,因为AI编码工具变化非常快。我感觉自从几个月前,我个人最喜欢的工具变成了Claude Code,取代了早期的一些工具。自从GPT-5发布以来,我认为OpenAI Codex也取得了巨大进步。今天早上,Gemini 3发布了,我今早玩了一下,似乎又是一个巨大的飞跃。所以,如果你每三个月问我一次我最喜欢的编码工具是什么,答案很可能会改变,肯定每六个月会变,甚至可能每三个月就变。我发现,在这些工具上落后半代,就意味着生产力会明显下降。我知道大家都在说AI或工程发展得如此之快,但在AI的所有领域中,AI编码工具是进步速度惊人的一个领域。使用最新一代的工具,而不是落后半代,能让你更高效。
产品管理的瓶颈 📈
随着我们构建更强大软件和更快构建软件的能力增强,我现在比一两年前更强烈地给出的一条建议是:直接去构建东西。在斯坦福上课,参加在线课程,此外,你构建东西并向他人展示的机会比以往任何时候都大。
但这带来了一个可能尚未被广泛认识到的奇怪影响:产品管理的瓶颈。当从清晰的软件规格说明到代码变得越来越容易时,瓶颈就越来越转向决定构建什么,或者越来越转向为你真正想要构建的东西编写清晰的规格说明。
当我构建软件时,我经常想到一个循环:编写一些软件,编写一些代码,展示给用户以获得反馈。我认为这是产品经理的工作。然后根据用户反馈,修正我对用户喜欢什么、不喜欢什么、哪些功能太难、他们想要什么功能、不想要什么功能的看法,改变我对要构建什么的想法,然后多次循环,希望迭代出用户喜爱的产品。
由于AI编码,构建软件的过程变得比以前便宜和快速得多。但这讽刺性地将瓶颈转移到了决定构建什么上。
工程师与产品经理角色的融合 👥
因此,我看到一些奇怪的趋势。在硅谷和许多科技公司,人们经常谈论工程师与产品经理的比例。这些比例需要谨慎看待,因为它们差异很大。你会听到公司谈论工程师与产品经理的比例大约是4:1或7:1或8:1,意思是一个产品经理编写产品规格说明可以让大约4到8个工程师保持忙碌。但由于工程速度加快,而产品管理受AI加速的程度不如工程,我看到工程师与产品经理的比例呈下降趋势,甚至可能达到2:1或1:1。我合作的一些团队提议的比例是1个产品经理对1个工程师,这几乎不同于所有传统硅谷公司的比例。

我看到的另一件事是,工程师也可以塑造产品,并且可以行动得非常快。更进一步,将工程师和产品经理的角色融合到一个人身上。我发现,那些喜欢做工程工作、不喜欢与用户交谈和进行更具人文同理心方面工作的工程师,与那些学会与用户交谈、获取反馈、培养对用户的深刻同理心从而能够决定构建什么的工程师相比,后者是我目前在硅谷看到的发展最快的人群。
在我职业生涯的早期阶段,我多年来一直后悔的一件事是,在我担任的某个角色中,我曾试图说服一群工程师做更多的产品工作,结果让一些非常优秀的工程师因为不擅长产品管理而感到难过。那是一个我后悔多年的错误,我本不应该那样做。
现在,我感觉自己又在重复那个完全相同的错误。话虽如此,我发现,我既能编写代码,又能与用户交谈以确定方向,这让我和能做到这一点的工程师行动速度快得多。因此,也许值得重新审视工程师是否能多做一点这方面的工作,因为如果你不等待别人将产品带给客户,你只需编写代码,凭直觉决定下一步做什么并迭代,这种执行速度会快得多。
人际网络的重要性 🤝
在交给劳伦斯之前,我想分享的最后一点是:在规划职业生涯方面,我认为对你学习速度和成功水平最强的预测因素之一是你周围的人。我们都是社会性生物,从周围的人身上学习。社会学研究表明,如果你的五个最亲密的朋友是吸烟者,你成为吸烟者的几率会高得多。虽然我不知道是否有研究表明,如果你的五个或一个最亲密的朋友是真正努力工作、有决心、快速学习、试图用AI让世界变得更美好的人,你更有可能也这样做,但我认为这几乎是肯定的。




我们所有人都受到周围人的启发。如果你能找到一群优秀的人一起工作,那将推动你前进。事实上,在斯坦福,我感到非常幸运,这里有优秀的学生群体和杰出的教职员工。我认为我们在斯坦福拥有的另一件幸运之事是紧密的联系网络。坦率地说,许多在尖端AI实验室工作的人,都是斯坦福不同教授以前的学生。因此,这种丰富的联系网络意味着,在斯坦福,我们经常能了解到很多尚未广为人知的事情,这得益于人际关系和友谊。当某家公司做了某事,我的教职员工朋友会打电话给该公司的人询问具体情况。这种丰富的联系网络意味着,当我们努力推动朋友前进时,朋友也用知识和联系网络以及AI前沿技术(不幸的是,这些并非全部在互联网上公开)来推动我们前进。

因此,当你在斯坦福时,请结交朋友,建立这种丰富的联系网络。很多时候,坦率地说,当我考虑进入某个技术方向时,我会与真正接近研究的人(无论是斯坦福的研究人员还是前沿实验室的人)打一两个电话,他们会分享一些我以前不知道的事情,这会改变我为项目选择技术架构的方式。我发现,你周围的朋友群体,那些“试试这个”、“别做那个”、“忽略那个公关”、“实际上别试那个东西”的小建议,对你引导项目方向的能力有很大影响。所以,在斯坦福期间,请利用好这种联系网络。斯坦福拥有的这种联系网络实际上非常独特。世界上有很多伟大的大学,但在当前这个时刻,我真的认为世界上没有哪所大学能像斯坦福这样,拥有如此丰富的联系网络连接到所有领先的AI领域。

但对我来说,我们也很幸运能在这里与一个优秀的人群社区一起工作和学习。
选择团队而非公司品牌 🏢
对于你们来说,如果申请工作,对你的职业成功更重要的事情是,如果你去一家公司,重要的是你每天与之共事的人。这里有一个我告诉过上一届学生并重复的故事:多年前我认识的一位斯坦福学生,他在斯坦福做得很好,我认为他是个佼佼者。他申请了一家公司的工作,并得到了这家拥有热门AI品牌的公司的工作机会。这家公司拒绝告诉他他将加入哪个团队。他们说,先来签工作合同,有一个轮换系统、匹配系统等等,先签了字,然后我们再为你找个好项目。部分原因是因为这是一家好公司,他的父母为他能进入这家公司感到自豪。他没有加入这家公司,希望能从事令人兴奋的AI项目。签了合同后,他被分配到公司的后端Java支付处理系统工作。


我并不是说做Java后端支付处理系统不好,我认为它们很棒,但这是一位AI学生,没有被匹配到AI项目。因此,大约一年时间里他非常沮丧,大约一年后他离开了这家公司。不幸的是,我在几年前在CS230讲过这个故事。然后,在我已经在这个课上讲过这个故事几年后,CS229的另一位学生与同一家公司经历了同样的经历,虽然不是Java后端支付处理,但是另一个项目。我认为,努力弄清楚你每天实际将与谁共事,并确保你周围是能激励你、从事令人兴奋项目的人,这很重要。坦率地说,如果一家公司拒绝告诉你将被分配到哪个团队,这确实让我怀疑会发生什么。
我认为,与其为品牌最热门的公司工作,有时如果你找到一个真正优秀的团队,里面有非常努力、知识渊博、聪明、试图做优秀AI的人,即使公司品牌不那么热门,这通常意味着你实际上能学得更快,职业发展得更好。毕竟,我们不是从走进公司大门时公司标志带来的兴奋感中学习,而是从每天打交道的人身上学习。
因此,我敦促你们将其作为选择过程、决定做什么的巨大标准。我认为,我建议的第一点是,现在比以往任何时候都更容易更快地构建强大的软件。这意味着要负责任,不要构建伤害他人的软件。同时,你们每个人都可以构建很多东西。我发现,世界上的想法数量远远多于有能力构建它们的人。我知道,对于应届大学毕业生来说,找工作变得更难了,但同时,很多团队就是找不到足够有技能的人。
世界上有很多项目,如果你不构建它,我认为也没有其他人会构建它。所以,只要你不伤害他人,负责任地去做,有很多事情你不需要等待许可,不需要等待别人先做。失败的成本比以前低得多,因为你浪费了一个周末但学到了东西,这对我来说似乎没问题。因此,我认为,只要你负责任,尝试并构建很多东西,将是帮助你们职业生涯最重要的事情。

关于努力工作的思考 💪
我想说的最后一件事是,在某些圈子里,这可能被认为在政治上不正确,但我还是要说:在某些圈子里,鼓励他人努力工作已变得在政治上不正确。
我要鼓励你们努力工作。我认为有些人不喜欢这一点的原因是,有些人正处于生活中的某个阶段,无法努力工作。例如,我的孩子出生时,我在短时间内没有努力工作。有些人因为受伤、残疾或其他非常正当的原因,在那一刻无法努力工作,你应该尊重他们,支持他们,确保他们得到很好的照顾,即使他们没有努力工作。
话虽如此,我所有非常成功的博士生,我看到他们每个人都工作得非常努力。凌晨两点坐着进行超参数调整,我经历过,现在有时仍然这样做。如果你有幸处于生活中可以努力工作的位置,现在有如此多的机会去做事情。如果你像我一样兴奋,利用晚上和周末编码、构建东西、获取用户反馈,如果你投入并做这些事情,它将增加你成功的可能性。所以,也许我会因为鼓励你们努力工作而惹上一些麻烦,但我发现事实是,努力工作的人能完成更多事情。当然,我们也应该尊重那些不处于能够努力工作位置的人。但在看一些无聊的电视节目和周末编写代理代码尝试某事之间,我几乎每次都会选择后者,除非有时我也会看电视节目,但我希望你们也这样做。
好了,以上就是我想说的主要内容。现在我想把讲台交给我的好友劳伦斯·莫罗尼,他将分享更多关于AI职业建议的内容。简单介绍一下,劳伦斯和我认识很久了,他做了很多在线教育工作,有时和我的团队合作,教了很多人TensorFlow,教了很多人PyTorch。他在谷歌担任了多年的首席AI倡导者,现在在OpenAI领导一个团队。我也很喜欢他的几本书,这是他最近出版的一本关于PyTorch的新书,这是一本优秀的PyTorch入门书,他在许多圈子里都是非常受欢迎的演讲者。所以当他同意来为我们演讲时,我非常感激。
第二部分:劳伦斯·莫罗尼的分享
大家好,我是劳伦斯。很高兴来到这里。我想先强调一下吴恩达教授早些时候谈到的一点:选择与你共事的人非常重要。但我也想从另一个角度说明,公司在面试你时也在选择你,好的公司真的也想选择他们愿意共事的人。



过去18个月里,我指导了很多寻找职业的年轻人。我想讲一个年轻人的故事。这个小伙子受过良好教育,经验丰富,编码能力超强。他能应对面前的每一个挑战。他在四月份被裁员了,他从事医疗软件工作,而医疗软件业务发生了巨大变化,联邦政府在多个领域削减了资金,他被裁员了。以他的经验、能力和技能,他认为再找一份工作会非常容易。但这个可怜的小伙子四月份过得很糟糕,他被裁员前不久,女朋友和他分手了,几周后,他的狗死了。所以他状态不好。
几个月后,我和他坐下来看了看,他有一个申请工作的电子表格,里面追踪了300多个工作。其中一些工作,他实际上进入了面试流程,并且在一些公司面试得很深入,比如Meta、微软和其他一些大型科技公司,进行了很多轮面试。每次到了最后阶段,他知道自己面试得很好,解决了所有编码问题,与人们进行了很好的交谈,至少他认为如此。然后每次在一天内,招聘人员就会打电话给他说:不,你没有得到这份工作。这令人心碎。正如我所说,他追踪了300多个工作。

我开始和他一起进行模拟面试,做一些调整。哦,是杰夫·贝佐斯的公司,不是亚马逊,是另一家他面试过的大型科技公司。我开始和他一起工作,进行测试面试等等。他是一个非常出色的候选人,我无法弄清楚问题出在哪里。
直到我决定尝试进行一种不同的面试,我给了他一个非常棘手的面试,我给了他一些困难的LeetCode问题,给了他一些编码中非常晦涩的边界情况,然后观察他的反应。他的反应方式是根据招聘手册中给他的建议。很多招聘手册会说:你将有机会分享意见,你必须坚持立场,必须有主见,不要屈服。他对这一点的理解是变得非常、非常强硬。
所以我会挑他代码的毛病,我会挑出可能不起作用的边界情况,我会给他一个危机测试。而他得到的“坚持立场”的建议,最终使他在这些面试环境中变得有些敌对。

我从吴恩达教授刚才谈到的角度看待这个问题:好的团队,可以一起共事的人。从面试官的角度来看,如果我在管理这个团队,这个人就是那种陈词滥调的“10倍工程师”,但我不希望他靠近我的团队,因为这种态度。我们在这方面进行了改进,调整了这一点。奇怪的是,他实际上是一个非常友善的人,只是这是他得到的建议,而他遵循了这个建议,结果在这么多面试中失败了。所以,当他面试下一份工作时,那是一家非常重视团队合作的公司。好消息是,他得到了那份工作,现在在那里工作,薪水比被裁员前翻了一番,现在回想起来,他有大约六个月的“有趣”失业期。但当时他经历这一切时,那是一段非常艰难的时期。
所以,从另一方面来说,如果你在考察一家公司,考察你将与之共事的人,这非常重要,但也要意识到他们也在以同样的方式考察你。所以,如果你参加过技术面试辅导,他们给了你“坚持立场、有主见”的建议,这样做是好的,但不要在这个过程中表现得像个混蛋。
当前就业市场现状 📊
大家能看到我的幻灯片吗?好的,我是劳伦斯。我在科技行业工作的时间比ChatGPT认为草莓里有原子还要长。我在许多大型科技公司工作过,在微软工作了很多年,在谷歌工作了很多年,也在路透社这样的地方工作过,在美国和国外都参与过很多初创公司的工作。
所以,我今天真正想谈的是,思考一下当前的职业前景,特别是在AI领域。首先,正如吴恩达教授所说,你们在斯坦福,有能力利用在斯坦福的人际网络,利用你们拥有的声望。我说要利用你拥有的每一种武器,因为不幸的是,当前的形势并不理想。
我们经历了一些非常困难的时期。你只需要看看新闻,就能看到大规模的科技裁员、科技行业招聘放缓等等。但如果你方法得当,这未必是件坏事。
我想快速看一下就业市场的现实情况。实际上,出于兴趣,我想了解一下,你们是三年级学生吗?你们是今年毕业还是明年毕业?你们是四年制中的第三年?三年制中的第三年?所以你们将在即将到来的夏天毕业。有多少人已经在找工作了?好的,相当多。很多人已经成功了?没有人?哦,一个。好的,差不多。好的,很好。所以你们可能已经看到了一些迹象。
初级招聘显著放缓。我所说的“初级”,指的是毕业生水平。高调裁员占据新闻头条。几年前我在谷歌时,他们进行了有史以来最大规模的裁员。我们看到亚马逊、微软等公司也在裁员。感觉入门级职位稀缺。我强调了“感觉”这个词,稍后我想更详细地探讨这一点。此外,竞争激烈。
但我的问题是,你应该担心吗?我说不。因为如果你能以正确的方式处理事情,特别是理解AI领域变化的速度,那么我认为拥有正确心态的人将会蓬勃发展。
AI招聘格局的变化 🔄
我这么说是什么意思呢?正如吴恩达教授提到的,AI招聘格局正在变化,因为AI行业正在变化。实际上,我早在1992年就首次接触AI,在AI寒冬之前工作了一段时间,然后一切都急剧失败了。但我被AI的魅力所吸引,然后在2015年,当谷歌推出TensorFlow时,我又被拉回了这个领域,成为AI热潮的一部分,推出TensorFlow,向数百万人推广TensorFlow,并见证了发生的变化。
但在2021年、2022年,我们遭遇了全球疫情。全球疫情导致了大规模的工业放缓。这种大规模的工业放缓意味着公司不得不开始转向直接创收的领域。在谷歌,TensorFlow是一个开源产品,它不直接创收。我们开始缩减规模。世界上每家公司此时也都缩减了招聘规模。
然后到了2022年、2023年左右,发生了什么?我们开始走出全球疫情。我们开始意识到所有行业都积压了大量未完成的招聘。同时,我们也进入了一个AI爆炸式发展的时代,这得益于像吴恩达教授这样的人的工作。世界正在转向并改变为一切以AI为先。每家公司都需要疯狂招聘。

2022年、2023年每家公司疯狂招聘的结果是,大多数公司最终都过度招聘了。这通常意味着,那些没有资格担任更高职位的人通常得到了更高的职位,因为你必须进入竞价战才能获得人才。你最终会有人才争夺战,最终会出现像吴恩达教授讲的故事那样的情况:这里有一个
009:我的模型内部发生了什么?🔍


在本节课中,我们将深入探讨神经网络(包括卷积神经网络和Transformer)的内部工作机制。我们将学习一系列可视化与解释方法,帮助你理解模型如何做出决策。课程将从经典的卷积神经网络入手,逐步过渡到前沿大模型的分析技术。
案例研究:模型训练师的一天 😊
假设你是一家前沿实验室的模型训练师,正在训练一个拥有2000亿参数的模型。一夜之间,新生成的模型检查点通过了训练安全检查,但出现了一些问题:模型在推理基准测试上表现变差,一些安全评估失败,并且在用于智能体工作流时出现了奇怪的延迟峰值。
你的副总裁想知道发生了什么。在修改代码或重新训练模型之前,你会首先检查哪些证据?
以下是大家讨论后可能关注的几个方面:
- 错误分析:查看推理基准和安全评估中失败的案例,寻找模式以定位问题根源。
- 训练过程监控:检查训练损失曲线是否平滑,验证损失是否与训练损失趋势一致。关注是否有异常的梯度爆炸或消失。
- 数据批次检查:检查最近训练的数据批次,看是否存在数据污染或偏差。
- 硬件问题排查:考虑到延迟峰值,检查硬件是否出现故障。
- 模型内部检查:对于语言模型,可以可视化注意力图,检查不同词元之间的关系是否合理。
- 敏感性分析:检查超参数(如优化器、学习率计划)是否设置不当,或对照已知的缩放定律分析模型规模、数据量和计算量是否匹配。
- 专家混合模型:如果模型是专家混合架构,检查路由模块是否失效,或是否总是选择相同的专家。
通常,这些解决方案可以归纳为四个方向:训练与缩放、模型内部表示与行为、数据与分布以及多层级能力评估。
接下来,我们将从卷积神经网络开始,深入其内部,然后再回到前沿模型的分析。
卷积神经网络的可解释性 🖼️
案例:动物园动物分类器
假设你为动物园构建了一个动物分类器,但动物园管理员因为不理解模型的决策过程,不愿意在没有人工监督的情况下使用它。你如何缓解他们的担忧,并让他们对模型的决策过程有直观的理解?

我们可以采用多种方法:
- 教育解释:解释Softmax层如何输出每个动物类别的概率,以及卷积滤波器如何扫描图像以学习特征。
- 数据搜索:展示模型在大量动物图片上表现良好的例子,建立初步信任。
- 更深入的证明:我们需要更系统的方法来证明模型确实在关注图像的正确部分。
方法一:显著图
一个基本方法是计算输出类别分数相对于输入图像的梯度。具体来说,对于“狗”这个类别,我们计算其得分(Softmax之前)对每个输入像素的偏导数:
公式:∂(score_dog) / ∂X
这会产生一个矩阵,其中较亮的像素表示其梯度较高,即改变该像素会显著影响“狗”的得分;较暗的像素则影响很小。这种方法称为显著图,可以快速显示模型在预测“狗”时关注了图像的哪些区域。
注意:这里使用Softmax之前的分数,是因为Softmax之后的概率依赖于所有类别的分数,而不仅仅是“狗”的分数。

显著图的一个主要问题是它只在像素级别进行分析,缺乏语义连贯性。因此,更常用的方法是积分梯度。它通过从基准图像(如全黑图像)到原始图像之间路径上的梯度积分,生成更具解释性的结果。
方法二:遮挡敏感性
另一种更直观的方法是遮挡敏感性分析。具体操作是:用一个小方块(如灰色方块)遮挡输入图像的不同区域,然后观察目标类别(如“狗”)得分的变化。

- 如果遮挡区域与物体(如狗的脸部)重叠时得分显著下降,说明模型确实在关注该区域。
- 如果遮挡无关区域时得分不变甚至上升,说明模型忽略了这些无关信息。

通过在整个图像上滑动遮挡方块并记录得分变化,可以绘制出类别概率热图。这种方法计算量较大,但结果非常直观。
方法三:类激活图
为了提供实时的决策过程可视化,我们需要一种可以集成到网络中的方法。传统CNN架构的瓶颈在于全连接层,它们混合了所有的空间信息,使得追溯回输入图像变得困难。
解决方案是修改网络架构:将最后的全连接层替换为全局平均池化层和一个全连接层。
工作原理:
- 假设最后一个卷积层输出一个体积(例如
4x4x6,6个通道的特征图)。 - 全局平均池化对每个通道的特征图取平均值,得到一个
6x1x1的向量。这个向量保留了每个特征图的激活强度信息。 - 这个向量再通过一个全连接层和Softmax得到分类概率。
关键优势:现在,最终类别的得分可以追溯到每个特征图的贡献。通过将最后一个全连接层中对应于“狗”类别的权重,与对应的特征图进行加权求和,我们可以生成一个类激活图,直观显示图像的哪些区域对预测“狗”贡献最大。
这种方法及其改进版(如Grad-CAM)是理解CNN决策重点的强大工具。
方法四:类模型可视化
我们可以进一步“询问”模型:你认为“狗”的最佳代表是什么?这可以通过优化输入图像来实现。
方法:定义一个损失函数,目标是最大化“狗”类别(Softmax前)的得分,同时加入正则化项以确保生成的图像看起来自然(像素值在合理范围内)。然后,从一个随机噪声图像开始,使用梯度上升算法迭代更新像素值,直到损失函数最大化。
生成的结果图像可以揭示模型对某个类别的“内部概念”。例如,模型可能认为“斑点狗”就是“白色背景上的黑色斑点”,或者“鹅”总是成群出现。这有助于我们发现模型可能存在的误解。

这种方法也可以应用于网络内部的任何神经元,通过最大化特定神经元的激活,来理解该神经元所响应的输入模式。

方法五:数据集搜索


最简单直观的方法是数据集搜索。具体做法是:选择一个特定的滤波器(或其特征图),然后在整个验证集上搜索,找出使该特征图激活值最高的前几张图像。
- 如果激活最高的图像都是“衬衫”,那么这个滤波器很可能学会了检测“衬衫”。
- 如果激活最高的图像都包含明显的“边缘”,那么这个滤波器可能是一个边缘检测器。
通过为网络中的每个滤波器执行此操作,我们可以解释大多数滤波器学习到的特征。需要注意的是,越深层的滤波器,其感受野越大,看到的图像区域也越大,因此提取的特征也更抽象。

方法六:反卷积与网络逆向工程


为了更精确地逆向工程一个激活的原因,我们可以使用反卷积(或转置卷积)技术。核心思想是:在网络前向传播时,记录下关键信息(如最大池化的位置“开关”),然后构建一个反向网络,将某个特定的高层激活映射回输入像素空间。
简化数学原理(以1D卷积为例):
- 一个步长为2的1D卷积操作可以写成一个矩阵
W与输入向量X的乘法,得到输出向量Y:Y = W * X。 - 在理想情况下(如滤波器是正交的),其逆操作就是其转置:
X ≈ W^T * Y。 - 这等价于一个步长为1/2的“子像素卷积”操作:先将
Y在元素间插入零进行上采样,然后使用翻转后的滤波器进行卷积。
应用流程:
- 前向传播一张图像,在某一层选择一个特征图,并找到其中激活值最高的那个位置。
- 将该位置以外的激活全部置零。
- 利用记录的反向传播信息(池化开关、Relu等)和翻转的滤波器,通过一系列“反池化”和“反卷积”操作,将该激活反向映射到输入空间。
- 最终得到输入图像中的一个裁剪区域,该区域正是导致该特征图高度激活的原因。
通过这种方法,我们可以可视化网络任何层次中滤波器所响应的具体图像模式,从浅层的边缘、纹理到深层的复杂形状和物体部件。
前沿模型的分析技术 🚀
从CNN到Transformer
CNN主要处理局部信息(边缘、纹理、形状),而现代大模型(如Transformer)则侧重于概念或词元之间的关系和语义。
Transformer的两个核心可解释组件是:
- 注意力模式:可视化注意力权重,可以显示模型在处理一个词元时,关注了序列中的哪些其他词元。这有助于理解模型如何建立词与词之间的联系(如代词指代、句法结构)。
- 词嵌入:通过降维技术(如t-SNE)可视化词嵌入空间,可以检查语义相近的词是否在空间中彼此靠近,从而验证模型是否学到了有意义的语言表示。
然而,现代Transformer极其复杂,当前的前沿研究也只能较好地解释小型(如两层)Transformer。像Anthropic公司关于“Transformer电路”和“归纳头”的研究,是这一领域的代表性工作。
训练与缩放诊断
前沿实验室如何判断模型训练是否良好?
- 损失曲线:监控训练损失和验证损失,确保它们平滑下降。异常的跳跃或震荡可能预示着数据批次问题、梯度问题或代码错误。
- 训练遥测数据:跟踪梯度范数、学习率计划、硬件利用率等指标。
- 缩放定律:这是非常重要的分析工具。通过分析模型性能(如测试损失)与模型规模、计算量、数据量之间的幂律关系,可以指导资源分配。例如,Chinchilla论文指出,当时的大模型(如GPT-3)可能训练数据不足,而非参数不够。遵循缩放定律可以帮助决定:是应该增加计算、收集更多数据,还是扩大模型规模。
能力与安全评估
实验室通过广泛的基准测试来评估模型能力(如推理、编码、数学、多语言)和安全性。
- 基准测试:用于比较不同检查点或模型之间的性能。但需警惕基准污染问题——如果测试数据不小心混入了训练集,会导致分数虚高。可以通过n-gram搜索、哈希或嵌入相似性检查来检测污染。
- 安全评估:包括对抗性攻击(越狱、社会工程)、有害内容生成、幻觉、隐私泄露等多方面的压力测试。评估不仅针对模型本身,也针对其在实际智能体工作流中的表现。
数据诊断
数据质量至关重要,实验室会监控多种数据问题:
- 分布检查:跟踪训练数据中不同领域(如维基百科、代码、法律文本)的比例。如果某个领域数据不足,模型在该领域的性能可能会下降。需要通过采样策略来平衡领域分布。
- 词元统计:监控关键词元(如数学符号)的频率变化。如果某个重要词元出现频率漂移,可能影响相关任务性能。
- 污染检测:如前所述,检测并清除训练数据中可能包含的测试集信息。
总结 📝
本节课我们一起深入探索了神经网络的黑箱。
- 我们首先学习了多种用于卷积神经网络的可视化与解释方法:
- 显著图和积分梯度用于理解输入像素对输出的影响。
- 遮挡敏感性直观地展示了模型关注的图像区域。
- 类激活图通过修改网络架构,实现了决策过程的可视化。
- 类模型可视化和数据集搜索帮助我们理解模型内部神经元和滤波器学习到的概念。
- 反卷积/逆向工程让我们能够将高层的激活追溯回具体的输入模式。
- 随后,我们将视野扩展到前沿大模型,了解了当前的研究方向:
- 通过注意力模式和词嵌入可视化来理解Transformer。
- 利用损失曲线、缩放定律进行训练诊断和资源规划。
- 通过多维度基准测试和安全评估来全面衡量模型能力与风险。
- 运用数据分布分析和污染检测来保障数据质量。

这些工具和方法构成了模型开发者和研究者理解、调试和改进模型的工具箱。虽然前沿模型的完全可解释性仍是巨大挑战,但掌握这些基础技术将为你未来探索更复杂的模型内部机制奠定坚实的基础。
010:聊天机器人案例研究与结语 🤖


在本节课中,我们将通过一个聊天机器人的小型案例研究,来回顾并应用本课程中学到的深度学习知识。随后,我们将进行课堂总结,并提供一些关于期末项目和未来学习方向的建议。
聊天机器人案例研究
上一节我们回顾了课程的整体脉络,本节中我们来看看如何构建一个简单的聊天机器人,帮助学生查找课程信息或进行选课。
核心概念与术语
在深入技术细节之前,我们首先需要了解一些构建对话助手时常用的术语。
- 话语:用户输入或助手输出的一个句子。
- 意图:用户话语背后的目的。在我们的案例中,意图只有两种:
查找课程信息或选课。 - 槽位:为完成特定意图所需收集的具体信息。例如,对于“选课”意图,需要填充的槽位可能包括:
课程代码、学期和年份。 - 单轮对话:仅包含一次用户话语和一次助手回复的交互。
- 多轮对话:包含多次来回交互的对话,需要跟踪上下文。
意图识别
我们的第一个任务是识别用户的意图。这是一个典型的序列分类问题。
以下是构建意图识别模型所需的数据集示例:
# 输入(用户话语) -> 输出(意图标签)
"我想选修CS106A来学习编程。" -> "enroll"
"2019年春季有哪些本科历史课程?" -> "inform"
我们可以使用循环神经网络或卷积神经网络来构建分类器。卷积网络的一个优势是,如果意图通常由输入序列中的少数几个关键词决定,那么卷积滤波器可以有效地捕捉到这些模式。
槽位填充
识别意图后,我们需要提取完成该意图所需的详细信息,即填充槽位。这是一个序列到序列的标注问题。
以下是槽位标注的数据格式示例(以航班预订为例):
用户话语: "我想预订12月5日周二从巴黎到吉隆坡的航班。"
槽位标签: O O O B-day I-day O B-departure O B-arrival I-arrival O
- B-:表示一个槽位值的开始。
- I-:表示一个槽位值的中间或结尾。
- O:表示该词不属于任何槽位。
对于我们的选课案例,“我想选修CS106A来学习编程”这句话的槽位标签可能是:O O O B-code O O O,表示识别出了课程代码槽位。
联合训练与数据获取
意图识别和槽位填充模型可以共享底层的特征提取层(如一个LSTM层),然后通过两个不同的输出头进行联合训练。总损失函数是两个任务损失函数的简单求和。
获取标注数据是构建模型的关键步骤。以下是几种常见方法:
- 人工标注:最准确但最耗时。
- 自动生成:利用已有的数据库(课程列表、日期等)和句子模板,通过替换占位符自动生成大量带标注的数据。
- 利用现有模型:使用成熟的词性标注或命名实体识别模型进行初步标注,再进行人工修正。
处理上下文与多轮对话
当用户的话语信息不全时,就需要进行多轮对话。例如,用户说“我想选CS106A”,但没有提供学期和年份。这时,助手需要询问缺失的信息,并在后续对话中结合上下文来理解用户的回答(如“2019年冬季”)。
一种处理上下文的方法是使用记忆网络。该网络会将历史对话记录在“记忆”中。当处理当前用户话语时,网络会计算当前话语编码与所有历史记忆之间的注意力权重,从而得到一个融合了相关上下文的向量,再用于当前的槽位填充任务。
评估与扩展
评估聊天机器人性能可以从模块和整体两个层面进行:
- 模块评估:使用精确率、召回率、F1分数等指标分别评估意图分类器和槽位填充器的性能。
- 整体评估:通常采用人工评估,例如,让评估者为机器人生成的多个候选回复在“恰当性”上打分(1-5分),通过平均意见分来比较不同模型的优劣。
如果要将文本聊天机器人升级为语音助手,则需要在前后端分别增加语音转文本和文本转语音模块。
期末项目建议 📝
本节我们将提供一些关于完成和提交期末项目的具体建议,帮助大家取得好成绩。
在撰写项目报告时,请务必注意以下几点:
- 问题描述:像论文摘要一样清晰、准确地描述你的项目。
- 超参数调优:报告你尝试过的超参数及其结果,并解释最终选择的原因。
- 写作与解释:注意语言清晰,避免拼写错误。详细解释你做出的每一个重要选择(如模型架构、数据处理方法)。
- 数据预处理:如果适用,请详细说明数据清洗和预处理步骤。
- 代码与结果:说明有多少代码是自己编写的。即使结果未达预期,也要完整报告并分析原因。
- 讨论与展望:包含对结果的深入分析,并讨论如果时间更充裕,下一步会做什么。
- 格式与长度:核心报告请控制在5页以内,可添加附录。
对于最终的海报展示,请准备好进行3分钟的项目介绍,并接受2分钟的提问。
后续学习方向 🚀
CS230课程结束后,你可以通过多种途径继续深化在深度学习及相关领域的知识。
斯坦福大学提供了许多相关的进阶课程,例如:
- CS224N:自然语言处理与深度学习
- CS231N:计算机视觉中的卷积神经网络
- CS236:深度生成模型
- CS229:机器学习
- CS234:强化学习
此外,也可以关注业界的研究动态,将所学知识应用到软件行业之外更广阔的领域,如医疗、农业、教育、气候等,这些领域存在着大量尚未被挖掘的AI应用机会。
课程总结与寄语
本节课我们一起学习了如何将深度学习技术应用于构建一个简单的任务导向型聊天机器人,涵盖了意图识别、槽位填充、上下文管理和评估方法。我们也回顾了完成期末项目的关键要点,并展望了未来的学习路径。
你们通过这门课程掌握的技能是独特且强大的。深度学习领域发展迅速,你们学到的很多知识在几年前甚至还不存在。希望你们能利用这些技能,不仅去创造商业价值,更能去解决那些对社会和人类至关重要的挑战——无论是改善医疗可及性、应对气候变化,还是提升教育质量。许多最有价值的AI应用机会存在于软件行业之外。
最后,衷心感谢大家在整个课程中的辛勤付出。我们期待在项目展示会上看到你们的精彩工作。请带着在这里获得的“超能力”,继续探索、创造,并享受这个过程,去做那些真正重要的工作。

祝大家好运!

浙公网安备 33010602011771号