Goodfellow 等人提出来的 GAN 是通过对抗过程估计生成模型的新框架。在这种框架下,我们需要同时训练两个模型,即一个能捕获数据分布的生成模型 G 和一个能估计数据来源于真实样本概率的判别模型 D。生成器 G 的训练过程是最大化判别器犯错误的概率,即判别器误以为数据是真实样本而不是生成器生成的假样本。因此,这一框架就对应于两个参与者的极小极大博弈(minimax game)
GAN网络如何训练?
生成模型和判别模型可以简单的认为是不同的神经网络
图片来源(https://blog.csdn.net/on2way/article/details/72773771, 侵删)
生成模型的主要任务是:生成尽可能逼近真样本的假样本
判别模型的主要任务是:尽可能高准确度的判别假样本
上图叫做单独交替迭代训练,具体训练步骤如下:
- 训练判别模型:
- 假样本(0):给一堆随机数组,就会得到一堆假的样本集;真样本(1):真实数据
- 就是二分类模型的训练,直接将数据喂入判别模型即可
- 训练生成模型:
- 生成模型生成假样本,但是只用生成模型自己的话没有误差反馈,也就是说没有误差来源,无法训练。所以将上一步训练好的判别模型连接在生成模型后一起训练。
- 如何连接?因为两个模型的输入都输同样大小的数据,比如说人脸照片,生成的照片数据就可以作为判别模型的输入。
- 训练数据是什么?第一步中我们产生的假样本,将其标签设置为1(就是当做真样本),注意:生成模型的数据只有这个假样本。这样才能迷惑判别器,逐渐使生成的假样本逼近真样本
- 训练时另外重要的一点是,我们要冻结判别模型的参数。判别模型的作用只是传递误差,而不是联合训练。(好不容易训练好的判别摸性,再重新训练不就是白训练了吗,所有不能修改判别模型的参数)
- 生成模型训练好之后,我们的假样本更加逼真,这时再讲这些逼真的假样本当做假样本,真实数据为真样本进行步骤1,2的训练。所有叫做单独交替迭代训练
GAN的目标函数(上述的步骤使用数学表达式表达)D表示判别网络,G表示生成网络
拆分上述公式,先优化判别网络:
- 在生成网络G的条件下优化判别网络D,D(G(Z))就是我们的假样本,一开始是随机生成的,之后是生成模型生成的。
- D(x)表示判断真实数据是否真实的概率,x 表示的是真实数据,所有D(x)越接近1越好
- G(Z)是生成的假样本,所以D(G(Z))越接近0越好
其中 E 指取期望。辨别出 x 属于真实数据 data的对数损失函数。最大化这一项相当于令判别器 D 在 x 服从于 data 的概率密度时能准确地预测 D(x)=1
同理,这个式子的含义就是判别器D识别G(Z)都为0,即G(Z)没有欺骗判别器D
优化生成模型G
最小化该函数,就是令D(G(Z))最大,其值越大就说明我们的假样本越逼真,判别器无法识别,因此就是一个此消彼长的过程。
理解生成判别过程
- 蓝色虚线表示判别分布
- 绿色实线表示生成分布
- 黑色点线表示真实数据分布(图中是正态分布)
判别分布和生成分布不断改变,最后生成分布等于真实值。这是判别器无法判别,D=1/2。个人觉得GAN的强大之处在于,可以从复杂的数据中真正学习到数据的分布规律,比如说生成模型生成人脸的过程,它从一开始的随机数据到最后判别器很难识别的假数据,生成器已经掌握了人脸数据的规律。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:GAN 生成对抗模型详解 - Python技术站