为有效控制生成对抗网络的输出,我们需引入将条件信息(表示为$y$)并入生成过程的机制。此条件$y$可以代表多种事物,比如类别标签(例如“狗”、“猫”)、特定属性(例如发色、姿势)、文本描述,甚至是另一张图像。条件GAN(cGAN)的核心构思是修改生成器$G$和判别器$D$使其基于$y$运行,从而得到$G(z, y)$和$D(x, y)$。实现这种条件设置的常见架构方法如下。生成器的条件设置生成器的任务是产生一个既属于目标数据分布又与所给条件$y$对应的样本$x$。潜在向量$z$仍提供变异的来源,而$y$则指导合成朝向特定的模式或特征。1. 基于拼接的条件设置最直接的方法是将条件信息$y$连同潜在向量$z$一起直接输入到生成器。输入拼接: 如果$y$表示为一个向量(例如独热编码的类别标签或文本/图像的嵌入),它可与潜在向量$z$拼接。这个组合向量$[z, y]$随后作为生成器第一层的输入。digraph G_Concat { rankdir=LR; node [shape=box, style=filled, fillcolor="#e9ecef"]; edge [arrowhead=vee]; z [label="z (潜在)"]; y_embed [label="y (条件向量/嵌入)", style=filled, fillcolor="#d0bfff"]; concat [label="拼接", shape=ellipse, style=filled, fillcolor="#a5d8ff"]; G_body [label="生成器网络 (G 主体)"]; x_gen [label="生成的 x = G(z,y)"]; z -> concat; y_embed -> concat; concat -> G_body; G_body -> x_gen; }将潜在向量$z$与(可能已嵌入的)条件向量$y$拼接,作为生成器网络的输入。中间层拼接: 条件$y$(通常在通过其自身的嵌入层或小型神经网络处理后)不仅可以在输入端,还可以被重塑并拼接至生成器架构中的中间特征图。这使得条件能够在特征抽象的多个层次上影响生成过程。对于卷积生成器,$y$可能在沿通道轴拼接前被空间复制以匹配特征图的尺寸。2. 条件调制技术更复杂的方法涉及使用条件$y$来调制生成器中归一化层的行为。条件批量归一化 (CBN): 标准批量归一化在一个层内对激活进行归一化,然后应用学到的仿射变换参数:缩放($\gamma$)和平移($\beta$)。在CBN中,这些参数$\gamma$和$\beta$不再是全局学习的,而是由接收条件$y$作为输入的小型神经网络预测的。即,$\gamma = f_\gamma(y)$和$\beta = f_\beta(y)$。这使得条件能够动态控制整个生成器中的特征统计量(均值和方差),从而对合成过程提供精细的控制,通常影响与$y$相关的风格方面。自适应实例归一化 (AdaIN): 由StyleGAN推广,AdaIN在思路上与CBN相似,但作用于实例归一化。它将内容特征(来自$z$)的均值和标准差对齐,以匹配从风格输入(可通过映射网络受$y$影响)派生的均值和标准差。这有效地在合成网络的多个点“注入”风格或条件$y$。这些调制技术相比简单的拼接,通常能带来更好的解缠和控制,特别是对于复杂、高分辨率的生成任务。判别器的条件设置判别器在cGAN中的作用是双重的:判断输入样本$x$是真实还是虚假,并验证$x$是否与给定条件$y$匹配。若没有第二部分,生成器可能会学着忽略$y$,从而产生真实但无关的样本。1. 输入拼接与生成器类似,告知判别器条件的最直接方式是通过拼接。输入与条件拼接: 输入样本$x$(真实或生成)通常通过早期的卷积层进行处理,以获得特征表示。条件向量$y$(可能已嵌入)也经过处理并重塑。随后,这两个表示被拼接并输入到判别器的后续层,由这些层产生最终的真实/虚假预测。digraph D_Concat { rankdir=LR; node [shape=box, style=filled, fillcolor="#e9ecef"]; edge [arrowhead=vee]; x [label="x (真实/生成)"]; y_embed [label="y (条件向量/嵌入)", style=filled, fillcolor="#d0bfff"]; D_pre_x [label="D 的初始层 (针对 x)"]; D_pre_y [label="嵌入/处理 (针对 y)"]; concat [label="拼接", shape=ellipse, style=filled, fillcolor="#a5d8ff"]; D_post [label="D 的最终层"]; output [label="真实/虚假输出"]; x -> D_pre_x; y_embed -> D_pre_y; D_pre_x -> concat; D_pre_y -> concat; concat -> D_post; D_post -> output; }在最终判别前,分别处理输入$x$和条件$y$,然后拼接它们的表示。2. 投影判别器一种更有效且广泛采用的技术,特别是对于高维输入和大量类别,是投影判别器。它不是简单拼接,而是显式地将输入$x$与条件$y$的匹配整合到判别器的输出对数中。该架构工作方式如下:条件$y$(通常是一个类别标签)被嵌入到一个向量$v_y$中。输入图像$x$通过判别器网络的主体(例如卷积层),获得一个中间特征表示$\phi(x)$。核心构思是计算图像特征$\phi(x)$与嵌入条件$v_y$之间的点积(或类似的双线性池化)。这一项$\phi(x)^T v_y$衡量图像特征与特定条件之间的兼容性或对齐度。判别器的最终输出对数被计算为两项之和:一项仅基于图像特征(代表独立于条件的“真实性”),以及在步骤3中计算的投影项。$$ \text{输出对数} = W \phi(x) + \phi(x)^T v_y $$此处,$W \phi(x)$捕获无条件真实/虚假分数,而$\phi(x)^T v_y$显式奖励判别器识别出其特征$\phi(x)$与正确条件$y$的嵌入$v_y$良好对齐的图像。这种架构强烈鼓励生成器产生不仅真实而且准确反映给定条件$y$的样本。digraph D_Projection { rankdir=LR; node [shape=box, style=filled, fillcolor="#e9ecef"]; edge [arrowhead=vee]; subgraph cluster_D { label = "投影判别器 (D)"; style=filled; fillcolor="#f8f9fa"; color="#dee2e6"; x [label="x (输入图像)"]; y [label="y (条件)"]; embed_y [label="嵌入 y", style=filled, fillcolor="#d0bfff"]; phi_x [label="特征提取器 φ(x)", style=filled, fillcolor="#bac8ff"]; dot_prod [label="内积\n(投影)", shape=invhouse, style=filled, fillcolor="#ffc9c9"]; linear_out [label="无条件对数\n(来自 φ(x))", style=filled, fillcolor="#74c0fc"]; add [label="+", shape=circle, style=filled, fillcolor="#96f2d7", width=0.6, height=0.6, fixedsize=true]; output [label="最终条件\n真实/虚假对数"]; x -> phi_x; y -> embed_y; phi_x -> dot_prod [label=" φ(x)"]; embed_y -> dot_prod [label=" v_y"]; phi_x -> linear_out; dot_prod -> add; linear_out -> add; add -> output; } }投影判别器的架构,将无条件分数与条件投影项组合。3. 辅助分类器GAN (AC-GAN)AC-GAN虽有不同,但也存在相似之处。在AC-GAN中,判别器同时执行两个任务:它预测输入$x$是真实还是虚假,并预测与$x$相关的类别标签$y$。其损失函数既包含标准对抗损失,也包含辅助分类损失(例如交叉熵)。这迫使生成器产生不仅真实而且能被判别器根据预期条件$y$正确分类的样本。该架构的修改在于为判别器添加一个单独的输出头,用于类别预测任务。选择合适的条件设置架构取决于条件$y$的性质、生成任务的复杂性以及计算限制。拼接更易于实现,而调制技术(如CBN)和投影判别器通常为复杂的条件生成任务提供卓越的性能和控制。