Skip to content

GAN 影片筆記系列三

簡介

GAN的目標以數學角度來說,是要在高維空間中找到一個distribution

如上圖,2D平面是一個image space,藍色是人臉的圖片分布,則GAN就是要找出這個分布
(而那些點就是圖片,但人臉圖片只占所有圖片的一部分)

Maximum Likelihood Estimation

該分布P_data(x)我們其實不知道是甚麼,只能用sample的方式
利用P_G(x;θ)去逼近P_data

作法:
sample {x1,x2… xm} from P_data(x) 我們計算 P_G(xi;θ) (回傳值是xi在P_G內的機率)

Likelihood

我們希望在P_data內sample出的x1~xm,出現在P_G內的機率越大越好

接下來尋找好的θ值,使L最大即可

數學式如下:

問題: 如何產生P_G(generator)?

上述如果不使用常態分佈,P_G(xi;θ) 無法求得(不知道機率密度函數)

但如果使用常態分布,可能無法完整的擬合高維中的真實分佈,造成一些誤差(比如生成照 片模糊)

解法:用Nerual Network作為Generator
將distribution通過一個NN,讓NN將分布的形狀"改造”

問題: 如何計算divergence?

如果知道P_G、P_data的distribution,就可以用gradient descent
但通常無法得知

解法: 使用Discriminator sample P_G (sample random vec,輸入G讓其生成)與 P_data

本質上就是一個二分類問題(邏吉斯回歸)

概念上: 兩堆越接近,會讓D越難區分,divergence越小

求解數學式如下

目標是找出D使其值最大,那麼對該式子以D這個函數微分,求解為0處就好 解出D的形式如下

再代回Objective function,會的到JS divergence的結果

也就是說,在此定義上,求discrimination目標函數最大化,就是最佳化divergence

小結

因此我們可以得到下列的稍微有點繞的結果
紅點就是D在找的,(給定Distribute的最高點)
G3就是G在找的(在所有的D的最高點找出最小的(divergence最小的))
所以可得知其最高處就是divergence

求解演算法

就是GAN的做法 init D,G for i in iter:
先固定G,更新D
再把G、D視為一個網路,固定D,更新G

數學觀點看演算法

如果單看最佳化式,將maxD部分視為L(G)

用gradient descent即可

但是L(G)內有max operator,可以微分嗎?
答案是可以,只要將各範圍內的最大值函數,拿出來微分就好

故每次確認自己的範圍,然後再算gradient,再更新參數 => loop 即可

但這很顯然會發生問題:
如果D函數變動很大,那gradient有可能瞬間跑偏
如圖,紅點一變,反而離最大值很遠(就不是在量divergence了)
事實上,我們會假設函數變動不大,因此每次更新參數要小

演算法如下圖

注意G不能更新太多次

直覺: 假分布的點會追求D(x)最高點,到最後真假分布會重和,D(X)會變水平線