
塔里克·拉希德
生成对抗网络是神经网络领域的新星,被誉为“机器学习领域近20年来最酷的想法”。本书以直白、简短的方式向读者介绍了生成对抗网络,并且教读者如何使用PyTorch按部就班地编写生成对抗网络。
这本书加入书架的时候,我只是想了解GAN,看了开头,就放下了,那个时候应该还没有使用torch的经验,这次拾起来。不知不觉就读完了,可能是因为有了利用MNIST数据集训练识别模型的锻炼(尤其是应用训练结果识别我自己的手写,提高识别率到我自己满意的程度的努力过程,让我受益匪浅,至少,算是实战入了门了),这本书看起来很简单明了!原来,我也可以训练对抗网络了!那么遥远不可触摸的图像生成,竟然也是用普通神经层就能做到!本来,我觉得gan是类似LSTM、GRU、transformer那样有专门特殊结构的东西! 做不了DIFFUSION,也能生成图了! 这本书的好处是循序渐进,先有,再优化!比如手写数字生成,先随便生成,再精确控制到某个数字!这对于建立概念和信心,都是非常重要的! 但这本书里的附图太不用心了,小不说,还不能点击放大,根本看不清是什么! 但作为入门对抗网络,强烈推荐!
《PyTorch生成对抗网络编程》拆解 作者:[英]塔里克·拉希德 一、一句话概括 生成对抗网络通过让生成器和判别器相互竞争,逐步学习真实数据的分布;理解GAN最有效的方法,不是先陷入复杂公式,而是从简单数据开始,用PyTorch亲手搭建、训练、观察失败并逐步改进。 二、核心逻辑 全书按照“神经网络基础—简单GAN—图像GAN—高级结构与理论补充”的顺序展开: 1. 学习PyTorch中的张量、网络、损失、优化和GPU计算。2. 理解生成器与判别器之间的对抗关系。3. 从简单的“1010”规律入手,建立最小GAN。4. 逐步生成MNIST手写数字和CelebA人脸。5. 引入卷积、转置卷积和条件信息。6. 分析损失、模式崩溃和训练不稳定的原因。 核心训练循环是: 判别器学习区分真实与伪造 → 生成器学习欺骗判别器 → 两者交替更新 → 生成结果逐渐接近真实数据 三、核心内容 1. PyTorch的核心对象是张量 张量可以看作多维数组。标量是零维张量,向量是一维张量,矩阵是二维张量,图像批次则通常是四维张量。 PyTorch张量不仅保存数据,还可以记录计算过程并自动计算梯度。 这让神经网络训练不需要手工推导每个参数的偏导数。开发者只需定义前向计算和损失,再调用反向传播,框架就会沿计算图求出梯度。 2. 神经网络通过损失和梯度学习 网络接收输入,经过若干线性变换和激活函数后产生输出。 损失函数衡量预测与目标之间的差异。优化器根据梯度调整权重,使损失逐步下降。 基本流程是: 1)输入一批数据;2)执行前向传播;3)计算损失;4)清空旧梯度;5)执行反向传播;6)更新参数;7)重复训练。 GAN虽然由两个网络组成,底层仍遵循这一训练机制。 3. 激活函数赋予网络非线性能力 如果网络只有线性层,无论叠加多少层,最终仍等价于一次线性变换。 激活函数让网络能够表达复杂模式。书中使用Sigmoid和Leaky ReLU等函数: Sigmoid把输出映射到0和1之间,适合表示概率;Leaky ReLU在负值区域保留较小斜率,减少神经元完全停止学习的问题。 选择激活函数时,需要结合网络位置和输出含义。 4. CUDA让模型在GPU上训练 图像生成需要大量矩阵和卷积计算,GPU可以通过并行运算显著提高速度。 使用GPU时,模型参数和输入张量必须位于同一设备,否则会出现设备不匹配错误。 训练还要关注显存。批次过大、图像分辨率过高或网络过深,都会增加显存消耗。 书中介绍了查看当前显存和最大显存使用量的方法,帮助读者理解计算资源也是模型设计的一部分。 5. GAN由生成器和判别器组成 判别器接收数据并判断它来自真实数据集,还是由生成器制造。 生成器接收随机噪声,输出与真实数据结构相似的样本。 二者的目标相反: 判别器希望准确识别真假;生成器希望制造足以欺骗判别器的数据。 这种竞争迫使生成器学习真实数据中的结构,而不需要人为明确规定每个样本应该生成成什么样。 6. GAN训练必须交替进行 训练判别器时,需要同时使用真实样本和生成样本: 真实数据的目标标签为真;生成器输出的目标标签为假。 训练生成器时,则把生成样本送入判别器,但希望判别器把它判断为真。 此时应只更新生成器,而不能错误地同时更新判别器。实际代码必须谨慎管理梯度流向、参数更新和计算图。 7. 简单的“1010”案例揭示GAN本质 本书先让GAN学习非常简单的规律数据,而不是立即生成复杂图像。 这种教学设计能够让读者观察: 判别器如何认识真实分布;生成器怎样从随机输入产生结构;两个网络的损失如何变化;训练失衡时会出现什么;生成结果是否真正多样。 从最小问题理解机制,比直接复制大型图像模型更容易建立正确直觉。 8. MNIST案例完成第一个图像GAN MNIST包含28×28像素的手写数字,是生成模型常用的入门数据集。 数据进入模型前,需要转换为张量、调整形状并缩放到与输出激活相匹配的范围。 判别器把图像展平或通过网络提取特征,输出真假概率;生成器则把随机向量逐步映射为图像像素。 训练早期的图像通常接近噪声,随后会出现笔画、轮廓和类似数字的结构。 9. 生成人脸显著增加了难度 CelebA等人脸数据比MNIST复杂得多,包含颜色、姿态、表情、发型和背景变化。 训练前需要: 读取和裁剪图片;统一分辨率;调整通道顺序;归一化像素;设计更强的网络;控制批次与显存。 人脸生成案例说明,数据管道与网络结构同样重要。预处理不一致或输出范围错误,都可能让训练失败。 10. 卷积更适合处理图像结构 全连接层忽略像素的空间关系,而卷积核可以在图像不同位置寻找局部特征。 卷积判别器会逐步降低图像空间尺寸并增加特征通道,从边缘、纹理等局部模式中判断真假。 卷积结构具有参数共享和局部连接特点,因此通常比纯全连接网络更适合图像。 步长、补全、卷积核和输入尺寸共同决定输出形状,维度计算错误是实现卷积GAN时的常见问题。 11. 转置卷积把隐藏表示放大为图像 生成器需要把低维随机向量逐步转换成较大图像。 转置卷积可以增加空间尺寸,因此常用于图像生成。它不是卷积运算的完全数学逆过程,而是一种可学习的上采样方法。 生成器通常先用全连接层把噪声转换成小型特征图,再通过多层转置卷积逐渐放大。 如果卷积核、步长和补全设置不合理,生成图像可能出现尺寸错误或棋盘状伪影。 12. 批归一化能够改善训练稳定性 批归一化对网络中间激活进行缩放和调整,使不同批次的数值分布更加稳定。 在GAN中,它可以帮助梯度传播,并让生成器和判别器更容易训练。 但批归一化不是万能修复方法。批次太小、网络设计不合理或双方学习速度严重失衡时,训练仍会失败。 使用批归一化还要区分训练与推理模式,因为两种模式对统计量的处理不同。 13. 条件GAN让用户控制生成内容 普通GAN从随机噪声生成样本,却不能直接指定生成哪一类内容。 条件GAN把类别标签或其他信息同时输入生成器和判别器。例如,在MNIST中可以指定希望生成数字“3”。 生成器学习“随机噪声+条件→对应内容”,判别器则判断“样本是否真实且是否符合条件”。 条件机制把无目标生成转化为可控制的生成,是文本生成图像、图像到图像转换等更复杂系统的重要思想。 14. 损失值不能简单解释为模型好坏 GAN的损失与普通监督学习不同。 判别器和生成器同时变化,任何一方的进步都会改变另一方所面对的问题。因此,损失不一定平稳下降,也不能只凭某个固定数值判断生成质量。 判别器损失过低,可能表示它过于强大,生成器得不到有效信号;判别器太弱,则无法指导生成器改进。 评估GAN需要同时观察损失、生成样本、多样性及更系统的质量指标。 15. GAN不只是记忆训练图片 理想情况下,生成器学习的是训练数据的概率分布,而不是简单保存并复制原图。 随机输入中的不同位置会映射到生成空间中的不同样本。相近噪声可能产生相近图像,这说明模型学习了某种连续结构。 不过,模型容量过大、数据太少或训练不当时,确实可能出现记忆和过拟合。因此,可以通过最近邻比较、验证数据和多样性分析检查生成结果。 16. 模式崩溃是GAN的典型问题 真实数据通常包含多种模式,例如人脸具有不同发型、角度和表情。 生成器可能发现,只生产少数几类样本就足以暂时欺骗判别器,于是忽略其他模式。这被称为模式崩溃。 其表现包括: 不同噪声产生几乎相同图像;样本质量尚可,但多样性很低;训练过程中生成内容突然退化;生成器在少数模式间反复切换。 应对方法包括调整双方学习率、网络容量、训练次数、损失函数和正则化,并持续检查样本多样性。 17. GAN训练不稳定来自动态博弈 普通优化问题通常在固定目标上寻找较小损失,而GAN的目标会随着对手更新不断变化。 生成器和判别器可能围绕均衡点震荡,而不是直接收敛。书中用简单对抗案例和圆形轨迹解释,普通梯度下降并不天然适合这种博弈。 这也是GAN难以训练的根本原因之一: 两个网络必须保持相对平衡;梯度可能消失或爆炸;损失变化难以解释;同样代码也可能因初始化产生不同结果。 实践需要监控过程,而不能只等待训练结束。 18. 开源数据和软件降低了生成模型门槛 MNIST、CelebA等公开数据集和PyTorch等开源框架,使个人能够完成过去需要大型实验室才能进行的实验。 开源的价值不只是免费,还在于: 代码可以检查和修改;实验更容易复现;社区能够发现问题;学习者可以从简单项目逐步扩展;不同方法可以在共同基准上比较。 但数据集仍可能包含偏差、授权和隐私问题,使用开源资源也需要了解其来源与许可。 四、本书最值得关注的核心观点 本书最值得关注的观点是: GAN的真正学习对象不是某一张图片,而是“什么样的数据看起来像真实数据”的分布规律。 判别器不会直接告诉生成器正确答案是什么,只提供“更像真实”或“更像伪造”的反馈。生成器通过不断试错,从这种间接反馈中学会结构。 这是一种非常重要的机器学习思想:系统不一定需要每个输出都配有明确标签,也可以通过竞争、评价和反馈学习复杂目标。 与此同时,这种间接学习也造成了训练不稳定、模式崩溃和评估困难。GAN的魅力与难点来自同一个机制。 五、一段话总结 《PyTorch生成对抗网络编程》采用由浅入深的实践路线,从PyTorch张量、自动求导、神经网络和CUDA开始,先用简单的“1010”规律解释生成器与判别器的对抗机制,再逐步完成MNIST手写数字、CelebA人脸、卷积GAN和条件GAN。生成器把随机噪声转换为样本,判别器学习区分真实与伪造,二者交替更新,使模型逐渐逼近真实数据分布;卷积和转置卷积用于提取与生成空间结构,条件信息则使生成结果可控。全书同时强调,GAN的动态博弈会造成损失震荡、梯度问题和模式崩溃,因此不能只看损失值,而要持续观察生成质量与多样性。部分代码和模型结构相对基础,但其最大价值正在于让读者通过亲手实现,真正理解生成模型如何从对抗反馈中学习。
本书提及的构建GAN所需要的工具和服务都是免费或开源的
深入浅出,但并不表示覆盖的神经网络的所有的最新的成果一点需要注意
挺不错的一本书,继承了前篇《Python神经网络编程》的书写风格,适合深度学习领域初学者了解PyTorch库的基础使用方法,学习编程实现GAN以及常见的模型优化方法。值得一读!
本书成书时间较早,所以只是很简单地介绍了GAN的一些基本程序算法,而基础理论和延拓内容并不充分。对于尚未从事图像生成领域研究的人员是一本能读的下去的入门书籍,对于想深入了解GAN的则需要另寻其他书籍。但总的来说,这本书因为其通俗易懂,值得推荐。
近年来,我们一起见证了机器学习和人工智能的飞速发展,重要的技术突破层出不穷。 如今,智能手机不但能听懂我们说了什么,甚至可以将我们说的话翻译成多种语言;自动驾驶汽车在安全性上已经接近了人工驾驶的水平;在一些疾病的诊断上,计算机甚至比有经验的医生更准确、更快捷。 围棋起源于中国,迄今已有超过3 000年的历史。尽管与国际象棋相比,围棋的规则更简单,然而其长期策略的复杂度却远远超过国际象棋。最近几年,研究人员开发的机器学习系统频频击败人类围棋世界冠军。不仅如此,该系统甚至通过自学成就了一套3 000年来无人领悟出的新策略! 计算机在学习完成一个任务的过程中发现新的策略,这是整个机器学习领域的一个重大成就。 如今的ChatGPT更是火爆,犹如平地一声雷,开启了AI的划时代。
本书作者拉希德先有《Python神经网络编程》珠玉在前,本书也不落窠臼。阅读过程中,我不止一次的被作者的才华惊艳到,他仿佛有种天赋——能几乎不用数学公式,就能把问题背后的数学原理直观的展示在你面前。这或许源于作者背后深入的思考。虽然这本书的电子版有少许错误,但是绝对瑕不掩瑜。
这本小书可能是入门GAN最好的教材之一,感觉哪怕数学基础不太好的人,也可以了解GAN的原理。对于想要在数学方面了解多一些的,附录的资料也很不错。机器学习的一个难点就是如何获得直观的解释,否则神经网络就会像一个黑盒一样,这本书在这个方面写得很好,告诉了读者GAN到底学习到了什么,是如何学习的。最后不得不说里面的图片很可爱哈哈哈
基础但是细节,即便是用过gan的人读完后也能学到新东西