年轻的时候,我们爱得死去活来,可随着年岁渐长,你就会发现,爱情并不是生活的全部。 善良,努力,读书,健身,让自己变得更好才是人生最重要的事。
简介:伯克利大学研究提出的使用条件对抗网络作为图像到图像转换问题的通用解决方案。图像到图像转换的问题其实也就是像素到像素(Pix2Pix)的映射问题。
Github Demo:Pix2Pix
官网:Image-to-Image Translation with Conditional Adversarial Nets
论文:Image-to-Image Translation with Conditional Adversarial Networks
前阵子很出名的DeepNude:DeepNude-an-Image-to-Image-technology
GAN实现原理:GAN 在结构上受博弈论中的二人零和博弈 (即二人的利益之和为零,一方的所得正是另一方的所失) 的启发,系统由一个生成器和一个判别器构成。
名词说明GAN生成对抗网络,Generative adversarial networks。Generator生成器,尽量去学习真实的数据分布。Discriminator判别器,尽量正确的判别输入数据是来自真实数据还是来自生成器。训练结束标准当最终 D 的判别能力提升到一定程度,并且无法正确判别数据来源时,可以认为这个生成器 G 已经学到了真实数据的分布。V ( G , D ) = E x ∼ p d a t a ( x ) l o g D ( x ) + E z ∼ p z ( z ) l o g ( 1 − D ( G ( z ) ) ) V(G,D)=E_{x\sim p_{data}(x)}logD(x)+E_{z\sim p_{z}(z)}log(1-D(G(z))) V(G,D)=Ex∼pdata(x)logD(x)+Ez∼pz(z)log(1−D(G(z)))
参数解析 m i n G m a x D \underset{G}{min}\ \underset{D}{max} Gmin Dmax零和博弈 D D D可微判别器函数 G G G可微生成器函数 E E E数学期望 x ∼ p d a t a x\sim p_{data} x∼pdata x x x服从于真实数据 d a t a data data的概率密度 z ∼ p z ( z ) z\sim \ p_{z}(z) z∼ pz(z) z z z服从于初始化数据的概率密度 l o g D ( x ) logD(x) logD(x)正类的对数损失函数(正类:即能判别出x属于真实分布。) l o g ( 1 − D ( G ( z ) ) ) log(1-D(G(z))) log(1−D(G(z)))负类的对数损失函数(正类:即能判别出x属于生成分布。) E x ∼ p d a t a ( x ) l o g D ( x ) E_{x\sim p_{data}(x)}logD(x) Ex∼pdata(x)logD(x)根据正类的对数损失函数构建,取最大值则意味着令判别器 D D D在 x x x服从于 d a t a data data的概率密度时能准确预测 D ( x ) = 1 D(x)= 1 D(x)=1,即 D ( x ) = 1 w h e n x ∼ p d a t a ( x ) D(x)= 1 \ when \ x\sim p_{data}(x) D(x)=1 when x∼pdata(x)。 E z ∼ p z ( z ) l o g ( 1 − D ( G ( z ) ) ) E_{z\sim p_{z}(z)}log(1-D(G(z))) Ez∼pz(z)log(1−D(G(z)))根据负类的对数损失函数构建,企图欺骗判别器的生成器。根据上述的价值函数,可以提出零和博弈函数。
给定生成器 G G G,由价值函数可以推导出最优判别器的表述 D G ∗ D_G^* DG∗为:
D G ∗ = a r g m a x D V ( G , D ) D_G^*=arg\underset{D}{max}V(G,D) DG∗=argDmaxV(G,D)
其中 a r g m a x argmax argmax表示取得最大值时的参数的意思。因此, a r g m a x D V ( G , D ) arg\underset{D}{max}V(G,D) argDmaxV(G,D)指的是当 D D D取特定值的时 V ( G , D ) V(G,D) V(G,D)的最大值。
当生成器 D D D使得 V ( G , D ) V(G,D) V(G,D)达到最大值的时候,即最优的情况 D = D G ∗ D=D_G^* D=DG∗的时候,固定 D D D,开始训练 G G G。根据 D G ∗ D_G^* DG∗可以推导出最优生成器 G G G:
G ∗ = m i n G m a x D V ( G , D ) = E x ∼ p d a t a ( x ) l o g D ( x ) + E z ∼ p m o d e l l o g ( 1 − D ( G ( z ) ) ) G^*=\underset{G}{min} \ \underset{D}{max}V(G,D)=\mathbb{E}_{x\sim p_{data}(x)}logD(x)+\mathbb{E}_{z\sim p_{model}}log(1-D(G(z))) G∗=Gmin DmaxV(G,D)=Ex∼pdata(x)logD(x)+Ez∼pmodellog(1−D(G(z)))
备注: E \mathbb{E} E指的也是数学期望。最后,我们可以将最优生成器表达为: G ∗ = a r g m i n G V ( G , D G ∗ ) G^*=arg\ \underset{G}{min}V(G,D_G^*) G∗=arg GminV(G,DG∗) 当然,这仅仅是其中的一次优化的过程。这个过程会持续很多次,直到一个临界点才终止。
任意可微分的函数都可以用来表示 GAN 的生成器和判别器。——《生成式对抗网络GAN的研究进展与展望》
在 GAN 原论文中,有一个思想和其它很多方法都不同,即生成器 G 不需要满足可逆条件。
在极大极小博弈的第一步中,给定生成器 G G G,最大化 V ( D , G ) V(D,G) V(D,G)得到最优判别器 D D D。最大化 V ( D , G ) V(D,G) V(D,G)评估了 P G P_G PG和 P d a t a P_{data} Pdata的数据差异。由于原论文中价值函数可写为在 x x x上的积分形式,即将数学期望展开为积分形式: V ( G , D ) = ∫ x p d a t a ( x ) l o g D ( x ) + p G ( x ) l o g ( 1 − D ( x ) ) d x V(G,D)=\int_{x} p_{data}(x)logD(x)+p_G(x)log(1-D(x))\ dx V(G,D)=∫xpdata(x)logD(x)+pG(x)log(1−D(x)) dx
令 p d a t a ( x ) = a p_{data}(x)=a pdata(x)=a, D ( x ) = y D(x)=y D(x)=y, p G ( x ) = b p_G(x)=b pG(x)=b得:
f ( y ) = a l o g y + b l o g ( 1 − y ) f(y)=a\ log\ y+b\ log(1-y) f(y)=a log y+b log(1−y) f ( x ) f(x) f(x)一阶导数: f ′ ( x ) = a y − b 1 − y = 0 f'(x)=\frac{a}{y}-\frac{b}{1-y}=0 f′(x)=ya−1−yb=0 由此可得: y = a a + b y=\frac{a}{a+b} y=a+ba f ( x ) f(x) f(x)二阶导数: f ′ ′ ( a a + b ) = − a ( a a + b ) 2 − b ( 1 − a a + b ) 2 < 0 f''(\frac{a}{a+b})=-\frac{a}{(\frac{a}{a+b})^2}-\frac{b}{(1-\frac{a}{a+b})^2}<0 f′′(a+ba)=−(a+ba)2a−(1−a+ba)2b<0 一阶导数为0有解,且二阶导数小于0,因此 a a + b \frac{a}{a+b} a+ba为极大值点。
因此,价值函数可以等价为: V ( G , D ) = ∫ x m a x y p d a t a ( x ) l o g y + p G ( x ) l o g ( 1 − y ) d x V(G,D)=\int_{x} \underset{y}{max}\ p_{data}(x)log\ y+p_G(x)log(1-y)\ dx V(G,D)=∫xymax pdata(x)log y+pG(x)log(1−y) dx 因此,最优的生成器 D G ∗ D_G^* DG∗为: D G ∗ = p d a t a p d a t a + p G = 1 2 D_G^*=\frac{p_{data}}{p_{data}+p_G}=\frac{1}{2} DG∗=pdata+pGpdata=21 这个时候判别器已经不能区分数据是否真实了,基于这个观点,GAN的作者也证明了 G G G就是极大极小博弈的解了。
当寻找最优的生成器 G G G的时候,那么给定一个判别器 D D D,可以将 m a x G V ( G , D ) \underset{G}{max}V(G,D) GmaxV(G,D)看作训练生成器的损失函数 L ( G ) L(G) L(G),有了损失函数,我们就可以使用 S D G SDG SDG、 A d a m Adam Adam等优化算法更新生成器 G G G的参数,梯度下降的参数优化过程为: θ G ← θ G − η ∂ L ( G ) ∂ θ G \theta_G \leftarrow \theta_G-\eta \frac{\partial L(G)}{\partial \theta_G} θG←θG−η∂θG∂L(G)
θ \theta θ表示输入参数。详细推导可以看: 机器之心GitHub项目:GAN完整理论推导与实现,Perfect!GAN原理解析,公式推导与python实现日前很火的DeepNude就是基于这个原理实现的。
普通的GAN:
Generator的输入Input是随机向量,输出的是图像;Discriminator的输入Input是图像(生成的图像、真实的图像),输出是对或者错。在不断的博弈的过程中,就可以相互增强,直到生成的图像使得判别器真假难辨为止。
cGAN,即Conditional GAN:
Generator的输入Input是图像和随机向量,输出的是图像;Discriminator的输入Input是图像(生成的图像、真实的图像),输出是对或者错。在不断的博弈的过程中,就可以相互增强,直到生成的图像使得判别器真假难辨为止。
换而言之:
传统GAN,从随机向量 z z z学到图像y: G : z → y G:z \rightarrow y G:z→ycGAN,从输入图像 x x x和随机向量 z z z学到图像 y y y: G : { x , z } → y G:\{x,z\} \rightarrow y G:{x,z}→y生成器 G G G用到的是U-Net结构,输入的轮廓图 x x x编码再解码成真是图片,判别器 D D D用到的是作者自己提出来的条件判别器PatchGAN,判别器 D D D的作用是在轮廓图 x x x的条件下,对于生成的图片 G ( x ) G(x) G(x)判断为假,对于真实判断为真。
由于 L 1 L o s s L_1 \ Loss L1 Loss和 L 2 L o s s L_2\ Loss L2 Loss可以较好的恢复图像的低频部分,GAN Loss可以较好的恢复图像的高频部分。
L c G A N ( G , D ) L_{cGAN}(G,D) LcGAN(G,D) L c G A N ( G , D ) = E x , y [ l o g D ( x , y ) ] + E x , z [ l o g ( 1 − D ( x , G ( x , z ) ) ) ] L_{cGAN}(G,D)=\mathbb{E}_{x,y}[logD(x,y)]+\mathbb{E}_{x,z}[log(1- D(x, G(x,z)))] LcGAN(G,D)=Ex,y[logD(x,y)]+Ex,z[log(1−D(x,G(x,z)))] L 1 L o s s L_1\ Loss L1 Loss L L 1 ( G ) = E x , y , z [ ∣ ∣ y − G ( x , z ) ∣ ∣ 1 ] L_{L1}(G)=\mathbb{E}_{x,y,z}[||y-G(x,z)||_1] LL1(G)=Ex,y,z[∣∣y−G(x,z)∣∣1] 因此,作者采用了两者相结合的方式,目标函数可以表达为: G ∗ = a r g m i n G m a x D L c G A N ( G , D ) + λ L L 1 ( G ) G^*=arg\ \underset{G}{min} \underset{D}{max}L_{cGAN}(G,D)+\lambda L_{L1}(G) G∗=arg GminDmaxLcGAN(G,D)+λLL1(G) 效果如下图(梯度下降使用SGD和Adam):
可以看出, L 1 L_1 L1对颜色的感受野比较小,因此生成的图像的颜色范围没那么丰富。
U-net采用了完全不同的特征融合方式:拼接,U-net采用将特征在 C h a n n e l Channel Channel维度拼接在一起,形成更厚的特征。
使用Skip-Connect可以解决梯度消失的问题。
U-Net中使用了skip-connection,大大提高了生成后的图像质量。
用 L 1 L o s s L_1 \ Loss L1 Loss和 L 2 L o s s L_2 \ Loss L2 Loss重建的图像很模糊,也就是说 L 1 L_1 L1和 L 2 L_2 L2并不能很好的恢复图像的高频部分(图像中的边缘等),但能较好地恢复图像的低频部分(图像中的色块)。为了能更好得对图像的局部做判断,作者提出PatchGAN的结构,也就是说把图像等分成Patch,分别判断每个Patch的真假,最后再取平均!作者最后说,文章提出的这个PatchGAN可以看成所以另一种形式的纹理损失或样式损失。在具体实验时,不同尺寸的Patch,最后发现70x70的尺寸比较合适。
这里其实也可以解释为什么 a r g m i n G m a x D arg\ \underset{G}{min}\ \underset{D}{max} arg Gmin Dmax的 a r g arg arg是怎么得来的了。其实就是因为PatchGAN最后得出来的结果需要求均值。
Pix2Pix本身也有一定的局限性,论文作者承认,这种结构其实学到的是 x x x到 y y y之间的一一对应,Pix2Pix就是对Ground Truth的重建。输入轮廓图→经过U-Net编码解码成对应的向量→解码成真实图。
这种一对一映射的应用范围十分有限,当我们输入的数据与训练集中的数据差距较大时,生成的结果很可能就没有意义,这就要求我们的数据集中要尽量涵盖各种类型。
当我们输入训练集中不存在的轮廓图时,得到以下:
我们可以看出,服装的形态还是可以保持的,但是生成图像的颜色并不能令人满意。
Pix2Pix论文要点:
cGan:替换向量输入为图像输入。U-Net:使用Skip-connection(残差连接)来共享贡多信息。PatchGAN:降低计算量提升效果。 L 1 L o s s L_1\ Loss L1 Loss:加入 L 1 L_1 L1损失函数提高了生成的图像的质量。本文经过参考以下文章整理出来。
