DLAI-生成对抗网络笔记-全-
DLAI 生成对抗网络笔记(全)
01:生成对抗网络(GAN)专项课程介绍 🎨🤖
在本课程中,我们将学习生成对抗网络(Generative Adversarial Networks,简称GAN)的基本概念、工作原理及其应用。GAN是一种新兴的深度学习算法,能够生成极其逼真的图像。通过本课程,你将学会如何构建和应用先进的图像生成GAN。
概述
生成对抗网络(GAN)是一类强大的深度学习模型,能够生成高度逼真的图像。本专项课程将指导你从零开始构建GAN,并应用于多种场景,例如生成不存在的人物肖像、调整人物年龄外观,或将低分辨率视频转换为高分辨率视频。此外,GAN还可用于数据增强,帮助解决监督学习任务中数据不足的问题。
GAN的核心概念:伪造者与检查员 🎭
上一节我们概述了GAN的潜力,本节中我们来看看GAN的基本工作原理。为了简化理解,我们常使用“艺术伪造者”和“艺术检查员”的类比来解释GAN。
GAN包含两个相互对抗的神经网络:
- 生成器(Generator):即“艺术伪造者”。它的目标是学习并模仿真实艺术作品(或任何数据分布),生成以假乱真的赝品。
- 判别器(Discriminator):即“艺术检查员”。它的目标是审视一堆混合了真实作品和伪造者生成的作品,并准确判断每一幅作品的真伪。
这两个网络在训练过程中不断对抗与进化。生成器努力生成更逼真的图像以骗过判别器,而判别器则努力提升自己的鉴别能力。这种动态竞争最终使得生成器能够产出极其逼真的输出。
学习本课程所需的背景知识 📚
理解了GAN的基本框架后,在开始动手构建之前,你需要具备一些必要的先修知识。
以下是开始本专项课程前你应该掌握的内容:
- 理解神经网络的基本原理,包括卷积神经网络(CNN)。
- 能够使用Python编程。
- 熟悉至少一个深度学习框架,如TensorFlow、Keras或PyTorch。
如果你已经完成了DeepLearning.AI的《深度学习专项课程》,那么你将具备所有必需的基础。即使对这些主题有些生疏,也没关系,课程的前几周会提供相关的复习内容。
课程结构与学习成果 🚀
现在,让我们了解一下你将在本专项课程中完成哪些令人兴奋的项目。
以下是本专项课程四个星期的学习路线:
- 第一周:你将实现一个基础的GAN。这是你创建的第一个生成对抗网络。
- 第二周:你将在基础GAN上加入卷积神经网络组件,构建一个更强大的图像生成模型。
- 第三周:你将学习如何改进GAN,使其训练过程更加稳定。
- 第四周:你将学会控制GAN的生成内容。例如,你可以指示生成特定品种的狗,或者调整生成人脸的年龄特征。
通过亲手构建和迭代改进你的GAN,你将体验到创造的成就感,并生成属于自己的独特“艺术作品”。
总结
本节课中,我们一起学习了生成对抗网络(GAN)专项课程的概览。我们了解了GAN通过生成器和判别器对抗训练的核心思想,回顾了学习所需的先修知识,并预览了接下来四周由浅入深、动手实践的学习路径。现在,让我们正式开启课程,进入第一周的学习,亲手构建你的第一个GAN吧!
02:生成对抗网络(GAN)入门 🎯
在本课程中,我们将学习生成对抗网络(GAN)的基本概念。我们将了解GAN的构成、工作原理以及它们如何通过两个相互对抗的模型生成逼真的图像。课程还将回顾二元交叉熵损失和PyTorch的基础知识,为本周的实践任务做好准备。
欢迎来到第一周 ✨
上一节我们介绍了本课程的整体目标,本节中我们来看看第一周的具体内容。
第一周将展示GAN取得的一些惊人成就。你将看到一些视觉上令人惊叹的示例,并了解GAN随着时间推移如何变得越来越好。
GAN是一种无监督学习技术。你可能已经见过许多监督学习技术,例如分类器。GAN则有所不同。本周,你将建立起对GAN的直观理解,了解一个GAN背后包含的两个模型:生成器(Generator) 和 判别器(Discriminator)。这两个模型实际上相互对抗。这种对抗使得其中一个模型变得非常出色,从而能够生成逼真的图像。
本周内容中还穿插了许多有趣的梗图。此外,你将复习二元交叉熵损失(Binary Cross Entropy Loss) 并初步了解PyTorch,以便在开始本周任务前熟悉这些工具。
以下是本周的核心组成部分:
- GAN的成就展示:观看GAN生成的图像示例。
- 核心概念建立:理解生成器与判别器的对抗过程。
- 关键知识回顾:复习损失函数和深度学习框架。
本周的任务非常酷,你将着手构建你的第一个GAN。
那么,让我们开始吧。
总结 📝
本节课中我们一起学习了生成对抗网络第一周的课程概述。我们了解到本周将介绍GAN的卓越成果、其基本工作原理(依赖于生成器和判别器的对抗),并回顾了二元交叉熵损失与PyTorch基础,为完成构建第一个GAN的实践任务做好准备。
03:生成对抗网络(GAN)入门 🎨🤖

在本节课中,我们将学习生成模型的基本概念,并了解生成对抗网络(GAN)及其相关模型的工作原理。通过对比判别模型与生成模型,我们将初步认识两种流行的生成模型架构:变分自编码器(VAE)和生成对抗网络(GAN)。课程结束时,你将能够构建一个生成手写数字的GAN模型。
生成模型简介
上一节我们概述了课程目标,本节中我们来看看什么是生成模型。生成模型是机器学习中的一类模型,其目标是学习并生成逼真的数据样本,例如图像或音乐。GAN是生成模型的一种。
你可能已经熟悉判别模型,但可能不清楚它们在机器学习大背景下的位置。判别模型通常用于分类任务。它们学习如何区分不同类别,例如狗和猫,常被称为分类器。
判别模型接收一组特征 X(例如是否有湿鼻子或是否发出呼噜声),并根据这些特征确定类别 Y(判断图像是狗还是猫)。换句话说,它们试图建模给定特征 X 时类别 Y 的概率,公式表示为 P(Y|X)。
相比之下,生成模型试图学习如何生成某个类别的逼真表示,例如一张逼真的狗图片。生成模型接收一些随机输入(这里用噪声表示),噪声可以是一组随机值,例如 [3, -5, 2.6],实际上它是一个向量。生成模型有时也接收类别 Y(例如“狗”)。基于这些输入,其目标是生成一组特征 X,使其看起来像一只逼真的狗,例如具有湿鼻子或吐舌头特征的狗图像。
你可能会问为什么需要噪声输入。噪声主要是为了确保每次生成的内容不完全相同,从而产生多样化的输出。如果只生成同一只狗,既无趣也缺乏意义。因此,可以将噪声视为额外的随机输入。
更一般地说,生成模型试图捕捉给定类别 Y(如狗)时特征 X 的概率分布。通过添加噪声,这些模型能够生成该类别的逼真且多样化的表示。如果只生成一个类别(如狗),则可能不需要条件输入 Y,而是直接建模所有特征 X 的概率。
从对比中可以看出,判别模型和生成模型在某种程度上是相互镜像的。
生成模型示例

以下是生成模型的一个运行示例。在一次良好的生成过程中,你可能得到一张啄食鹅的图片;在另一次运行中,可能生成一只藏獒。

如果多次运行生成模型而不加限制,最终会得到更多代表训练数据集的图片,例如许多可爱的拉布拉多犬。
流行生成模型架构
生成模型有多种类型,以下简要介绍两种最流行的架构:变分自编码器(VAE)和生成对抗网络(GAN)。
变分自编码器(VAE)
VAE包含两个模型:编码器和解码器,它们通常是神经网络。训练过程首先将逼真图像(例如一张逼真的狗图片)输入编码器。编码器的任务是找到在潜在空间中表示该图像的有效方式。假设它在潜在空间中找到一个点,可以用向量 [6.2, -3, 21] 表示。
VAE随后将潜在表示(或接近它的点)输入解码器。解码器的目标是重建编码器之前看到的逼真图像。训练初期,解码器可能无法准确重建图像,生成的狗可能具有邪恶的眼睛。训练完成后,我们通常移除编码器,并可以在潜在空间中随机选择点(例如另一个位置),解码器将学会生成逼真的狗图像。
上述描述主要是自编码器部分。变分部分在训练过程中向整个模型注入一些噪声。编码器不是将图像编码为潜在空间中的单个点,而是将其编码为一个分布,然后从该分布中采样一个点输入解码器以生成逼真图像。由于可以从分布中采样不同的点,这增加了一定的噪声。
生成对抗网络(GAN)
GAN的工作方式截然不同。它同样由两个模型组成:生成器和判别器。生成器接收随机噪声输入(例如向量 [1.23, -5]),并生成图像(类似于VAE中的解码器)。生成器的作用在某种程度上与VAE的解码器非常相似。
不同之处在于,这次没有编码器来指导应输入生成器的噪声向量。相反,有一个判别器同时查看真实图像和生成图像,并试图区分哪些是真实的、哪些是伪造的。随着时间的推移,两个模型相互竞争、相互学习,因此被称为“对抗”网络。
你可以想象,随着它们相互竞争和学习,它们的“肌肉”会逐渐增长,直到达到一个阶段:我们不再需要判别器,生成器可以接收任何随机噪声并生成逼真图像。例如,随机向量 [-5, 6.2, 8] 可以生成这只可爱的拉布拉多犬。
在本专项课程中,我们将重点学习GAN。如果你对VAE感兴趣,可以自行阅读更多资料。如果你还不完全理解GAN的工作原理,不必担心,本周接下来的视频将深入探讨其架构和学习方式。
总结
本节课中我们一起学习了生成模型的基本概念。生成模型学习生成逼真的样本,就像一位艺术家能够绘制出看起来像照片的画作。同时,判别模型用于区分不同类别。生成模型就像试图学习如何创作逼真艺术的艺术家,而判别模型则像区分狗和猫的分类器。
当然,你也看到判别模型可以作为生成模型的子组件,例如判别器其类别是“真实”和“伪造”。生成模型有多种类型,但在本专项课程中,我们将重点研究GAN。到本周末,你将能够构建自己的GAN模型,用于生成手写数字。

多么酷啊!准备开始吧。
04:现实生活中的GAN应用 🎨
在本节课中,我们将要学习生成对抗网络(GAN)在现实世界中的多种应用。自2014年诞生以来,GAN已在众多任务中取得了令人瞩目的成就。如果你还未见识过它们的成果,接下来的内容将为你带来惊喜。

GAN的快速发展 📈

上一节我们介绍了GAN的基本概念,本节中我们来看看其实际应用的发展速度。
伊恩·古德费洛(Ian Goodfellow)被广泛认为是GAN的创造者。他的一条推文生动地展示了GAN近年来惊人的进步速度。
从2014年生成黑白且看起来不太真实的人脸,到2018年生成更高质量、色彩逼真的照片级人脸,GAN一直在不断进步。实际上,直到今天,它们的表现仍在持续提升。
一个典型的例子是,在2020年初,英伟达发布了一个能够生成如下图像的GAN。这些图像分辨率极高,看起来像专业照片,并且具有柔和的背景虚化效果。

很容易认为这些人是真实存在的,但他们实际上并不存在。这很神奇,不是吗?

超越人脸的生成能力 🐱
GAN可以从给定的任何训练数据中学习,因此它们的能力不限于生成人脸。以下是同一个模型生成的猫的图像。

仔细观察,你会发现一些看起来非常奇怪的图像,因为并非每个生成的样本都是完美的。这里虽然有些像猫的轮廓,但当然,我也不知道那具体是什么。
另一个有趣的现象是,你可以在生成的图像上观察到文字。这是因为如前所述,生成模型试图模仿其训练数据的分布。在本例中,训练数据是从网络上抓取的所有猫的图片,其中包含许多带有 meme 文字的猫 meme 图。
有趣的是,这些生成猫 meme 图上的文字并不构成真正的单词,因为生成模型的目标不是建模文字,而是追求视觉上的真实感。尽管如此,其中一些生成的图像仍然相当可爱和逼真,尽管它们可能还不足以登上 Reddit。
图像翻译与风格转换 🖼️➡️🦓
GAN还可以执行图像翻译,这意味着它们可以将一个领域的图像转换成另一个领域。例如,它们可以将马的图像转换成斑马,反之亦然。
真正有趣的是,你实际上并不需要斑马和马做相同动作的成对示例,模型可以直接将风格迁移过去。




从草图到照片级渲染 ✏️
同样地,GAN可以帮助你绘画。这个模型可以接受一幅粗糙的风景草图,并将其变得具有照片般的真实感。
在左侧,你可以看到笔触,这是一个用非常粗糙的笔触勾勒出不同类别(如云、山或湖)的人。然后,GAN能够根据这个非常粗糙的草图生成非常逼真的图像。





在这幅草图中,一个人仅用几根线条和颜色进行粗略的素描,然后GAN就能将它们转换成逼真的图片。
图像动画与3D生成 🎬
GAN还可以处理静态肖像,例如《蒙娜丽莎》,并利用任何真实人脸的运动来使其动画化。扮演者甚至不需要长得像蒙娜丽莎。
如果你联想到了《哈利·波特》中会说话的肖像画,那么你并非唯一有这种想法的人。从某种意义上说,GAN就是魔法。
GAN的应用不止于2D图像,它们还能生成3D物体,如椅子和桌子。这可以应用于生成式设计等领域,为你家创造很酷的家具。
在医学领域也有多种应用,例如使用GAN生成人工医疗数据,甚至检测X光片中的异常。你将在课程3中看到更多相关内容,但要展示所有酷炫的应用可能需要数小时。


知名公司的GAN应用案例 🏢
一些知名公司也已开始将生成对抗网络用于各种应用。
以下是部分公司的应用方向:
- Adobe:正在构思下一代Photoshop,让新手艺术家也能达到专家水平,例如通过那些涂鸦。
- Google:主要将其用于文本生成,但也涉及图像。
- IBM:将GAN用于数据增强,即使用GAN生成合成样本来扩充下游分类器的数据集。例如,当某类或某种图像数据不足时。
- Snapchat和TikTok:将其用于创造性的新滤镜,你可能已经见过并使用过。
- 迪士尼:将其用于超分辨率技术。
在本专项课程结束时,你也将能够将GAN用于你喜欢的任何应用。
总结 📝
本节课中我们一起学习了GAN在过去几年取得的快速进展。我向你展示了几个非常酷的应用,并提到了一些大公司使用GAN的方式。然而,GAN还有更多事情可以做,你也有许多潜在的方向可以利用这些模型。


05:GANs背后的直觉 🧠
在本节课中,我们将学习生成对抗网络(GANs)背后的核心直觉。我们将了解生成器和判别器这两个关键组件如何通过相互竞争来学习,最终使生成器能够创造出逼真的图像。

概述
生成对抗网络(GANs)是一种强大的模型,它通过学习生成难以与真实对象区分的逼真对象,例如人脸。GANs通过让生成器和判别器相互竞争来学习。本节将讨论生成器和判别器的目标,并展示它们之间的博弈如何开始,以及它们如何相互促进,直到我们获得一个能够生成逼真图像的优秀生成器。


生成器与判别器:核心组件
上一节我们介绍了GANs的基本概念,本节中我们来看看它的两个核心组件。
GANs包含两个部分:一个称为生成器,另一个称为判别器。它们通常是两个不同的神经网络。

- 生成器 学习生成看起来真实的“假货”,以欺骗判别器。
- 判别器 学习区分什么是真实的,什么是伪造的。
你可以将生成器想象成绘画伪造者,而判别器则是艺术鉴定师。
博弈的开始:初始状态

了解了基本组件后,我们来看看这场博弈是如何开始的。
要启动这场博弈,你只需要一组真实图像,例如一些著名的画作(如果你想生成名画的话)。
在博弈开始时,生成器实际上并不复杂,它不知道如何生成看起来真实的艺术品。我们可以用一个试图绘画的狗狗表情包来代表这个初级的生成器。
此外,生成器不允许看到真实图像,它甚至不知道这些画作应该是什么样子。这对生成器来说非常困难,尤其是在开始时。因此,在最开始,这个初级的生成器可能只会画出一堆涂鸦。
你的另一个初始组件是一个初级的判别器,它也不确定什么是真,什么是假。这里用一个戴着贝雷帽、试图成为艺术评论家的狗狗来代表它。但在这个阶段,它被允许查看真实的艺术品,只是这些真品与生成器制造的假货混在一起,它需要自己去分辨和学习如何决定。
训练过程:相互促进的竞争
现在,让我们深入这场竞争的具体训练过程。

以下是启动竞争的关键步骤:
- 训练判别器:你使用真实艺术品来训练判别器,让它能够知道哪些图像是真实的。当它做出判断(例如,“这个看起来像真的”)后,你会告诉它“对,那是真的”或“不,那是假的”。这样,判别器就能学会区分像涂鸦这样画得不好的图像和稍好一些的图像,并最终识别出真正的艺术品。
- 生成器获得反馈:当生成器产生一批画作时,它会通过查看判别器对其作品给出的评分,来了解应该在哪个方向上改进。例如,如果某张画被认为“看起来更真实一点”,生成器可能会开始朝着绘制更逼真的蒙娜丽莎面孔方向努力。
- 判别器持续进化:判别器也会随着时间的推移而改进,因为它在每一轮中都会从生成器那里收到越来越逼真的图像,并且它总是会收到混杂在一起的真假图像。本质上,随着图像质量提高,它会努力培养出越来越敏锐的“眼力”。
- 纠正错误:例如,当判别器说生成器创建的某张图像有“60%的可能性是真实的”时,你实际上会告诉它这是错的,它并不真实,实际上是伪造的。

经过多轮竞争后,生成器将开始创作出越来越难以区分的画作,对于判别器来说,可能已经无法将它们与真品区分开来。

博弈的终结
当作为开发者的你对生成器的结果感到满意,认为它已经能够生成足够逼真的假图像时,这场博弈就会结束。

总结

本节课中,我们一起学习了生成对抗网络(GANs)背后的核心直觉。重要的是要理解:
- 生成器的目标是生成让判别器信以为真的假货。
- 判别器的目标是将生成器制造的假货与你提供的真实样本区分开来。
两个模型都从与对方的竞争中学习,直到生成器产生的样本足够好,能够欺骗判别器。

在接下来的视频中,你将基于这种直觉,更深入地探讨这种竞争机制是如何运作的。
06:判别器详解 🧠

在本节课中,我们将要学习生成对抗网络(GAN)的核心组件之一:判别器。我们将从分类器的基本概念开始,逐步深入到判别器在GAN中的具体作用和工作原理。
分类器回顾
上一节我们介绍了GAN由生成器和判别器组成,本节中我们来看看判别器是如何工作的。判别器本质上是一种分类器,因此我们首先快速回顾一下分类器的基本概念。
分类器的目标是区分不同类别。例如,给定一张猫的图片,分类器应能判断出这是一只猫,而不是狗。分类器不限于图像分类,也可用于文本、视频等多种数据类型。
以下是分类器的一种常见实现方式:
- 使用神经网络作为模型。
- 输入为特征
x(例如x0, x1, ..., xn)。 - 网络经过一系列非线性计算。
- 输出为各个类别的概率分布(例如,猫:45%,狗:45%,鸟:10%)。
在训练初期,模型的预测可能不准确。通过学习过程,模型会不断调整,试图使其预测 Y_hat 接近真实的标签 Y。
这个学习过程可以概括为以下几个步骤:
- 拥有输入特征
X和对应的真实标签Y。 - 神经网络(参数为
θ)学习从X到预测值Y_hat的映射。 - 目标是最小化真实值
Y与预测值Y_hat之间的差异。 - 通过成本函数(Cost Function)来衡量这种差异。
- 根据成本函数的梯度更新网络参数
θ。 - 重复此过程,直到分类器性能良好。
判别器的概率视角
从概率的角度看,判别器的目标是为每个类别建模概率。具体来说,它建模的是在给定输入特征 X(例如图像的像素值)的条件下,样本属于某个类别 Y 的概率,即 P(Y|X)。这是一个条件概率分布。
现在,将其放回GAN的上下文中。GAN中的判别器是一个特殊的分类器,它检查样本(包括真实样本和生成器产生的假样本),并判断它们属于“真实”类还是“虚假”类。
例如,当判别器看到一张伪造的《蒙娜丽莎》图像时,它不再判断图像内容是猫、狗还是鸟,而是判断这幅画有多“假”。它可能输出此图像有85%的概率是伪造的。
用概率公式表示,判别器建模的是:给定输入 X,样本为“假”的概率,即 P(fake|X)。在上例中,P(fake|image) = 0.85。相应地,其为“真”的概率 P(real|image) = 0.15。
判别器不仅会给出“真假”的分类判断,更重要的是,它会将这个概率值(例如0.85)反馈给生成器,以帮助生成器改进。
总结
本节课中我们一起学习了判别器的核心原理。我们了解到:

- 判别器是一种分类器,其任务是建模给定输入特征(如图像的RGB像素值)后,样本属于“真实”或“虚假”类别的概率。
- 判别器输出的概率值是驱动生成对抗网络学习的关键。这些概率帮助生成器了解其生成样本的“假”的程度,从而在后续迭代中生成更逼真的样本。

判别器与生成器之间的这种对抗性互动,正是GAN能够学习生成高质量数据的基础。在下一节中,我们将探讨另一个核心组件——生成器。
07:生成对抗网络(GAN)中的生成器 🧠

在本节课中,我们将要学习生成对抗网络(GAN)的核心组件之一——生成器。我们将探讨它的作用、工作原理、如何随时间改进,以及它在概率层面所建模的内容。
概述
生成器是GAN的“心脏”,是用于生成示例的模型。训练过程的最终目标就是帮助生成器达到极高的性能。
生成器的角色与目标
生成器的最终目标是能够生成特定类别的示例。例如,如果你用猫的图像训练它,生成器将通过一系列计算,输出一张看起来真实的猫的图片。
理想情况下,生成器每次运行时不会输出完全相同的猫。为了确保它每次都能生成不同的示例,我们需要向它输入不同的随机值集合,这被称为噪声向量。
这个噪声向量就是一组数值,可以想象成 [1, 2, 5, 1.555, ...]。这个噪声向量(有时连同类别标签Y,例如“猫”)会作为输入,馈送到生成器的神经网络中。
这意味着特征 x0, x1, x2, ..., xN 包含了类别信息和噪声向量中的数值。然后,神经网络中的生成器会基于这些输入计算一系列非线性变换,最终输出一些变量,这些变量在运行时看起来就像一只棕白相间的猫。
在这里,它的输出不是不同的类别,而是一张图像。你可以想象这张图像可能有300万个像素,因此输出层可能有300万个节点,每个节点代表一个像素的值,而非类别。
在另一次运行中,它可能生成一只斯芬克斯猫。在最后一次运行中,可能生成一只萨凡纳猫。这些不同的输出都源于输入了不同的噪声向量。
生成器如何随时间改进
上一节我们介绍了生成器的基本输入和输出,本节中我们来看看它是如何通过学习来改进的。
首先,你有一个噪声向量(即那些随机输入值),我们用希腊字母 ζ 表示。你将它传入一个由神经网络表示的生成器,以生成一组构成猫图像(或尝试生成猫图像)的特征。
例如,你的生成器可能生成这样一张图片。这张生成的图片 X̂ 会被送入判别器。判别器通过检查它,来判断它认为这张图片有多真实或多虚假。
之后,基于判别器对它的判断(我们用 ŷ_D 表示,下标D代表这是判别器的预测),你可以计算一个成本函数。这个函数本质上衡量的是生成器产生的示例被判别器认为是“真实”的程度,因为生成器的目标就是让输出看起来尽可能真实。

简单来说,生成器希望 ŷ_D 尽可能接近1(代表“真实”),而判别器则试图让它接近0(代表“虚假”)。生成器利用这两者之间的差异来更新自身的参数,从而随时间改进,并知道该朝哪个方向调整参数,以生成看起来更真实、更能“欺骗”判别器的内容。
保存与使用训练好的生成器
一旦你获得了一个看起来相当不错的生成器,你可以保存生成器的参数 θ。这通常意味着冻结这些θ值并将其保存到某处。之后,你可以重新加载它,并从这个保存的生成器中“采样”。

“采样”基本上意味着:你准备一些随机噪声向量,将它们输入到保存的生成器中,它就能生成各种各样的不同示例。请注意,图中保存的生成器生成的示例是狗,这表明它可能不是用猫的图像训练的。
你可以持续生成新的噪声向量,将其输入这个保存的生成器,从而(在本例中)采样出更多的狗图像。
生成器建模的概率
在概率的领域中,生成器建模的是某个示例(如前例中的猫,或图中的狗,当然也可以是乌龟、鸟或鱼)出现的概率。
更一般地说,生成器试图建模给定类别Y(例如“猫”)时,猫的各种特征(如舔爪子、有可爱的胡须、有不同类型的毛发)的概率。这即是特征 X 给定类别 Y 的条件概率:P(X|Y)。
然而,如果我们目前只有一个类别(比如只生成猫),那么Y将始终相同。因此,你实际上不需要显式地写出条件,你建模的是 P(X)。当然,如果你希望生成器学习所有不同类型的类别,并且你关心类别信息,那么你就需要将类别信息输入进去。
现在,你有了世界上所有不同类型猫的 P(X)。生成器将建模特征X的无条件概率(因为类别Y始终是“猫”)。在这种情况下,它将尝试近似真实世界中猫的分布。
最常见的猫品种将有更高的概率被生成,因为它们在数据集中更常见。某些特征(如尖耳朵)也会更常见,因为大多数猫都有。而更稀有的品种被采样到的可能性则较低。
图中的线条代表了一个三维的概率分布,展示了“猫”这个类别的特征是如何分布的。最常见的猫类特征会显示并采样于中间区域(如果将其视为3D表示,则是凸出的部分),而稀有品种或外观独特的猫则位于边缘。
这意味着最常见的猫品种有更多机会被生成,而像斯芬克斯猫这样不常见的品种则会被更罕见地生成。在未来的视频中,你将看到如何控制采样过程以获得你想要的结果,但目前生成器的工作只是模拟自然界中猫的分布。
本周实践任务

为了总结,生成器产生试图看起来真实的虚假数据,它学习模仿你数据类别中特征X的分布。为了每次产生不同的输出,它以随机特征作为输入。
在本周的作业中,你将构建一个生成器G,用于生成手写数字的图像。它的设置相同:你只需给它随机噪声,它就能产生所有这些不同的手写数字。
这很酷,因为手写看起来并不完美,每次看起来也不尽相同。生成器将能够从作业中你将看到的手写数字数据集中,建模并生成各种不同样式的5、8等所有数字。
总结

本节课中,我们一起学习了生成对抗网络中生成器的核心作用。我们了解到生成器如同GAN的心脏,负责从随机噪声中生成逼真的数据。它通过接收噪声向量作为输入,并利用与判别器的对抗反馈来不断优化自身参数,从而学习并逼近真实数据的概率分布 P(X)。最终,训练好的生成器可以被保存并用于采样,创造出多样化的新样本。在接下来的实践中,你将亲手构建一个用于生成手写数字的生成器。
08:二元交叉熵(BCE)损失函数详解 🧮

在本节课中,我们将学习生成对抗网络(GAN)训练中一个核心的损失函数——二元交叉熵(Binary Cross Entropy,简称BCE)。我们将深入理解其公式、每个组成部分的含义,并通过直观的示例说明其工作原理。
概述
二元交叉熵函数专为二分类任务设计,例如区分“真实”与“伪造”数据。它通过量化模型预测与真实标签之间的差异,为模型训练提供优化方向。
BCE损失函数公式
完整的BCE损失函数公式如下:
$$J(\theta) = -\frac{1}{m} \sum_{i=1}^{m} [y^{(i)} \log(h_{\theta}(x^{(i)})) + (1 - y^{(i)}) \log(1 - h_{\theta}(x^{(i)}))]$$
这个公式初看可能有些复杂,接下来我们将逐一拆解其中的每个部分。
公式拆解与含义
求和与平均
公式开头的 $\sum_{i=1}^{m}$ 和 $\frac{1}{m}$ 表示对当前小批量(mini-batch)中所有 $m$ 个样本的损失进行求和,然后取平均值。这确保了损失值不受批次大小的影响。
符号定义
- $h_{\theta}(x)$:模型的预测输出。在GAN中,这通常是判别器(Discriminator)的输出,表示输入 $x$ 为“真实”的概率。
- $y$:样本的真实标签。例如,
y=1代表真实样本,y=0代表伪造样本。 - $\theta$:模型的参数,即判别器中需要被优化的权重。
公式括号内的内容可以拆分为两个独立的项,每一项对应一种标签情况。
两项的直观理解
上一节我们介绍了公式的整体结构,本节中我们来看看公式中两个核心项的具体行为。
以下是每一项在不同预测情况下的表现:
第一项:$y \log(h_{\theta}(x))$(当真实标签 $y=1$ 时激活)
- 情况A:标签 $y=1$(真实),且模型预测 $h_{\theta}(x) \approx 1$(认为很真实)。
- 此时 $\log(1) \approx 0$,该项值接近0,贡献的损失很小。
- 情况B:标签 $y=1$(真实),但模型预测 $h_{\theta}(x) \approx 0$(错误地认为很假)。
- 此时 $\log(0) \to -\infty$,该项值趋向负无穷。
第二项:$(1-y) \log(1 - h_{\theta}(x))$(当真实标签 $y=0$ 时激活)
- 情况C:标签 $y=0$(伪造),且模型预测 $h_{\theta}(x) \approx 0$(认为很假)。
- 此时 $\log(1-0) = \log(1) \approx 0$,该项值接近0,贡献的损失很小。
- 情况D:标签 $y=0$(伪造),但模型预测 $h_{\theta}(x) \approx 1$(错误地认为很真实)。
- 此时 $\log(1-1) = \log(0) \to -\infty$,该项值趋向负无穷。
负号的作用
可以看到,当预测非常错误时(情况B和D),对数项会趋向负无穷。公式最外层的负号 - 至关重要,它将负无穷转换为正无穷。在损失函数中,我们通常希望较大的值代表较差的性能,模型训练的目标就是最小化这个值。因此,将严重错误的惩罚设为巨大的正数,符合我们的优化逻辑。
损失函数曲线可视化
理解了各项的行为后,我们通过图像来直观感受BCE损失如何随预测值变化。
以下是两种标签情况下,单个样本的损失随模型预测值变化的曲线:
当真实标签 $y=1$ 时,损失简化为 $L = -\log(h_{\theta}(x))$。
- 当预测值 $h_{\theta}(x)$ 接近1(正确),损失接近0。
- 当预测值 $h_{\theta}(x)$ 接近0(错误),损失趋近于无穷大。
当真实标签 $y=0$ 时,损失简化为 $L = -\log(1 - h_{\theta}(x))$。
- 当预测值 $h_{\theta}(x)$ 接近0(正确),损失接近0。
- 当预测值 $h_{\theta}(x)$ 接近1(错误),损失趋近于无穷大。

图像清晰地展示了核心规律:预测值与真实标签越接近,损失越低;差异越大,损失越高,直至无穷。
总结
本节课中我们一起学习了二元交叉熵(BCE)损失函数。
- 设计目的:BCE是专为二分类任务设计的损失函数,在GAN中用于评估判别器区分真假样本的能力。
- 核心机制:公式包含两项,分别对应“真实”和“伪造”标签。每项都在模型预测严重错误时,通过对数运算产生巨大的惩罚。
- 计算过程:对一个小批量中的所有样本计算BCE损失,然后取平均值,得到该批次的总体损失。
- 直观理解:损失函数鼓励模型的预测概率向真实标签靠拢。预测正确则损失小,预测完全错误则损失极大。

掌握BCE损失函数是理解GAN训练过程的基础。在后续课程中,我们将看到生成器和判别器如何利用这个损失函数进行对抗性学习。
09:生成对抗网络(GAN)整体整合 🧩

在本节课中,我们将回顾生成对抗网络(GAN)的核心概念,并将所有组件整合起来,理解其完整的训练流程。我们将从GAN的基本架构开始,逐步讲解生成器和判别器的交替训练过程,并探讨训练中的关键注意事项。
GAN 架构概览 🏗️
首先,我们来看一个基础GAN架构的示意图。

在基础GAN中,生成器以一个随机噪声向量 z 作为输入。生成器随后会生成一些假样本,记作 X̂(例如假图像)。目前我们暂不向生成器传递类别信息,这将在后续课程中介绍。
接着,这些生成的假样本 X̂ 和一些真实样本 X 会被一同输入到判别器中。判别器的输出是一个概率值 ŷ,用于判断输入样本是真实还是虚假的可能性。
判别器的目标是尽可能准确地区分真实样本和生成样本。而生成器的目标则是生成尽可能逼真的假样本,以“欺骗”判别器。
交替训练过程 🔄
训练一个基础GAN需要交替训练生成器和判别器。上一节我们介绍了整体架构,本节中我们来看看具体的训练步骤。
判别器的训练
以下是判别器的训练步骤:
- 首先,获取由生成器根据噪声 z 产生的一批假样本 X̂。
- 将这些假样本 X̂ 和一批真实样本 X 混合后输入判别器,暂时不告知判别器哪些是真、哪些是假。
- 判别器对每个样本做出预测 ŷ,给出其是真实或虚假的概率分数。
- 使用二元交叉熵损失函数,将预测值 ŷ 与样本的真实标签(假样本标签为0,真样本标签为1)进行比较。
- 计算出的损失用于更新判别器的参数 θ_D。注意,此步骤仅更新判别器的参数,不更新生成器。
生成器的训练
接下来,我们看看生成器是如何训练的:
- 生成器再次根据噪声 z 生成一批假样本 X̂。
- 这些假样本被输入到判别器中。在这个过程中,生成器只看到自己的假样本,看不到真实样本。
- 判别器对这些假样本做出预测 ŷ。
- 这里有一个关键区别:计算损失时,我们将所有假样本的标签都视为“真实”(即标签为1)。因为生成器的目标是让判别器认为其生成的样本是真实的。
- 计算损失后,梯度反向传播,用于更新生成器的参数 θ_G。此步骤仅更新生成器的参数,不更新判别器。
通过这种交替训练的方式,每次只训练一个模型,同时保持另一个模型的参数固定。
训练平衡的重要性 ⚖️
在以上交替训练的过程中,保持生成器和判别器能力的平衡至关重要。
如果判别器过于强大(远强于生成器),它可能会轻易地将所有生成样本判定为100%虚假。这对于生成器来说信息量不足,它无法从“完全错误”的反馈中学习如何改进。
反之,如果生成器过于强大,完全骗过了判别器,判别器给出的反馈(如所有生成样本都被判为100%真实)同样缺乏指导意义。
判别器的任务(区分真假)通常比生成器的任务(建模整个数据分布,如生成所有可能的猫的图像)要简单。因此,一个常见问题是判别器学习过快,导致训练失衡。
为了让训练有效进行,我们需要确保两个模型在训练初期保持相近的技能水平,并共同进步。判别器提供更具信息量的梯度(例如,输出0.87假而非1.0假),能更好地指导生成器逐步学习生成逼真的图像。

本节课中我们一起学习了GAN的整体训练流程,理解了生成器与判别器如何通过交替训练进行对抗学习,并掌握了保持两者训练平衡的核心要点。这是成功训练一个GAN模型的基础。
10:PyTorch入门教程 🚀
在本节课中,我们将学习PyTorch这一深度学习框架的基础知识。我们将了解PyTorch与TensorFlow的主要区别,并掌握如何使用PyTorch定义和训练一个简单的模型。本教程专为初学者设计,内容简单直白,确保你能轻松跟上。

概述
本课程将首先对比PyTorch与TensorFlow两大框架的核心差异。接着,我们会详细讲解如何在PyTorch中定义模型架构,并逐步演示模型的训练过程。通过本课的学习,你将能够理解PyTorch的基本工作流程,并为后续的实践打下坚实基础。
PyTorch与TensorFlow对比
上一节我们概述了本课内容,本节中我们来看看PyTorch与TensorFlow的主要区别。两者都是当前最流行的深度学习框架。如果你学习过深度学习专项课程,可能对TensorFlow较为熟悉。但这里有个小秘密:我更喜欢PyTorch。
它们的主要区别在于计算方式。在PyTorch中,计算是即时进行的,这种方式有时被称为命令式编程。在TensorFlow中,你首先定义计算方式,然后再执行计算,这被称为符号式方法。
这意味着在PyTorch中,你拥有变量A和B的值(例如 a=1, b=2),当你将它们相加时,会立即得到结果 3。而在TensorFlow中,A和B最初没有具体值,你可以将它们的和存储在另一个变量C中,这有些抽象。然后你需要编译C,并为A和B赋值才能得到计算结果。
因此,PyTorch能够支持动态计算图,这意味着你的神经网络在每次运行时都可以轻松改变其结构。然而,由于TensorFlow的计算图是静态的,其模型运行时间往往更短。最近,TensorFlow 2.0引入了急切执行模式,这与PyTorch的动态计算图非常相似。但总体而言,动态计算图在PyTorch中感觉更加自然。
不过,总的来说,这两个框架目前已经非常相似,你会发现在它们之间切换,尤其是从TensorFlow转向PyTorch,从未如此简单。
在PyTorch中定义模型
了解了框架间的区别后,本节我们聚焦于PyTorch,看看如何用它来定义一个模型。
首先,你需要导入PyTorch库:
import torch
同时,导入nn模块(神经网络模块)也很有用,它包含了深度学习模型的各种定制层:
from torch import nn
在PyTorch中,通常通过创建nn.Module类的子类来定义模型。以下是一个逻辑回归模型的示例:
class LogisticRegression(nn.Module):
def __init__(self, input_size):
super(LogisticRegression, self).__init__()
self.logistic_regression = nn.Sequential(
nn.Linear(input_size, 1),
nn.Sigmoid()
)
def forward(self, x):
return self.logistic_regression(x)
以下是代码关键部分的解释:
__init__方法是类的构造函数,用于接收模型参数。这里的input_size变量决定了逻辑回归模型的输入变量数量。- 在构造函数内,你将模型架构定义为一个属性。对于逻辑回归,你可以在一个
Sequential模块中使用一个线性层和一个Sigmoid激活函数。 Sequential模块用于按顺序堆叠层。这里,首先是线性层,然后是Sigmoid激活函数。- 在线性层中,传入的
input_size指定了输入的大小,输出为1,表示我们希望从所有这些输入中得到一个预测值(例如,是猫或不是猫的类别)。 - Sigmoid激活函数会产生一个介于0和1之间的值。
- 最后,你定义模型类的
forward方法。forward方法指的是给定输入后,模型在前向传播过程中如何产生输出。它不涉及反向传播。前向传播就是当你输入数据时,模型如何计算出输出。在这个例子中,你只需将输入X通过之前定义的self.logistic_regression这个顺序层序列并返回结果。
这是一个在PyTorch中定义模型的非常简单的通用大纲,当然你也可以用不同的代码结构达到相同的结果。
在PyTorch中训练模型
定义好模型后,接下来我们看看如何训练它。
首先,为你定义的模型类初始化一个实例。例如,使用上一张幻灯片的逻辑回归类,这个模型有16个输入变量:
model = LogisticRegression(16)
然后,为你的模型确定一个损失函数(在PyTorch中常被称为criterion):
criterion = nn.BCELoss() # 二元交叉熵损失
接着,选择你想要使用的优化器,例如随机梯度下降(SGD),并传入模型的参数(即之前提到的权重θ,它们将在训练中被更新)。你还需要为此优化器指定不同的超参数,例如学习率:
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
最后,你可以训练你的模型多个周期(epoch):
num_epochs = 100
for epoch in range(num_epochs):
# 前向传播:将输入传入模型,得到预测
predictions = model(inputs)
# 计算损失:使用损失函数比较预测值与真实标签
loss = criterion(predictions, labels)
# 反向传播与优化
optimizer.zero_grad() # 清零过往梯度
loss.backward() # 反向传播,计算当前梯度
optimizer.step() # 根据梯度更新参数
以下是训练循环的关键步骤说明:
- 你不需要担心确切的语法,但基本上发生的是:我们使用
optimizer.zero_grad()将之前的梯度清零,以确保一切干净无误。 loss.backward()是反向传播的重要步骤,它计算当前损失的梯度。- 最后的
optimizer.step()意味着使用随机梯度下降法,以设定的学习率沿着梯度方向更新模型参数。
总结
本节课中,我们一起学习了PyTorch的基础知识。我们了解到PyTorch采用即时计算的方式,允许你在每次运行中灵活地实验和更改模型。同时,我们也看到PyTorch作为另一个深度学习框架,实际上与TensorFlow非常相似。如果你已经熟悉其中一种框架,将能够毫无障碍地在它们之间切换。

通过定义模型类、设置损失函数与优化器、以及编写训练循环,你已经掌握了使用PyTorch进行模型训练的核心流程。希望本教程能帮助你顺利入门PyTorch,并在后续的实践中继续探索。
11:生成对抗网络(GAN)第二周概述 🚀
在本节课中,我们将深入探讨生成对抗网络(GAN)的核心组件,特别是针对图像生成任务。我们将回顾并学习一些关键概念和技术,以构建更强大的GAN模型。
激活函数与批归一化 🔧
上一周我们初步构建了一个基础的GAN模型。本节中,我们来看看如何通过改进其内部组件来提升模型性能,特别是在图像生成方面。这包括使用不同的激活函数,如ReLU和Sigmoid,以及引入批归一化(Batch Normalization)技术。
以下是本小节涉及的核心概念:
- ReLU激活函数:其公式为
f(x) = max(0, x),它能有效缓解梯度消失问题,加速网络训练。 - Sigmoid激活函数:其公式为
σ(x) = 1 / (1 + e^{-x}),常用于输出层,将值映射到(0,1)区间,适用于概率输出。 - 批归一化(Batch Normalization):我们将学习其直观原理并简要了解其操作流程。它通过对每一批(batch)数据进行标准化处理(减均值、除标准差),来稳定和加速深度网络的训练过程。
卷积、上采样与转置卷积 🖼️
理解了激活函数和归一化之后,我们需要回顾和比较用于处理图像数据的核心操作。这些操作是构建卷积神经网络(CNN)和生成器网络的基础。
以下是相关的关键操作:
- 卷积(Convolution)、填充(Padding)与步幅(Stride):这些是卷积层的基本参数,共同决定了输出特征图的大小和感受野。
- 池化层(Pooling Layers):如下采样操作,用于缩减特征图尺寸并提取主要特征。
- 上采样(Upsampling)与转置卷积(Transpose Convolution):这是生成器中将低维特征图“放大”成高分辨率图像的关键技术。我们将比较两者的异同。
构建深度卷积GAN(DCGAN) 🏗️
掌握了上述所有组件后,我们就具备了构建更强大GAN模型的理论基础。这些组件不仅是构建用于图像生成的深度卷积生成对抗网络(Deep Convolutional GAN, DCGAN) 的重要基石,也是构建更广泛神经网络架构的通用部分。
本周的作业正是运用这些知识来构建一个DCGAN模型。
本节课中,我们一起学习了提升GAN性能,特别是针对图像生成任务的关键组件,包括ReLU和Sigmoid激活函数、批归一化技术,以及卷积、上采样和转置卷积等核心操作。这些知识为我们完成本周构建深度卷积GAN(DCGAN)的作业奠定了坚实的基础。
12:激活函数的基本性质 🧠
在本节课中,我们将学习激活函数的基本性质。激活函数是深度神经网络,特别是生成对抗网络(GANs)中的关键组件。我们将了解它们是什么、为什么必须是非线性的、可微分的,以及它们在神经网络中的作用。

什么是激活函数?
激活函数是一种以任意实数作为输入(也称为定义域),并通过一个非线性、可微分的函数,输出一个特定范围内数值的函数。在深度神经网络中,激活函数通常用于某些层之间的分类任务。
上一节我们介绍了激活函数的基本概念,本节中我们来看看它在神经网络中的具体作用。
以一个具有两个隐藏层和多个输入的神经网络为例。输入x0可能是毛色,x1可能是动物体型,以及其他各种特征。这个神经网络的目标是预测这些特征是否构成一只猫,最终输出一个介于0和1之间的概率值。
神经网络中所有这些节点共同构成了整个网络架构。接下来,我将从演示每个独立节点发生的过程开始。
单个节点的计算过程
一个节点接收来自前一层的信息,并预测两个部分,我将用虚线将其分开。
首先,它计算Z。其中i代表节点编号(例如,第一个节点i=1),L代表层数(例如,这里L=1表示第一层)。Z的计算公式如下:
公式:
Z_i^L = Σ (W_ij^L * A_j^{L-1}) + b_i^L
这里,Z是前一层的输出值A与权重W的加权和。L-1表示前一层的索引。这个计算过程通常被称为线性层,它既包括权重的缩放值,也包含一个偏置项b(可以整合到权重矩阵W中)。
然后,节点的另一侧输出A。A是激活函数G的输出,它以Z值作为输入。
公式:
A_i^L = G(Z_i^L)
为什么需要非线性和可微分性?
激活函数G必须同时具备非线性和可微分这两个性质。
它需要是可微分的,因为训练神经网络和更新其参数时需要使用反向传播算法。可微分性意味着可以计算其导数(梯度),从而为前一层提供梯度信息。
它需要是非线性的,这样神经网络内部计算的特征才能变得复杂。如果不使用非线性激活函数,一个具有多个隐藏层和神经元的神经网络实际上可以坍缩成一个简单的线性回归模型。因为线性层可以相互堆叠合并,最终所有层等效于一个单一的线性层。
线性回归本质上就是一个带有偏置项的线性层(同样,偏置项可以整合到权重矩阵中)。
总而言之,你需要非线性且可微分的激活函数,才能充分利用深度学习模型,让各层有效堆叠,构建出能够建模复杂非线性函数的复杂神经网络。
非线性特性确保了你的线性层不会简化为线性回归中的单一线性层,从而使网络能够学习更复杂的函数。可微分特性则确保了网络能够通过计算导数,利用反向传播进行学习。
激活函数的选择
你可以为深度学习模型使用任何自定义函数作为激活函数,只要确保它是非线性且可微分的即可。
研究人员经常尝试不同的函数,以找出最适合特定任务的那一个。在下一讲中,你将学习到一些常用的激活函数。
总结

本节课中,我们一起学习了激活函数的基本性质。我们了解到激活函数是神经网络中的非线性、可微分组件,它们接收线性组合的结果作为输入并产生输出。激活函数的非线性使得深度网络能够学习复杂模式,而其可微分性则使得通过反向传播进行有效训练成为可能。正确选择和使用激活函数对于构建强大的深度学习模型至关重要。
13:常见激活函数 🧠

在本节课中,我们将学习深度神经网络中几种常见的激活函数。激活函数对于引入非线性至关重要,它决定了神经元是否应该被“激活”。我们将详细介绍四种最常用的激活函数:ReLU、Leaky ReLU、Sigmoid 和 Tanh,并了解它们各自的特性、公式以及优缺点。
概述
你已经了解到激活函数对于深度学习模型非常重要。有多种函数被用作激活函数。在本视频中,你将看到当今最流行的一些激活函数。

本视频将重点介绍四种常用的激活函数,你也将在你的GANs中使用它们。第一种是ReLU,第二种是其变体Leaky ReLU,最后两种是Sigmoid和Tanh。实际上,可能的激活函数有无限多种,但并非所有都理想。最流行且有效的激活函数之一被称为整流线性单元,简称ReLU。
ReLU 激活函数
ReLU的作用是取z和0之间的最大值。这意味着,如果它的输入是来自当前层L的z,那么这个激活函数g(此处g代表ReLU)将取0和z之间的最大值。实际上,这意味着它消除了所有负值。
从图形上看,我可以将这个函数描述为:对于正值,它是一条斜率为1的直线。因此,任何进入z的值,例如值2,如果进入g,输出仍然是值2。现在,如果一个负数z被传入g,那么从图形上看,每当z值为负时,它将输出零。本质上,不允许负值,所以它看起来像一个曲棍球棒,这使其具有非线性(线性意味着一条单一的直线)。
你可能会注意到,严格来说,ReLU在z=0处不可微,但按照惯例和实现,ReLU在z=0处的导数通常被设置为0。
当z为负时,ReLU激活函数的平坦部分导数总是等于零,这可能会有问题。因为学习过程依赖于导数来提供关于如何更新权重的重要信息。导数为零时,一些节点的权重会卡在相同的值上,停止学习。因此,网络的这一部分将停止学习,事实上,网络的前面部分也会受到影响。这个问题被称为“ReLU死亡”问题,因为它意味着学习的终结。这就是为什么存在ReLU的一个变体,称为Leaky ReLU。
Leaky ReLU 激活函数
Leaky ReLU所做的是保持与ReLU相同的形式。当z为正时,它保持与ReLU相同的形式,这意味着它再次保持与输入相同的正值。但当z小于0(即z为负)时,它在直线上增加了一个小的“泄漏”或斜率。它在z=0处仍然是非线性的,有一个斜率转折,但现在当z为负时,它有了非零导数。
这个斜率通常小于1,所以它不必与正值一侧形成一条直线(那将是不幸的,因为会变成线性)。注意,在z=0处的导数仍然被设置为0。通常,这个斜率被视为一个超参数,即这里的a,但它通常被设置为0.1,意味着相对于正斜率,泄漏仍然相当小。这在很大程度上解决了“ReLU死亡”问题。在实践中,大多数人仍然使用ReLU,但Leaky ReLU的受欢迎程度正在上升。
Sigmoid 与 Tanh 激活函数
现在,我将向你展示另外两种看起来相当相似的常见激活函数。
首先是Sigmoid激活函数,它具有平滑的S形,输出值在0和1之间。当z大于或等于0时,Sigmoid激活输出一个介于0.5和1之间的值。当z小于0时,Sigmoid输出一个介于0和0.5之间的值。因为它输出一个介于0和1之间的值,Sigmoid激活函数经常被用在二元分类模型的最后一层,以表示一个介于0和1之间的概率。例如,预测图片中有猫的概率为0.95。
Sigmoid激活函数在隐藏层中不常用,因为该函数的导数在函数的两端趋近于零。这会产生所谓的“梯度消失”问题或饱和输出。你可以想象这个函数向两个方向延伸,因为它可以接受任何实数值作为输入。它在顶部渐近地趋近于1,在底部渐近地趋近于0。这会产生梯度消失问题,因为当输入z离0太远时,函数两端的输出总是接近1或接近0,导致饱和。
另一个形状与Sigmoid相似的函数是双曲正切函数,简称Tanh。然而,与Sigmoid相比,它输出介于-1和1之间的值。因此,当z为正时,它输出一个介于0和1之间的值;当z为负时,它输出一个介于-1和0之间的负值。
与Sigmoid的一个关键区别是,Tanh保留了输入z的符号,所以负数仍然是负数,这在某些应用中可能有用。然而,由于形状与Sigmoid相似,同样存在饱和和梯度消失的问题,两端同样向两个方向延伸,顶部趋近于1,底部趋近于-1。
总结
本节课中,我们一起学习了深度学习中几种核心的激活函数。以下是关键要点:
- ReLU:公式为
g(z) = max(0, z)。计算高效,但可能导致“神经元死亡”问题。 - Leaky ReLU:公式为
g(z) = max(az, z),其中a是一个小的正数(如0.1)。解决了ReLU的“死亡”问题,允许小的负梯度通过。 - Sigmoid:公式为
g(z) = 1 / (1 + e^{-z})。将输出压缩到(0, 1)区间,常用于输出层表示概率,但隐藏层中易导致梯度消失。 - Tanh:公式为
g(z) = (e^{z} - e^{-z}) / (e^{z} + e^{-z})。将输出压缩到(-1, 1)区间,且输出是零中心的,但同样存在梯度消失问题。
所有这些激活函数都用于神经网络,特别是在你即将实现的GANs中。实际上还有更多的激活函数,研究人员一直在开发新的。如果你有兴趣,可以设计自己的激活函数,只需确保它是非线性且可微的。
总而言之,目前有许多不同的函数被用作激活函数,我向你展示了ReLU、Leaky ReLU、Sigmoid和Tanh。它们大多有自己的问题:ReLU有“死亡”问题,Sigmoid和Tanh有梯度消失和饱和问题。在本专业课程你将实现的模型中,你会看到并使用这里介绍的所有这些激活函数。


14:批归一化(Batch Normalization)详解 🧠
在本节课中,我们将学习批归一化(Batch Normalization)的概念及其在训练生成对抗网络(GANs)和深度神经网络中的重要作用。批归一化是一种关键技术,能显著加速训练过程并提升模型稳定性。

概述
生成对抗网络(GANs)的训练通常耗时较长,尤其在构建复杂应用时。GANs的学习过程较为脆弱,不如分类器直接,生成器和判别器的能力有时也不完全同步。因此,任何能加速和稳定训练的技巧都至关重要,批归一化已被证明在这方面非常有效。
归一化对训练的影响
首先,回顾归一化对训练的影响。假设有一个简单的神经网络,包含两个输入变量:x1(代表大小)和x2(代表毛色)。网络输出基于这些特征判断示例是否为猫。
假设x1(大小)的数据分布呈正态分布,集中在中等大小附近,极少有极小或极大的示例。而x2(毛色)的数据分布则偏向较高值,均值较高,标准差较低。这里较高值代表较深的毛色。需要注意的是,直接比较毛色和大小的数值意义不大,因为深色毛色和大尺寸之间没有有意义的关联。
然而,这种不同的数据分布会影响神经网络的学习方式。例如,如果网络试图到达某个局部最小值,而输入变量的分布差异很大,代价函数会变得细长。这意味着与每个输入相关的权重变化对代价函数的影响不同,使得训练变得困难、缓慢,且高度依赖于权重的初始化。
此外,如果新的训练或测试数据中毛色非常浅(即数据分布发生某种变化),代价函数的形状也可能改变,甚至局部最小值的位置也会移动,即使判断是否为猫的基本事实(即图像的标签)没有变化。这种现象称为协变量偏移(Covariate Shift),在训练集和测试集之间经常发生,尤其是在未对数据分布变化采取预防措施时。
输入归一化的效果
如果对输入变量x1和x2进行归一化,新的输入变量x1'和x2'的分布会更相似,例如均值为0,标准差为1。这样,代价函数在这两个维度上会更平滑、更平衡,从而使训练更容易、更快速。
此外,无论原始输入变量的分布如何变化(例如从训练集到测试集),归一化变量的均值和标准差都会被调整到相同的位置(均值为0,标准差为1)。对于训练数据,这是通过批统计量实现的:在训练每个批次时,计算均值和标准差,并将数据调整到均值为0、标准差为1。对于测试数据,可以使用训练过程中收集的统计量来调整测试数据,使其更接近训练数据的分布。
通过归一化,协变量偏移的影响将显著减少。因此,输入归一化的主要效果是平滑代价函数并减少协变量偏移。
内部协变量偏移
然而,即使确保数据集的分布与建模任务相似(即测试集的分布与训练集相似),神经网络仍然容易受到内部协变量偏移(Internal Covariate Shift)的影响。这意味着在网络的内部隐藏层中也会发生协变量偏移。
以神经网络第一个隐藏层的激活输出为例,观察其中一个节点。在训练模型时,所有影响该激活值的权重都会更新,从而导致该激活值的分布发生变化,并受到训练过程的影响。这种偏移类似于输入变量分布的变化(如毛色),但发生在内部节点上,这些节点的含义比毛色和大小更抽象。
批归一化旨在解决这个问题,通过基于每个输入批次计算的统计量来归一化所有这些内部节点,以减少内部协变量偏移。这样做还有额外的好处:平滑代价函数,使神经网络更容易训练,并加速整个训练过程。
批归一化中的“批”字表示使用批统计量,这在本周后续视频中会进一步熟悉。
批归一化的作用总结
以下是批归一化的主要作用:
- 平滑代价函数:使优化过程更稳定。
- 减少内部协变量偏移:使网络各层的输入分布更稳定。
- 加速和稳定训练:特别有助于训练GANs等复杂模型。
需要注意的是,虽然批归一化对GANs和神经网络非常有效,但内部协变量偏移背后的理论尚未完全定论。我们仍在寻找批归一化在模型中可能有用的其他原因的证据。

总结

本节课中,我们一起学习了批归一化(Batch Normalization)的核心概念。我们了解了它对平滑代价函数、减少内部协变量偏移的重要作用,以及它如何加速和稳定神经网络的训练过程,尤其是在构建生成对抗网络(GANs)时。批归一化通过归一化网络内部各层的激活值,使训练更加高效和可靠。
15:批归一化流程详解 🧠

在本节课中,我们将要学习批归一化的完整流程。批归一化是深度学习中的一项重要技术,它通过规范化神经网络中间层的激活值,帮助模型更快、更稳定地训练。我们将详细拆解它在训练和测试阶段的不同操作,并解释其核心优势。
批归一化听起来可能有些复杂,但它是一个相当直观的过程,你甚至可以自己从头实现它。不过,像PyTorch这样的深度学习框架已经为你实现了这个功能。在本视频中,我将向你展示它的工作原理。

通过本视频,你将熟悉批归一化的操作,并了解它在训练和测试阶段的不同之处。批归一化的目标是创建如你所见的、令人愉悦的归一化数值分布。
以一个具有两个隐藏层、多个输入和一个输出的神经网络为例。我将聚焦于其中一个内部隐藏层来解释批归一化是如何工作的。
所以,这里的输入Z来自之前所有的节点。批归一化会考虑批次中的每一个样本Z_i。例如,你的批次大小可能是32,那么这里就会有32个Z值。再次提醒,这里的上标i代表该层中的第i个节点,上标l代表这是第l层。例如,这是第0层,第1层,或者这是节点0,节点i1。
因此,批归一化会获取批次的大小(例如32),这里有32个Z值。它希望将这些Z值归一化,使其均值为0,标准差为1。
以下是具体的操作步骤:
首先,计算批次的均值μ,这仅仅是这32个值的平均值。然后,计算批次的方差σ²,同样基于这32个值。
为了将这些z值归一化为均值为0、标准差为1的分布,你需要减去均值并除以标准差。这里的标准差是方差的平方根,并加上一个很小的常数ε,以确保分母不为零。
最终,你得到了归一化的Z值,我们称之为Z_hat。
好的,在得到归一化值Z_hat之后,批归一化层中还有需要学习的参数。这意味着你将有一个称为β的值,它是偏移因子;以及一个称为γ的值,它是缩放因子。这些参数在训练过程中学习,以确保你将Z转换到的分布对你的任务来说是最优的。
因此,在完全归一化得到Z_hat之后,你再根据这些学习到的值γ和β对其进行重新缩放。
这就是输入归一化与批归一化的主要区别。因为在这里,你并非每次都强制分布具有零均值和单位标准差,而是在归一化之后,可以根据任务需要重新调整分布。关键在于,批归一化让你能够控制该分布在神经网络中向前传播时的形态。
经过偏移和缩放后的最终值将被称为Y,这个Y随后被送入激活函数。
以上是训练阶段的过程。在测试阶段,你需要防止不同的批次产生不同的均值和标准差,因为这可能导致同一个样本在不同的批次中,由于该批次特定的均值或标准差而被不同地归一化,从而产生不同的结果。因此,在测试时,你希望获得稳定的预测。
在测试阶段,你使用的是在整个训练集上计算得到的“运行均值”和“运行标准差”。这些值在训练后是固定的,不再变化。
但在此之后,你只需遵循一个非常相似的过程。这里的μ是那些z值的期望值(即运行均值),σ²是那些z值的方差(取其平方根得到标准差)。你仍然会加上ε以防止分母为零。之后,你只需遵循与训练时相同的过程,将这些归一化值输入到学习到的参数中,然后送入激活函数。
不过,不必过于担心这个过程的细节。正如我之前所说,像TensorFlow和PyTorch这样的框架会为你跟踪这些统计量。你所要做的就是创建一个名为BatchNorm的层,然后当你的模型切换到测试模式时,框架会自动为你计算或保存整个数据集上的运行统计量,这非常方便。
你可能也听说过测试模式被称为测试时间、推理时间、评估模式或E模式,它们大致是等价的,你可以将它们理解为“非训练时间”。
上一节我们详细介绍了批归一化的具体计算步骤。本节中,我们来总结一下它的核心优势。
总而言之,批归一化与标准归一化的不同之处在于以下几点:
首先,在训练期间,它使用每个批次的统计量,而不是整个数据集的统计量。这减少了计算时间,使训练更快,无需等待遍历整个数据集后才能使用批归一化。
其次,通过引入可学习的偏移和缩放参数,你并不强制目标分布必须具有零均值和单位标准差。
最后,在测试时,应用的是训练期间计算得到的运行统计量到整个数据集,这保持了预测的稳定性,因为训练值是独立且固定的。
一个重要的注意事项是,深度学习框架已经为你实现了训练和测试的整个过程。因此,你只需要知道何时在你的GAN或其他你想训练的出色模型中使用它。
在接下来的课程中,你还将学习到更先进的归一化技术,敬请期待。


本节课中,我们一起学习了批归一化的完整流程。我们理解了它如何在训练时利用批次统计量进行归一化和再参数化,在测试时则切换到固定的运行统计量以确保稳定性。批归一化通过赋予模型对中间数据分布的控制能力,成为了加速和稳定深度神经网络训练的关键技术之一。
16:卷积回顾 🧠

在本节课中,我们将学习卷积(Convolution)的基本概念及其在图像处理中的应用。卷积是许多生成对抗网络(GAN)架构的核心组成部分,它通过扫描图像来检测关键特征。

什么是卷积?
卷积是图像处理中的一项基本操作,它允许你使用过滤器(filter)检测图像不同区域的关键特征。这些过滤器在图像上滑动扫描,以寻找各种特征。例如,一个“眼睛”过滤器会告诉你图像的哪些部分包含眼睛,“鼻子”过滤器会告诉你哪些部分包含鼻子,“耳朵”过滤器会告诉你哪些部分包含耳朵。
每个过滤器实际上是一个由实数值组成的矩阵,这些具体的数值在训练过程中学习得到。这些数值用于在输入图像上计算卷积。实际上,这些过滤器比“眼睛”或“鼻子”过滤器更为抽象,但它们确实能够捕捉到相当高级的特征,例如眼睛和鼻子。

卷积操作详解
卷积操作非常直观。让我们来看一个简单的例子:一个5x5的灰度图像,其中每个方块代表一个像素,其值介于0到255之间。0代表纯黑色像素,255代表纯白色像素,灰色值介于两者之间,例如这里看到的50。
假设你有一个学习到的3x3过滤器,其第一列为1,第二列为0,第三列为-1。在卷积操作中,使用这个过滤器对灰度图像进行处理,我们用星号(*)表示它们之间的卷积操作。这意味着你要在整个灰度图像上应用这个过滤器。
操作过程如下:从左上角开始,将过滤器的所有元素与对应位置的像素值相乘。例如,将50乘以1,50乘以0,依此类推,与过滤器匹配。然后,取所有这些乘积的总和,并将结果放入结果矩阵的第一个单元格中。
之后,将过滤器向右移动一个位置,再次计算元素乘积,求和并将结果存储在矩阵中,依此类推。当你到达一行的末尾时,向下移动一行,重新从左侧开始,继续应用过滤器,直到覆盖整个图像。最终,你会得到一个3x3的结果矩阵。
有趣的是,这个过滤器实际上是一个垂直线检测器。在你的图像中有一条垂直线,过滤器在这里检测到了一些非常高的值,试图表明:“嘿,我在这里真的看到了这条垂直边缘。”
这些过滤器可以有许多不同的值,通过组合多层这些过滤器,可以获得更抽象、更高级的概念,例如鼻子或眼睛。
卷积的变体与调整
以上是计算卷积的基本过程,但你可以对这个简单操作进行一些调整,这些调整对你后续的学习会很有帮助。接下来,我们将讨论这些调整。
总结
在本节课中,我们一起学习了卷积的基本概念及其在图像处理中的应用。卷积通过扫描图像的每个部分来检测特征,从而识别模式。归根结底,卷积只是整个图像上元素乘积的一系列总和。
卷积操作的核心公式可以表示为:
结果矩阵 = 输入图像 * 过滤器

其中,* 表示卷积操作,即对每个局部区域进行元素乘积并求和。

通过本节课的学习,你应该对卷积有了基本的理解,并能够将其应用于图像处理任务中。在后续的课程中,我们将进一步探讨卷积在生成对抗网络中的具体应用。
17:填充与步长 🧩

在本节课中,我们将学习卷积神经网络中的两个重要概念:填充(Padding) 与 步长(Stride)。我们将了解它们如何影响卷积操作,以及为何在图像处理中需要调整这些参数。

卷积操作回顾
在上一节中,我们介绍了卷积是一种用于检测图像不同区域特征的简单操作。本节中,我们来看看如何通过调整填充与步长来优化卷积操作。
卷积操作通过一个滤波器(例如3x3的矩阵)在图像上滑动,计算每个位置的元素乘积和。例如,对于一个灰度图像,我们首先将滤波器放置在图像的左上角3x3区域,计算乘积和,然后移动滤波器。
步长(Stride)的作用
步长决定了滤波器每次移动的像素数量。以下是步长如何影响卷积操作的详细说明:
- 步长为1:滤波器每次向右或向下移动1个像素。这是最常见的设置,能最大程度地覆盖图像。
- 步长大于1:例如步长为2时,滤波器每次移动2个像素。这会减少滤波器访问的图像区域数量,从而加快计算速度,但也会丢失一些图像信息。因此,选择步长需要在计算效率和信息完整性之间进行权衡。

例如,对一个图像应用3x3滤波器,步长为2时,滤波器访问的区域会减少,最终输出的特征图尺寸也会变小。
公式表示:若输入图像尺寸为 n x n,滤波器尺寸为 f x f,步长为 s,则输出尺寸约为 ((n - f) / s) + 1。
填充(Padding)的作用
填充是在图像边缘周围添加一个边框(通常由0构成,称为“零填充”)。以下是使用填充的主要原因和方式:
- 解决边缘信息丢失问题:在没有填充的卷积中,图像边缘的像素被访问的次数远少于中心像素。这意味着边缘的特征(例如位于角落的物体)可能被忽略。
- 实现方式:通过在图像周围添加一个像素框(填充层),使得原始图像的所有像素在卷积过程中都能被平等地访问。滤波器会扫描这个带边框的新图像。
- 保持输出尺寸:填充还可以用于控制卷积后输出特征图的大小。例如,通过合适的填充,可以使输出尺寸与输入尺寸保持一致。
代码示例(概念性描述):
# 假设使用零填充,填充层宽度为p
padded_image = pad(original_image, width=p)
# 卷积操作会应用在这个padded_image上
总结
本节课中,我们一起学习了卷积神经网络中的两个关键调整参数。

- 步长 控制了滤波器扫描图像的步进距离,它直接影响输出特征图的尺寸和计算速度。更大的步长意味着更快的计算,但可能丢失细节。
- 填充 通过在图像边缘添加边框,确保了图像中所有位置(尤其是边缘)的像素都能在卷积中获得同等的关注度,同时也能帮助我们控制输出的大小。

理解并合理设置步长与填充,是构建高效、准确的卷积神经网络模型的重要基础。
18:池化与上采样 🧠

在本节课中,我们将要学习卷积神经网络中两种非常常见的层:池化层和上采样层。池化层用于降低输入数据的尺寸,而上采样层则用于增加其尺寸。理解这两种操作对于构建和理解生成对抗网络(GAN)等模型至关重要。
池化层:压缩信息 🔽
上一节我们介绍了卷积神经网络的基本概念。本节中,我们来看看池化层。池化层通过计算图像不同区域的平均值或最大值,来降低输入图像的维度。


例如,一张猫的图片经过池化层处理后,会得到一张尺寸更小、分辨率更低的模糊图像。虽然图像变模糊了,但其颜色分布和整体形状仍与原始图像相似。在池化后的图像上进行计算,其计算成本远低于原始图像。因此,池化本质上是一种信息提炼的过程。
以下是池化操作的几种常见类型:
- 最大池化:取滑动窗口内的最大值。
- 平均池化:取滑动窗口内的平均值。
- 最小池化:取滑动窗口内的最小值。
需要特别注意的是,池化层没有可学习的参数。这与卷积层不同,池化只是在整个图像上应用一个简单的固定规则。
最大池化示例
让我们通过一个简单的例子来理解最大池化是如何工作的。假设我们有一个4x4的灰度图像,我们希望使用最大池化将其缩减为2x2的输出图像。
操作步骤如下:
- 使用一个2x2的“池化窗口”(或称过滤器,但无权重)在输入图像上滑动。
- 设置步长为2,确保窗口不重叠。
- 对于窗口覆盖的每个2x2区域,取其中像素值的最大值。
- 将该最大值填入输出图像的对应位置。
通过这个过程,输出图像中的每个值都代表了原始图像中一个2x2区域的最显著(值最大)的特征。这对于在只关心最突出信息的场景下提炼信息非常有用。

上采样层:扩展信息 🔼

了解了如何压缩信息后,我们来看看与之相反的操作:上采样。给定一张低分辨率图像,上采样的目标是输出一张更高分辨率的图像。

当然,上采样生成的结果并非完美,因为它需要为新增的像素推断出合适的值。有多种方法可以实现上采样。
最近邻上采样示例
一种简单的上采样方法是最近邻上采样。这种方法通过复制输入像素的值多次来填充输出图像。

操作步骤如下:
- 将输入图像中的像素值按一定间距(例如,每隔一个像素)放置到输出图像的对应角落位置。
- 对于输出图像中剩余的空缺像素,将其值设置为与其最近的、已有值的邻居像素相同。
与池化层类似,上采样层也没有可学习的参数,它同样遵循某种固定的规则。除了最近邻法,还有线性插值、双线性插值等方法,深度学习框架(如TensorFlow和PyTorch)会自动处理这些实现细节。

总结 📝
本节课中我们一起学习了卷积神经网络中的两种重要操作:
- 池化层:用于减小输入尺寸,提炼信息,常见类型有最大池化和平均池化。其核心是应用固定规则(如取最大值),没有可学习参数。
- 上采样层:用于增大输入尺寸,常见方法如最近邻上采样。它同样没有可学习参数,通过固定规则为新增像素推断值。

与具有可学习权重的卷积层不同,池化和上采样都是基于规则的变换。在接下来的课程中,我将介绍一种特殊的、具有可学习参数的上采样方法——转置卷积。
19:转置卷积 🧩

在本节课中,我们将要学习转置卷积。这是一种用于上采样的技术,它使用可学习的滤波器来放大输入尺寸。我们将详细解释其工作原理,并讨论其特有的“棋盘格”问题。
概述
上一节我们介绍了卷积、池化和上采样层。本节中,我们来看看转置卷积。这是一种通过可学习滤波器来放大输入尺寸的上采样方法。
转置卷积的工作原理
转置卷积的操作过程与普通卷积非常相似,但其目的是增大特征图的尺寸。
以下是转置卷积将一个2x2输入上采样为3x3输出的具体步骤:
- 使用一个2x2的可学习滤波器,设置步长(stride)为1。
- 从输入的左上角像素开始,将其值与滤波器中的每个值相乘。
- 将相乘的结果放置在输出特征图左上角的2x2区域内。
- 将滤波器按步长1移动,对输入的下一个像素(例如右上角像素)重复此过程,将结果累加到输出特征图的相应位置。
- 重复此过程,直到遍历完整个输入。
通过这种计算方式,输出中的某些像素值会受到输入像素的更大影响。例如,输出中心的像素值受到输入所有四个像素的影响,而角落的像素值只受一个输入像素的影响。
转置卷积的“棋盘格”问题
尽管转置卷积功能强大,但它存在一个常见问题:棋盘格效应。
这个问题源于计算方式的不均匀性。在之前的例子中,输出中心的像素被访问了四次(受所有输入像素影响),而边缘像素只被访问了一次。这种不均匀的“贡献度”会导致生成的图像出现类似棋盘格的规则图案。
下图展示了一个转置卷积的实际输出,其中可以观察到明显的棋盘格图案:


应用现状与替代方案


尽管存在棋盘格问题,转置卷积在研究中仍然相当流行。
然而,为了避免这个问题,目前一种更受欢迎的技术是组合使用上采样层(如最近邻插值)和普通卷积层。这种方法先通过无参数的上采样增大尺寸,再通过卷积层进行学习,通常能产生更平滑的结果。
总结
本节课中我们一起学习了转置卷积的核心内容:

- 转置卷积是一种上采样方法,其滤波器参数是可学习的。
- 其操作过程与卷积类似,但目的是增大特征图尺寸。
- 使用转置卷积的一个主要问题是可能导致输出出现棋盘格图案。
- 尽管有此问题,转置卷积仍然被广泛使用,在本专项的某些模型中也会用到它。同时,“上采样+卷积”的组合正成为更流行的替代方案。
20:吴恩达《生成对抗网络》第三周 - 解决生成器模式崩溃问题 🎯
概述
在本节课中,我们将要学习生成对抗网络训练过程中的一个主要问题——模式崩溃,并探索如何通过引入一种新的损失函数来解决它,从而使生成器和判别器能够持续学习,生成更多样化的输出。
欢迎来到第三周 🚀
上一节我们介绍了如何升级生成器以生成更好的图像。本节中,我们来看看生成器训练中的另一个主要问题。
这个问题表现为:生成器每次只生成同一种东西。例如,一个在所有不同犬种上训练的生成器,可能最终只生成金毛寻回犬的图像。
这显然是一个问题。该问题的发生是因为判别器在不断改进。
模式崩溃的根源
以下是模式崩溃发生的关键过程:
- 判别器作为一个分类器,其目标是尽可能准确地区分真实图像和生成图像。随着训练进行,它倾向于给出极端的判断(例如,1代表“非常真实”,0代表“非常假”)。
- 在某一轮训练中,即使生成器生成的金毛寻回犬看起来并不十分逼真,但只要判别器认为它是“真实”的,生成器就会紧紧抓住这个“成功模式”。
- 于是,生成器开始只生成金毛寻回犬。
- 当判别器在下一轮训练中学会识别这种金毛寻回犬是假的时,生成器就陷入了困境。因为它“武器库”中的其他图像模式从未被鼓励过,它不知道应该转向生成什么。
学习的终止对这些网络来说是非常、非常糟糕的。
深入探究:二元交叉熵的局限
挖掘更深一层,这个问题源于二元交叉熵损失函数。
在这种损失函数下,判别器被强制输出一个介于0和1之间的值。尽管0和1之间有无限个小数,但随着判别器性能提升,其输出会无限逼近0或1。
其公式可以表示为:
L = -[y * log(p) + (1 - y) * log(1 - p)]
其中 y 是真实标签(0或1),p 是判别器的预测概率。
解决方案:引入 Wasserstein 损失
本周,你将认识一种新的损失函数——Wasserstein 损失(或称推土机距离)。它允许判别器输出任意实数,范围可以从负无穷到正无穷(例如 -4 或 100)。
这种改变缓解了模式崩溃问题,因为它不再强迫判别器做出非此即彼的极端判断。判别器可以给出一个连续的“真实度”分数,这为生成器提供了更丰富、更渐进的梯度信号,使得两个网络都能像你一样持续学习。
你的作业将是实现这个出色的GAN升级。
总结
本节课中,我们一起学习了:
- 模式崩溃的现象及其对GAN多样性的破坏。
- 模式崩溃的根源在于判别器的极端化判断和生成器的路径依赖。
- 传统的二元交叉熵损失限制了判别器的输出范围,加剧了此问题。
- 引入 Wasserstein 损失 作为解决方案,它允许判别器输出更丰富的梯度信息,从而促进生成器和判别器的持续、稳定学习。
现在,让我们开始动手实现吧!
21:模式坍塌 (Mode Collapse) 🎭

在本节课中,我们将要学习生成对抗网络训练中一个常见的问题——模式坍塌。我们将了解什么是概率分布中的“模式”,以及模式坍塌在GAN训练中是如何发生的。
什么是“模式”?📊
上一节我们介绍了GAN训练中可能遇到的问题。本节中,我们来看看“模式”在概率分布中的具体含义。
在数据的概率分布中,一个“模式”指的是观测值高度集中的区域。例如,正态分布的均值就是该分布的单一模式。当然,也存在具有多个模式的分布,其均值不一定是模式之一。
更直观地说,在特征的概率密度分布上,任何一个峰值都是该分布的一个模式。
以下是理解模式的一个具体例子:
- 特征表示:假设手写数字可以用特征
X1和X2来表示。这两个维度可以是任何用于表示不同手写数字的数值。 - 概率分布:在这种情况下,概率密度分布将是一个具有许多峰值的曲面,每个峰值对应一个数字(0-9)。因此,这是一个具有10个不同模式的多峰分布。
- 模式中心:例如,所有数字“7”的观测值将由相似的
(X1, X2)特征对表示。这些值会聚集在一起,其中最中心的点(红色标记)可以看作是“平均的7”。同样,数字“5”的观测值会聚集在另一个区域,形成另一个峰值。 - 低概率区域:在两个模式(如“7”和“5”)之间的区域,概率密度非常低。这意味着在真实数据集中,几乎不可能出现一个看起来介于7和5之间的数字。
因此,在这个由特征 X1 和 X2 构成的概率密度分布上,总共有10个模式,每个数字对应一个。

什么是“模式坍塌”?🏚️

理解了模式的概念后,我们继续使用手写数字的例子,来探讨模式坍塌意味着什么。
直观上,模式坍塌听起来就像是所有事物都坍缩到一个或少数几个模式上,而其他模式消失了。以下是它发生的过程:
- 判别器的局部最优:假设一个判别器已经学会了很好地识别哪些手写数字是伪造的,除了那些看起来像数字“1”或“7”的生成图像。此时,判别器处于其损失函数的一个局部最小值。
- 生成器接收反馈:生成器看到判别器的反馈后,得到了一个如何在下一轮欺骗判别器的好主意。它发现所有被判别器错误分类的图像都类似于“1”或“7”。
- 生成器利用漏洞:因此,生成器开始大量生成类似于“1”或“7”的图片。
- 判别器调整:在下一轮,这些生成的图像被传递给判别器。判别器可能调整后,能正确识别出像“7”的假图,但仍然会错误分类那些像“1”的图片。
- 坍塌到单一模式:生成器获得这个新反馈,发现判别器的弱点在于处理像手写“1”的图片。于是,这次它生成的所有图片都只模仿数字“1”。这样,生成器的输出就从整个可能的手写数字分布,“坍塌”到了单一的模式上。


最终,判别器可能会察觉并学会识别伪造的“1”,从而跳出那个局部最小值。但生成器也可能迁移到分布的另一个模式(例如“5”),导致博弈再次坍塌到另一个不同的模式。或者,生成器可能无法找到其他可以多样化的方向。

本节总结 📝
本节课中我们一起学习了模式坍塌的核心概念:

- 模式:是特征概率分布上的峰值。真实世界的数据通常具有多个模式,对应数据集中的每个可能类别(如手写数字数据集中的10个数字)。
- 模式坍塌:发生在生成器通过学习只从整个训练数据集的单一类别(例如只生成手写数字“1”)中产生样本来欺骗判别器时。这是不幸的,因为虽然生成器在优化以欺骗判别器,但这并不是我们最终希望生成器做的事——我们希望它能生成多样且高质量的样本。
22:BCE损失的问题与梯度消失 🧠
在本节课中,我们将探讨生成对抗网络(GAN)训练中常用的二元交叉熵(BCE)损失函数,并分析其为何可能导致梯度消失问题。我们将回顾BCE损失的形式,理解生成器和判别器的目标,并解释在何种情况下训练会变得困难。


BCE损失函数回顾
上一节我们介绍了GAN的基本概念,本节中我们来看看其常用的损失函数。传统上,GAN使用二元交叉熵损失进行训练,但这并非最佳方法。使用BCE损失时,GAN容易遭遇模式崩溃和其他问题。
BCE损失函数的形式是判别器对真实样本和生成样本误分类代价的平均值。其公式如下:
L = - [y * log(D(x)) + (1 - y) * log(1 - D(G(z)))]
其中,第一项针对真实样本,第二项针对生成样本。损失值越高,表明判别器的性能越差。

生成器的目标是最大化这个损失,因为这意味着判别器表现不佳,将生成的假样本误判为真实样本。而判别器的目标是最小化这个损失函数,因为这表示其分类正确。生成器只关注公式中与生成样本相关的部分。这种最大化与最小化的博弈常被称为极小极大博弈。
GAN的全局目标
通过这个极小极大博弈,生成器与判别器的互动最终转化为整个GAN架构的一个更宏观的目标:使生成数据的特征分布与真实数据的特征分布尽可能相似。换句话说,是让生成分布无限接近真实分布。

因此,二元交叉熵损失函数的极小极大过程,近似于在最小化另一个更复杂的、旨在实现分布匹配的函数。在整个训练过程中,判别器自然地试图尽可能清晰地区分真实与生成分布,而生成器则试图让生成分布看起来更像真实分布。
判别器与生成器的角色差异
然而,让我们退一步,再次审视生成器和判别器的角色。在GAN中,判别器只需要输出一个介于0和1之间的预测值,而生成器则需要产生一个由多个特征组成的复杂输出(例如一张图像)来试图欺骗判别器。

因此,判别器的任务往往相对简单一些。换句话说,欣赏博物馆里的画作比创作那些杰作要直接得多。在训练过程中,判别器完全有可能在性能上超越生成器,事实上,这种情况非常普遍。
梯度消失问题的产生
以下是训练过程中可能发生的情况:
在训练初期,判别器能力不强,区分生成分布与真实分布存在困难。两者分布存在重叠,判别器不太确定,因此它能够以非零梯度的形式向生成器提供有用的反馈。
随着训练进行,判别器能力增强,开始更清晰地区分生成分布与真实分布。此时,真实样本的预测值会集中在1附近,而生成样本的预测值会趋近于0。
当判别器变得过于优秀时,它开始提供信息量较少的反馈。具体来说,它回传的梯度可能接近于0。这对生成器毫无帮助,因为生成器无法知道该如何改进。梯度消失问题便由此产生。
总结

本节课中我们一起学习了BCE损失在GAN训练中的局限性。GAN试图通过最小化一个衡量分布差异的底层代价函数,来使生成分布逼近真实分布。然而,当训练中判别器比生成器更容易提升,且两个分布差异较大时,该代价函数会产生平坦区域。此时判别器能轻易区分真假样本(给真实样本打标签1,给生成样本打标签0),从而导致梯度消失问题,阻碍生成器的进一步学习。
23:推土机距离 🚜
在本节课中,我们将学习生成对抗网络中一个重要的概念——推土机距离。我们将了解为何传统的二元交叉熵损失函数会导致模式崩溃和梯度消失问题,并探讨推土机距离如何通过测量两个分布之间的差异来提供更优的训练效果。
概述

使用二元交叉熵损失训练生成对抗网络时,由于整个架构的基础成本函数特性,常会遇到模式崩溃和梯度消失问题。尽管判别器的输出值在0到1之间有无限多个小数,但随着判别器的改进,其输出会趋向于两端极值。

本节视频将介绍一种不同的基础成本函数,称为推土机距离。它用于测量两个分布之间的距离,并且在训练生成对抗网络时,其表现通常优于与二元交叉熵损失相关的函数。最后,我们将解释为何这种方法有助于缓解梯度消失问题。

推土机距离的直观理解
假设我们有一个生成分布和一个真实分布,它们具有相同的方差但不同的均值,并且可能都是正态分布。推土机距离的作用是,通过估计将生成分布转化为真实分布所需付出的“努力”程度,来衡量这两个分布之间的差异。
直观地理解,如果生成分布是一堆泥土,那么推土机距离衡量的是将这堆泥土移动并塑造成真实分布的形状和位置有多困难。这就是“推土机距离”一词的含义。
该函数同时取决于生成分布需要移动的距离和需要移动的量。我们将在下一节视频中介绍计算此距离的函数。
二元交叉熵损失的问题
上一节我们了解了推土机距离的概念,本节中我们来看看传统方法的问题所在。
二元交叉熵损失的问题是,随着判别器的改进,它会开始在0和1之间给出更极端的值,即更接近1或更接近0的值。因此,它反馈给生成器的信息变得不那么有用,导致生成器因梯度消失问题而停止学习。
以下是该问题的简化表示:
判别器输出 -> 极端化 (接近0或1) -> 梯度消失 -> 生成器停止更新
推土机距离的优势
与二元交叉熵损失不同,推土机距离在0和1之间没有这样的上限。因此,无论这两个分布相距多远,成本函数都会持续增长,并且该度量的梯度不会趋近于0。
因此,使用推土机距离的生成对抗网络更不容易出现梯度消失问题,进而也减少了模式崩溃的可能性。
总结
本节课中我们一起学习了推土机距离。
推土机距离是一个衡量使一个分布等于另一个分布所需付出的努力的函数,因此它同时取决于距离和数量。与二元交叉熵损失不同,当分布开始变得非常不同且判别器大幅改进时,它不会出现平坦区域。
因此,近似这种度量可以消除梯度消失问题,并降低生成对抗网络中出现模式崩溃的可能性。


在接下来的几节视频中,我将展示一个使用推土机距离来训练生成对抗网络的损失函数。


24:Wasserstein损失函数 🧠
在本节课中,我们将学习生成对抗网络(GAN)中的一种替代损失函数——Wasserstein损失(W Loss)。我们将了解其基本概念、计算方式,并与传统的二元交叉熵(BCE)损失进行对比。

概述
之前你已经看到,传统上使用二元交叉熵(BCE)损失来训练GAN。然而,由于其函数形式的近似特性,BCE损失存在许多问题。本节将介绍一种替代损失函数——Wasserstein损失(简称W Loss),它近似于上一节中提到的“推土机距离”(Earth Mover's Distance)。
BCE损失的简化形式
上一节我们介绍了BCE损失的基本概念,本节中我们来看看它的简化表达方式。

BCE损失通过一个较长的方程计算,本质上衡量了判别器将观测样本分类为“真”或“假”的平均错误程度。生成器希望最大化这个损失,因为这意味着判别器认为其生成的假样本看起来非常真实;而判别器则希望最小化这个损失,这通常被称为“极小极大博弈”。
这个复杂的BCE损失方程可以简化为以下形式:
[
L_{\text{BCE}} = \mathbb{E}[\log(D(x))] + \mathbb{E}[\log(1 - D(G(z)))]
]
其中,求和与除以样本数M的操作即为均值或期望值。方程的第一部分衡量判别器对真实样本(y=1)的分类错误程度,第二部分衡量其对生成器产生的假样本(y=0)的分类错误程度。
Wasserstein损失的计算

现在,让我们转向Wasserstein损失。与BCE损失不同,W损失近似于真实分布与生成分布之间的“推土机距离”,并具有比BCE更优的性质。
W损失的计算形式与简化后的BCE损失相似,其函数计算的是判别器(在W损失中常称为“评论家”)对真实样本和假样本预测值之间的差异:
[
L_{\text{W}} = \mathbb{E}[C(x)] - \mathbb{E}[C(G(z))]
]
这里,C代表评论家,x是真实样本,G(z)是生成器根据噪声向量z生成的假样本(也可记作(\hat{x}))。判别器试图最大化其对真实样本和假样本评价之间的距离,即努力将这两个分布推得尽可能远。与此同时,生成器希望最小化这个差异,因为它希望判别器认为其生成的假图像尽可能接近真实图像。
与BCE损失相比,W损失函数中没有对数运算,因为评论家的输出不再被限制在0和1之间。
判别器与评论家的区别
以下是BCE损失与W损失在判别器/评论家设计上的主要区别:
- 激活函数与输出范围:为使BCE损失有意义,判别器的输出必须是0到1之间的预测概率。因此,使用BCE损失训练的GAN,其判别器神经网络的输出层通常使用Sigmoid激活函数,将值压缩到0和1之间。
- 输出层设计:W损失没有上述限制。因此,评论家神经网络的最后一层可以是线性层,产生任意实数值输出。
- 功能与名称:评论家的输出可以解释为图像被评价为“真实”的程度。由于输出不再局限于0(假)和1(真),它不再是在这两个类别之间进行分类或判别。因此,将这个神经网络称为“判别器”不太合适,在W损失的语境下,其等价物被称为“评论家”。评论家的目标是最大化其对假样本和真实样本评价之间的距离。
核心差异总结
本节课我们一起学习了Wasserstein损失函数及其与BCE损失的关键区别。
W损失与BCE损失的主要区别在于:
- 输出范围:BCE损失下的判别器输出0到1之间的值;而W损失下的评论家可以输出任意数值。
- 损失函数形式:两者的成本函数形式相似,但W损失内部没有对数运算,因为它衡量的是评论家对真实样本的预测与对假样本的预测之间的距离。而BCE损失衡量的是预测值与真实标签(1或0)之间的距离。
- 训练稳定性:关键要点在于,判别器的输出有界(0到1),而评论家的输出无界,它只是尽可能地将两个分布分开。因此,由于无界性,评论家可以在不降低反馈质量的情况下持续改进,这缓解了梯度消失问题,并有助于避免模式崩溃,因为生成器总能获得有用的反馈。

总之,W损失看起来与BCE损失相似,但其背后的数学表达式不那么复杂。它的作用是近似推土机距离,从而防止模式崩溃和梯度问题。然而,为了使该损失函数有效工作,还需要一个额外的条件,这将在后续视频中介绍。
25:Wasserstein GAN中的判别器条件 🧠
在本节课中,我们将学习Wasserstein损失函数如何解决传统GAN训练中的一些问题,并重点探讨其成功应用的一个关键前提:判别器网络必须满足“1-Lipschitz连续性”条件。我们将解释这个条件的含义、重要性以及如何实现它。

概述
Wasserstein损失(W Loss)通过计算真实样本与生成样本在判别器输出上的期望值之差,为GAN训练提供了更稳定的梯度。然而,要有效地使用W Loss进行训练,判别器(Critic)网络必须满足一个特殊的数学条件,即“1-Lipschitz连续性”。本节将深入解析这一条件。
Wasserstein损失函数回顾
上一节我们介绍了Wasserstein损失的基本形式。它本质上是一个简单的表达式,用于计算判别器对真实样本 X 的输出期望值与其对生成样本 G(Z) 的输出期望值之间的差值。
生成器的目标是最小化这个表达式,试图让生成的样本尽可能接近真实样本。
而判别器的目标是最大化这个表达式,因为它希望尽可能地区分真实样本和生成样本,希望两者之间的距离尽可能大。
然而,为了使用W Loss成功训练GAN,判别器需要满足一个特殊条件。
判别器的关键条件:1-Lipschitz连续性
这个条件听起来复杂,但其核心思想很简单:对于像判别器这样的神经网络函数,要成为“1-Lipschitz连续”的,其梯度的范数(Norm)必须处处小于或等于1。
这意味着,函数在任何一点的斜率(梯度)的绝对值都不能大于1。
以下是判断一个函数是否满足1-Lipschitz连续性的方法:
你可以沿着函数的每一个点进行检查,确保该点的斜率小于或等于1(或梯度小于等于1)。一种可视化的方法是,在你要评估的每个点处,画两条斜率分别为+1和-1的直线。你需要确保函数的增长永远不会超出这两条线所夹的绿色区域范围,因为停留在这个区域内意味着函数的增长是线性的。

示例分析:
- 图中展示的函数不满足1-Lipschitz连续性,因为它在多个区段超出了绿色边界,表明其增长超过了线性速度。
- 一个平滑的曲线函数,如果你检查每一个点,发现其增长始终没有超过线性速度,那么这个函数就是1-Lipschitz连续的。
为什么这个条件至关重要?
这个施加在判别器网络上的条件对于W Loss至关重要,因为它确保了Wasserstein损失函数不仅是连续且可微的,而且其变化不会过大,从而在训练过程中保持一定的稳定性。
这正是W Loss所基于的推土机距离(Earth Mover‘s Distance) 能够有效计算的前提。

这个条件对于同时训练判别器和生成器神经网络是必需的。它还能增加训练的稳定性,因为随着生成器的学习,损失函数的变化将被限制在一定范围内。

总结与过渡
总结来说,在使用W Loss进行训练的GAN中,判别器需要是1-Lipschitz连续的,这样才能确保其对真实数据和生成数据之间进行的推土机距离比较是有效的。
为了在训练中满足或近似满足这一条件,研究者们提出了多种不同的方法。


在本节课中,我们一起学习了Wasserstein GAN中判别器必须满足的1-Lipschitz连续性条件,了解了它的定义、直观理解及其对训练稳定性的重要性。下一节,我们将探讨几种在实践中强制执行这一条件的常用技术。
26:强制 Lipschitz 连续性 🎯
在本节课中,我们将学习如何在训练判别器时,强制其满足 1-Lipschitz 连续性 条件,以确保 Wasserstein 损失函数的有效性。我们将介绍两种主要方法:权重裁剪和梯度惩罚,并比较它们的优劣。

1. 什么是 1-Lipschitz 连续性?
上一节我们介绍了 Wasserstein 损失函数。本节中我们来看看确保其有效性的一个关键条件:判别器网络的 1-Lipschitz 连续性。
这意味着,对于判别器函数 f(例如,以图像 x 为输入),其梯度的范数在函数的每一个点上都必须小于或等于 1。用公式表示如下:
||∇f(x)|| ≤ 1
这里通常使用 L2 范数(即欧几里得距离)。直观上,在二维空间中,这表示函数在任何一点的“斜率”都不超过 1。
2. 强制连续性的两种方法
为了确保判别器满足上述条件,有两种常见的方法。以下是它们的简要介绍:
方法一:权重裁剪
在权重裁剪方法中,判别器神经网络的所有权重值都被强制限制在一个固定的区间内。
具体操作是,在梯度下降更新权重后,将所有超出设定区间的权重“裁剪”到区间的边界值。例如,如果设定区间为 [-c, c],那么任何小于 -c 的权重会被设为 -c,任何大于 c 的权重会被设为 c。
代码示例:
# 假设权重矩阵为 w,裁剪阈值为 clip_value
w = np.clip(w, -clip_value, clip_value)
方法二:梯度惩罚
梯度惩罚是一种更“柔和”的强制连续性方法。它通过在损失函数中添加一个正则化项来实现。
这个正则化项的作用是:当判别器在某个点上的梯度范数大于 1 时,对其进行惩罚。损失函数变为:
L = Wasserstein损失 + λ * 正则化项
其中,λ 是一个超参数,用于控制正则化项的权重。
3. 梯度惩罚的实现细节
上一节我们提到了梯度惩罚的基本思想。本节中我们来看看如何具体实现它。
由于检查判别器在特征空间每一个点上的梯度是不现实的,我们采用一种采样近似的方法。以下是具体步骤:
- 从真实图像集和生成图像集中各取一个样本。
- 在这两个样本之间进行随机线性插值,生成一个中间样本 x̂。
- 计算判别器对这个中间样本 x̂ 的预测的梯度范数。
- 我们希望这个梯度范数尽可能接近 1。因此,正则化项被设计为梯度范数与 1 的平方差。
公式表示:
正则化项 = (||∇f(x̂)||₂ - 1)²
其中,x̂ = ε * x_real + (1 - ε) * x_fake,ε 是一个在 [0, 1] 区间内均匀分布的随机数。
这种方法并不严格保证每一点的梯度范数都 ≤1,而是鼓励判别器在整个数据流形上具有近似为 1 的梯度范数。实践证明,它比权重裁剪更有效。
4. 两种方法的比较
现在,我们来总结和比较一下权重裁剪与梯度惩罚这两种方法。

- 权重裁剪:实现简单,但存在明显缺点。过于严格的裁剪会严重限制判别器的学习能力,影响最终生成器的性能;而裁剪不足则可能无法有效强制连续性。这需要大量的超参数调优。
- 梯度惩罚:作为一种软约束,它不严格保证但有效鼓励判别器满足 Lipschitz 连续性。尽管它增加了计算开销(需要计算二阶梯度),但在实践中通常能获得更稳定、更优的训练效果,对超参数的选择也相对更鲁棒。
总结

本节课中,我们一起学习了强制判别器满足 1-Lipschitz 连续性 的两种方法:权重裁剪 和 梯度惩罚。我们了解了它们的基本原理、实现方式以及各自的优缺点。梯度惩罚因其更好的实践效果,已成为训练 Wasserstein GAN (WGAN-GP) 时更受青睐的选择。理解这些技术有助于我们构建更稳定、更强大的生成对抗网络。
27:生成对抗网络(GAN)第四周 🎭
概述
在本节课中,我们将要学习生成对抗网络(GAN)的进阶应用,重点介绍条件生成与可控生成的核心概念。通过对比无条件生成,我们将理解如何让模型根据特定指令生成内容,以及如何在不改变模型结构的情况下调整输出特征。
无条件生成与条件生成
在过去的几周中,您的生成对抗网络(GAN)性能已经逐步提升。
但您对生成内容缺乏控制权。
这类似于在家中,您无法选择父母或监护人制作哪种类型的饼干。
您可能今天得到燕麦葡萄干饼干,明天晚上则是巧克力碎片饼干。
您的生成对抗网络(GAN)一直以这种方式运作,这被称为无条件生成。
然而,与此相反,在餐厅中,您可以根据菜单点选燕麦葡萄干饼干、巧克力碎片饼干或任何其他类型的饼干。
这被称为条件生成:您告诉模型生成不同的项目,您指定或基于菜单条件进行生成,并调整训练过程以实现这一目标。
可控生成的概念
类似地,存在可控生成的概念,继续以饼干类比进行说明。
这涉及在不改变模型或厨师及其流程的情况下,调整模型输入的方法。
这类似于在烹饪过程中调高或调低温度,以控制特定输出特征,例如饼干的酥脆程度或软糯程度。
这一概念适用于条件生成和无条件生成。
本周任务安排
以下是本周的两个实践任务:
- 构建一个条件生成对抗网络(Conditional GAN)。
- 实现可控生成(Controllable Generation)。
让我们开始学习。
总结
本节课中,我们一起学习了生成对抗网络(GAN)中条件生成与可控生成的核心区别与应用。通过类比,我们理解了如何让模型根据特定条件生成内容,以及如何通过调整输入参数来控制输出特征,为后续的实践任务奠定了理论基础。
28:条件生成对抗网络(Conditional GAN)的直观理解 🧠
在本节课中,我们将要学习生成对抗网络(GAN)中一个重要的进阶概念:条件生成(Conditional Generation)。我们将通过对比无条件生成,来理解条件生成如何让你控制生成样本的类别或特征。

概述
在之前的几周里,你已经了解了GAN的工作原理,以及如何构建它们来生成模仿训练数据集的样本。本周,我将向你展示如何控制生成器的输出,使其生成特定类别的样本,或者让生成的样本具备某些特定特征。这非常有趣。
无条件生成回顾
首先,我们来回顾一下什么是无条件生成。实际上,到目前为止你一直在使用的就是无条件生成。在这种模式下,生成器会从随机类别中产生输出。
你可以将其想象成一个扭蛋机:你投入一枚硬币,就会得到一个随机颜色的扭蛋。如果你想要一个特定颜色(比如红色)的扭蛋,你必须不断投币,直到得到它为止。
在这个比喻中:
- 硬币 类似于生成器用于生成的随机噪声向量
z。 - 扭蛋机 类似于生成器
G。 - 扭蛋 就是随机的输出,即你得到的那些图像。

因此,就像你知道扭蛋机里有哪些颜色的扭蛋(基于你的训练数据),但你无法控制具体会得到哪个颜色的扭蛋一样,无条件生成无法控制输出样本的具体类别。

条件生成介绍
与无条件生成相反,条件生成允许你“请求”一个特定类别的样本,并且你会得到你所请求的。这更像一个自动售货机。
你投入一枚硬币(类似于扭蛋机),但同时你还需要输入你想要商品的代码。例如,输入代码“A2”来获得一瓶红色汽水。
但需要注意的是,你仍然无法控制汽水瓶的某些具体特征,比如你无法得到保质期最新、瓶身最完好或者液体最满的那一瓶。你只是随机得到一瓶红色汽水,但它确实是一瓶红色汽水,而不是一根蓝色糖果棒。
在这个比喻中:
- 硬币和代码 共同作为条件GAN的输入。
- 自动售货机 是生成器
G。 - 汽水 是生成的输出。

因此,使用条件GAN,你可以从你指定的类别(例如这里的“A2”红色汽水)中获得一个随机样本。
核心对比
现在你已经对条件生成和无条件生成的关系有了概念,让我们对它们进行一些比较。
以下是两者的主要区别:
- 输出控制:条件生成可以让你决定生成样本的类别;而无条件生成只能得到随机类别的样本。
- 数据需求:因此,条件生成需要使用带标签的数据集进行训练,这些标签对应着你希望生成的不同类别;而无条件生成则不需要任何标签,正如你在前几周课程中看到的,你只需要一堆真实的样本即可。
- 模型修改:在后续的讲座中,你将看到如何修改你的模型来实现这种条件生成。
总结
本节课中,我们一起学习了条件生成对抗网络的核心直觉。你需要掌握的重点是:条件生成需要带标签的数据集进行训练,以便学习如何从期望的类别中生成样本。

接下来,我将向你展示如何将数据集的标签信息输入到生成器和判别器中,从而训练你的条件GAN,并生成来自期望类别的样本,就像从自动售货机中选择红色汽水一样。
29:条件生成对抗网络的输入 🎨
在本节课中,我们将学习条件生成对抗网络(Conditional GAN)中,如何将类别信息传递给生成器和判别器,从而实现按指定类别生成样本。


概述
条件生成允许你从指定类别中生成样本。为实现这一点,你需要带有标签的数据,并在训练过程中将类别信息同时传递给生成器和判别器。本节将介绍如何告知生成器要生成哪个类别,以及如何将样本的类别信息与待分类图像一同传递给判别器。
生成器的输入
上一节我们介绍了无条件生成,生成器需要一个噪声向量来生成随机样本。在条件生成中,你还需要一个向量来告诉生成器,生成的样本应属于哪个类别。
这通常是一个独热编码向量,意味着除了对应你所需类别的位置为1外,其他所有位置都是0。噪声向量则仍然是随机值,但它不必是0或1。
以下是类别信息与噪声向量的结合方式:
- 独热编码向量:用于指定目标类别。例如,向量
[0, 1, 0, 0, 0]可能表示“哈士奇”。 - 噪声向量:用于在指定类别内引入多样性,生成不同的样本。
条件GAN中生成器的输入,实际上是噪声向量和独热编码类别信息的拼接,形成一个更大的向量。
代码示例:生成器输入向量的拼接
# 假设 noise_vector 维度为 100, one_hot_class 维度为 10(代表10个类别)
generator_input = concatenate([noise_vector, one_hot_class])
# 现在 generator_input 的维度是 110


例如,当类别向量代表“哈士奇”时,生成器理想情况下会从一个噪声向量生成一只哈士奇的图像。如果你改变噪声向量,它应该生成另一只不同的哈士奇,而类别信息保持不变。
判别器的输入与训练目标
那么,如何确保生成器真的生成哈士奇,而不是任意品种的狗呢?这看起来像魔法。原因在于判别器也会接收同样的类别信息。

判别器以类似的方式接收样本,但现在样本会与类别信息配对,作为输入,以判断该样本是该特定类别的真实还是虚假表示。这是关键所在。
例如,如果输入判别器的类别是“金毛寻回犬”,但图像是一只比格犬(即使它看起来非常真实),判别器也应该判定其为“假”,因为它不是一只看起来真实的金毛寻回犬。
因此,为了让判别器预测一个样本是“真实”的,该样本需要看起来像训练数据集中该类的样本。生成器为了用“金毛寻回犬”欺骗判别器,就必须生成一只逼真的金毛寻回犬。
继续以“金毛寻回犬”类别为例,判别器将学会仅在样本看起来像金毛寻回犬时,才预测该图像更“真实”。这是因为真实图像会带有正确的类别标签,这也促使生成的图像呈现出正确的类别。
类别信息的表示方法

深入探讨一下,判别器的输入是图像。那么如何添加类别信息呢?
图像通常以三个通道(RGB:红、绿、蓝)输入,如果是灰度图像则只有一个通道。这就是图像的组成部分。
而独热编码的类别信息也可以作为额外的通道输入。在这些通道中,所有位置的值通常都是0(图中显示为白色块,与图像等高宽),而对应类别的通道(图中显示为黑色块)则取值为1。
与一维的独热向量相比,这些是更大的矩阵,每个通道在非对应类别的位置都充满0。
当然,也存在许多其他更节省空间的方法来实现这一点,例如以其他格式压缩此信息。如果你有非常多的类别,甚至可以创建一个独立的神经网络“头”来处理,这将是更谨慎的做法。但对于这里大约七个类别的情况,上述方法完全可行,模型能够学习到这些信息。
公式/概念说明:判别器的多通道输入
判别器的输入可以看作是一个多通道张量:
判别器输入 = 图像通道 (如 RGB) + 类别信息通道 (独热编码矩阵)

总结
本节课中,我们一起学习了条件生成对抗网络中输入的处理方式:
- 在条件生成中,你需要将类别信息传递给两个模型。
- 对于生成器,类别信息通常是一个独热编码向量,与你的噪声向量拼接后作为输入。
- 对于判别器,当GAN的期望输出是图像时,类别信息是代表通道的独热编码矩阵。
- 类别向量的大小以及用于类别信息的额外通道数,与你将要生成的类别数量相同。

通过这种方式,生成器学会了根据指定的类别生成样本,而判别器则学会了结合类别信息来更精确地判断真伪。
30:可控生成 🎛️
在本节课中,我们将学习生成对抗网络的另一种控制输出方式——可控生成。我们将探讨其核心概念、工作原理,并将其与上一节介绍的条件生成进行对比。

概述
上一节我们介绍了条件生成,它利用标签在训练过程中引导模型。本节中,我们来看看可控生成。这种方法允许你在模型训练完成后,依然能够控制输出样本中想要的特定特征,例如调整生成人脸的年龄、是否戴眼镜或头发的颜色。
什么是可控生成?🤔
可控生成让你能够控制输出样本中的某些特征。例如,在一个进行人脸生成的GAN中,你可以控制图像中人物的外观年龄、是否佩戴太阳镜、视线方向或感知性别。
实现这一目标的方法是:在模型训练完成后,通过调整输入生成器的噪声向量Z。
例如,对于某个输入噪声向量 Z,生成器可能生成一张红发女性的图片。如果你调整 Z 中的某个特定维度(特征),可能会得到同一位女性但头发变为蓝色的图片。这暗示了该维度可能控制着发色的变化。
# 概念性示例:调整噪声向量Z的某个维度以改变特征
z_original = sample_noise_vector()
image_original = generator(z_original) # 生成红发人像
z_modified = modify_feature_in_z(z_original, feature_index=0, delta=0.5)
image_modified = generator(z_modified) # 生成蓝发人像

在后续课程中,你将学习如何精确地调整 Z 向量。但首先,为了更好地理解可控生成,我们将其与条件生成进行快速比较。
可控生成 vs. 条件生成 ⚖️
以下是两种方法的核心区别。请注意,在研究论文中,这些术语的界限有时并不绝对(可控生成有时也涵盖条件生成),但通常按如下方式区分:
- 可控生成:目标是控制输出中特征的强弱或有无。这些特征通常是连续的,如年龄、发色深浅、笑容程度。你可以在训练后通过寻找特征方向并调整
Z来实现,无需为每个特征值(如每种具体发长)提供标签。 - 条件生成:目标是指定输出所属的类别,例如“人类”或“鸟类”。当然,也可以是“戴太阳镜的人”。这通常需要在训练期间使用带标签的数据集,并将类别信息附加到噪声向量
Z上。
简而言之,可控生成更关注连续特征的程度微调,而条件生成更关注离散类别的指定。
工作原理与对比 🔧
可控生成与条件生成在实现机制上有所不同:
- 可控生成:通过调整输入噪声向量
Z本身来工作。你寻找Z空间中代表特定特征(如“年龄增长”)的方向,并沿该方向移动Z。 - 条件生成:需要向生成器传递额外的信息(即类别标签),通常与噪声向量
Z拼接(append) 后一起输入。
# 概念性代码对比
# 可控生成:修改Z
z_controlled = z + alpha * direction_age # 沿“年龄”方向调整
# 条件生成:将标签信息与Z结合
label = one_hot_encode("person_with_sunglasses")
z_conditional = concatenate(z, label)
当然,可控生成有时也会在训练期间进行干预,以引导模型学到更易于控制的特征方向。
总结
本节课中,我们一起学习了可控生成。它使你能够在GAN训练完成后,通过调整输入噪声向量 Z 来控制输出样本的特定特征(如年龄、发色)。与条件生成不同,它通常不需要带标签的训练数据集,而是侧重于在特征空间中发现可解释的方向并进行操作。

在接下来的视频中,我们将深入探讨如何具体实现这种对 Z 向量的调整。
31:Z空间中的向量代数 🧮

在本节课中,我们将学习生成对抗网络中“可控生成”背后的核心直觉。我们将探讨如何通过操作输入生成器的噪声向量 Z,来控制生成图像的特征,例如改变人物的发色。理解Z空间中的向量操作是实现精细控制生成内容的关键。

上一节我们介绍了通过操作噪声向量 Z 可以实现可控生成。本节中,我们来看看这背后的直观原理,并首先回顾如何在两个生成器输出之间进行插值。
回顾:生成器输出之间的插值 🔄


可控生成与插值有相似之处。通过插值,你可以在两个生成的样本之间获得一系列中间样本。


以下是插值在实践中的应用方式:
- 你可以观察一张图像如何逐渐变形为另一张图像。
- 例如,在这个动图中,每个从0到9的数字都逐渐变形为下一个数字,效果非常有趣。
其原理是,通过操作来自Z空间(即噪声向量的向量空间)的输入,你可以在目标图像之间获得中间样本。稍后你会看到,这正是可控生成背后的相同思想。
为了更清晰,我们定义:
Z1和Z2是当前所观察的Z空间中的两个维度。- 向量
V1和V2是Z空间中的具体向量值。
例如:
- 向量
V1的值为[z1=5, z2=10],即向量[5, 10]。 - 向量
V2的值为[z1=4, z2=2],即向量[4, 2]。
当将 V1 输入生成器时,会产生图像A;将 V2 输入生成器时,会产生图像B。
如果你想在这两张图像之间获得中间图像,可以在Z空间中对它们的两个输入向量 V1 和 V2 进行插值。这种插值通常是线性的,当然也存在其他插值方式。
然后,你可以将所有中间向量输入生成器,观察它们产生的图像。生成器接收这些向量并输出对应的图像,从而得到这两张原始图像之间的平滑渐变过渡。
可控生成的原理 🎯
可控生成同样利用了Z空间中的变化,其关键在于理解对噪声向量的修改如何反映在生成器的输出上。

例如:
- 使用一个噪声向量,你可以得到一张红发女性的图片。
- 使用另一个噪声向量,你可以得到同一女性但头发是蓝色的图片。
这两个噪声向量之间的差异,正好指明了在Z空间中需要移动的“方向”,以修改生成图像的发色。
在可控生成中,你的目标就是为所关心的不同特征(例如修改发色)找到这些方向。不过,暂时不必担心如何精确找到这个方向,我们将在后续课程中讲解。
假设我们已知这个方向,称其为Z空间中的方向向量 D。现在,你就可以控制生成器 G 输出上的特征了,这非常令人兴奋。
这意味着,如果你用同一个生成器 G 和输入噪声向量 V1 生成了一张红发男性的图像,你可以通过将之前找到的方向向量 D 加到噪声向量上,创建一个新的噪声向量 V1 + D。
将 V1 + D 输入你的生成器,就能得到一张结果图像,其中男性的头发变成了蓝色。
总结 📝

本节课中,我们一起学习了Z空间向量代数的核心思想。
总结来说,在可控生成中,你需要找到Z空间中与生成器输出上所需特征变化相关的方向。
一旦已知这些方向,可控生成就通过在该Z空间中沿不同方向移动噪声向量来实现。

接下来,你将学习与可控生成相关的一些挑战,以及如何找到对生成输出具有已知效果的Z空间方向。
32:可控生成的挑战 🎯
在本节课中,我们将学习生成对抗网络(GAN)中“可控生成”所面临的两个主要挑战:输出空间中的特征相关性,以及潜在空间(Z空间)的纠缠问题。理解这些挑战是掌握如何精确控制生成内容的关键。

概述
可控生成的目标是能够决定生成器输出内容的特定特征,例如在生成人物图片时控制其发色或发型。然而,实现精确控制并非易事,主要会遇到两个核心挑战。
特征相关性
上一节我们介绍了可控生成的基本概念,本节中我们来看看第一个挑战:特征相关性。
当训练数据集中不同的特征高度相关时,训练出的生成器将难以在不影响相关特征的情况下,独立控制某个特定特征。
例如,理想情况下,你希望仅控制生成器输出的人物面部胡须量。如果数据集中的特征没有高度相关性,你或许可以通过在潜在空间(Z空间)中沿某个方向移动,为一张女性图片添加胡须。
然而,在实际训练数据集中,像“是否有胡须”和“面部男性化程度”这类特征很可能存在强相关性。因此,当你试图为女性图片添加胡须时,最终会改变输出的许多其他特征。这通常不是我们期望的结果,因为我们希望找到能仅改变单一特征的方向,从而实现可靠的图像编辑。

以下是特征相关性挑战的要点:
- 问题本质:数据集中特征A与特征B高度绑定。
- 导致结果:尝试修改特征A时,会不可避免地连带改变特征B。
- 核心影响:破坏了控制的独立性和精确性。
Z空间纠缠
了解了特征相关性后,我们来看第二个挑战:Z空间纠缠。
当Z空间发生纠缠时,即使训练数据中的特征本身不相关,在Z空间中沿不同方向移动也会同时影响输出中的多个特征。这是因为噪声空间在学习过程中变得非常纠缠。
在这个纠缠的Z空间中,例如当你试图控制输出人物是否戴眼镜时,可能也会同时改变她是否有胡须或头发的样式。同样,当你尝试修改她的表观年龄时,可能也会连带改变她的眼睛和发色。这对于控制无关的特征来说是不可取的。
这意味着噪声向量中某些分量的变化会同时改变输出的多个特征,这使得控制输出变得非常困难,甚至不可能。
当Z空间的维度相对于你想要控制的输出特征数量不足时,这是一个非常常见的问题,因为此时模型无法建立一一映射的关系。这通常也是训练生成模型时的一个普遍问题。
以下是Z空间纠缠挑战的要点:
- 问题本质:Z空间(噪声输入空间)的维度结构混乱。
- 数学/代码描述:设噪声向量为
z ∈ R^d,生成器为G(z)。纠缠意味着存在一个方向向量Δz,使得G(z + αΔz)的输出在多个不相关的特征上(如眼镜、胡须)同时发生变化,其中α是步长。 - 导致结果:单一控制方向会同时影响多个输出特征。
- 核心影响:无法实现特征间的解耦控制。

总结
本节课中我们一起学习了可控生成面临的两大挑战。
首先,如果数据集中的特征彼此高度相关,并且没有以某种方式加以处理,那么当你尝试控制生成器的输出时,最终会一次性改变多个特征。
其次,即使你想要控制的特征在训练数据中相关性不高,但如果你的Z空间是纠缠的,可控生成同样困难。当Z空间的维度不够大时,这种情况经常发生,当然也存在其他导致纠缠的原因。

理解这些挑战是后续探索解决方案(如使用解耦表示学习、条件GAN等)的重要基础。
33:利用分类器梯度控制GAN生成特征 🎭

在本节课中,我们将学习一种利用已训练分类器的梯度,在生成对抗网络的潜在空间(Z空间)中寻找特定特征方向的方法。这种方法允许我们在不修改生成器权重的情况下,通过调整输入噪声向量来控制生成图像的特征,例如添加太阳镜或改变发型。
概述
上一节我们介绍了通过在Z空间中沿特定方向移动来修改生成图像特征(如改变头发长度)的基本概念。本节中,我们将深入探讨一种利用预训练分类器梯度来寻找这些方向的具体方法。
方法原理
该方法的核心思想是:使用一个能够识别目标特征(例如“是否佩戴太阳镜”)的预训练分类器,通过其输出的梯度信息来指导噪声向量Z的调整,从而使生成器输出的图像逐渐具备该特征。
以下是实现步骤:
- 准备噪声向量与生成图像:选取一批噪声向量
Z,输入到已训练好的生成器中,得到一批生成图像。 - 使用分类器进行评估:将生成的图像输入到一个预训练的分类器(例如“太阳镜分类器”)中。该分类器会判断每张图像中的人物是否佩戴太阳镜。
- 计算梯度并更新Z:根据分类器的输出(例如,对“未佩戴太阳镜”的图像施加惩罚),计算损失函数相对于输入噪声向量
Z的梯度。然后,沿着减小损失的方向更新Z向量。生成器的权重在此过程中始终保持冻结,不被更新。 - 迭代优化:重复步骤1至3,直到生成的图像被分类器判定为“佩戴太阳镜”为止。
方法要求与优缺点
以下是使用此方法前需要考虑的几个要点:

- 需要预训练的分类器:你必须有一个能够准确检测你想要控制的目标特征的预训练分类器。
- 分类器的来源:你可以使用现成的模型,也可以针对特定特征(例如检测胡须)自己训练一个分类器。建议优先寻找可用的预训练模型,这通常是最简单快捷的方式。
- 方法的优势:这种方法简单、高效,充分利用了现有的预训练模型,无需重新训练或修改生成器。
- 方法的局限:其效果完全依赖于所用分类器的准确性。如果分类器性能不佳,寻找的特征方向也可能不准确。
总结

本节课中,我们一起学习了如何利用预训练分类器的梯度来控制GAN的生成特征。关键要点是:预训练分类器可用于发现Z空间中与生成图像特征相关联的方向;通过计算分类器对噪声向量Z的梯度并迭代更新Z(同时保持生成器不变),我们可以实现这种控制。请记住,所有这些操作都是在生成器训练完成之后进行的。
34:生成对抗网络 (GAN) - P34:解耦 🧩

在本节课中,我们将学习生成对抗网络中“解耦”的概念。我们将探讨解耦空间与耦合空间的区别,并介绍几种引导模型实现解耦的方法。
上一节我们介绍了Z空间中的“耦合”现象及其带来的问题。本节中,我们来看看什么是“解耦”,以及如何引导模型实现它。
首先,我们回顾一下耦合与解耦的Z空间分别意味着什么。
耦合空间 vs. 解耦空间
假设有以下两个噪声向量 V1 和 V2,它们来自一个解耦的Z空间。
# 示例:解耦Z空间中的噪声向量
V1 = [z1_hair_color, z2_hair_length, z3, z4, ...]
V2 = [z1'_hair_color, z2'_hair_length, z3', z4', ...]
右侧可视化了该Z空间的两个维度,但显然,从这些噪声向量可以看出,其维度远不止两个。在一个解耦的Z空间中,每个维度位置都对应输出图像中的一个单一特征。例如:
- 第一个维度(如
z1)可能对应发色。 - 第二个维度(如
z2)可能对应发长。
因此,如果你想改变图片中的发色,你只需要改变噪声向量中第一个元素的值,或者在Z空间中沿Z1方向移动。同理,要改变发长,只需调整第二个维度的值。
通常,我们希望噪声向量的尺寸大于你想要控制的特征数量。这使得模型在训练时更容易学习,因为多余的维度值可以灵活变化以辅助训练。例如,如果你只想控制发色和发长两个特征,那么将噪声向量设置为大于二维(比如三维或更多)是更明智的。多出的维度不控制特定特征,但能帮助模型在训练过程中进行适应。
由于解耦Z空间中的噪声向量分量允许你改变输出中期望的特征,它们通常被称为变化的潜在因子。“潜在”一词源于噪声向量中的信息并非直接体现在输出中,但它们确实决定了输出的样貌。有时,噪声向量也被更泛泛地称为“潜变量”。“变化的因子”则意味着这些是不同的、你希望独立改变的因素(如发色、发长),并且改变一个因子时,只影响对应的那个特征。
本质上,一个解耦的Z空间意味着在噪声向量中存在特定的索引(维度),这些维度直接对应并改变你GAN输出中的特定特征。例如,生成图像中的人物是否戴眼镜、是否有胡子或头发的某些特征。每个这样的维度都对应一个你希望改变的特征,你只需改变该维度的值就能调整眼镜、胡子或头发。
解耦Z空间与耦合Z空间的一个关键区别在于:在解耦空间中,当你控制输出中的一个特征(例如眼镜)时,其他特征保持不变。如果改变某人是否有胡子,眼镜和头发也会保持不变。
这意味着,拥有一个解耦的Z空间,你更有可能为一个看起来非常女性化的人物添加胡子,而无需改变她的头发或面部特征。
了解了什么是解耦空间后,我们来看看如何引导模型实现它。以下是几种主要方法。
引导模型实现解耦的方法

1. 使用带标签数据的监督方法
一种方法是给你的数据打上标签,并遵循类似于条件生成的过程。但不同之处在于,类别的信息被嵌入到噪声向量本身中,因此你不需要额外的独热编码类别信息或类别向量。
然而,这种方法对于连续型类别可能会有问题。想象一下,需要为成千上万张人脸标注他们的头发长度。当然,即使只划分几个不同的类别(几个桶),也可能将你的生成器推向正确的方向。

2. 无监督的正则化方法
另一种无需为任何样本打标签的方法是,在你选择的损失函数(如BCE或W损失)中添加一个正则化项。这个正则化项的目的是鼓励模型将噪声向量中的每个索引与输出中的不同特征关联起来。这种正则化可以来自分类器的梯度,也有更先进的技术以完全无监督(即无需任何标签)的方式实现这一点。

在本节课中,我们一起学习了生成对抗网络中的“解耦”概念。

总结如下:
- 解耦的Z空间允许你通过将噪声向量中特定的Z值直接对应到你想控制的特征,从而独立地控制单个输出特征。
- 为了引导你的模型使用解耦的噪声向量,你可以使用监督学习和无监督学习两种方法。
35:一总结与课程二展望 🎉
在本节课中,我们将对生成对抗网络(GAN)的第一门课程进行总结,并展望第二门课程的核心内容与学习目标。
恭喜你完成了第一门课程的学习。你现在已经掌握了足够的知识,可以在第二门课程中学习并构建最先进的生成对抗网络。
第二门课程是迈向逼真图像生成能力的一个巨大转折点。这就像是从90年代模糊的手机图像,跃升到了高清电影的画质。那么问题来了,我们如何量化这一巨大飞跃,并与其他已构建的GAN模型进行比较呢?
在第二门课程中,你将实现目前最广泛使用的GAN评估指标。这些指标将使你能够定量地比较不同GAN模型的性能。由于你将构建的模型非常令人兴奋且先进,这类技术正被应用于各种产品并影响着人们的生活,因此,确保任何使用它的人都以负责任的态度对待它至关重要。
负责任地处理这一技术的一个重要方面,是理解其可能存在的偏见。你将探索这个强大模型在实际应用中的情况,并了解它有时并未被非常公平地使用。
所以,请做好准备。第二门课程将是一次激动人心的旅程,它将赋予你构建那些让GAN声名鹊起的模型所需的知识与责任感。能力越大,责任越大。我们下一门课程再见。
本节课中,我们一起回顾了第一门课程的完成,并介绍了第二门课程在评估指标、技术进阶以及社会责任方面的核心学习内容。我们即将进入更深入、更实用的GAN构建与应用阶段。
36:高级生成对抗网络与伦理考量 🚀
在本课程中,我们将深入学习生成对抗网络(GANs)的高级概念,包括前沿的StyleGAN算法、其他生成模型(如VAE),以及模型评估方法。我们还将探讨GANs的社会影响,包括偏见和深度伪造等伦理问题。
欢迎来到课程2 👋
欢迎来到生成对抗网络专项课程的第二门课程。在第一门课程中,你已经学习了如何构建一个基础的GAN,并了解了许多改进方法,例如DCGAN、WGAN和条件GAN。
在本课程中,我们将把这些概念推向更深入的层次。
课程核心内容 🎯
上一节我们介绍了课程的整体目标,本节中我们来看看具体的核心学习模块。
以下是本课程将涵盖的四个主要部分:
- StyleGAN:你将学习用于合成人脸及其他图像的前沿算法。
- 替代模型:你将了解GAN的替代方案,例如变分自编码器(VAE)和其他生成模型。
- 模型评估:你将学习模型的评估方法,包括多样性和保真度等技术问题。
- 社会影响:本课程将探讨GAN的重要社会影响议题。
深入探索StyleGAN 🖼️
StyleGAN可能是你在新闻中读到过的算法之一。它能生成极其逼真的图像,甚至让人们难以分辨图片是真实的还是合成的。
实际上,有一个名为“thispersondoesnotexist.com”的网站展示了此类示例。浏览这些图片时,你可能会因为所有这些“不存在”的人而略感惋惜。
我听说人们甚至开始为这些虚构人物创作故事,也许你可以在那些故事中“遇见”他们。
StyleGAN将与你第一门课程中看到的“可控性”主题相联系。你可以控制StyleGAN生成各种输出,其精细程度甚至可以达到将一缕头发拨到一边,这非常神奇。
当然,StyleGAN能够生成极其逼真且多样化的图像,同时不易快速发生模式崩溃。多样性至关重要,因为你不会只想生成一张超级逼真的脸,那一点也不酷。你希望能够生成整个范围,甚至可能是所有可能的人脸。
技术力量与社会责任 ⚖️
我同意,因此我认为本课程既要探讨我们使用GAN的社会影响,也要讲解其技术组成部分。
作为下一代GAN构建者,我希望你们在掌握构建这种神奇的StyleGAN的能力时,也能负责任地运用它。我们希望避免深度伪造造成严重破坏。
因此,在本课程中,我们也将讨论GAN非常真实的伦理影响,以及何时使用、何时不应使用它们。
本课程将教授你一系列相对强大的技术。请大家务必仅以对社会负责和积极的方式使用这些技术。
我认为GAN的积极影响实际上远远超过其一些负面用例,我真诚希望你们能将精力集中于此,并利用你们的力量造福社会。
事实上,我见过的一个非常酷的项目是,你(Sharon)与Yoshua Bengio等人合作,使用GAN合成图像,以帮助人们理解气候变化的影响。
我希望我们许多学习者在完成这门课程、完成这个专项课程后,能提出更多酷炫而有创意的想法,以帮助解决重要问题。我真的很期待看到你们的创造。
总结 📝
本节课中我们一起学习了课程2的概览。我们了解到,本课程将深入讲解StyleGAN等高级GAN技术、其他生成模型、评估方法,并重点探讨了伴随强大技术而来的社会责任与伦理考量。现在,让我们开始学习吧。
37:生成对抗网络(GAN)评估指南 🧐

在本节课中,我们将学习如何评估生成对抗网络。评估GAN是一个具有挑战性的任务,因为它不像分类任务那样有明确的“正确”或“错误”标签。我们将从理解评估GAN的难点开始,然后深入探讨两个核心评估属性:保真度和多样性。
为什么评估GAN具有挑战性?🤔
评估GAN的挑战性源于其生成式任务的本质。在监督学习中,例如图像分类,我们有一个带有标签的测试集,可以明确判断模型预测的对错。模型输出有明确的“正确”目标。
然而,对于GAN,我们输入一个随机噪声向量 z,模型会生成一张“假”图像。我们无法预先知道给定 z 时应该生成的确切像素值。因此,没有一个清晰的“正确”目标来衡量生成图像的好坏。这就像评判一位学习创作大师级画作的艺术家,而不是评判一位临摹已知画作的学徒。
此外,GAN中的判别器虽然能区分真实与生成图像,但它永远不会达到完美,并且通常会过拟合于其对应的特定生成器。这意味着,即使一个生成器生成了看起来很逼真的图像,其对应的判别器也可能因为捕捉到了生成器的某些特定模式而将其判定为“假”。因此,不存在一个完美的、通用的判别器可以公平地比较两个不同GAN模型的优劣。
评估GAN的核心属性
既然没有直接的“正确”答案,我们转而关注生成器应具备的理想属性。以下是两个最重要的评估维度。
属性一:保真度
保真度指的是生成图像的质量和真实感。一张高保真度的图像看起来应该像一张真实的照片,细节清晰,没有明显的伪影或模糊。我们可以这样思考:对于每一张生成的“假”样本,它与最接近的“真”样本有多大的差异?更一般地,我们可以比较一组生成图像与一组真实图像在特征空间中的整体距离。
核心思想:评估生成图像与真实图像的接近程度。
属性二:多样性
多样性指的是生成器能够产生的图像的变化范围。一个好的生成器不应该只反复生成同一张或少数几张非常逼真的图像(这种现象称为模式崩溃)。它应该能够捕捉并再现训练数据集中存在的全部多样性。
例如,一个用于生成手写数字的GAN,应该能生成各种不同风格、不同笔画的数字“8”,而不仅仅是同一种“8”。

核心思想:评估生成图像覆盖真实数据分布范围的能力。
上一节我们介绍了评估GAN的两个核心属性。需要理解的是,保真度和多样性有时会相互制约。追求极高的保真度可能导致生成图像过于相似,缺乏多样性;而过度追求多样性又可能牺牲图像质量。一个优秀的GAN需要在两者之间取得良好的平衡。
深入理解保真度与多样性
以下是关于这两个属性的进一步说明。

关于保真度
评估保真度时,我们关注生成图像的逼真程度。一种思路是衡量单个生成样本与其在真实数据集中最近邻样本的差异。为了获得更稳健的评估,我们通常比较两组样本(例如各100张)在特征空间中的分布距离。我们期望一个好的生成器能够持续稳定地输出高质量图像,而不是偶尔生成一张杰作。
在后续课程中,你将学习一些具体的度量方法来进行这种比较。
关于多样性
评估多样性时,我们希望生成图像的分布能够覆盖真实数据分布的整个范围。如果GAN只生成同一张高度逼真的图像,那它不是一个好模型。我们可以通过比较生成图像集和真实图像集在特征空间中的分布“散度”来量化多样性。例如,生成的一组“狗”的图片,应该像真实的“狗”图片集一样,包含不同品种、姿态和场景。

课程总结
本节课我们一起学习了评估生成对抗网络的核心概念。
我们了解到,评估GAN之所以困难,是因为缺乏一个能够提供绝对真实标签的全局判别器来进行公平的模型间比较。
为了评估GAN,我们需要综合考虑保真度(生成图像的质量与真实感)和多样性(生成图像的变化范围)这两个关键属性。
通过衡量生成图像与真实图像在保真度和多样性上的表现,我们可以对生成器的性能有一个全面的认识。


在接下来的视频中,你将带着对这些属性和标准的理解,学习具体评估GAN的几种方法。
38:图像比较方法 🖼️🔍

在本节课中,我们将学习如何比较不同的图像,例如在生成对抗网络中评估真实图像与生成图像的质量。比较图像在保真度和多样性方面具有挑战性,因为具体应该比较什么?首先,我们将探讨一种简单但不够充分的方法——像素距离。然后,我们将介绍使用特征距离来比较图像,这种方法能提供更可靠的比较结果。

像素距离法 📏
像素距离是图像比较中最简单的方法,它通过计算两幅图像对应像素值之间的差异来实现。
具体操作是:对于一幅真实图像和一幅生成图像,将一幅图像的像素值(范围从0到255)减去另一幅图像的对应像素值,然后取绝对值。这样可以得到每个像素的差异值。
接着,可以将所有像素的差异值求和。如果两幅图像完全相同,总差异值为0,表示它们之间没有距离,看起来完全一致。
然而,像素距离法并不十分可靠。例如,假设生成图像相对于真实图像向左平移了一个像素。尽管这两幅图像在人眼看来可能几乎无法区分,尤其是在高分辨率图像中,但根据像素距离计算,它们的绝对差异会非常大。
公式示例:
像素距离 = Σ |真实图像像素值 - 生成图像像素值|
如果图像非常大,仅平移一个像素可能导致巨大的像素距离总和,例如达到900,尽管视觉差异微乎其微。
特征距离法 🧠

由于像素距离法对微小变化过于敏感,一种替代方法是关注图像的高级特征,而非直接比较像素。
高级特征指的是图像中的语义信息,例如:狗是否有两只眼睛?鼻子是否在眼睛下方?是否有毛发?这种高级语义信息对图像的小幅平移或变化不那么敏感。
因此,我们可以通过提取图像的特征(如两只眼睛、下垂的耳朵、鼻子等)来“浓缩”或描述图像,然后基于这些提取的特征来比较图像。这种方法称为特征距离法。
核心思想:
通过比较图像的高级语义特征,评估结果对图像中的微小差异不再那么敏感。例如,即使两幅图像的背景不同,只要它们都能被识别为“有两只眼睛和鼻子的狗”,它们在特征层面上就是相似的。
在接下来的视频中,我们将详细讲解如何提取这些特征以及如何计算特征距离。
有趣的是,你可以看到两幅图像在某些方面相似(例如都有两只眼睛),但在其他方面可能存在差异(例如耳朵的数量、腿的数量等)。生成图像可能只有一只下垂的耳朵或者五条腿,这与真实图像存在差距。通过特征比较,我们可以量化这种差距。
总结 📝
本节课我们一起学习了两种图像比较方法。
首先,我们介绍了像素距离法。这种方法虽然简单,但对图像中的微小变化过于敏感,导致比较结果不可靠。
接着,我们探讨了特征距离法。这种方法通过提取和比较图像的高级语义特征,而非直接比较像素,使得图像比较更加稳健和可靠。特征距离法关注的是更高层次的信息,因此在评估生成对抗网络中的图像时更为有效。


总之,在评估和比较图像时,特征距离法提供了一个比像素距离法更优的替代方案。
39:特征提取 🧠

在本节课中,我们将学习如何从图像中提取特征。这些特征将用于计算图像之间的特征距离。
为了计算真实图像与生成图像之间的特征距离,首先需要一种从这些图像中提取特征的方法。我们可以通过使用预训练分类器的权重来获得一个特征提取器。
获取特征提取器
以下是获取特征提取器的关键步骤:
- 预训练分类器:理想的提取器是一个在大量图像上预训练过的分类器,这些图像最好与你想要提取特征的数据和类别相关。
- 编码的特征:这些预训练模型的权重本质上编码了许多特征。例如,一个能区分狗和植物的分类器,必然已经学会了识别“湿鼻子”、“金色毛发”或“植物形状”等特征。
- 无需重复训练:幸运的是,我们无需为评估每个GAN都去训练一个新分类器。已有在数百万图像和成百上千个类别上预训练好的神经网络可供直接使用。
这些分类器能区分非常多的类别,因此它们的网络中编码了大量相关特征。
如何使用预训练分类器
上一节我们介绍了如何获取预训练模型,本节中我们来看看如何具体使用它来提取特征。

我们并不关心分类器最终的分类输出,但网络其余部分的权重很有价值,它们学习了有助于最终分类任务的重要特征。
因此,我们可以“砍掉”最后的分类层,只获取更早一层的输出,该层包含了输入图像的有用信息。
以下是处理一个通用卷积神经网络(CNN)的典型流程:
- 一个卷积神经网络通常包含卷积层、池化层和全连接层。
- 最常见的做法是移除最后一个用于分类的全连接层。
- 将移除前最后一个池化层的输出作为特征。因为在这一层,模型必须编码足够多的精细特征信息,才能让后续仅一个全连接层就能完成图像分类。
截断网络后,从这个“最后的池化层”输出的值(例如100个数值)就代表了该模型为这张特定输入图像提取的特征。我们可以将此层视为特征层。
这个特征层输出的值远少于输入像素的数量,因此它将输入中的像素值压缩成了这些特征。
选择特征层
选择哪一层作为特征层是可以进行实验的。通常建议从最后一个池化层开始,因为它在一个庞大且任务广泛的数据集上训练过。
但使用更早的层也是可行的。以下是不同层次的特征差异:
- 更早的层:如果回溯到网络中更早的卷积层或池化层,可以提取更基础的特征。例如,最早的层可能只进行垂直边缘检测。
- 最后的池化层:这一层的特征则更适用于具体的图像类别,例如判断图像中是否有猫。

ImageNet 数据集
上一节提到,一个好的起点是使用在ImageNet上预训练的分类器。本节我们来详细了解一下这个数据集。
ImageNet是一个包含超过1400万张图像和2万个类别的著名大型数据集。其类别包括各种狗品种、猫品种、几乎所有你能想到的动物类型以及多种物体。
在这个数据集上训练的分类器,其编码的信息非常丰富。从这个分类器提取的特征有时被称为 ImageNet嵌入,因为它们利用在该数据集上训练的网络权重,将图像信息嵌入并压缩到一个更小的向量中。
这些特征(或嵌入)是存在于更广泛意义上的特征空间或嵌入空间中的向量。你可以想象一张图像输入后,输出的特征就是一个由各种数值组成的向量(例如 [-3, 2, 0.5, ...]),这个向量在某个空间中代表了你的特征。
总结

本节课中,我们一起学习了如何通过截断网络并使用输出层之前的层权重,从一个预训练分类器中获得特征提取器。
最常用的做法是使用最后一个池化层,但如果使用更早的层,则可以提取更基础的特征,如垂直边缘或自然纹理模式。

使用在大型数据集(如拥有数百万张图像的ImageNet)上训练的分类器,可以将图像中有意义的信息编码为特征。在接下来的课程中,你将学习一个使用ImageNet数据的流行分类器,以及如何用它来评估你的生成对抗网络(GAN)。
40:06_01_08_Inception-v3 与嵌入 🧠

在本节课中,我们将学习 Inception V3 网络。这是一个复杂的卷积神经网络分类器,可以在 ImageNet 数据集上进行训练。本节内容将围绕 Inception V3 网络展开,讲解如何从中提取特征嵌入,并比较这些嵌入。这种比较方法可用于评估生成对抗网络。

从分类器到特征提取器
上一节我们介绍了如何使用一个分类器作为特征提取器,特别是那些在庞大的 ImageNet 数据集上训练过的分类器。
具体使用的网络可以不同,但最常用的是 Inception V3,或简称为 Inception。Inception 网络有 42 层深,但设计巧妙且计算高效,在分类任务上表现出色,同时作为特征提取器也特别有用。由于我们将用它来比较真实图像与生成图像的特征,因此我们将重点放在其作为特征提取器的功能上。
Inception V3 网络结构
下图展示了 Inception V3 网络的表示。首先,你需要截断这个分类器网络的最后一个用于分类的全连接层,然后使用最后一个池化层。
分类过程发生在网络末端(图中未显示),这部分已被截断。如图所示,输出是一个 8x8x2048 的张量。这实际上并非最终输出,而是最后一个卷积层的输出。然后,你将其输入到一个使用 8x8 滤波器的最后一个池化层,最终得到一个大小为 2048 的向量嵌入。
令人惊叹的是,你只得到这 2048 个值作为输出。这意味着给定一张图像,它可以将图像的像素压缩到仅用 2048 个值来表示图像中的显著特征。
之所以强调 2048,是因为与许多图像相比,这个值确实不多。网络上常见的图像可能是 1024x1024 像素,带有三个 RGB 颜色通道,总计超过 300 万个像素值。因此,2048 的嵌入尺寸缩小了 1000 多倍,描述图像所需的值减少了 1000 倍。
目前看来,特征距离似乎明显优于像素距离。特征提取器压缩图像信息也很有用,因为这允许你在每个图像上操作更少的维度,并将大大减少比较大量图像所需的时间,这在后续工作中是必然要做的。


特征提取与嵌入
使用在 ImageNet 上训练用于图像分类的 Inception V3 网络,你现在可以从图像中提取特征来评估你的 GAN。
再次说明,这可能是从这只可爱的狗身上提取诸如两只眼睛、两只下垂的耳朵和一个鼻子等特征。当然,实际的特征比这些描述更抽象一些。值得注意的是,这个特征提取模型应用了一个称为 Phi 的函数或映射函数到图像 X 上以提取其特征。这里的 X 可以是真实或生成的图像,而 Phi 实际上就是那个截断了全连接层的 Inception 网络,用于获取这些特征并构建嵌入,也就是那个 2048 维的向量。
这些提取的特征通常被称为图像的嵌入,因为它们被压缩到这个低维空间中,并且它们在这个低维空间中的位置彼此之间具有相对意义。
实际上,具有相似特征的嵌入在空间中的位置会更接近,即具有相似的值。例如,如果输入另一只与这只狗非常相似的狗,也许是另一只金毛或拉布拉多,但处于不同的姿势,你仍然提取出这些相似的特征,那么它的特征向量可能非常接近原始的那个。假设原始向量是 [-5, 4],想象另一只是 [-6, 4],那么这两个向量就相当相似。
现在,如果输入一张看起来非常不同的椅子图像,没有任何这些特征,那么你会得到第三个特征向量,它可能与前两个相距甚远,例如 [1000, 0.001]。这里我只展示了这些嵌入的两个维度,但请记住它们有 2048 维。

比较嵌入以进行评估

接下来,为了进行评估,需要比较这些嵌入,即真实图像和生成图像之间提取的特征。这通常涉及多个真实图像和多个生成图像,以获得足够的图像代表性。
假设你有几个生成的狗图像示例,当你将它们的特征提取为嵌入时,你发现这些嵌入(这些是向量值的图示)代表了浅色毛发、粉色鼻子的狗。
与此同时,你的真实图像的特征嵌入也包含浅色毛发的狗,但更多的是黑色鼻子。因此,将这些图像作为特征进行比较,比将它们作为像素进行比较更有意义。请记住,在简单的像素距离下,像素的轻微偏移就可能导致两张其他方面完全相同的图像显得完全不同。
因此,基于特征距离,这两张相当相似的图像实际上会非常接近,因为它们都是浅色毛发的狗,都有粉色鼻子。但在像素距离上,它们会相距甚远,因为某个像素与另一个像素非常不同,所以在像素距离上它们会是天壤之别。
计算特征距离的方法
要获得特征距离,你可以直接通过相减来比较特征。例如,你为所有这些图像都得到了向量,你可以取所有生成图像向量的平均值,所有真实图像向量的平均值,然后相减——这是一种方法,类似于你计算像素距离的方式。或者,你可以计算不同向量之间的欧几里得距离或余弦距离。你还可以考虑将真实图像集和生成图像集视为某种分布,并查看这些分布之间的距离。

在下一节中,你将学习如何计算真实图像与生成图像之间的特征距离,这是一种常见的评估方法,敬请期待。

本节总结
现在你对 Inception 网络有了相当的了解:它是一个在 ImageNet 上预训练的分类器,也可以通过截断最后的全连接层用作特征提取器。
同时,你也了解了如何利用最后一个池化层的中间输出,为输入图像构建特征嵌入。这些嵌入随后可用于在不同图像(特别是真实图像和生成图像)之间进行比较,从而了解它们在特征空间中的差异程度。


41:07_01_09_弗雷歇起始距离 (FID) 📊

在本节课中,我们将学习生成对抗网络(GAN)中最流行的评估指标之一——弗雷歇起始距离(Fréchet Inception Distance,简称 FID)。我们将了解其数学原理、如何应用于评估生成图像的质量,以及它存在的一些局限性。
弗雷歇距离简介
上一节我们介绍了评估生成模型的重要性。本节中,我们来看看一个具体的评估指标:弗雷歇距离。
弗雷歇距离以数学家莫里斯·弗雷歇命名,最初用于度量两条曲线之间的距离,后来被推广用于比较两个概率分布。
一个经典的例子是“遛狗问题”:狗在一条曲线(蓝色)上行走,主人在另一条曲线(橙色)上行走。两者都可以按各自速度前进,但不能后退。
计算这两条曲线之间的弗雷歇距离,本质上是找出从起点到终点遛完整条曲线所需的最小狗绳长度。这个长度就是弗雷歇距离的直观理解。
从曲线到分布
弗雷歇距离也可以用于计算两个概率分布之间的距离。对于某些分布,存在解析解。
例如,对于两个一维正态分布,弗雷歇距离有一个简单的计算公式:
公式: d^2 = (μ_x - μ_y)^2 + (σ_x - σ_y)^2
其中:
μ_x和μ_y分别是两个分布的均值,代表分布的中心位置。σ_x和σ_y分别是两个分布的标准差,代表分布的离散程度。
这个公式计算了均值之差与标准差之差的平方和,可以理解为一种衡量两个分布“中心”和“形状”差异的L2距离。
多元正态分布
然而,真实数据(如图像特征)的分布通常不是简单的一维正态分布,它们可能具有多个峰值和复杂的模式。
为了建模这种复杂关系,我们需要引入多元正态分布。它将正态分布的概念推广到更高维度,允许我们使用一个均值向量和一个协方差矩阵来描述分布。
- 均值向量:表示分布在每个维度上的中心。
- 协方差矩阵:描述各个维度自身的方差以及维度之间的协方差(即它们如何相互影响)。
以下是协方差矩阵不同取值时,二元正态分布形态的变化:
- 对角线为1,非对角线为0:两个维度独立,分布呈对称的圆形山峰。
- 非对角线为正数:两个维度正相关,分布沿
y=x方向被拉长。 - 非对角线为负数:两个维度负相关,分布沿
y=-x方向被拉长。
多元弗雷歇距离公式
理解了多元正态分布后,我们可以将一维的弗雷歇距离公式推广到多元情况,用于比较两个多元正态分布:
公式: d^2 = ||μ_x - μ_y||^2 + Tr(Σ_x + Σ_y - 2(Σ_x Σ_y)^{1/2})
其中:
μ_x,μ_y分别是真实和生成数据特征向量的均值向量。Σ_x,Σ_y分别是它们的协方差矩阵。Tr()表示矩阵的迹(对角线元素之和)。||...||表示向量的范数(长度)。(Σ_x Σ_y)^{1/2}表示矩阵的平方根。
这个公式的核心思想与一维情况一致:同时比较两个分布的“中心”(均值向量)和“形状”(协方差矩阵)。距离越小,说明两个分布越接近。
弗雷歇起始距离 (FID) 的应用
现在,我们来看如何将这个理论应用于GAN评估,即计算弗雷歇起始距离。
其步骤如下:
- 提取特征:使用一个预训练的图像分类网络(通常是 Inception V3)分别处理大量真实图像和生成图像,提取它们的特征向量(通常是2048维)。这就是“Inception”的由来。
- 拟合分布:假设这些特征向量服从多元正态分布。分别用真实图像的特征和生成图像的特征,拟合出两个多元正态分布(即计算各自的均值向量和协方差矩阵)。
- 计算距离:使用上述多元弗雷歇距离公式,计算这两个拟合分布之间的距离。这个距离值就是FID分数。
核心要点:FID分数越低越好。分数越低,说明生成图像的特征分布与真实图像的特征分布越接近,即生成图像的质量越高、多样性越好。
FID的局限性
尽管FID被广泛使用,但它也存在一些明显的缺点,需要我们注意:
以下是FID的主要局限性:


- 对特征提取器依赖性强:FID依赖于Inception V3网络提取的特征。如果任务与ImageNet数据集(Inception V3的训练数据)差异很大(例如生成手写数字),提取的特征可能不具代表性,导致评估不准。
- 需要大量样本:为了减少噪声和选择偏差,FID通常需要至少数万个样本进行计算。这导致计算速度较慢。
- 分数存在偏差:FID分数会随所用样本数量的变化而波动。通常样本越多,分数会倾向于更低(显得模型更好),但这并非模型本身改进所致。
- 假设过于简化:FID假设特征服从多元正态分布,且只考虑了一阶矩(均值)和二阶矩(协方差)。真实的特征分布可能更复杂,包含更高阶的统计特性(如偏度、峰度),这些信息被忽略了。
- 分数范围不直观:FID分数没有一个固定的范围(如0到1),其具体数值难以直接解释,通常只能用于相对比较。

总结与建议
本节课中,我们一起学习了弗雷歇起始距离(FID)的原理与应用。
我们了解到,FID通过比较真实图像与生成图像在特征空间中的分布距离来评估GAN的性能。它计算高效、易于实现,因此成为当前最主流的GAN评估指标。
然而,由于其存在的多种局限性(如假设简化、样本偏差等),FID分数不应作为评估模型的唯一标准。在训练GAN时,我们仍然需要:
- 定性检查:人工观察生成的样本,判断其视觉质量。
- 综合评估:结合FID、其他定量指标以及定性分析,来选择最佳模型。

生成模型的评估仍然是一个开放的研究领域,理解现有工具的优缺点对于有效使用它们至关重要。
42:生成对抗网络评估指标 - Inception Score 🧠

在本节课中,我们将学习一种使用 Inception V3 模型来计算生成图像与真实图像之间“距离”的早期方法——Inception Score。虽然它现在很大程度上已被 Fréchet Inception Distance (FID) 所取代,但在许多论文中仍有报告,理解其原理和与FID的区别仍然很重要。
概述:什么是 Inception Score? 📊
Inception Score 是一种评估生成对抗网络性能的指标。它利用在 ImageNet 上预训练的 Inception V3 分类器,从保真度和多样性两个维度来评估生成图像的质量。与FID使用模型中间层特征不同,Inception Score 直接使用分类器的最终输出。
Inception Score 的核心原理

上一节我们介绍了 Inception Score 的基本概念,本节中我们来看看它的具体计算逻辑。其核心思想基于两个概率分布:
- 条件标签分布
P(y|x):给定一张生成图像x,分类器预测其属于各个类别的概率分布。这衡量了保真度。 - 边缘标签分布
P(y):在所有生成图像的样本上,统计各个类别出现的总体概率分布。这衡量了多样性。
保真度:清晰的对象识别
保真度要求单张生成图像看起来像某个明确的类别。这意味着 P(y|x) 应该是一个低熵分布,即概率集中在少数或单个类别上。

例如,一张高质量的“狗”的生成图像,其 P(y|x) 可能类似于:
P(‘dog’|x) = 0.9, P(‘cat’|x) = 0.05, P(‘bird’|x) = 0.05
这个分布具有明显的峰值(低熵),表明图像内容清晰可辨。
多样性:丰富的类别覆盖
多样性要求生成器能产生多种不同类别的图像。这意味着 P(y) 应该是一个高熵分布,即概率均匀地分散在许多类别上,而不是集中在某几个类别。
例如,一个好的生成器,其 P(y) 可能对所有1000个ImageNet类别都有相近的非零概率,而不是只生成“狗”。
Inception Score 的计算公式
理解了保真度和多样性的含义后,我们将它们结合成一个单一的分数。Inception Score 使用 KL散度 来度量 P(y|x) 和 P(y) 这两个分布之间的差异。
Inception Score 公式:
IS(G) = exp( E_{x~p_G} [ KL( P(y|x) || P(y) ) ] )
其中:
G代表生成器。x ~ p_G表示从生成器中采样的图像。KL(P||Q)是分布P和Q之间的KL散度。exp()是指数函数,用于将分数放大到更易读的范围(如接近类别总数1000)。

直观理解:当保真度高(P(y|x) 峰值尖锐、低熵)且多样性好(P(y) 分布平坦、高熵)时,这两个分布差异很大,KL散度值高,从而Inception Score也高。
Inception Score 的数值范围与解读
根据公式和实现方式,Inception Score 的理论最低值为1(当 exp(0) 时),最高值理论上可达类别数量(对于ImageNet是1000)。
以下是得分的解读:
- 高分(例如 > 50):通常意味着模型在保真度和多样性上都表现良好。
- 低分:可能由两种情况导致:
- 两种分布都是低熵(
P(y|x)和P(y)都有尖峰):模型可能发生了模式崩溃,只生成少数几种清晰的图像。 - 两种分布都是高熵(
P(y|x)和P(y)都很平坦):生成的图像内容模糊,分类器无法识别出任何明确物体。
- 两种分布都是低熵(

Inception Score 的局限性

尽管曾被广泛使用,Inception Score 存在一些明显的缺陷:
以下是其主要问题:
- 容易被“欺骗”:生成器只需为每个类别生成一张高质量的图像,就能获得近乎完美的分数,即使它无法为同一类别生成多张不同的图像(这本身也是一种模式崩溃)。
- 不与真实数据比较:该指标只评估生成图像,完全不参考真实数据集的统计信息。因此,一个生成分布可能与真实分布相去甚远,却仍能获得高分。
- 依赖于分类器的能力:其效果受限于Inception V3分类器在ImageNet任务上的训练。对于包含多个物体的复杂场景、分类器未训练过的特征(如特定的人脸角度)或空间关系错乱但局部特征清晰的图像,评估可能不准确。
- 对数据集敏感:只有当生成任务的数据集与ImageNet相似时,该指标才有意义。
总结

本节课中我们一起学习了 Inception Score 这一重要的GAN评估指标。我们了解到它通过 Inception V3 分类器,将生成图像的质量分解为保真度(P(y|x),低熵为好)和多样性(P(y),高熵为好)两个方面,并使用KL散度将它们合并为一个分数。

尽管 Inception Score 因其不与真实数据比较、易被欺骗等局限性,已逐渐被 Fréchet Inception Distance 所取代,但它仍然是阅读早期GAN文献和理解评估思路的重要基础,尤其在条件生成任务中仍有其参考价值。
43:采样与截断技巧 🎲

在本节课中,我们将要学习生成对抗网络(GAN)评估过程中的两个重要概念:采样方法与截断技巧。我们将了解如何通过调整采样策略来平衡生成图像的质量(保真度)与多样性,并介绍一种在模型训练后使用的实用技巧。

概述
上一节我们介绍了GAN的主要评估方法。本节中,我们来看看在具体评估时,如何对真实数据集和生成数据集进行采样,以及一个可以显著影响评估结果的技巧——截断技巧。
采样策略的重要性
在评估GAN时,真实数据集与生成数据集的统计特性至关重要。采样方式的不同会直接影响评估指标(如FID分数)的结果。
对于真实图像,通常采用均匀随机采样。然而,对于生成图像,其采样依赖于噪声向量 z 的先验分布 P(z)。
以下是典型的做法:
- 在训练GAN时,噪声向量 z 通常从一个标准正态分布中采样,即 z ~ N(0, 1)。
- 这意味着,靠近均值0的 z 值在训练中出现得更频繁。
- 因此,在评估时从分布中心区域采样,生成的图像质量较高、更逼真,但多样性可能不足。
截断技巧
基于上述保真度与多样性的权衡观察,一个非常巧妙的采样技巧应运而生,即截断技巧。该技巧在模型训练完成后使用,用于主动调整生成结果的特性。
截断技巧的核心操作是“裁剪”用于采样的正态分布尾部。具体而言:
- 它通过设定一个超参数 ψ(截断阈值),将原始分布(如图中蓝色曲线)的尾部切除,形成新的采样分布(如图中红色曲线)。
- 采样时,只从 [-ψ, ψ] 区间内抽取 z 值。
这个技巧允许你在评估或应用模型时进行微调:
- 若追求更高保真度:应设置较大的 ψ 值,更多地裁剪分布尾部,使采样更集中于均值附近。公式表示为:采样 z, 其中 |z| ≤ ψ,且 ψ 值较小。
- 若追求更高多样性:应设置较小的 ψ 值,保留更多的分布尾部,从而采样到更多训练中不常见的 z 值。但这样生成的图像可能质量较低、更怪异。
关于先验分布的补充
虽然也可以使用均匀分布等其他先验分布来训练GAN,但正态分布因其支持截断技巧而广受欢迎。实验表明,不同先验分布对最终模型性能的影响并不显著。
需要注意的是,使用截断技巧可能会影响FID等自动化评估分数,因为它改变了生成样本的统计特性。然而,它可能更符合特定下游任务的需求,例如当你需要高度逼真、避免怪异结果的图像时。
人类评估与HYPE标准
尽管自动化评估指标很有用,但它们仍无法完全捕捉人类对图像质量的感知。因此,人工评估仍然是GAN开发过程中的重要环节,并被视为黄金标准。
近年来,发展出了一种系统化、基于众包的人类感知评估标准——HYPE。HYPE通过向评估者(如亚马逊众包工人)逐张展示图像,并要求其判断“真实”或“虚假”,来量化生成模型的质量。评估者需要做出判断的时间越短,通常意味着图像越容易被识别为假货,即模型性能越差。
然而,最终选择何种评估方式,仍取决于你的下游任务。例如,如果GAN用于生成医学X光片,那么最好的评估者可能是专业医生,而非自动化指标或普通众包人员。
总结
本节课中我们一起学习了:
- 采样策略:评估GAN时,对生成图像的采样需依据训练时噪声向量 z 的先验分布 P(z),通常为标准正态分布 N(0, 1)。
- 截断技巧:这是一个训练后技巧,通过设定阈值 ψ 来裁剪采样分布的尾部,从而在保真度(图像质量)和多样性(图像变化范围)之间进行权衡。
- 评估考量:自动化指标(如FID)与人类感知评估(如HYPE)各有优劣,选择合适的评估方法需结合具体的应用目标。

你现在已经掌握了如何在测试或推理阶段,通过截断技巧这把“新武器”来灵活调整GAN的输出特性。虽然自动化评估指标尚不能完美衡量生成效果,但它们提供了良好的近似,而人类评估则继续为图像质量设定着终极基准。
44:生成对抗网络(GAN)评估:精确率与召回率 📊
在本节课中,我们将学习用于评估生成对抗网络(GAN)性能的两个重要概念:精确率和召回率。这两个指标可以帮助我们更细致地理解生成图像的质量(逼真度)和多样性。


概述
在生成模型的评估中,我们不仅关心生成的单个图像是否逼真,还关心模型是否能生成覆盖整个真实数据分布的多样化图像。精确率和召回率为我们提供了一种将“逼真度”和“多样性”分解为更具体、可量化指标的方法。
核心概念:精确率与召回率
为了理解这两个指标,我们首先需要想象一个包含所有可能真实图像的“空间”。在这个空间中,有两个关键分布:
- 真实分布(PR):代表所有真实图像的概率分布。
- 生成分布(PG):代表生成器能够生成的所有“假”图像的概率分布。
理想情况下,我们希望 PG 与 PR 完全重叠,这意味着生成器既能生成所有类型的真实图像,又不会生成任何不真实的“垃圾”图像。



然而现实中,这两个分布通常只是部分重叠。精确率和召回率正是通过分析这个重叠区域来评估模型性能的。
精确率(Precision)
精确率关注的是生成器输出的质量。

在上图中,虚线圆圈内代表所有生成样本。其中,填充的样本是与真实分布重叠的部分(即看起来真实的生成图像),未填充的样本是未重叠的部分(即看起来虚假的“垃圾”图像)。
精确率的计算公式是:
精确率 = (与真实分布重叠的生成样本数) / (所有生成样本的总数)
直观上,精确率衡量的是“在所有生成的图像中,有多少比例是高质量的(看起来真实的)”。高精确率意味着生成器产生的图像普遍逼真,但它可能只覆盖了真实数据分布的一部分(即 PG 可能是 PR 的一个子集)。
精确率与逼真度(Fidelity)相关,因为它惩罚了那些被模型生成出来但质量低劣的“额外垃圾”。
召回率(Recall)
召回率关注的是生成器覆盖真实数据分布的能力。
它是精确率的镜像,计算公式是:
召回率 = (与真实分布重叠的生成样本数) / (所有真实样本的总数)
直观上,召回率衡量的是“在所有可能的真实图像中,生成器能够成功模拟(生成)的比例”。它关注的是生成器遗漏了哪些真实样本(即图中蓝色区域中未被红色覆盖的部分)。高召回率意味着生成器能够生成非常多样化的图像,覆盖了真实数据中的大部分变化。
召回率与多样性(Diversity)相关,因为它评估了模型捕捉真实数据全部变化的能力。
模型表现与“截断技巧”
理解了这两个指标后,我们来看看实践中模型的典型表现。
以下是当前生成模型(尤其是大型模型)的一个常见趋势:
- 模型通常在召回率方面表现较好。由于模型参数量巨大,理论上存在某个噪声向量
z,使得模型能够生成数据集中(甚至超出)的每一个真实图像,从而较好地覆盖真实分布。 - 模型在精确率方面往往表现不佳。同样因为参数量庞大,模型某些部分在训练中未得到判别器的充分反馈,导致其会生成大量不属于真实分布的“垃圾”图像。这使得生成分布
PG看起来像是真实分布PR的一个超集(即PG包含了PR,但还有额外部分)。
为了应对精确率低的问题,在实践中可以采用 “截断技巧” 。这个技巧通过限制输入生成器的噪声向量 z 的取值范围(例如,只采样其值接近均值的部分),来“修剪”掉生成分布中那些质量低劣的边缘部分。这能有效提高生成图像的整体质量(即精确率),但代价是可能会降低多样性(即召回率),因为生成分布 PG 的范围被缩小了。
总结
本节课我们一起学习了评估生成对抗网络的两个重要指标:
- 精确率:衡量生成图像的质量。高精确率 = 高逼真度。它计算“看起来真实的生成图像”占“所有生成图像”的比例。
- 召回率:衡量生成图像的多样性。高召回率 = 高多样性。它计算“被成功生成的图像”占“所有真实图像”的比例。
当前的大型生成模型往往更擅长实现高召回率(覆盖多样数据),但在精确率(避免生成垃圾)方面存在挑战。我们可以利用“截断技巧”等方法来在具体应用中权衡这两者,以提升生成结果的整体质量。

至此,您已经完成了本周的理论学习,可以准备进入编程实践部分了。希望您能运用这些知识,构建出性能卓越的下一代生成模型!
45:GAN的局限性与责任 🧠⚠️
在本节课中,我们将要学习生成对抗网络(GAN)的局限性、潜在问题以及相关的社会责任。我们将探讨GAN的缺点、替代方案,并深入理解机器学习中普遍存在的偏见问题。
上一节我们介绍了GAN的基本原理和强大能力,本节中我们来看看使用这些模型时需要注意的负面因素和挑战。
请注意,到目前为止,在本系列课程中,你们主要关注的是GAN的积极方面。但同样重要的是,要理解并意识到使用这些模型的缺点和负面问题。
对于其中一些缺点,你们将学习到其他生成模型。这些模型是GAN的替代方案,能够弥补GAN的某些问题。
但不用担心,尽管存在弱点,GAN在生成逼真内容方面仍然保持着顶尖水平的地位。
上一部分提到了GAN的弱点,本节我们将探讨一个普遍存在于所有机器学习,尤其是所有生成模型(包括GAN)中的固有缺陷,那就是偏见问题。
偏见通过许多不同的方式被引入,包括数据集本身,但也包括你的损失函数、评估方法以及其他途径。
你们将看到一个存在偏见的模型示例。该模型使用了最先进的GAN技术,能将模糊的像素化图像转换为更高分辨率的图像,这个过程被称为上采样。但这一次,它将一张像素化模糊的、属于混血人种的奥巴马图像,上采样成了一张高分辨率的白人男性图像。
以下是本周课程的核心目标:
- 探索这种偏见现象。
- 使你们掌握相关知识,以便能够负责任地运用最先进的GAN技术。
因为能力越大,责任越大。所以,让我们开始吧。
本节课中我们一起学习了GAN模型的重要局限性,特别是其中可能存在的偏见问题。我们认识到,在追求技术先进性的同时,必须对其社会影响和伦理责任保持清醒的认识。
46:生成对抗网络的缺点 🧐


在本节课中,我们将探讨生成对抗网络(GAN)的局限性。了解这些缺点对于全面掌握GAN技术至关重要,它能帮助我们在实际应用中做出更明智的选择。

上一节我们介绍了GAN的工作原理及其优势。本节中,我们来看看GAN在实际应用中面临的一些挑战和不足之处。

GAN的优势回顾
首先,简要回顾一下GAN的主要优势。

- 生成质量高:GAN能够生成在视觉上高度逼真的结果,足以“以假乱真”。
- 生成速度快:一旦模型训练完成,仅需输入噪声向量即可快速生成样本。
GAN的缺点分析
尽管优势显著,GAN也存在一些固有的缺点。

以下是GAN的几个主要缺点:
-
缺乏内在的评估指标
GAN没有像分类准确率那样明确、理论扎实的评估标准。我们无法直接通过检查模型权重或输出就轻易判断哪个模型更好。通常需要人工检查大量生成样本的特征,并与真实图像进行对比,但这只是一种近似估计,可靠性有限。 -
训练过程不稳定且耗时
训练GAN可能不稳定,需要大量时间。梯度下降法并不总能得到理想的生成器,有时更像一门“艺术”而非“科学”。例如,可能遇到模式崩溃(Mode Collapse)问题,即生成器陷入单一模式,只生成相似样本(如全是数字“7”)。你不能简单地持续训练并期望模型收敛,需要频繁监控,通过视觉检查生成样本来决定何时停止训练。不过,这个问题已通过Wasserstein损失(W loss)和Lipschitz连续性等技术得到了一定程度的缓解。 -
无法进行显式的概率密度估计
如果你需要明确获取建模特征的概率密度(即某个特定特征组合出现的可能性),GAN可能不是最合适的模型。这种密度估计(Density Estimation)能力在异常检测等任务中很有用,例如,判断一张“狗”的图片是否异常。虽然通过对大量样本进行统计可以获得某种近似,但这并非GAN模型固有的能力。 -
生成器通常不可逆
标准的GAN生成器设计为单向映射:z(噪声) -> x(图像)。它通常不具备可逆性,即你无法轻松地将一张现有图像(无论是生成的还是真实的)反向映射回其对应的噪声向量z。这限制了其在图像编辑等领域的应用,因为如果能找到图像对应的z,就可以通过修改z来控制生成图像的属性(如年龄、发色)。目前已有一些新方法试图解决可逆性问题,例如训练一个逆向模型,或使用能同时学习双向映射的GAN变体。
总结与展望
本节课中我们一起学习了生成对抗网络(GAN)的优缺点。
总结如下:
- 优势:能生成高质量结果,且从已训练模型中生成样本的速度快。
- 缺点:缺乏内在评估指标;训练可能不稳定(已部分改善);无法进行固有的概率密度估计;将图像反演到潜在空间表示具有挑战性。
尽管存在这些缺点,但必须强调GAN在生成高保真结果方面的开创性意义。它首次如此稳定地实现了逼真的输出,这一核心优势使其被广泛用于增强各种输出的真实感。

在接下来的视频中,你将看到其他方法如何尝试弥补GAN的这些不足。
47:GAN的替代方案 🧠

在本节课中,我们将学习生成对抗网络(GAN)之外的其他生成模型。我们将探讨变分自编码器(VAE)、自回归模型、流模型以及混合架构,了解它们如何以不同的方式解决生成问题,并分析各自的优缺点。
上一节我们介绍了GAN的一些缺点。本节中,我们来看看其他生成模型如何应对这些挑战,但同时也带来了不同的权衡取舍。具体而言,我们将讨论另一种流行的模型——变分自编码器(VAE),以及一些虽不那么流行但非常有趣的替代方案。
一个生成器模型可以是任何试图建模给定类别y下数据x的概率分布P(x|y)的机器学习模型。如果只针对单一类别建模,则通常是该类别数据x的概率分布P(x)。模型通常会引入某种噪声以实现随机性,从而避免每次生成相同的内容。这意味着其输出具有多样性,并能根据输入的类别生成代表该类别的特征或对象X。
生成模型的范围远不止GAN。让我们开始深入了解。
变分自编码器(VAE) 🔄
变分自编码器(VAE)是另一大类生成模型。作为本专项课程第一周的回顾,VAE包含两个不同的模型:一个编码器和一个解码器。
以下是VAE的工作原理:
- 模型通过将真实图像输入编码器进行学习。
- 编码器在潜在空间中找到一种好的方式来表示该图像。
- 然后,解码器接收该潜在表示(或接近它的表示),并重建编码器之前看到的真实图像。
以上描述的主要是VAE的“自编码器”部分。“变分”部分则更为复杂,它使模型能够以最大化生成真实数据(或类似输入编码器的真实图像)的可能性为目标进行训练。
从高层次看,VAE试图最小化生成分布与真实分布之间的差异。这通常被认为是一种相对更容易的优化问题,能带来更稳定的训练过程,但也常被认为会导致结果更模糊或保真度更低。训练完VAE后,实际上可以丢弃编码器(就像不需要判别器一样),而使用解码器(类似于生成器),从潜在空间中采样点,从而生成输出图像。
如果你还记得GAN的优缺点,VAE的情况大致相反。VAE通常被认为产生的结果质量低于GAN,至少在生成逼真结果方面不是首创,并且一度落后于GAN,需要更多的工程和修改。
以下是VAE的主要特点:
- 密度估计:VAE可以进行密度估计。
- 易于反转:因为它们有编码器来寻找潜在空间表示。虽然可能不是完美的一对一反转,但能提供一个不错的噪声因子。
- 训练更稳定可靠:尽管可以说训练速度相对较慢。
但GAN的支持者可能会说,如果不能生成好的样本,这些优点就没什么用。因此,大量工作致力于提升VAE的结果质量。例如,左边是近期一个名为VQ-VAE-2的VAE模型生成的图像,右边是BigGAN生成的图像。可以看到BigGAN的质量略高,但VAE的结果也开始变得更好,特别是在多样性方面,正如这条生成的鱼所展示的。
自回归模型 📈
这个VQ-VAE-2模型借鉴了许多VAE的概念,但它实际上不被认为是纯粹的VAE解决方案。事实上,它还依赖于一个自回归网络组件。
自回归模型是一种根据先前像素来确定下一个像素的模型。例如,它可能看到这里的几个像素,然后就能确定图像其余部分的像素。这是另一种生成模型,它基于前一个像素逐个像素地生成。你可以将其理解为,它根据之前的像素来“条件化”地决定下一个像素是什么。它无法看到未来的像素,只能查看过去的像素。如果你熟悉RNN或语言/语音模型,这个概念非常相似,即无法看到未来的信息。
可以想见,这种模型并非完全无监督,因为它依赖于之前的像素。它是一种有监督技术,意味着需要锚定像素来开始生成,无法直接从噪声生成。
流模型 🌊
另一种生成模型是流模型。这类模型训练困难且耗时,但它是一个非常酷的新想法,基于似然估计来寻找噪声与生成图像之间的可逆映射。
显然,它是可逆的。从高层次看,它的工作方式是从一个初始的简单分布开始,通过一系列可逆变换来创建更复杂的分布。假设它从非常简单的东西开始,通过图中箭头代表的可逆映射,得到更复杂的分布,最终能够建模人脸。这是一个名为Glow的流模型示例。
混合架构 🤝
最后,你也可以结合这些模型或思想中的任意几种,形成混合架构,以尝试兼收两个或多个领域的优势。就像之前看到的结合了VAE和自回归的VQ-VAE-2模型一样。此外,也有许多结合了GAN和VAE概念的模型。在课程三中,你也会看到一些高级模型的提及。
总结 📝

本节课中,我们一起学习了GAN之外的其他生成模型。
总而言之,VAE的优缺点列表与GAN大致相反。值得注意的是,其结果通常更模糊(尽管这一点有争议),但它可以进行密度估计、易于反转且训练稳定。然而,GAN已经在许多方面改进了这些缺点,例如训练稳定性大大提高,而近似反转(这是编辑图像所需的)已简化为通过另一个模型寻找Z向量的工程问题。VAE在获得更好结果方面也取得了长足进步。
因此,总体而言,在应用方面,当逼真生成是主要目标时,GAN仍然更有用。
正如本视频所示,其他替代生成模型包括自回归模型、流模型以及所有这些模型的混合模型。

现在你已经了解了其他生成模型,接下来将探讨所有机器学习模型(包括GAN和这些其他模型)都无法避免的一些普遍问题。
48:机器学习偏差简介 🧠

在本节课中,我们将暂时离开生成对抗网络(GAN)的主题,探讨一个普遍存在且影响深远的问题——偏差。这个问题渗透到生活的许多方面,机器学习和GAN也不例外。本视频的目的是提高大家对机器学习,特别是GAN中偏差问题的认识,这是消除模型中偏差的第一步。


偏差在现实中的体现
上一节我们提到了偏差问题的普遍性。本节中,我们来看看一个来自现实世界的具体案例,它揭示了机器学习模型如何可能复制并加剧社会中的现有偏见。
这个案例基于ProPublica新闻机构一篇名为《机器偏差》的文章,该文章讨论了在全国范围内用于刑事判决的专有软件中发现的种族差异及其影响。
以下是该文章的主要要点:
- 背景:在美国刑事司法系统中,法庭越来越多地依赖风险评估来预测个人未来犯罪的可能性。许多风险评分计算现已计算机化,并且越来越依赖机器学习。
- 研究对象:ProPublica通过公开记录请求,评估了当时两个主流商业模型之一,该算法名为Compass。其设计初衷是减少审前判决的偏见。
- 核心矛盾:然而,ProPublica的调查结果表明,该算法本身存在显著的偏见。值得注意的是,Compass的评分计算被视为专有技术,其公司不公开具体细节。
- 数据输入:评分计算大致基于被告填写的问卷及其犯罪记录。问卷中不直接询问种族,但包含诸如“你的父母是否曾入狱?”或“饥饿的人偷窃是错误的吗?”等问题。
- 法官决策:法官可以根据他们对风险评分的评估,增加或减少刑期长度。
- 预测表现:不幸的是,Compass算法仅能正确预测约20%的暴力犯罪再犯情况。ProPublica发现,该模型预测黑人被告未来暴力犯罪的风险高出77%,未来任何类型犯罪的风险高出45%。
- 评分分布:数据显示,白人被告的高风险评分比例随年龄增长而下降,而黑人被告的高风险评分可能性则保持不变。这表明白人被告的分数倾向于较低风险类别,而黑人被告则不然。
具体案例与影响

了解了算法的整体偏差情况后,我们通过具体个体的故事来看看这些风险评估分数可能带来的真实后果。
- 案例对比:例如,白人男性Gregory Lugo和黑人女性Mallory Williams均因持有毒品被捕,但犯罪前科不同。Lugo此前已有三次严重犯罪前科,而Williams则是首次严重犯罪,且之前只有两项轻罪。然而,Williams的风险评估分数(6分)却远高于Lugo(1分)。
- 影响实例一:Paul Zilly是一名复吸成瘾者,因复发并偷窃一台割草机被捕。在法官看到他的高风险评分后,原本控辩双方同意的认罪协议被推翻,刑期从县监狱一年增至州立监狱两年。尽管上诉后刑期减至18个月,但上诉法官指出,若没有Compass评分,Zilly本应只被判一年或六个月。
- 影响实例二:18岁的Sage Jones在逮捕时无犯罪记录,因偷窃一辆未上锁的自行车而被给予中等风险评分,其保释金从建议的0美元提高至1000美元。如今,她仍因记录上的轻罪而难以找到工作。
这些案例展示了较高风险评分可能带来的后果,即使当事人事后未必再次犯罪。判决在很大程度上仅基于模型的预测,如果模型的预测存在偏差,就可能非常不公平。
模型表现与公平性问题

前面我们看到了偏差对个人的直接影响。现在,我们来深入分析该模型在统计上的表现,这能更系统地揭示其公平性问题。
研究人员发现,该模型在所有领域(再犯风险、暴力犯罪风险、未出庭风险)正确预测再犯者的总体准确率仅为61%。仅就暴力犯罪而言,准确率只有20%。

问题的关键在于,模型对白人和黑人群体产生的错误类型不同:
- 假阳性(被标记为高风险但未再犯):约45%被标记为高风险的非洲裔美国人实际上并未再犯,而白人群体的这一比例为23.5%。
- 假阴性(被标记为低风险但实际再犯):在那些被标记为低风险但实际再犯的人中,非洲裔美国人占28%,白人占48%。
这些细节表明,该模型及其评估方法在公平性上存在严重问题。
总结与反思
本节课中,我们一起学习了机器学习中偏差问题的具体体现。我们通过Compass算法的案例看到,旨在减少刑事司法系统偏见的模型,实际上可能只是反映了我们自身的偏见,并加剧了历史上服务不足和受歧视群体重新融入社会的困难。
由营利性公司创建的专有风险评估软件,由于其计算不公开,且对其准确性的调查往往由软件构建者自身进行,使得理解和改进这些系统变得更加困难。
此外,还需要考虑的是,这些模型无法全面地看待一个人,例如个人真诚的自我改造努力,或较长刑期对其照顾家庭能力的影响。因此,一个至关重要的问题是:这些模型今天究竟在为谁服务?

认识到偏差的存在是解决它的第一步。在后续的机器学习实践中,我们必须积极审视数据、算法和结果,努力构建更加公平、负责任的系统。
49:15_02_09_定义公平性 📊
在本节课中,我们将探讨机器学习模型公平性的定义。理解如何衡量公平性是构建负责任AI系统的关键一步。

概述
上一节我们讨论了模型偏见的问题。本节中,我们来看看如何具体地定义和衡量一个模型是否“公平”。虽然“公平”这个概念看似直观,但在实际操作中却存在多种不同的定义方式。
公平性的多种定义
公平性是一个复杂的概念,不同的研究论文和实践场景可能依赖不同的定义。以下是几种常见的公平性定义方式。
1. 机会均等 / 人口统计均等
这种定义要求模型的预测结果独立于敏感属性(如种族、性别)。这意味着,无论敏感属性如何,不同群体获得有利预测结果的概率应该相同。
公式表示:P(Ŷ=1 | A=0) = P(Ŷ=1 | A=1)
其中,Ŷ 是模型的预测结果(例如1表示通过),A 是敏感属性(例如0和1代表不同群体)。
2. 结果代表测试集人口统计
这种定义要求模型的输出分布反映真实世界的人口比例。例如,在美国,一个生成人脸的GAN模型应该有大约6%的生成图像是亚裔美国人面孔,因为这对应了亚裔在美国人口中的大致比例。
3. 错误率均等
这种定义关注模型的错误在不同群体间是否一致。它要求不同敏感属性群体的假阳性率或假阴性率相等。
公式表示(以假阳性率相等为例):P(Ŷ=1 | Y=0, A=0) = P(Ŷ=1 | Y=0, A=1)
其中,Y 是真实标签。
这也被称为机会平等,即模型对不同保护类别做出正确或错误预测的概率是相同的。

总结与启示
本节课中我们一起学习了公平性的多种定义。正如你所见,公平性并没有一个单一的、放之四海而皆准的定义。这里列举的只是三种基础定义,实际中还存在更多。

尽管缺乏统一的定义,我们仍然可以观察到,根据上述任何一种定义,现有模型普遍存在公平性不足的问题。因此,在将任何AI系统部署到生产环境之前,深入探索和理解这些公平性定义至关重要。
50:机器学习中的偏差引入方式 🎯

在本节课中,我们将学习机器学习模型中偏差(Bias)可能被引入的各种途径。理解这些途径对于构建公平、可靠的模型至关重要。
上一节我们介绍了机器学习中偏差的基本概念,本节中我们来看看偏差具体是如何进入模型的。我将介绍几种主要方式,但重要的是要知道还存在其他途径,有些甚至尚未被发现。



偏差引入的常见阶段
首先,你将了解偏差在模型开发的各个阶段可能进入模型的几种方式,然后更具体地看一个名为“Pulse”的系统中偏差的表现。

1. 训练阶段引入的偏差
偏差进入模型的一种方式是在训练阶段。首先,你应该关注你的训练数据。
以下是训练数据可能存在的问题:
- 数据缺乏多样性:数据可能没有足够的变体。
- 数据收集过程存在偏差:数据可能反映了收集方式带来的偏见。例如,数据集中是否不成比例地缺少有色人种的图像?有时这很难发现,比如当你只是从互联网上抓取名人图像时。
- 数据来源单一:你需要考虑数据是如何收集的。数据是否全部来自一个地点、一次网络抓取?是否由单个人或单一人口统计特征的人群收集?请记住,所谓“多样化”的数据也取决于你对“公平”的定义,正如你在上一个视频中所见。
- 标注者多样性不足:如果你使用标注数据,那么标注者的多样性也会影响你的数据。这是因为不同人群可能对事物有不同的标注方式,这可能导致数据中产生固有的偏差。例如,如果标注者大多是男性,他们来标注哪些人的简历值得获得软件工程师职位的面试机会。
这些只是你在准备模型训练数据时应考虑的几个方面。
2. 评估阶段引入的偏差
广泛社会中存在的偏见也会影响模型的各个部分。另一个可能引入偏差的领域是在评估阶段。
以下是评估阶段可能存在的问题:
- 评估方法的设计者:你使用的评估方法是谁创建的?
- 评估标准的文化偏向:评估方法可能偏向于在该社会或一种文化中通常被认为是“好”或“正确”的图像,但在另一种文化中则不然。一个简单的例子是汽车是靠左行驶还是靠右行驶。如果通常在某侧行驶,那么评估可能会反映这一点,并对方向盘在“错误”一侧的图像给出较差的评估或分数。这完全取决于当地的驾驶法律。
- 数据集的代表性不足:一个更具体的例子涉及ImageNet,这是用于训练Inception V3模型的数据集,FID使用它来评估GAN以及其他评估指标。ImageNet中超过一半的图像来自美国和英国。与世界人口密度相比,这并不能代表大多数人的来源地。这种不平衡导致系统将图像错误地分类到因地理而异的类别中。例如,斗笠会被分类为头发吗?披风会被分类为围巾吗?
- 评估计算方式强化偏差:评估计算的方式可能会强化你开发的模型中的偏差,并可能让你认为模型在某个任务上表现优异,而实际上它并不能执行该任务。例如,研究人员实际上从不同收入水平的家庭中选取物品,然后评估了顶级物体识别模型对这些产品的准确性。结果是,来自较高收入家庭的图像在这些模型上具有更高的准确性。这里的问题在于,开发这些模型的人可能得出结论,认为他们拥有了能够以人类水平“看”世界的优秀模型,并声称视觉感知问题已经解决,而实际上它只对特定社会经济地位的对象达到了高精度水平。这并非我所设想的优秀模型应具备的感知能力。
3. 架构与设计阶段引入的偏差
现在,偏差也可以通过架构引入。
以下是架构与设计阶段可能存在的问题:
- 程序员的多样性:优化代码的程序员的多样性如何?
- 设计者的观点影响输出:他们对什么是“对”或“错”,什么看起来“好”或“坏”的看法会影响生成的图像。毕竟,特别是在生成模型中,评估指标并不完善,因此更要以批判的眼光看待该领域如何选择各种问题,因为一旦你选择了重要的问题,人们就会针对那些对错、好坏的定义来优化解决方案,这将会影响某些研究方向以及它们被选择的方式。
- 损失函数的影响:例如,所使用的损失函数可能会扭曲模型认为正确的内容。对于生成人脸图像的生成器G来说,这可能是肤色较浅与肤色较深之间的差异。
这些只是一些例子。偏差可能出现在任何个人设计、工程或接触系统的地方,因为每个人都有偏见,无论他们是否意识到。

案例分析:Pulse系统中的偏差
这里有一个GAN系统中偏差的例子。一个名为Pulse的系统使用一种先进的GAN模型StyleGAN,从像素化、模糊的图像创建高分辨率图像,这个过程称为“超分辨率”。它在这里从这些像素化图像作为输入,然后这些上采样图像作为输出,执行了相当好的上采样。这在2020年可能是研究界见过的最好的效果。你可以看到一个男孩在这里被很好地上采样,然后你看到一个很酷的应用,一个电子游戏角色在这里被赋予了生命。


然而,并非全部如此。一个像素化的奥巴马(他是混血)照片的例子被上采样成一个明显的白人男性。此外,政治家亚历山德里娅·奥卡西奥-科尔特斯和演员刘玉玲也被转变成了无法辨认的版本,这些版本可以说在种族上更“白”,更接近于StyleGAN生成器在其训练数据中的平均面孔。对一个白人电子游戏角色的处理效果优于这些有色人种,这相当有力地表明模型中存在偏差问题。

但很难说系统是在哪里失败的。是StyleGAN的问题,还是建立在StyleGAN之上的Pulse系统的问题?或者是StyleGAN训练所用的数据集的问题?
已经有研究致力于减轻GAN中的偏差,例如使用对抗性损失来惩罚存在偏差的模型。这很复杂,也是一个重要的工作领域,因此我强烈建议你去了解一下。
目前,这类问题在机器学习社区中开始受到更多关注,Pulse论文的作者此后也发布了关于应用其模型的谨慎声明。

总结与责任
本节课中我们一起学习了偏差可以通过多种不同途径引入模型,这是一个非常现实的问题,正如在Pulse以及之前视频中的Compass系统所看到的那样。

我希望这会提醒你在自己的模型中注意偏差,甚至在日常学习、应用和推进机器学习的过程中找到对抗偏差的方法。机器学习和GAN领域需要研究人员和实践者在工作的同时思考这个问题。
现在掌握了这些重要知识,我希望你现在能够负责任地使用先进的GAN等技术,这些技术将渗透到产品中并影响人们的生活。
能力越大,责任越大,请善用你的力量。


51:生成对抗网络(GAN)第3周 🎭
课程编号:P51
在本节课中,我们将要学习StyleGAN的核心概念及其关键组件。StyleGAN在生成图像的质量和多样性方面表现出色,我们将深入探讨其工作原理。
过去几周,我们已经了解了生成对抗网络的多种改进方法。本周,我们将聚焦于StyleGAN,分析其组成部分,并理解它为何在定量和定性评估指标上超越其他生成对抗网络模型,无论是在图像保真度还是多样性方面。
StyleGAN的不同组件将与我们过去几周熟悉的主题紧密相连。
上一节我们介绍了StyleGAN的整体背景,本节中我们来看看其核心优势。
以下是StyleGAN的几个关键优势:
- 实现稳定训练,从而生成更高分辨率、更高保真度的图像。
- 提供更好的生成控制,以此实现图像更大的多样性。
StyleGAN的一个显著特点是,它能够通过添加少量噪声,精细调整图像的细节。
例如,在生成的人脸图像中,它可以控制一缕头发是向后梳还是垂落下来。
本周的作业将更详细地探索这些不同的组件。
本节课中我们一起学习了StyleGAN的概述及其在提升图像质量和多样性方面的核心优势。我们了解到,StyleGAN通过其独特的组件设计,在细节控制上达到了新的高度。接下来,我们将逐一深入这些组件。
52:生成对抗网络(GAN)的改进 🚀


在本节课中,我们将学习生成对抗网络(GAN)自诞生以来的主要改进方向。我们将探讨如何提升GAN的训练稳定性、模型容量以及生成结果的多样性,并了解一些实现这些改进的关键技术。

训练稳定性的提升
上一节我们回顾了GAN的基本概念,本节中我们来看看研究者们如何解决GAN训练不稳定的问题,特别是模式崩溃(Mode Collapse)。

训练不稳定的GAN通常意味着延长训练时间也无济于事。如下图所示,生成器可能陷入局部最优,只能生成单一类型的样本(例如只生成数字“4”),而无法生成多样化的结果。


利用小批量统计信息
一种监测和缓解模式崩溃的方法是分析生成样本的多样性。以下是具体思路:
- 高多样性样本:在一个小批量(Mini-batch)中,样本间差异大,标准差高。
- 低多样性样本:样本间非常相似,标准差低,这可能是模式崩溃的迹象。
通过将小批量的统计信息(如标准差)传递给判别器,可以帮助判别器识别生成器是否正在发生模式崩溃,从而给出更有效的反馈,促使生成器生成更多样化的样本。

实施利普希茨连续性约束
另一种提升稳定性的方法是在使用Wasserstein损失(W Loss)时,强制模型满足1-利普希茨连续性。这可以防止模型学习过快,并保持有效的Wasserstein距离。
以下是两种实现该约束的主流技术:
-
WGAN-GP (Wasserstein GAN with Gradient Penalty):通过梯度惩罚项来约束判别器函数的梯度范数。
- 核心公式:在损失函数中添加梯度惩罚项,例如
λ * (||∇D(ˆx)||₂ - 1)²,其中ˆx是真实样本和生成样本的随机插值点。
- 核心公式:在损失函数中添加梯度惩罚项,例如
-
谱归一化 (Spectral Normalization):这是一种权重归一化技术,类似于批归一化(Batch Norm),通常作为一个网络层实现。它通过约束每一层权重矩阵的谱范数来稳定训练,确保函数满足利普希茨连续性。
使用移动平均与渐进式增长
在StyleGAN等先进模型中,还采用了以下两种技术来进一步提升稳定性和生成质量:
-
权重移动平均:不是使用单个训练检查点的生成器权重,而是对多个检查点的权重取平均。这能产生更平滑、更稳定的生成结果。
- 核心公式:
θ̄ = (1/n) * Σ(θ_j),其中θ̄是平均权重,θ_j是第j个检查点的权重。
- 核心公式:
-
渐进式增长:训练时从低分辨率图像开始,逐步增加图像分辨率。这种方法让生成器先学习整体结构,再学习细节,有助于生成高质量的高分辨率图像。

模型容量的扩大
在提升了训练稳定性之后,研究者们得以构建更大、更深的模型。模型容量的扩大是GAN质量飞跃的另一个关键。

得益于更强大的硬件(如GPU)和更高分辨率的数据集(如用于训练StyleGAN的FFHQ人脸数据集),生成器和判别器网络变得更深、更宽。例如,你在第二周学到的深度卷积生成对抗网络就是早期扩大模型容量的成功范例。一些新的网络架构也开始专门为处理高分辨率数据而设计。


生成多样性的增强
最后,我们来看看生成多样性的改进。一个优秀的GAN应该能模拟数据分布中的所有变化,而不仅仅是生成同一张脸。


生成多样性的提升主要得益于以下几点:
- 更大、覆盖更广的数据集:训练数据本身的多样性直接影响了生成结果的多样性。
- 避免模式崩溃的技术:如前所述,利用小批量标准差等方法防止模式崩溃,有助于生成器逼近真实图像的变异程度。
- 专门的架构改进:例如StyleGAN等模型在架构上进行了特定设计,以更好地解耦和控制生成图像的不同特征,从而增加多样性。
总结
本节课中我们一起学习了生成对抗网络(GAN)的三个主要改进方向:
- 训练稳定性:通过监测小批量统计、实施利普希茨连续性约束(如WGAN-GP、谱归一化)以及采用权重移动平均和渐进式增长等技术,使GAN能够进行更长时间、更稳定的训练。
- 模型容量:借助更强大的硬件和高质量数据集,构建更深、更宽的神经网络,以生成更高分辨率和更精细的图像。
- 生成多样性:通过使用多样化的数据集和防止模式崩溃,确保GAN能够生成丰富多样的样本,更好地模拟真实数据分布。

这些改进共同推动了GAN从生成模糊的黑白图像,发展到能生成以假乱真的高质量图像。在接下来的关于StyleGAN的视频中,你将看到这些技术的一些具体应用实例。
53:StyleGAN 概述 🎨

在本节课中,我们将要学习 StyleGAN,这是一种相对较新的生成对抗网络架构。它不仅是当前 GAN 领域的先进代表,更被认为是 GAN 发展的一个转折点,尤其是在生成极其逼真人脸图像方面。
上一节我们回顾了 GAN 近年来的发展历程,本节中我们来看看 StyleGAN 是如何具体实现这些进步的。
主要目标
StyleGAN 的首要目标是生成高质量、高分辨率的图像,足以“欺骗”普通观察者。其次,它追求生成图像具有更高的多样性。例如,如果生成小狗图像,输出范围可能涵盖金毛寻回犬、金贵犬和法国贵宾犬,而不仅仅是背景相同、略有差异的金毛寻回犬。
StyleGAN 一个非常酷的特点是增强了对图像特征的控制能力。这包括添加帽子或太阳镜等特征,或者将两张不同生成图像的风格混合在一起。从某种意义上说,你可以看到布拉德·皮特和安吉丽娜·朱莉在“AI 大脑”中结合的样子。

高分辨率与逼真度
获得能够“欺骗”未经训练的眼睛的高分辨率逼真图像,是一项巨大的成就,直到最近都难以实现。这主要归因于模型容量较小、数据集分辨率较低,以及高分辨率挑战直到 2018 年 StyleGAN 的前身 ProGAN 出现后才被真正攻克。

以下是 2014 年生成的这些人脸图像,它们看起来大部分像糟糕的素描,颗粒感强,很难让人信服其真实性。
现在,看看这张由 StyleGAN 生成的近期高分辨率人脸图像。如果没有任何上下文,你能猜出她不是一个真实存在的人吗?
显然,StyleGAN 已经实现了更高的逼真度目标。但有趣的是,StyleGAN 尝试了你在第三周学到的 WGAN-GP 损失函数和第一周学到的原始 GAN 损失函数,发现它们在不同的高分辨率人脸数据集上各有优势。因此,结论是关键在于不断实验。
特征控制与风格混合
StyleGAN 还旨在增强对图像特征的控制。这可以是混合一张图像的风格到另一张图像中,如下图所示。右下角的这张脸混合了下方和右侧图像的特征,你可以看到发色和发型来自右侧图片,而各种面部特征来自下方的人脸。

同样,在右下角,这位女性的风格混合了上方女性和左侧男孩的风格。
控制也可以意味着添加配饰,如眼镜。StyleGAN 通过解耦潜在空间来实现这一点,这个概念稍后会详细学习。如下图所示,这些“家伙”都戴上了太阳镜。
“风格”的含义
在图像生成的语境中,“风格”一词几乎指图像中的任何变化。你可以将这些变化视为图像不同层次上“外观和感觉”的体现。

这些不同的层次可以意味着更大、更粗糙的风格,例如整体脸型或面部结构;也可以意味着更精细、更详细的风格,例如头发颜色或某些发丝的放置位置。
有趣的是,StyleGAN 生成器由多个模块组成,其中较早的模块大致对应于较粗糙的特征,如面部结构或姿势。
因此,较早的层在这里,靠近输出端,则控制着更精细的风格,如发色或眉毛形状。你可以想象,这里的这位女性可以基于顶部女性的粗糙风格、中间女性的中等风格和底部女性的精细风格,以某种方式进行组合或改变。
与传统 GAN 生成器的区别
现在你对“风格”概念更熟悉了,让我们看看 StyleGAN 生成器与你可能更熟悉的传统 GAN 生成器有何不同。
在传统 GAN 生成器中,你将噪声向量输入生成器,然后生成器输出图像。
在 StyleGAN 中,噪声向量的处理方式略有不同。噪声向量不直接馈入生成器,而是通过一个映射网络得到一个中间噪声向量 W。然后,这个 W 向量被多次注入到 StyleGAN 生成器中以产生图像。
此外,还有额外的随机噪声被传入,为图像添加各种随机变化,例如以不同方式移动一缕头发。这种随机噪声没有学习成分,主要是无关的随机高斯噪声,用于轻微扰动卷积层等各层的输出值。
然而,这个映射网络非常重要,它包含可学习的参数。因此,反向传播会从判别器一路经过生成器,再回到这个映射网络。
需要注意的是,W 并非简单地输入到 StyleGAN 生成器中。相反,风格是从这个中间噪声值 W 中提取出来,然后添加到 StyleGAN 生成器的各个点。在生成器的较早阶段,W 会影响之前提到的较粗糙风格,如整体脸型;而将 W 注入到较后的层,则会控制更精细事物的风格,如头发颜色。

这种将中间噪声注入 StyleGAN 所有层的操作,是通过一种称为 AdaIN 的操作完成的。这是一种类似于批量归一化的归一化方法,区别在于它在以某种方式归一化后,会尝试基于传入的 W 来应用某种风格。
渐进式增长
StyleGAN 第三个也是最后一个重要组成部分是渐进式增长。它在训练过程中,逐步增加生成器生成和判别器评估的图像分辨率。
渐进式增长起源于 ProGAN。它并非 StyleGAN 独有,但作为其前身,作者指出它确实有助于更高分辨率图像的训练。
在训练过程中,生成器和判别器都从小的低分辨率图像开始。首要目标是训练生成器能够生成比高分辨率人脸更容易的东西,即一个模糊但大致正确的图像。当模型稳定后,它们可以扩展到双倍的高度和宽度,这是一个稍难的任务,图像需要看起来更像人脸,但仍然比超高分辨率人脸容易。这个过程持续进行,直到达到所需的图像分辨率,这种“加倍”发生在训练过程中的预定时间点。
但棘手的是,这种加倍不能太突然,必须更渐进,以便让生成器逐步适应生成那些更大的图像。如果你感到困惑,完全不用担心,课程后面会更详细地介绍。主要的收获是:如果你想“成长”,就必须慢慢来。

总结
本节课中我们一起学习了 StyleGAN 及其一些惊人成就,包括在更高分辨率图像上实现更高的逼真度、输出图像多样性增加,以及对发色、配饰等图像特征更强的控制能力。
我们了解了在图像生成语境中“风格”的含义,即图像不同层次上的一般纹理或外观感觉。这些风格根据其在生成器中的位置而变化,从大的核心风格(如脸型)到精细风格(如发色)。
最后,我们介绍了 StyleGAN 的架构,看到了它的主要组件——噪声映射网络和自适应实例归一化——如何使其区别于更传统的 GAN。渐进式增长虽不限于 StyleGAN,但它确实有助于更高分辨率图像更稳定的训练。

这只是一个高层次的介绍,接下来你将更深入地了解这些组件及其工作原理。
54:渐进式增长 🚀

在本节课中,我们将要学习 StyleGAN 中的一个重要组件——渐进式增长。我们将了解其背后的直观原理和动机,并深入探讨其实现方式。
概述
上一节我们介绍了 StyleGAN 的基本概念。本节中,我们来看看 渐进式增长 技术。该技术通过让生成器从生成低分辨率图像开始,逐步过渡到生成高分辨率图像,从而简化了生成高分辨率图像的训练过程。
渐进式增长的原理与动机
渐进式增长的核心思想是:让生成器从简单的任务(生成低分辨率、模糊的图像)开始学习,然后逐步增加难度,最终生成高分辨率、清晰的图像。这有助于实现更快速、更稳定的训练。

渐进式增长的实现步骤
以下是渐进式增长的基本实现流程。
-
初始阶段:生成器
G首先生成一个非常低分辨率的图像(例如 4x4 像素)。判别器D的任务是判断这个 4x4 图像是真实的还是生成的。为了使任务对判别器也具有挑战性,真实图像也会被下采样到 4x4 分辨率。生成器输出: 4x4 图像 判别器输入: 4x4 图像(真实或生成) -
增长阶段:在预定的训练间隔后,图像分辨率会翻倍。例如,从 4x4 增长到 8x8。此时,生成器需要学习生成 8x8 的图像,而判别器也相应增加一个卷积层来处理这个更高分辨率的输入。真实图像同样会被下采样到 8x8 以匹配。
生成器输出: 8x8 图像 判别器输入: 8x8 图像(真实或生成) -
最终阶段:经过多个这样的增长周期,生成器最终能够生成非常高分辨率的图像(例如 1024x1024)。此时,判别器将直接处理全分辨率的真实图像与生成图像,不再需要下采样。
平滑过渡:Alpha 参数
分辨率翻倍的过程并非一蹴而就,而是通过一个平滑的过渡实现的。这个过渡由一个关键的 alpha 参数控制。
-
在生成器中:当需要从低分辨率(如 4x4)过渡到高分辨率(如 8x8)时,我们不会立即用新的卷积层完全生成图像。
- 初始时,
alpha = 0。高分辨率图像 100% 由简单的上采样(如最近邻插值)得到,新卷积层的贡献为 0%。 - 随着训练进行,
alpha从 0 逐渐增加到 1。高分辨率图像变为由上采样结果和新卷积层输出的加权和。输出图像 = (1 - alpha) * 上采样图像 + alpha * 卷积层输出图像 - 当
alpha = 1时,图像完全由学习到的卷积参数生成,上采样路径被弃用。
- 初始时,
-
在判别器中:过程类似但方向相反。判别器需要处理逐渐变大的输入图像。
- 初始时,
alpha = 0。高分辨率输入图像 100% 被简单下采样,然后送入原有的低分辨率处理层。 - 随着
alpha增加,判别器逐渐更多地使用新增的卷积层(处理高分辨率输入,然后下采样)的输出来做判断。 - 最终,
alpha = 1,判别器完全依赖新增的卷积层路径。
- 初始时,
网络结构
在 StyleGAN 的生成器中,渐进式增长体现为一系列逐步增大的网络块。每个块通常包含上采样层和卷积层(实践中常为两个卷积层),以学习更复杂的特征。
总结

本节课中我们一起学习了 渐进式增长 技术。我们了解到,它通过让生成对抗网络从低分辨率图像开始训练,并逐步平滑地过渡到高分辨率,有效降低了模型学习生成高质量图像的难度,从而实现了更快、更稳定的训练。核心的平滑过渡机制由 alpha 参数控制,确保了训练过程的连续性。
55:噪声映射网络 🧠

在本节课中,我们将学习 StyleGAN 的一个独特组件——噪声映射网络。这是一种将噪声向量作为输入的特殊方法,它将在后续帮助我们控制生成图像的风格。
首先,我们将了解噪声映射网络的结构,然后探讨它存在的原因,最后看看它的输出——中间向量 W 的实际去向。
噪声映射网络的结构
噪声映射网络接收你的噪声向量 Z,并将其映射为一个中间噪声向量 W。
这个网络由八个全连接层组成,层与层之间包含激活函数。它也被称为多层感知机(MLP)。这是一个相当简单的神经网络,它接收大小为 512 的 Z 向量,并将其映射为同样大小为 512 的 W 向量。本质上,它只是改变了向量的值。
你仍然像处理 Z 一样,从一个正态分布中采样所有 512 个值来得到 Z,但现在你需要将其输入这个网络,以获得中间的 W 噪声向量。
为何需要噪声映射网络?

上一节我们介绍了网络的结构,本节中我们来看看它存在的原因。其动机在于,映射你的噪声向量实际上能让你获得一个解耦程度更高的表示。
简单回顾一下,Z 空间中的“耦合”是指噪声向量与输出特征之间并非一一对应的映射关系。当你改变 Z 向量中的一个值时,实际上可能会改变输出图像中的许多不同特征。这很糟糕,因为它不允许你对最终图像进行精细的或特征级别的控制。例如,当你试图改变某人的眼睛时,你肯定不希望突然改变他的胡子。
Z 空间(噪声向量的来源)之所以经常是耦合的,是因为真实数据具有特定的概率密度。这意味着样本图像具有某些特征(如戴眼镜、有胡子、特定发色、年龄等)存在一定的概率分布。

然而,由于 Z 具有正态先验分布(所有值都从正态分布中抽取),让它将这个正态分布映射到所有输出特征的正确密度分布上是困难的。因为你期望随机噪声向量能够建模整个特征空间(戴眼镜、有胡子、各种发色眼睛等所有不同类型的图像及其特征),这对于 Z 空间来说极具挑战性。它会试图找到某种方式来扭曲自身以映射到这些期望的特征,而这种扭曲方式对我们来说可能并不合理。
因此,期望 Z 空间完全解耦(即完全的一一映射)是不现实的。它很可能(并且非常必要地)会学习一组复杂的、耦合的映射关系来实现目标。
然而,为噪声向量引入这个中间映射(W 空间)可以给它一些调整空间,使其能够匹配真实数据的密度分布。这使得学习一个解耦的一一映射变得更容易。本质上,噪声向量不需要严格受限于训练数据的统计特性,而是可以学习这些现在呈线性且更易于生成的变异因子。这将降低不同风格特征过于紧密相关的可能性,并最终有助于控制和映射特征。
需要说明的是,W 空间并非如图所示那样完美,这只是一个示意图。研究发现,它只是比 Z 空间的耦合程度更低。请注意,图中显示的向量大小是 7,但在实际中它们是 512 维。
噪声映射网络在 StyleGAN 中的位置
在了解了噪声映射网络的作用后,我们来看看它如何融入整个 StyleGAN 架构。
你之前已经学习了渐进式增长,即输出尺寸会阶段性地翻倍。生成器的架构大致如下图所示,而噪声映射网络实际上是在这里作为输入,进入所有这些模块中。

你可能会注意到,原本 Z 输入的位置现在不再是这样了。相反,Z 会经过这个映射网络,而生成的 W 实际上会在网络中的多个不同位置被输入。在下一个视频中,你将看到它是如何被精确地添加到所有这些地方的,以及 W 在不同输入点的影响有何不同(例如,在早期输入与在后期输入,其影响是不同的)。
要知道,W 并不像原始 GAN 设置中 Z 那样在网络的最开始输入。这是因为 StyleGAN 的作者发现,在那里添加 W 并没有明显的效果差异,加或不加基本上是一样的。
因此,模型实际上是以一个常量值开始的,而不是在开头输入 W。这个常量值对于你生成的任何图像都是固定不变的。它不仅仅是一个值,其尺寸为 4x4x512(高度、宽度和 512 个通道)。同样,对于生成的每一张图像,这个起始值都是相同的。
任何对生成图像的改变,都将发生在噪声向量被引入的地方,也就是所有这些模块中。实际上,W 会在每个中间模块中被多次输入,这非常巧妙。在下一个视频中,你将详细了解噪声向量是如何被添加到这些模块中的。
总结

本节课中,我们一起学习了噪声映射网络。它是一个多层感知机(MLP),或者说是一个带有全连接层和激活函数的前馈神经网络,其作用是将你的 Z 噪声向量映射为一个中间噪声向量 W。这个 W 向量被用作生成器中多个位置的输入,从而允许对生成图像的风格进行控制。


56:自适应实例归一化 (AdaIN) 🎨

在本节课中,我们将深入探讨生成对抗网络(GAN)中的一个关键技术:自适应实例归一化(AdaIN)。我们将了解它如何将中间噪声向量 W 的“风格”信息整合到生成器的网络中,从而控制生成图像的样式。

从批归一化到实例归一化

上一节我们介绍了渐进式增长和噪声映射网络。本节中,我们来看看如何将中间噪声向量 W 实际集成到网络中,这涉及到自适应实例归一化。
首先,我们来讨论实例归一化,并将其与你更熟悉的批归一化进行比较。
- 批归一化 (Batch Norm):它沿着一个批次(batch)中所有样本的高度和宽度维度(即图中蓝色高亮区域)计算均值和标准差。具体来说,对于一个通道(例如红色通道R),它会计算该批次内所有样本在该通道上的统计量,然后进行归一化。公式可表示为对批次维度
B的归一化。 - 实例归一化 (Instance Norm):与批归一化不同,实例归一化只针对单个样本(实例)。它仅计算一个样本内、单个通道(例如蓝色通道B)的均值和标准差,并基于此进行归一化。它不跨批次或其他样本进行统计。其公式可表示为:
IN(x_i) = (x_i - μ_i) / σ_i
其中,x_i代表第i个实例的特征,μ_i和σ_i是该实例自身的均值和标准差。
在风格化生成任务中,实例归一化通常比批归一化更合理,因为它专注于处理正在生成的每一个独立样本,而不是依赖于整个批次的统计信息。
自适应部分:注入风格信息
实例归一化是第一步,它将卷积层的输出 x 归一化为均值为0、标准差为1的分布。接下来是“自适应”部分,它将风格信息应用到这些归一化后的值上。
这些风格信息来源于你的中间噪声向量 W。W 由初始噪声向量 Z 通过一个多层感知机(映射网络)得到。W 本身并不直接输入到 AdaIN 层,而是会先通过两个全连接层,学习生成两个参数:
YS:代表缩放参数 (Scale)YB:代表偏置参数 (Bias) 或平移参数 (Shift)
这两个参数随后被输入到 AdaIN 层中。
以下是自适应实例归一化的完整过程:
- 实例归一化:对输入特征图
x进行实例归一化,去除其原有的风格信息,得到内容表示。
x_norm = (x - μ) / σ - 自适应风格变换:利用从
W中学习到的YS和YB,对归一化后的特征进行缩放和平移,从而施加新的风格。
AdaIN(x, YS, YB) = YS * x_norm + YB
你可以这样理解:实例归一化步骤试图“抹去”图像中已有的风格,只保留内容结构。然后,YS 和 YB 根据 W 所编码的风格信息,将这些内容“重新绘制”成特定的风格(如毕加索风格或莫奈风格)。改变 YS 和 YB 的值,就相当于改变了生成图像的风格。
AdaIN 在生成器中的位置与作用
现在让我们放大视野,看看 AdaIN 在生成器整体架构中处于什么位置。
生成器由多个块组成,其中较早的块大致对应图像的粗糙特征(如轮廓、姿态),较晚的块对应精细细节(如纹理、发丝)。AdaIN 被用在每一个生成块中,具体位置是在每个卷积层之后。

这意味着,中间噪声向量 W 的风格信息被注入到了网络的每一个层级。其影响是:
- 在早期块中,
W主要影响图像的整体、粗糙风格。 - 在晚期块中,
W主要影响图像的局部、精细风格。
由于每个 AdaIN 层都会将其输入重新归一化(均值为0,标准差为1),因此每个块都能独立地控制该层级所表达的样式。下一个块的 AdaIN 会覆盖前一个块的输出统计量,甚至在同一个块内的不同卷积层之间也是如此。这种设计允许对生成模型进行非常精细的风格控制,例如,可以在不同块注入不同的风格,以实现对图像从整体到细节的多层次调控。
总结

本节课中我们一起学习了自适应实例归一化 (AdaIN):
- 核心功能:AdaIN 是将中间噪声向量
W所包含的风格信息传递到生成图像上的关键机制。 - 两个步骤:
- 实例归一化:对每个样本(实例)独立进行归一化,剥离其原有风格,提取内容。
- 自适应变换:利用从
W学习到的缩放(YS)和偏置(YB)参数,对归一化后的内容施加新的风格。其核心公式为:AdaIN(x) = YS * ((x - μ)/σ) + YB。
- 网络作用:在生成器中,AdaIN 被应用于多个层级,使得
W能够同时控制图像从粗糙到精细的不同层次的风格表现,为实现多样化和可控的图像生成奠定了基础。

在接下来的视频中,你将看到风格信息具体是如何引入的,以及如何进一步调整 W 来精确控制这些风格。
57:🎨 风格混合与随机变化

在本节课中,我们将学习 StyleGAN 中用于控制图像风格的两个关键技术:风格混合 与 随机噪声注入。前者通过混合不同的中间噪声向量来增加生成图像的多样性,后者则通过向模型添加额外噪声来为图像增添细微的变化。
🧩 风格混合简介
上一节我们介绍了 StyleGAN 的基本架构,本节中我们来看看如何通过混合不同的风格来创造新的图像。风格混合的核心思想是,将两个不同来源的中间噪声向量 W 分别注入到生成器网络的不同部分,从而融合两种图像的风格特征。


例如,假设我们有一张虎斑猫的图像和一张燕尾服猫的图像。通过风格混合技术,我们可以生成一张兼具两者特征的“混合猫”图像。这证明了模型能够学习并组合不同的视觉风格。
🔀 风格混合的工作原理
在之前的课程中,我们了解到中间噪声向量 W 会被多次注入到生成器网络的各个模块中。关键在于,这些被注入的 W 不必每次都相同。
以下是实现风格混合的步骤:
- 首先,从潜在空间采样一个噪声向量 Z1,通过映射网络得到其对应的中间向量 W1。
- 接着,采样另一个噪声向量 Z2,得到其对应的中间向量 W2。
- 在生成图像时,我们可以决定在网络的哪个部分切换使用的中间向量。例如,将 W1 注入到网络的前半部分(控制粗粒度特征,如脸型、姿态),将 W2 注入到网络的后半部分(控制细粒度特征,如发丝纹理、肤色细节)。
- 切换点可以是网络中的任意位置。切换得越晚,W2 所控制的特征就越精细。
这种在训练和推理阶段混合不同风格的方式,能有效提升生成图像的多样性。

👥 风格混合效果示例
让我们通过一个生成人脸的 StyleGAN 示例来直观理解风格混合的效果。
在上图中:
- 第一列(A, B, C)是由不同的 W1 向量生成的源图像。
- 第一行(A, B, C, D, E)是由不同的 W2 向量生成的源图像。
- 中间的网格图像则是 W1 与 W2 混合的结果。
具体分析如下:
- 第一行混合图像:它们从 W2(顶部行)获取了粗粒度风格(如脸型、性别特征),而从 W1(左侧第一列的单张图像)获取了中、细粒度风格。
- 最后一行混合图像:它们仅从 W2 获取了细粒度风格(如发丝、皮肤细节),而粗、中粒度风格完全来自 W1(左侧列的单张图像),因此看起来与源图像 W1 非常相似。
- 中间行混合图像:风格混合的程度介于两者之间,展示了不同程度的融合效果。
通过这种方式,我们可以精确控制希望从每个源图像中继承何种类型(粗、中、细)的风格特征。
🌪️ 引入随机噪声
除了混合不同的风格向量,另一种为图像增加变化的方法是注入随机噪声。这可以为生成的图像添加更细微、更随机的细节,例如一缕头发的精确位置或皮肤上微小的纹理。
随机噪声的注入与 Z 或 W 向量无关,它是一个独立的过程。
如上图所示,在网络的早期层(控制粗粒度特征)注入噪声,会产生较大的变化,如头发的整体卷曲度。而在后期层(控制细粒度特征)注入噪声,则会产生更精细的变化,如发梢的细微卷曲或眉毛的纹理。
⚙️ 随机噪声注入机制

随机噪声的注入发生在每个生成器模块的自适应实例归一化层之前。其具体流程如下:
- 采样噪声:从一个标准正态分布中采样一组随机噪声值。
- 缩放噪声:这些噪声值会与一个可学习的缩放因子 λ 相乘。λ 决定了噪声对最终输出的影响程度。
- 公式表示为:
调整后特征 = 原始特征 + λ * 采样噪声
- 公式表示为:
- 添加到特征图:缩放后的噪声被添加到卷积层输出的特征图 x 上。
- 后续处理:添加了噪声的特征图再被送入自适应实例归一化层进行后续处理。
通过让模型学习每个 λ 的值,StyleGAN 能够自动决定在网络的每一层需要多少随机性来生成逼真的细节。
这种技术可以产生极其微妙的变化,例如上图中人物发梢的细微差异,展示了模型对细节的强大建模能力。

📝 课程总结
本节课中我们一起学习了 StyleGAN 中控制图像风格变化的两种重要方法:
- 🎨 风格混合:通过混合两个不同的中间噪声向量 W1 和 W2,并将其分别注入生成器网络的不同部分,可以融合图像的风格,并控制所继承特征是粗粒度还是细粒度。这增加了模型的输出多样性。
- 🌪️ 随机噪声注入:通过向网络的特征图添加经过缩放的随机噪声,可以为生成的图像引入细微的、随机的变化。噪声注入的层位决定了变化的性质:早期层对应粗粒度变化,后期层对应细粒度变化。

这两种技术共同使 StyleGAN 能够生成高度多样且细节丰富的图像。
58:StyleGAN 核心组件整合教程 🧩

在本节课中,我们将系统性地整合 StyleGAN 的所有核心组件。我们将回顾渐进式增长、噪声映射网络、自适应实例归一化、风格混合以及随机噪声注入等关键概念,并理解它们如何协同工作以生成高质量的图像。
上一节我们介绍了 StyleGAN 的各个独立模块,本节中我们来看看如何将这些组件整合成一个完整的生成器架构。
首先,我们学习了渐进式增长。该技术让生成器从生成低分辨率图像开始,随着训练进行,逐步添加新的层来生成更高分辨率的图像。这构成了生成器的基本构建块。
接下来是噪声映射网络。它接收从标准正态分布中采样的潜在向量 Z,并通过一个多层感知机(通常包含8个全连接层,层间使用激活函数如Sigmoid)进行变换,输出一个中间的噪声向量 W。这个 W 向量随后被注入到生成器的多个层级中(通常从某个阶段开始),为不同层提供风格信息。
然后,我们探讨了自适应实例归一化。AdaIN 利用 W 向量提供的统计量(缩放和偏移参数),在网络的各个关键点对特征图进行归一化和风格化。较早的层使用 W 的统计量来控制更宏观的风格,而较后的层则用于影响更精细的细节。
以下是风格混合的实现思路:
- 采样两个不同的潜在向量
Z1和Z2。 - 分别通过映射网络得到
W1和W2。 - 在生成网络的前半部分使用
W1,在后半部分切换为使用W2。 - 最终生成的图像将融合
W1和W2所代表的两种风格。
最后,我们引入了随机噪声。这些额外的、每个像素独立的噪声被添加到生成器的特定层,用于引入细微的、随机的变化,例如发丝的具体位置、卷曲的形态等。网络还会学习一个缩放参数,以控制噪声在每一层的重要性。
所有这些组件都至关重要。StyleGAN 的作者通过消融实验验证了这一点,他们发现移除任何一个组件都会对模型性能产生负面影响。当然,正如我们在学习GANs的整个过程中所见,存在其他方法可以替换某些组件以达到相似效果。
现在,让我们将 StyleGAN 的所有部分整合起来。生成器首先通过渐进式增长的结构搭建主干。输入的 Z 经过映射网络转换为 W。W 通过 AdaIN 机制将风格信息注入到生成器的各个层级。同时,可学习的随机噪声被添加到特定层以增加细节的多样性。此外,通过风格混合技术,我们可以创造性地融合不同 W 向量所代表的风格。


本节课中我们一起学习了 StyleGAN 的五大核心组件:渐进式增长、噪声映射网络、自适应实例归一化、风格混合以及随机噪声。理解这些组件如何相互作用,是掌握现代高质量图像生成技术的关键一步。

浙公网安备 33010602011771号