跳到主要内容

生成式实战与对抗攻击 — 同一梯度的正反两用

这一章讲三件事: 冻结权重、把梯度施加在输入上,能做出哪些平时想不到的事; 风格迁移的两个损失怎么把「风格」变成可计算的量;以及同一机制反过来用—— 对抗攻击:一层噪声就能让模型指鹿为马,和四种防御思路。 原书两章,拆解并作一章:它们共享同一台机器,只是方向相反。

1. 顶层全景:梯度对准谁,决定你在做什么

训练(常规): 固定输入,对【权重】求梯度下降 → 模型学会任务
DeepDream: 固定权重,对【输入像素】求梯度上升 → 问出某层特征
风格迁移: 固定权重,对【输入像素】求下降 → 同时贴住内容与风格
对抗攻击: 固定权重,对【输入像素】求上升 → 让模型犯指画的错
(唯一区别:目标从「更真实的图」换成「更大的损失」)

书里对 DeepDream 动机的交代值得先读:卷积网络效果好,「但过程像谜」——它到底学到了什么特征?DeepDream 是可视化手段,不是艺术滤镜1

2. DeepDream:反向问网络「你看见了什么」

做法:拿一张图喂进预训练网络(VGG19),前向传播到指定层,冻结权重,把该层输出的 L2 范数(把整组数折成一个长度的量)当损失,对输入像素做梯度上升——不停放大「这一层最容易响应的模式」2。书里的直观解释:一朵云有 60% 像狗、40% 像猫,最大化这个特征的 L2,迭代的轮数越多,云就越「长成」狗的样子3。注意损失函数的变化:不优化交叉熵,「而是最大化特征值的 L2 范数」4

直接放大得到的图噪乱,书里用了两个工程手段:高斯模糊平滑,和八度(octave)多尺度——把图连续缩小,在每档尺寸上各做一轮,再逐步放大合并;书里比例 1.5、递归(自己套自己)二十层、结果按 0.6 比例混合5。代码的核心就两行:损失是 out.norm()(L2 范数),更新是 input += lr * input.grad——梯度上升(加号,不是训练里的减号)6

实验最能说明问题的是层数:同一张星空图,VGG19 第 4 层放大出的是局部纹理,第 8 层出现简单图案,第 32 层浮出「像某些类别(比如狗)的图案」——越靠近顶部的层,激活越全面、越抽象7。这一现象反向印证了第 06 章的「特征金字塔」:浅层管纹理、深层管语义,可视化让谱系从结论变成了亲眼所见。

3. 主走查:风格迁移的两个损失

风格迁移的任务:把参考图的风格(梵高的笔触)套到内容图(上海外滩)上,保留后者的内容结构。书里按三种路线分类:普通迁移(固定风格固定内容)、快速迁移(固定风格任意内容)、极速迁移(任意任意),本章走第一种——Gatys 2015 年的原始方案8

核心是把「风格」变成可计算的量,总损失两项9:

loss = distance(style(参考图) − style(生成图)) ← 风格损失
+ distance(content(内容图) − content(生成图)) ← 内容损失

内容损失:取 conv_4 层的特征图,与目标算均方误差
层的选择有讲究:太浅只剩像素、太深丢细节,前 3 层重建已较好[^10]
风格损失:取 conv_1…conv_5 多层的「格拉姆矩阵」算均方误差
格拉姆矩阵 = 一层特征图按通道两两做内积,得到 [通道×通道] 的表
它不管「什么东西在哪」,只管「哪些特征倾向同时出现」——这正是纹理的统计定义[^11]

格拉姆矩阵值得单独看清:特征图本来是 [通道, 高, 宽],展平成 [通道, 高×宽] 与自己的转置相乘,得到通道两两的相关表——「星空的漩涡纹该出现在整幅图,而不是某个角落」这类全局统计,就住在里面10。两个损失的权重极其悬殊:风格 1000000、内容 1——风格项在数值上天然小得多,靠权重拉平11。优化器用 LBFGS(一种拟牛顿法,适合这种「优化对象是像素」的小规模问题),对输入图迭代 300 步12

4. 修复与跨域:Encoder-Decoder 的两个变体

图像修复(inpainting):图缺一块,凭周围补全。Context Encoder 用编码器把缺口图压成小瓶颈(6×6×256),解码器用转置卷积展开还原;损失=重构+对抗——书里点明只靠重构损失,补出来的区域会模糊(它只能输出「各种可能」的平均),对抗损失负责从多种可能里挑一种像真的13。这正好是第 08 章「VAE 模糊、GAN 锐利」原理的一次落地复用。

DiscoGAN:在两个没有配对标签的域之间学互转(包↔鞋,边框图↔彩色鞋)。做法是两个生成器 G_AB、G_BA 对头接:域 A 的图转到 B 再转回 A,用重构损失要求「转一圈回得来」——这个往返约束逼出双射关系(一一对应,不塌缩);再各配一个判别器保证转过去的图像真图14。代价要有数:书里的训练日志显示 9000 轮跑到一半用了 3 小时 15 分(约 2.43 秒/轮)15。电商「自动推荐配套」是书里给的应用出口16

5. 反面:对抗攻击——一层噪声指鹿为马

以上都是梯度的「正用」。反向用法更早出名:在图片上加人眼无法察觉的噪声,分类模型就大规模出错——书里的例子是雪山样本加噪声后被认成狗17。根源书里给了机制级解释:把训好的网络看成一片片「单元格」,这些单元格过度线性化,对细微扰动不敏感的恰好是它们的软肋;攻击者构造的对抗图像,「人眼看是停车标志,汽车看是限速 60」——无人车场景下这是安全事故18

攻击按知情程度分两档:白盒(知道算法与参数,能算梯度)、黑盒(只能喂输入看输出)19;按意图分无目标(只要认错)与有目标(要它认成指定类)20

最小可用的攻击算法 FGSM 一行写完:拿损失函数对输入求梯度,取符号(sign,只留方向丢大小),乘一个小系数 ε 加到图上——x* = x + ε·sign(∂J/∂x),同时约束总扰动不超过 ε(所谓 L∞ 约束)21。它可怕在便宜:一次梯度就够。书里引的经典数字:熊猫图 57.7% 被认成熊猫,加 ε=0.07 的噪声后 99.3% 被认成长臂猿——噪声幅度小到人眼看不出差别22

迭代版更狠:IFGSM 把「一步到位」改成小步多走(步长 α/T,走 T 步),每步把扰动夹回 [-ε, ε] 预算内;实验上白盒场景比单步 FGSM 效果更好23。书里的 PyTorch 实现用的正是迭代版:Inception_v3 上 eps=0.025、40 步、每步 0.0124;有目标攻击只改一个负号——无目标是 x + sign(梯度)(沿损失上升,越错越好),有目标改成 x − sign(梯度)(朝指定类的方向下降)25

判断(我们的,不是书里的): 本章最值得带走的不是算法是结构:攻击者与防御者玩的是同一个「输入上的梯度」。「梯度掩码」这类防御(见下节)试图藏起梯度,但只要模型仍是可微函数,输入梯度原则上就存在——这决定了对抗攻防是长期的军备竞赛,不存在一劳永逸的盾。2017 年 NIPS 设立对抗攻防专项竞赛,书里也记录了这个信号26如果错,会错在: 如果某个防御被证明能让输入梯度不再携带攻击信息(如 certified defense 的某些形式),「无盾论」就要按防御类型分级修正——它们如今确实构成一个小而无盾面狭窄的例外集。

6. 防御四类:各挡一路

书里把当时的防御归成四类27:

防御思路挡得住什么
对抗训练把对抗样本掺进训练集一起训已知攻击样式
梯度掩码把梯度藏起来,让基于梯度的攻击无从下手单纯依赖梯度的攻击
随机化模型里引入随机层,让攻击「瞄准的图」变形精确定制的扰动
去噪进模型前先滤掉扰动小幅噪声

四类各有覆盖面,没有一类通吃——这也是书里「根据实际情况灵活运用」背后的真实含义28。书里还点了攻击的蔓延方向:单像素攻击、语义分割攻击(把攻击任务转成对抗样本生成任务,引入 GAN)、图结构攻击(给知识图谱——公司的事实数据库——塞造假节点)29——今天读,这个清单像是此后五年对抗研究的预告。

7. 作者的判断与证据

给了证据的: DeepDream 三层对比图、风格迁移的层选择实验(conv1_1 到 conv5_1 的重建效果比较)、DiscoGAN 的完整训练日志(损失值、迭代进度)、熊猫 57.7%→99.3% 的经典数字,均有出处;对抗攻击的 PyTorch 代码可跑。

给了机制解释的: 修复「只重构会模糊」的因果、GAN 补「模式选择」的解释;对抗样本与「过度线性化」的关系——都是书里认真给了 why 的段落,不是现象罗列。

作者的写作选择: 把攻击放最后、以「未雨绸缪」的防御收尾——安全而不是造图,成了全书的落点。

8. 边界与局限

  • 风格迁移的三个路线只实现了一个。 快速/极速迁移(前馈网络一步出图)书里只有名字;今天产品里的实时滤镜走的是后两条路。
  • 防御一节停留在 2019 年。 认证防御、对抗鲁棒性(被攻击后稳得住的程度)的理论度量不在书内;书里四类防御后来都有被新攻击绕过的记录,引用时当「历史清单」而非「现状」。
  • DeepDream/风格迁移的现代替代品(特征可视化工具、扩散模型编辑)不在书内。
  • 对抗攻击的评测协议(迁移攻击、集成攻击)书里没讲;黑盒攻击的实践比书中「查询输入输出」一句复杂得多。

9. 可带走的

  1. 判断「梯度对准谁」:对权重=训练,对输入=可视化/生成/攻击——一套机器三种用法;
  2. DeepDream 放大某层特征的 L2,层越深图案越接近「类别」,这是特征金字塔的肉眼版;
  3. 风格=通道两两相关(Gram 矩阵),内容=特定层特征;风格权重 1000000:1 是数值量级决定的;
  4. 只用重构损失补洞必然模糊——「多种可能的平均值」;加对抗损失才敢「挑一种」;
  5. 无配对数据跨域互转的钥匙是「转一圈回得来」(A→B→A 重构)的双射约束;
  6. 对抗攻击最小算法一行:x + ε·sign(∂J/∂x);熊猫 57.7%→长臂猿 99.3% 是这条公式最著名的战绩;
  7. 有目标与无目标攻击只差一个负号;
  8. 防御四类(对抗训练/梯度掩码/随机化/去噪)各有覆盖面,没有通吃的盾——攻防是持续竞赛。

10. 原文地图

主题原书章原文位置
DeepDream 动机第12章 实战生成式模型text/13-ch12.txt:20(搜「神秘面纱」)
梯度上升、不更新权重第12章 实战生成式模型text/13-ch12.txt:26(搜「梯度上升」)
云狗与 [0.6,0.4]第12章 实战生成式模型text/13-ch12.txt:32(搜「0.6,0.4」)
L2 范数当损失第12章 实战生成式模型text/13-ch12.txt:33(搜「L2范数」) · text/13-ch12.txt:37(搜「最大化特征值」)
八度多尺度第12章 实战生成式模型text/13-ch12.txt:49(搜「八度」) · text/13-ch12.txt:56(搜「1.5」)
核心代码两行第12章 实战生成式模型text/13-ch12.txt:98(搜「out.norm()」) · text/13-ch12.txt:102(搜「input += lr」)
层越深越抽象第12章 实战生成式模型text/13-ch12.txt:171(搜「抽象」)
三种风格迁移第12章 实战生成式模型text/13-ch12.txt:178(搜「普通风格迁移」)
Gatys 2015第12章 实战生成式模型text/13-ch12.txt:187(搜「Gatys」)
总损失两项第12章 实战生成式模型text/13-ch12.txt:194(搜「style(reference_image)」)
内容层选择第12章 实战生成式模型text/13-ch12.txt:213(搜「内容重建」) · text/13-ch12.txt:214(搜「丢失了一些细节」)
Gram 矩阵第12章 实战生成式模型text/13-ch12.txt:254(搜「格拉姆矩阵」) · text/13-ch12.txt:255(搜「内积」)
风格与内容权重第12章 实战生成式模型text/13-ch12.txt:455(搜「1000000」)
LBFGS 优化像素第12章 实战生成式模型text/13-ch12.txt:389(搜「LBFGS」) · text/13-ch12.txt:454(搜「num_steps=300」)
修复与模糊第12章 实战生成式模型text/13-ch12.txt:510(搜「上下文解码器」) · text/13-ch12.txt:49(搜「模糊」)
DiscoGAN 双射第12章 实战生成式模型text/13-ch12.txt:17(搜「DiscoGAN」) · text/13-ch12.txt:643(搜「两次转换」) · text/13-ch12.txt:683(搜「双射」)
训练成本日志第12章 实战生成式模型text/13-ch12.txt:835(搜「2.43s」) · text/13-ch12.txt:836(搜「2.5586」)
对抗样本与雪山第14章 AI新方向:对抗攻击text/15-ch14-14-ai.txt:15(搜「对抗样本」) · text/15-ch14-14-ai.txt:24(搜「视为狗」)
过度线性化与停车标志第14章 AI新方向:对抗攻击text/15-ch14-14-ai.txt:52(搜「过度线性化」) · text/15-ch14-14-ai.txt:56(搜「停车标志」)
白盒黑盒第14章 AI新方向:对抗攻击text/15-ch14-14-ai.txt:41(搜「白盒攻击」)
无目标有目标第14章 AI新方向:对抗攻击text/15-ch14-14-ai.txt:62(搜「无目标攻击」)
FGSM 公式与 L∞第14章 AI新方向:对抗攻击text/15-ch14-14-ai.txt:80(搜「约束」) · text/15-ch14-14-ai.txt:82(搜「sign」)
熊猫 57.7→99.3第14章 AI新方向:对抗攻击text/15-ch14-14-ai.txt:87(搜「57.7%」)
迭代版更优第14章 AI新方向:对抗攻击text/15-ch14-14-ai.txt:100(搜「效果更好」)
实验参数第14章 AI新方向:对抗攻击text/15-ch14-14-ai.txt:118(搜「0.025」)
有目标只差负号第14章 AI新方向:对抗攻击text/15-ch14-14-ai.txt:247(搜「梯度符号」) · text/15-ch14-14-ai.txt:239(搜「x.data - normed_grad」)
防御四类第14章 AI新方向:对抗攻击text/15-ch14-14-ai.txt:296(搜「对抗训练」) · text/15-ch14-14-ai.txt:311(搜「去噪」)
NIPS 竞赛第14章 AI新方向:对抗攻击text/15-ch14-14-ai.txt:329(搜「NIPS」)

Footnotes

  1. 出处:「第12章 实战生成式模型」第 20 段(text/13-ch12.txt:20,搜「神秘面纱」)。

  2. 出处:「第12章 实战生成式模型」第 26 段(text/13-ch12.txt:26,搜「梯度上升」)。

  3. 出处:「第12章 实战生成式模型」第 32 段(text/13-ch12.txt:32,搜「0.6,0.4」)。

  4. 出处:「第12章 实战生成式模型」第 37 段(text/13-ch12.txt:37,搜「最大化特征值」)。

  5. 出处:「第12章 实战生成式模型」第 49 段(text/13-ch12.txt:49,搜「八度」)、第 56 段(text/13-ch12.txt:56,搜「1.5」)与第 135 段(text/13-ch12.txt:135,搜「blend」)。

  6. 出处:「第12章 实战生成式模型」第 98 段(text/13-ch12.txt:98,搜「out.norm()」)与第 102 段(text/13-ch12.txt:102,搜「input += lr」)。

  7. 出处:「第12章 实战生成式模型」第 171 段(text/13-ch12.txt:171,搜「抽象」)。

  8. 出处:「第12章 实战生成式模型」第 178 段(text/13-ch12.txt:178,搜「普通风格迁移」)与第 187 段(text/13-ch12.txt:187,搜「Gatys」)。

  9. 出处:「第12章 实战生成式模型」第 194 段(text/13-ch12.txt:194,搜「style(reference_image)」)。

  10. 出处:「第12章 实战生成式模型」第 259 段(text/13-ch12.txt:259,搜「ch,h*w」)。

  11. 出处:「第12章 实战生成式模型」第 455 段(text/13-ch12.txt:455,搜「1000000」)。

  12. 出处:「第12章 实战生成式模型」第 389 段(text/13-ch12.txt:389,搜「LBFGS」)与第 454 段(text/13-ch12.txt:454,搜「num_steps=300」)。

  13. 出处:「第12章 实战生成式模型」第 510 段(text/13-ch12.txt:510,搜「上下文解码器」)与第 49 段(text/13-ch12.txt:49,搜「模糊」)。

  14. 出处:「第12章 实战生成式模型」第 643 段(text/13-ch12.txt:643,搜「两次转换」)与第 683 段(text/13-ch12.txt:683,搜「双射」)。

  15. 出处:「第12章 实战生成式模型」第 835 段(text/13-ch12.txt:835,搜「2.43s」)与第 836 段(text/13-ch12.txt:836,搜「2.5586」)。

  16. 出处:「第12章 实战生成式模型」第 647 段(text/13-ch12.txt:647,搜「推荐配套」)。

  17. 出处:「第14章 AI新方向:对抗攻击」第 15 段(text/15-ch14-14-ai.txt:15,搜「对抗样本」)与第 24 段(text/15-ch14-14-ai.txt:24,搜「视为狗」)。

  18. 出处:「第14章 AI新方向:对抗攻击」第 52 段(text/15-ch14-14-ai.txt:52,搜「过度线性化」)与第 56 段(text/15-ch14-14-ai.txt:56,搜「停车标志」)。

  19. 出处:「第14章 AI新方向:对抗攻击」第 41 段(text/15-ch14-14-ai.txt:41,搜「白盒攻击」)与第 46 段(text/15-ch14-14-ai.txt:46,搜「黑盒攻击」)。

  20. 出处:「第14章 AI新方向:对抗攻击」第 62 段(text/15-ch14-14-ai.txt:62,搜「无目标攻击」)与第 67 段(text/15-ch14-14-ai.txt:67,搜「有目标攻击」)。

  21. 出处:「第14章 AI新方向:对抗攻击」第 80 段(text/15-ch14-14-ai.txt:80,搜「约束」)与第 82 段(text/15-ch14-14-ai.txt:82,搜「sign」)。

  22. 出处:「第14章 AI新方向:对抗攻击」第 87 段(text/15-ch14-14-ai.txt:87,搜「57.7%」)。

  23. 出处:「第14章 AI新方向:对抗攻击」第 99 段(text/15-ch14-14-ai.txt:99,搜「α/T」)与第 100 段(text/15-ch14-14-ai.txt:100,搜「效果更好」)。

  24. 出处:「第14章 AI新方向:对抗攻击」第 118 段(text/15-ch14-14-ai.txt:118,搜「0.025」)与第 119 段(text/15-ch14-14-ai.txt:119,搜「steps = 40」)。

  25. 出处:「第14章 AI新方向:对抗攻击」第 247 段(text/15-ch14-14-ai.txt:247,搜「梯度符号」)与第 189 段(text/15-ch14-14-ai.txt:189,搜「normed_grad」)。

  26. 出处:「第14章 AI新方向:对抗攻击」第 329 段(text/15-ch14-14-ai.txt:329,搜「NIPS」)。

  27. 出处:「第14章 AI新方向:对抗攻击」第 294 段(text/15-ch14-14-ai.txt:294,搜「分为4类」)与第 296 段(text/15-ch14-14-ai.txt:296,搜「对抗训练」)。

  28. 出处:「第14章 AI新方向:对抗攻击」第 317 段(text/15-ch14-14-ai.txt:317,搜「灵活运用」)。

  29. 出处:「第14章 AI新方向:对抗攻击」第 271 段(text/15-ch14-14-ai.txt:271,搜「一个像素点」)、第 273 段(text/15-ch14-14-ai.txt:273,搜「语义分割」)与第 285 段(text/15-ch14-14-ai.txt:285,搜「知识图谱」)。