DCGAN
- DCGAN
- 原理
- 改進
- 網絡架構
- ImprovedDCGAN
- 訓練增強手法
- 特征比對
- 批次判别
- 常見問題
- 原理
- 實作
- 曆史平均
- 單側标簽平滑(one-sided label smoothing)
- 虛拟批次正态化(virtual batch normalization)
DCGAN
原理
把上述的 G和D 換成了兩個卷積神經網絡(CNN)。但不是直接換就可以了,DCGAN 對卷積神經網絡的結構做了一些改變,以提高樣本的品質和收斂的速度
改進
- 取消所有pooling 層。G網絡中使用微步幅度卷積(fractionally strided convolution)代替pooling層,D網絡中使用步幅卷積(strided convolution)代替 pooling層。
- 在D和G中均使用 batch normalization
- 去掉FC層,使網絡變為全卷積網絡
- G網絡中使用ReLU 作為激活函數,最後一層使用tanh
- D網絡中使用LeakyReLU 作為激活函數
網絡架構
生成器的輸入是一個 100 維的噪聲,中間會通過 4 層卷積層,每通過一個卷積層通道數減半,長寬擴大一倍 ,最終産生一個 64643 大小的圖檔輸出。值得說明的是,在很多引用 DCGAN 的 paper 中,誤以為這 4 個卷積層是 deconv(反卷積)層,但其實在DCGAN 的介紹中這 4 個卷積層是 fractionally strided convolution(微步幅度卷積),二者的差别如下圖所示:
上圖左邊是反卷積,用 33 的卷積核把 22 的矩陣反卷積成 44 的矩陣;而右邊是微步幅度卷積,用 33 的卷積核把 33 的矩陣卷積成 55 的矩陣,二者的差别在于,反卷積是在整個輸入矩陣周圍添 0,而微步幅度卷積會把輸入矩陣拆開,在每一個像素點的周圍添 0。 接下來我們再看一下 DCGAN 中 D 網絡的結構,由于原論文中沒有給出相關圖,我找了一篇近似論文中的圖說明:
D 可以看成是 G 結構反過來的樣子,那具體結構也沒什麼好說的了,簡言之不斷地做卷積,最終得到一個 0,1 之間的結果。
ImprovedDCGAN
訓練增強手法
GANs 的主要問題之一是收斂性不穩定,盡管 DCGAN 做了結構細化,訓練過程仍可能難以收斂。我們先來分析一下為什麼會出現收斂性不穩定。 GANs 的優化就是尋找兩玩家非合作博弈的納什均衡點。這裡的兩玩家指的就是生成器和判别器。
特征比對
為了不讓生成器盡可能地去蒙騙鑒别器,ImprovedDCGAN 希望以特征作為比對标準,而不是圖檔作為比對标準,于是提出了一種新的生成器的目标函數,即:
其中 f(x)是指的生成器把判别器的中間層輸出 f(x)作為目标(一般中間層都是 D 最後幾層,f(x)實際上是 feature map),這樣可以讓生成的中間層輸出和真實資料的中間層輸出盡可能相同。這種做法雖然不能保證到達均衡點,但是收斂的穩定性應該是有所提高。
批次判别
常見問題
收斂到同一個點,并沒有什麼機制可以讓生成器生成不一樣的内容。
原理
用 minibatch 判别器。也就是說每次不是判别單張圖檔,而是判别一批圖檔。
實作
将一個中間層 f(x)乘以一個 tensor,得到一個新的矩陣 M,計算 M 每一行之間的 L1 距離 o,以此為 f(x)下一層的輸入
假設 x 是從生成器生成的,并且收斂到同一點,那麼對應的 f(x)必然很相似,由 f(x)生成的 M也必然非常相似。而這些 M 每一行的 L1 距離c(xi,xj)也就會非常接近 0,這也導緻 o(X)幾乎是 0 向量。相對的,如果 x 是真實資料,那麼 o(X)一般不會太接近 0 向量,這樣判别器就可以更簡單的區分生成資料或真實資料(在生成器收斂到一點的情況下)。
曆史平均
在更新參數值時,把它們過去的值也納入考慮:
單側标簽平滑(one-sided label smoothing)
- 判别式的目标函數中正負樣本的系數不再是 0-1,而是α和β,這樣判别式的目标就變成了下面這個式子。這相當于,原本判别器的目标數出值是[0=假圖像,1=真圖像],現在可能變成了[0=假圖像,0.9=真圖像]