GAN简介#
论文: Generative Adversarial Nets
参考资料:
对抗生成网络 GAN 的英文全称为 Generative Adversarial Network,
生成器(Generator, G G )
Generator是一个函数,输入是随机向量(随机噪声)z z ,输出是 x x ;
判别器(Discriminator, D D )
Discriminator也是一个函数,输入是 x x ,输出是一个标量;
GAN的训练流程#
我们需要借助一个高水平的判别器来训练我们的生成器 ,举个不恰当的例子,比如我们是做工艺品的,我们期望的目标是制造出的工艺品能够达到以假乱真的地步 ,这个时候我们需要一个鉴赏专家来告诉我们,我们制造出的工艺品是否逼真,因为专家给我们的反馈是十分重要的,我们可以借助专家给我们的反馈信息,来提升自己的工艺技术 。
那么我们如何训练判别器呢? 事实上,我们从上帝视角来看,其实我们是知道哪些是真的,哪些是假的,所以我们可以直接将古董和工艺品混合在一起,去给鉴赏专家,告诉鉴赏专家哪些是真的,哪些是假的,让鉴赏专家从带标签的样本中去学习、去提升鉴别能力。
判别器的学习#
首先我们初始化生成器 G G ,然后输入一组随机向量(Randomly sample a vactor),生成器会根据输入的向量产生一些图片,我们把这些图片标注成 0(假图片)。同时把已有训练集中真实的图片标注成 1(真图片)。两者同时丢进判别器 D D 中,以此来训练判别器 D D 。使得当输入是真图片的时候,判别器给高分(分数接近于1),而输入假图片的时候,判别器给低分(接近于0)。
此时,我们便可以用监督学习的方式来对判别器进行训练。
生成器的学习#
针对于 D D 我们有标记为1 1 和0 0 的数据,因此我们可以对其进行训练。那么对于生成器,有 x x (也就是随机噪声 z z ),那么他的标签 y y 在哪里呢?
事实上,我们在训练生成器 的时候可以做出假设“判别器 能够做出准确可靠的判断”,在这个假设下,我们可以通过判别器 来产生生成器 的标签 y y :
我们通过随机向量(噪声数据)经由生成网络产生一组假图片,我们将这些假图片都标记为 1(也就是说,人为的把假的图片当作真实的);
将这些假图片输入到判别器中,判别器在对这些图片进行判别的时候,会发现这些图片是假的图片,然后给出低分,这样就产生了误差(因为标记的为1,但是判别器给了低分);
由于在训练生成器的时候,这个网络是串接的,所以一个很重要的操作就是保持判别器网络的参数不发生改变 ,只是把误差一直方向传播,传到生成网络那块后更新生成网络的参数,这样就完成了生成网络的训练了。
在完成生成器的训练之后,我们又可以产生新的假的图片去对判别器进行训练。我们把这个过程称作为单独交替训练 。同时要定义一个迭代次数,交替迭代到一定次数后停止即可。
数学表示#
我们有一组含有 n n 个样本的数据集 X = { x ( 1 ) , x ( 2 ) , ⋯ , x ( n ) } X = { x ( 1 ) , x ( 2 ) , ⋯ , x ( n ) } ,假设这些样本数据从一个概率分布 P data P data 中产生;
假设 G G 的概率分布为 P g ( x ; θ g ) P g ( x ; θ g ) ,实际上我们所生成的样本也是从这个概率分布中抽样而得出的;
假定噪声 z z 从一个简单的分布中产生(如高斯分布),即 z ∼ P z ( z ) z ∼ P z ( z ) ;
我们将判别器 认为 x x 是真样本的概率记为 D ( X ; θ d ) D ( X ; θ d ) ;
需要注意的是:
我们不对生成器 G G 的概率分布 P g P g 进行建模,而是使用神经网络来逼近生成器 G G 的概率分布 P g P g ;
我们有 z → G ( Z ; θ g ) → x z → G ( Z ; θ g ) → x ,其中 z z 是输入噪声, G ( Z ; θ g ) G ( Z ; θ g ) 是生成器 的神经网络,x x 是生成的样本;
判别器#
我们所希望判别器 D D 能达到的效果是:
{ D ( x ) ↑ , if x is from p d a t a ( 1 − D ( G ( z ) ) ) ↑ , if x is from p g { D ( x ) ↑ , if x is from p d a t a ( 1 − D ( G ( z ) ) ) ↑ , if x is from p g
为了方便计算,我们将上式进行改写:
{ log D ( x ) ↑ , if x is from p d a t a log ( 1 − D ( G ( z ) ) ) ↑ , if x is from p g { log D ( x ) ↑ , if x is from p d a t a log ( 1 − D ( G ( z ) ) ) ↑ , if x is from p g
所以,判别器的目标函数为:
max D E x ∼ p d a t a [ log D ( x ) ] + E z ∼ p z [ log ( 1 − D ( G ( z ) ) ) ] max D E x ∼ p d a t a [ log D ( x ) ] + E z ∼ p z [ log ( 1 − D ( G ( z ) ) ) ]
为了便于初学者理解,这里说明一下 E x ∼ p d a t a [ f ( x ) ] E x ∼ p d a t a [ f ( x ) ] 所代表的含义:E x ∼ p d a t a [ f ( x ) ] = 1 N ∑ N i = 1 f ( x i ) , x i ∼ p d a t a E x ∼ p d a t a [ f ( x ) ] = 1 N ∑ i = 1 N f ( x i ) , x i ∼ p d a t a 。
生成器#
我们所希望生成器 G G 生成的样本能够使判别器 D D 尽可能地以为是真样本,即生成器所期望达到的效果是:D ( G ( z ) ) ↑ D ( G ( z ) ) ↑ ,即log ( 1 − D ( G ( z ) ) ) ↓ log ( 1 − D ( G ( z ) ) ) ↓
所以,生成器 G G 的目标函数为:
min G E z ∼ p z [ log ( 1 − D ( G ( z ) ) ) ] min G E z ∼ p z [ log ( 1 − D ( G ( z ) ) ) ]
综上所述,总目标为:
min G max D E x ∼ p d a t a [ log D ( x ) ] + E z ∼ p z [ log ( 1 − D ( G ( z ) ) ) ] min G max D E x ∼ p d a t a [ log D ( x ) ] + E z ∼ p z [ log ( 1 − D ( G ( z ) ) ) ]
算法推导#
在开始进行推导之前,我们介绍一下传统的生成器(这里除去GAN)方法:
首先再次明确一下我们的目标:我们所期望生成器生成的样本尽可能逼真,换句话说,我们所期望生成器生成的样本尽可能与真实的样本相似,即:P g → P d a t a P g → P d a t a 。
对于常规的生成模型(这里除去GAN)来说,我们直接将生成器 G G 的概率分布进行 P g P g 建模:P g ( θ g ) P g ( θ g ) ,那么我们有:
θ g = arg max θ g N ∑ i = 1 log p g ( x i ) = arg min θ g K L ( P d a t a ∣∣ P g ) (1) (2) (1) θ g = arg max θ g ∑ i = 1 N log p g ( x i ) (2) = arg min θ g K L ( P d a t a ∣∣ P g )
上式 ( 1 ) ( 1 ) 为极大似然估计的推导,上式 ( 2 ) ( 2 ) 为 KL 散度的推导。
我们获得参数 θ g θ g 之后,便可以得到生成器的概率分布 P g ( θ g ) P g ( θ g ) ,所以生成器生成的样本可以从 P g ( θ g ) P g ( θ g ) 中采样得到 X ∼ P g ( θ g ) X ∼ P g ( θ g ) 。
我们记生成器的目标函数为 V ( D , G ) = E x ∼ P d a t a [ log D ( x ) ] + E x ∼ P g [ log ( 1 − D ( x ) ) ] V ( D , G ) = E x ∼ P d a t a [ log D ( x ) ] + E x ∼ P g [ log ( 1 − D ( x ) ) ] ,那么对于固定的 G G 来说 :
V ( D , G ) = ∫ x P d a t a ( x ) log ( D ( x ) ) dx + ∫ x P g ( x ) log ( 1 − D ( x ) ) dx = ∫ x [ P d a t a ( x ) log ( D ( x ) ) + P g ( x ) log ( 1 − D ( x ) ) ] dx V ( D , G ) = ∫ x P d a t a ( x ) log ( D ( x ) ) dx + ∫ x P g ( x ) log ( 1 − D ( x ) ) dx = ∫ x [ P d a t a ( x ) log ( D ( x ) ) + P g ( x ) log ( 1 − D ( x ) ) ] dx
我们探讨是否存在最优的 D ⋆ G D G ⋆ 使得V ( D ⋆ G , G ) V ( D G ⋆ , G ) 最大化,很自然地会想到对 V ( D , G ) V ( D , G ) 求 D D 的偏导,即:
∂ V ( D , G ) ∂ D = ∫ x ∂ ∂ D [ P d a t a ( x ) log ( D ( x ) ) + P g ( x ) log ( 1 − D ( x ) ) ] dx = ∫ x [ P d a t a ( x ) 1 D ( x ) + P g ( x ) − 1 1 − D ( x ) ] ≜ 0 ⇒ D ⋆ G = P d a t a ( x ) P d a t a ( x ) + P g ( x ) ∂ V ( D , G ) ∂ D = ∫ x ∂ ∂ D [ P d a t a ( x ) log ( D ( x ) ) + P g ( x ) log ( 1 − D ( x ) ) ] dx = ∫ x [ P d a t a ( x ) 1 D ( x ) + P g ( x ) − 1 1 − D ( x ) ] ≜ 0 ⇒ D G ⋆ = P d a t a ( x ) P d a t a ( x ) + P g ( x )
所以,对于固定的 G G 来说,最优的判别器 D D 是:
D ⋆ G ( x ) = P d a t a ( x ) P d a t a ( x ) + P g ( x ) D G ⋆ ( x ) = P d a t a ( x ) P d a t a ( x ) + P g ( x )
将 D ⋆ G D G ⋆ 代入生成器 G G 的目标函数 V ( D , G ) V ( D , G ) ,则有:
min G max D V ( D , G ) = min G V ( D ⋆ G , G ) = min G E x ∼ P d a t a [ log ( P d a t a ( x ) P d a t a ( x ) + P g ( x ) ) ] + E x ∼ P g [ log ( 1 − P d a t a ( x ) P d a t a ( x ) + P g ( x ) ) ] = min G E x ∼ P d a t a [ log ( P d a t a ( x ) P d a t a ( x ) + P g ( x ) ) ] + E x ∼ P g [ log ( P g ( x ) P d a t a ( x ) + P g ( x ) ) ] = min G E x ∼ P d a t a [ log ( P d a t a ( x ) [ P d a t a ( x ) + P g ( x ) ] / 2 ⋅ 1 2 ) ] + E x ∼ P g [ log ( P g ( x ) [ P d a t a ( x ) + P g ( x ) ] / 2 ⋅ 1 2 ) ] = min G K L ( P d a t a ( x ) ∥ ∥ ∥ P d a t a ( x ) + P g ( x ) 2 ) + K L ( P g ( x ) ∥ ∥ ∥ P d a t a ( x ) + P g ( x ) 2 ) − log 4 ≥ − log 4 min G max D V ( D , G ) = min G V ( D G ⋆ , G ) = min G E x ∼ P d a t a [ log ( P d a t a ( x ) P d a t a ( x ) + P g ( x ) ) ] + E x ∼ P g [ log ( 1 − P d a t a ( x ) P d a t a ( x ) + P g ( x ) ) ] = min G E x ∼ P d a t a [ log ( P d a t a ( x ) P d a t a ( x ) + P g ( x ) ) ] + E x ∼ P g [ log ( P g ( x ) P d a t a ( x ) + P g ( x ) ) ] = min G E x ∼ P d a t a [ log ( P d a t a ( x ) [ P d a t a ( x ) + P g ( x ) ] / 2 ⋅ 1 2 ) ] + E x ∼ P g [ log ( P g ( x ) [ P d a t a ( x ) + P g ( x ) ] / 2 ⋅ 1 2 ) ] = min G K L ( P d a t a ( x ) ‖ P d a t a ( x ) + P g ( x ) 2 ) + K L ( P g ( x ) ‖ P d a t a ( x ) + P g ( x ) 2 ) − log 4 ≥ − log 4
当 P d a t a ( x ) = P g ( x ) = [ P d a t a ( x ) + P g ( x ) ] / 2 P d a t a ( x ) = P g ( x ) = [ P d a t a ( x ) + P g ( x ) ] / 2 时,"= = "成立。
所以 P ⋆ g ( x ) = P g ( x ) P g ⋆ ( x ) = P g ( x ) ,此时 G ⋆ G = P d a t a ( x ) / [ P d a t a ( x ) + P g ( x ) ] = 1 2 G G ⋆ = P d a t a ( x ) / [ P d a t a ( x ) + P g ( x ) ] = 1 2 。
GAN目前的问题#
训练不稳定#
待更新
Model Collapse#
待更新
工程上的技巧#
待更新
如果觉得这篇文章对您有用的话,请点推荐或者关注,这对我来说是十分宝贵的鼓励!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)