GAN 的计分规则来自二人零和博弈:双方得失之和恒为零,造假者追求"最坏情况下最多赚",鉴定师追求"最坏情况下最少赔",合起来就是极小极大(minimax)规则。 本节从一张收益矩阵手算鞍点开始,把 GAN 的极小极大目标逐项拆到可复算。
进入数学审讯室的第一案。第 1 章我们说"双方利益相反",本节把这句话精确化:相反到什么程度(零和),双方各自的最优策略怎么定义(极小与极大),以及 Goodfellow 论文里那个著名的目标函数每一项到底记的是谁的账。
规则要从最小的例子长出来。设造假者有两种工艺 A、B,鉴定师有两种鉴定法甲、乙。矩阵里的数字是造假者的收益(鉴定师的收益取负,这就是零和):
| 造假者\鉴定师 | 甲 | 乙 |
|---|---|---|
| 工艺 A | 3 | -1 |
| 工艺 B | 2 | 4 |
造假者不知道鉴定师会用哪招,稳妥起见看每行最小收益:A 行最小 -1,B 行最小 2。选 B,最坏也赚 2——这叫极大化极小(maximin)。鉴定师对称地看每列最大损失:甲列最大 3,乙列最大 4,选甲,最坏只赔 3——极小化极大(minimax)。用代码核一遍:
import numpy as np P = np.array([[3, -1], [2, 4]]) # 收益归造假者; 鉴定师收益 = -P print("造假者各行最小收益:", P.min(axis=1), " -> maximin 选工艺", P.min(axis=1).argmax() + 1) print("鉴定师各列最大损失:", P.max(axis=0), " -> minimax 选鉴定法", P.max(axis=0).argmin() + 1) print("maximin 值 =", P.min(axis=1).max(), "; minimax 值 =", P.max(axis=0).min()) # 输出: # 造假者各行最小收益: [-1 2] -> maximin 选工艺 2 # 鉴定师各列最大损失: [3 4] -> minimax 选鉴定法 1 # maximin 值 = 2 ; minimax 值 = 3
注意结果:maximin 值 2 不等于 minimax 值 3。这个例子没有鞍点——双方没有一对策略能互相锁死,理性对局会进入混合策略(按概率出招)的循环。这正是 GAN 训练"永不精确收敛、只能绕着均衡打转"的博弈论根源。当矩阵换成有鞍点的(比如把 4 改成 1.5,使得 B 行最小仍是 2、甲列最大恰为 2),双方策略才稳定互锁——对应 GAN 理论中"真实分布与生成分布重合"的完美均衡(2.4 节细讲)。
# 换一个有鞍点的矩阵观察互锁 P2 = np.array([[3, -1], [2, 1.5]]) print("maximin 值 =", P2.min(axis=1).max(), "; minimax 值 =", P2.max(axis=0).min()) # 输出: maximin 值 = 2.0 ; minimax 值 = 2.0 # 两者相等 => 鞍点存在: 工艺B 对 鉴定法甲, 博弈锁死
矩阵说的是离散策略,GAN 的策略是连续的(两组网络参数),"收益"换成了期望对数似然。Goodfellow 给出的审理规则:
min_G max_D V(D, G) = E[log D(x)] + E[log(1 - D(G(z)))]
其中第一个期望对真实数据 x 取(x 服从数据分布),第二个对噪声 z 取(G(z) 是赝品)。逐项拆账:
一个 V,两种意图,这就是"极小极大"四个字在网络参数空间里的形态。对比一下更直观:
| 博弈元素 | 矩阵例子 | GAN |
|---|---|---|
| 造假者策略 | 工艺 A/B | 生成器参数 θ_G |
| 鉴定师策略 | 鉴定法甲/乙 | 判别器参数 θ_D |
| 收益 | 矩阵元素 | 期望 V(D, G) |
| 均衡 | 鞍点(若存在) | 分布重合、D 恒输出 0.5 |
⚠️ 常见坑:把 GAN 叫"零和"严格来说要小心——工程实现里生成器常用"非饱和"改写损失(2.2 节),此时双方损失不再严格互为相反数,博弈从零和变成"近零和"。理论分析的起点是零和形式,训练代码里跑的多半是改写形式,两者别混。
直觉上,让两个网络合作拟合数据似乎更稳。问题在于合作目标仍要手工设计"像不像"的度量,绕回了显式建模的老路。极小极大的妙处是把"像不像"这个最难写的函数交给鉴定师去学,造假者只管对抗。代价是失去了单调的优化目标——没有哪条损失曲线能单独告诉你"整体在变好",这也是第 4 章验收指标要另起炉灶的原因。
极小极大和极大极小是一回事吗? 是同一对操作的两种读法:造假者做"极大化极小"(在最坏鉴定下挑最优工艺),鉴定师做"极小化极大"(在最坏造假下挑最优鉴定)。GAN 目标里的 min_G max_D 就是把两个视角写进一个式子,先对 D 取极大再对 G 取极小。
既然零和,为什么训练里双方损失加起来不是零? 因为工程实现做了两处修改:生成器用非饱和改写(第 2.2 节),判别器常见标签平滑。账本不再严格互为相反数,博弈从纯零和变成"近零和"——理论分析用严格形式,训练代码用工程形式,两者别混用。
混合策略在 GAN 里对应什么? 对应"参数绕均衡点震荡"。博弈论中无鞍点的博弈靠概率混合出招;GAN 的参数空间里,梯度噪声天然起到了混合的作用,训练轨迹绕均衡点打转而不精确收敛——第 2.3 节的实录会看到这个形态。
给定收益矩阵(造假者视角):第一行 5 与 0,第二行 3 与 2。请手算 maximin 与 minimax 值并判断有无鞍点。答案:造假者行最小为 0 与 2,选第二行得 2;鉴定师列最大为 5 与 2,选第二列得 2;两值相等即鞍点存在,工艺二对鉴定法二互锁。算完这题,极小极大的手工操作就过关了。