在之前我们做始祖Gan的数学推导 的时候,其实留下了一堆坑(不知道你注意到了没有哈哈)。当然,牛逼的人就是这样的,指明了一条光明大道,让人知道从哪里走,然后剩下的一些坑坑洼洼刚刚好就能帮助一些博士、硕士毕业或者一些人评副教授、教授啥的。
这篇文章介绍的f-gan就是填的其中一个坑,那就是给V ( G , D ) V(G,D) V ( G , D ) 这个函数一个更加通用的描述。在始祖文章里面,这个函数是直接写出来的,虽然知道它巧妙得令人窒息,而且也确实是在算拟合网络和实际数据之间的数据分布距离(J S JS J S ),但具体为什么能那么列式,那么列式之后为什么就刚刚好算的是分布间的某种距离其实我们是不大知道的,这导致的结果就是我们只能用它的,不能改进。而f-gan要解决的就是这个问题,它将告诉我们一道通用公式。在这道公式的约束下,你爱咋整咋整。
首先我们看怎么一般化的表述两个分布之间的距离,f-gan告诉我们是这样的:D f ( P ∥ Q ) = ∫ x q ( x ) f ( p ( x ) q ( x ) ) d x D _ { f } ( P | Q ) = int _ { x } q ( x ) f left( frac { p ( x ) } { q ( x ) } right) d x D f ( P ∥ Q ) = ∫ x q ( x ) f ( q ( x ) p ( x ) ) d x 这里有两个约束,第一:f f f 是凸函数;第二:f ( 1 ) = 0 f(1)=0 f ( 1 ) = 0
由始祖文章的数学推导我们知道,对于神经网络而言,我们去衡量两个分布之间的差距其实不需要那么准,只要当他们有差距的时候,损失函数输出一个正值,而没差距的时候输出一个0就OK。那么f ( 1 ) = 0 f(1)=0 f ( 1 ) = 0 就很好理解,当两个分布相同,只要满足这一约束就能使得最后的D f ( P ∥ Q ) D _ { f } ( P | Q ) D f ( P ∥ Q ) 也等于0。剩下我们就只需要证明在两个分布不完全相等的情况下,D f ( P ∥ Q ) D _ { f } ( P | Q ) D f ( P ∥ Q ) 大于0,就可以认为这道式子在表达两个分布之间的某种距离。
证明的过程我们会用到琴生不等式 (要求f f f 是凸函数也跟用到它有关,证明请移步链接所指文章),该不等式告诉我们:E ( f ( x ) ) ≥ f ( E ( x ) ) E ( f ( x ) ) geq f ( E ( x ) ) E ( f ( x ) ) ≥ f ( E ( x ) )
我们可以把f ( p ( x ) q ( x ) ) f left( frac { p ( x ) } { q ( x ) } right) f ( q ( x ) p ( x ) ) 看成f ( x ) f(x) f ( x ) ,q ( x ) q(x) q ( x ) 看成x x x 的分布,那么D f ( P ∥ Q ) D _ { f } ( P | Q ) D f ( P ∥ Q ) 直接就变成E ( f ( x ) ) E ( f ( x ) ) E ( f ( x ) ) ,故:D f ( P ∥ Q ) ≥ f ( ∫ x q ( x ) ( p ( x ) q ( x ) ) d x ) = f ( 1 ) = 0 D _ { f } ( P | Q ) geq f(int _ { x } q ( x ) left( frac { p ( x ) } { q ( x ) } right) d x)=f(1)=0 D f ( P ∥ Q ) ≥ f ( ∫ x q ( x ) ( q ( x ) p ( x ) ) d x ) = f ( 1 ) = 0 注意,由于琴生不等式等于号只有在x x x 分布完全均匀的时候取得(在这个应用中几乎不可能发生),因此基本可以判定除非D f ( P ∥ Q ) D _ { f } ( P | Q ) D f ( P ∥ Q ) 中的两个分布完全相等,不然不会取得等于号,这是极好的!避免了我们训练突然因为loss等于0而没反应的情况。
完成了上面的推理,我们得到了两个分布的某种距离的一般表达式。但它还不是V ( G , D ) V(G,D) V ( G , D ) ,原因是这里面既没有G G G 也没有D D D (其实有D D D 就好了,G G G 在D D D 里面),也就是说这是道看起来很美但对于Gan完全没用的式子。
那怎么让这道式子跟D D D 网络有关呢?我们可以想D D D 是一个评价数据是不是真实分布的东西,当我们在训练D D D 的时候,我们希望整个距离表达式最大。那么,能不能找到一个式子,当D D D 使得距离表达式取最大值的时候,式子刚刚好就等于上面的D f ( P ∥ Q ) = ∫ x q ( x ) f ( p ( x ) q ( x ) ) d x D _ { f } ( P | Q )= int _ { x } q ( x ) f left( frac { p ( x ) } { q ( x ) } right) d x D f ( P ∥ Q ) = ∫ x q ( x ) f ( q ( x ) p ( x ) ) d x 呢?
要求有点多,但还真有办法实现!
那就是利用共轭函数 (具体见链接所指博客或自行google),它的定义如下:f ∗ ( t ) = max x ∈ dom ( f ) { x t − f ( x ) } f ^ { * } ( t ) = max _ { x in operatorname { dom } ( f ) } { x t - f ( x ) } f ∗ ( t ) = x ∈ d o m ( f ) max { x t − f ( x ) } 它告诉我们,假设f ( x ) f(x) f ( x ) 是一个凸函数,那么它存在一个共轭函数长上面描述的那样,写作f ∗ ( t ) f ^ { * } ( t ) f ∗ ( t ) 。f ∗ ( t ) f ^ { * } ( t ) f ∗ ( t ) 本身也是凸函数,且它的共轭函数是f ( x ) f(x) f ( x ) 。也就有:f ( x ) = max t ∈ dom ( f ∗ ) { x t − f ∗ ( t ) } f( x ) = max _ { t in operatorname { dom } ( f ^ { * } ) } { x t - f ^ { * } ( t ) } f ( x ) = t ∈ d o m ( f ∗ ) max { x t − f ∗ ( t ) } 假设这个时候我们把f ( p ( x ) q ( x ) ) f left( frac { p ( x ) } { q ( x ) } right) f ( q ( x ) p ( x ) ) 看成是f ( x ) f(x) f ( x ) (前提是,f ( 1 ) = max t ∈ dom ( f ∗ ) { t − f ∗ ( t ) } = 0 f( 1 ) = max _ { t in operatorname { dom } ( f ^ { * } ) } { t - f ^ { * } ( t ) }=0 f ( 1 ) = max t ∈ d o m ( f ∗ ) { t − f ∗ ( t ) } = 0 ,这样f ( x ) f(x) f ( x ) 就完全符合$D _ { f } ( P | Q ) $的要求),可得到:D f ( P ∥ Q ) = ∫ x q ( x ) max t ∈ dom ( f ∗ ) { p ( x ) q ( x ) t − f ∗ ( t ) } d x D _ { f } ( P | Q ) = int _ { x } q ( x ) max _ { t in operatorname { dom } ( f ^ { * } ) } { frac { p ( x ) } { q ( x ) } t - f ^ { * } ( t ) } d x D f ( P ∥ Q ) = ∫ x q ( x ) t ∈ d o m ( f ∗ ) max { q ( x ) p ( x ) t − f ∗ ( t ) } d x 这个时候的公式其实还是跟D D D 和G G G 网络没什么关系,接着的这一步闪瞎眼,因为它做出了一个神之假设,假设有个神经网络D D D ,输入是x x x ,然后输出是t t t ,这样上面的式子直接就变成D f ( P ∥ Q ) = ∫ x q ( x ) max D ( x ) ∈ dom ( f ∗ ) { p ( x ) q ( x ) D ( x ) − f ∗ ( D ( x ) ) } d x D _ { f } ( P | Q ) = int _ { x } q ( x ) max _ { D(x) in operatorname { dom } ( f ^ { * } ) } { frac { p ( x ) } { q ( x ) } D(x) - f ^ { * } ( D(x) ) } d x D f ( P ∥ Q ) = ∫ x q ( x ) D ( x ) ∈ d o m ( f ∗ ) max { q ( x ) p ( x ) D ( x ) − f ∗ ( D ( x ) ) } d x
≥ ∫ x q ( x ) { p ( x ) q ( x ) D ( x ) − f ∗ ( D ( x ) ) } d x geqint _ { x } q ( x ) { frac { p ( x ) } { q ( x ) } D(x) - f ^ { * } ( D(x) ) } d x ≥ ∫ x q ( x ) { q ( x ) p ( x ) D ( x ) − f ∗ ( D ( x ) ) } d x
等于号在D ( x ) D(x) D ( x ) 刚刚好等于使得积分中的全部式子最大的t t t 的集合时取得。将式子进一步化简得到= ∫ x p ( x ) D ( x ) − q ( x ) f ∗ ( D ( x ) ) d x =int _ { x } p ( x )D(x) - q ( x )f ^ { * } ( D(x) ) d x = ∫ x p ( x ) D ( x ) − q ( x ) f ∗ ( D ( x ) ) d x 这道式子牛逼的地方不知道你看出来了没有,它就在于这个≥ geq ≥ 号,回忆一下始祖gan,D D D 网络的目标是最大化距离式子。而上面这道式子,我们恰恰好就能训练D D D 网络来使得式子取得最大值。这个时候,式子可以写成下面的形式:D f ( P ∥ Q ) ≈ max D { ∫ x p ( x ) D ( x ) d x − ∫ x q ( x ) f ∗ ( D ( x ) ) d x } D_{f}(P | Q) approx max _{mathrm{D}} {int_{x} p(x) D(x) d x-int_{x} q(x) f^{*}(D(x)) d x} D f ( P ∥ Q ) ≈ D max { ∫ x p ( x ) D ( x ) d x − ∫ x q ( x ) f ∗ ( D ( x ) ) d x }
= max D { E x ∼ P [ D ( x ) ] − E x ∼ Q [ f ∗ ( D ( x ) ) ] } =max _{mathrm{D}}left{E_{x sim P}[D(x)]-E_{x sim Q}left[f^{*}(D(x))right]right} = D max { E x ∼ P [ D ( x ) ] − E x ∼ Q [ f ∗ ( D ( x ) ) ] }
对于G G G 网络而言,我们目的是最小化距离式子,则写成如下形式:G ∗ = a r g min G max D { E x ∼ P [ D ( x ) ] − E x ∼ Q [ f ∗ ( D ( G ( x ) ) ] } G^*=argmin _{mathrm{G}}max _{mathrm{D}}left{E_{x sim P}[D(x)]-E_{x sim Q}left[f^{*}(D(G(x))right]right} G ∗ = a r g G min D max { E x ∼ P [ D ( x ) ] − E x ∼ Q [ f ∗ ( D ( G ( x ) ) ] } 不知各位看出来没有,它就是通用版本的gan距离计算公式。真的对弄出这个东西的数学家跪服,太牛逼了!
有了这个公式,我们只要找出一个凸函数(这里文章是这么写的,但其实非凸函数的共轭函数也是凸函数,因此不太清楚为什么要有这一条件,先存疑吧,有老哥知道麻烦留意告诉我)符合正实数域上有取值且是连续的,满足t − f ( 1 ) = 0 t - f ( 1 )=0 t − f ( 1 ) = 0 就可以作为f ∗ f^* f ∗ 。文章中也列举了几个可选的函数: 经过该篇文章,我们解放了距离函数的限制,让它可以带着镣铐跳舞了,而不是一动不动的木乃伊。
但其实它证明了一个让人哭笑不得的结论,始祖gan之所以效果不太好,跟我们选用的距离函数没有太大关系。也就是说,它的贡献主要在于帮助我们排除了一个错误答案。。。