Libo1575899134@outlook.com數組
Libo網絡
(原創文章,轉發請註明做者)dom
本文章會先從Gan的簡單應用示例講起,從三個方面問題以及解決思路覆蓋25篇GAN論文,第二個大部分會進一步講Gan的全部領域應用ide
-----------------------------------------------------------------------------------函數
1: 下圖GAN能夠學到不一樣的字體,而且在字體之間進行不一樣的變換學習
2 下圖能夠用簡筆畫能夠用GAN幫助生成想要畫的東西,好比綠色的橫線是想畫一個草地,若是想把綠色的山變成雪山,能夠在尖部畫一些白色的線條。字體
3 下圖展現了能夠把線條進行填色,也能夠把平面圖變成立體圖優化
4 下圖是仿臉萌的一個應用,把人的真實頭像換成一個卡通的頭像。ui
5 下圖展現了在不一樣物體之間作的轉換,好比從夏天的圖轉換到冬天的,從莫奈的畫變成一個真實的照片或者從馬變成斑馬。編碼
6 下圖是說把上面的任務應用到一個更流行的場景,能夠合成口型,這個圖看起來效果不是很好,可是能夠經過後期處理讓其變得很是真實。
----------------------------------------------------------------------------------------------------------------------------------
下面未來介紹一些內容包括GAN的難點,以及針對這些難點有哪些技術解決方法,咱們經過三個思路歸納25篇論文。
困難一:Gan的自由度過高了,引入了神經網絡以後隨之帶來的問題
困難二:優化JS散度帶來的梯度消失問題
困難三:替代版損失函數優化KL散度引起的mode missing問題
GAN最直觀的理解是給定一個隨機數或者一個隨機的向量生成咱們想要的東西,就象變戲法同樣
它雖然是一個生成模型,它解決生成模型的想法是:假設有個造假幣的人(生成模型),有個警察(判別模型),但願造出來的假幣很難被識別出來,警察須要抓捕造假幣的人,二者屬於一種對抗的模式,這種對抗會使得造假幣的人不斷提升本身的造假技術,警察不斷提升本身的偵察技術,最後致使了一種平衡,最後致使了假幣和真幣沒法被區分出來,認爲兩方都不可能變得更好了。
把這個想法變得數學化來講就是:GAN用的是一種min-max的對抗模型來解決生成問題,剛纔的假幣制造商和警察對應着生成器G和判別器D,如圖所示最左邊輸入一個隨機數或者隨機數組通過一個生成器(神經網絡),生成假幣或者圖像,對於警察(判別器)要判別當前接觸到的是真幣仍是假幣。
若是從數學公式來看的話,對D來講 有兩個目標,要最大可能的判斷出真實的錢幣(數據)是真實的,把正確的事情判斷正確,要把不正確的事情判斷出是不正確的
判別器要斷定最大化兩種狀況下都正確的機率,生成器跟判別器相反,最小化目標。
吸引人的地方有不少,好比生成輸入只須要是一個noise輸出是x,由於須要反向傳播的一些方法因此用神經網絡量來模擬G,只須要用生成數據的分佈去逼近真實數據的分佈,逼近以後就能夠直接從生成數據分佈中採樣就好了,最吸引人的地方在於並不須要寫出一個如何生成數據的表達式,正如圖模型的表現力有限,P的表達式越複雜,計算複雜度越高,gan解決了這個問題。
可是以下圖生成的東西和咱們但願的存在差別,甚至於真實的人臉可能會轉換成一個卡通圖像。
由於gan並不會對P有任何顯性的要求,不須要寫出一個具體的表達書,自由度過高了,失去控制,沒有合理的引導生成不出想要的東西
困難一:由於用到了深度神經網絡去逼近G,神經網絡中很困惑的問題是如何在反向傳播的過程當中,如何讓梯度傳播的更好,須要考慮模型的深度和複雜度,梯度消失梯度爆炸的問題,把神經網絡固有的問題引入進來。
困難二:是GAN的目標函數,判別器的目標是:1 最大化正確數據判斷正確的機率,2 最大化不真實的狀況下判斷爲不真實的機率
原始論文中提到,生成器的目標最好用下面alternative的,爲何呢?
使用原始的G目標函數會致使G的D梯度消失問題,由於直觀上,在訓練的初期階段,D很容易對檢測有信心G,因此D的輸出幾乎老是0
直觀上來理解,由於生成器是從無到有學習起來的,在訓練初期生成器生成的樣本質量很是差,對於判別器很是容易判別出來,判別器的損失幾乎爲0,進而生成器也沒法更新。
那麼從原理上說,當均衡狀態下判別器達到最優時,目標函數是在最小化JS散度,爲啥呢?
當靠攏到最佳狀態時,咱們能夠求得一個最優的判別器的表達式D*,r是真實數據的分佈,g是生成數據的分佈,損失函數就能夠等價下式,2log2是常數,其實是在優化這兩個分佈的JS散度
JS散度和KL散度是什麼意思呢?
假設有兩我的,一我的愛狗,說的頻率很高,一我的愛貓,這裏會引入一個交叉熵的概念
在語言系統中咱們但願表達更加有效率,咱們但願更常說的東西由更簡單的編碼去編,兩我的說話詞彙的頻率不同,則編碼系統就會不同,當一我的用到另外一我的的編碼系統時會致使信息量不同,信息量就叫交叉熵H
Hp(q)和Hq(p)就是兩我的分別說對方語言的交叉熵,alice 說「狗」時候,「狗」本身系統的編碼長度很大。 Bob說貓的時候,就須要很大的信息量。因此是非對稱的,致使KL散度就不是衡量兩個非對稱分佈的度量。
因此KL散度的計算如如下公式,各自交叉熵不是一樣大小,減去各自的熵,KL散度也不是對稱的。
KL散度是計算距離的,若是是非對稱的分佈就會帶來不少麻煩,須要變成對稱的,方法是:
先找到r的分佈,在p和q之間取一個平均值,就能夠計算出每一個單獨分佈和每一箇中間值r的KL散度,加起來後就是一個JS散度,JS散度就已是一個對稱散度了。
有個直觀的例子:當兩個分佈徹底重疊的時候,KL散度和JS散度都是0,當兩個分佈重合度很低的時候,KL和JS 都會增大,達到最大。
回頭再來看問題2,當D達到最優的時候,等價是在優化JS散度,關鍵是優化JS散度是不太對的。
由於,若是兩個分佈幾乎沒有重疊的話,JS散度就會是一個常數,就會不貢獻任何信息,傳遞導數時幾乎沒有導數傳過來,致使了梯度消失的問題。
困難三:剛纔都是一直在說原始的D是有問題的,提出了替代版的目標函數,可是一樣有問題,由於生成器G一開始的目標是最小化讓D把它抓出來的機率,D是最大化把它揪出來的機率。問題轉換一下,最大化D抓不出來的機率,但實際上在理論上是不等價的
沒有理論上的保證會帶來不少問題,因此替代版的目標函數等價於優化下面的目標函數,最小化KL散度的同時,最大化JS散度,可是KL散度和JS散度是同增同減的,並非相反的。則同時讓一個最大化一個最小化是不對的。
兩項是相反的,就會致使優化會亂跑就會致使梯度不穩定的問題。
那麼若是暫時不考慮優化JSD的部分,由於在不overlap的時候JSD等於常數,只考慮只優化KL散度有沒問題呢?一樣是有問題的,由於之因此引入JS散度就是由於KL散度是不對成的,不對稱帶來的問題是,當生成器生成了一個不夠真實的樣本和生成器沒有生成真實樣本的時候,兩種狀況下獲得懲罰是不同的,D返回的數據是不同的,這就是不對成的KL散度在這個問題中的直觀反應,會致使,生成器爲了減少本身可能獲得的懲罰,就會生成不少看起來儘可能真實,可是很可能都長一個樣的樣本,由於這樣的獲得的KL散度在某個方向的懲罰較小,致使了生成的樣本多樣性不夠豐富,會出現一個叫mode missing的問題。
------------------------------------------------------------------------------------------------
解決思路以下:
方法1.1: 部分指導,顯示的加入指導信息
方法1.2: 細粒度指導,隱性的知道,迭代學習
方法1.3: 神經網絡優化技巧 skip-connection 等
Solution 1: Partial and Fine-grained Guidance
傳統的輸入是藍色向量noise,綠色向量word2vec embding ,onehot編碼的向量均可以,也能夠是一個圖片,能夠是任何表達的信息,後面有不少版本,有人加到了中間層並非輸入層,在判別器的裏面也要把輸入的信息給他,作的實驗就是加了word embding的標達。簡單理解就是判別器要斷定生成圖像和輸入conditional是否是一個pair
接着看2016年openAI的improved Gan的paper 提出了2個技巧.
一個技巧是feature matching. D學的很好,G學的不是很好,就把D的信息傳過來,到底經過什麼樣的feature把G抓出來的,把這個feature也學出來。
第二個技巧minibatch disc解決的有點關乎mode missing 的問題,生成了太多長的同樣的樣本,由於每次判別器只看同樣本,是不是真實的,會致使當前生成器生成的樣本被斷定爲有效的時候就會致使生成器老是生成此個樣本,解決辦法是不要一次判斷一個,把以前判斷的其餘樣本的feature一塊兒送進來,判斷的時候會考慮一堆樣本的信息,能夠理解爲其餘樣本的feature給了當前樣本更多的信息,來指導靠攏其餘的有效信息。
接下來的工做是朱駿彥團隊的iGAN或者GVM,思路是GAN 不修正的話老是比較模糊,能夠考慮把清楚的紋路貼過來,這個工做裏會有兩個監督信息,一個是如何來變形,user能夠給定一個信息變成什麼樣的(低邦鞋變成高筒靴)。
另一個監督信息是要把原始紋路貼過來,直接貼會有問題,由於若是變形的話貼過來確定是不對應的。
下圖所示就是給定一個變形的監督信息,給了一個變形的方向,根據指導去融合。
第二種監督信息是把變形的過程作interpolation(插值) , 在interpolation中捕捉光場,光場能夠理解成一種motion+color的變化,目標是把光場的流向變形過來
以下圖只要是能夠捕捉到光場,就能夠把光場的對應關係一點一點應用到貼片的對應關係中,先從光場的信息中學到了點對點的映射,利用映射把原始信息貼到對應位置上就好了,因此在損失函數中就有很對對應的term(空間和顏色)。
下面這個工做是除了變形靴子,變形物品意外,還能夠用手殘畫變成更好的畫,或者對畫進行修飾和調整,若是北京霧霾比較嚴重,就能夠給它畫出一片藍天,山等等
下面的工做pix2pix在18年年初特別火,目標是咱們把線條畫變成一個上色的畫,把平面圖變成立體圖,以前的全部GAN的工做,都是讓D去判斷一張圖片,或者一組圖片一組圖片也是來自於真實或者生成的,可是pix2pix 須要傳入一個pair的數據給D,因此D分辨的是這一組之間的映射關係是否是對應的(是否是能夠映射爲一組)
假以下圖要給kitty上色,真實的pair是左邊,失敗的上色是右邊的pair,因此D須要斷定的不是生成的是否是kitty,而是生成是否是符合我上色要求的kitty
下面展現的也是pix2pix的工做,景深圖跟真實照片圖的轉換
下面的工做叫Gaussian-Poisson GAN,跟igan乾的事情比較相似,在PS過程當中常常會摳圖跟明星合影或者是換一個場景呀,因此須要摳圖+貼圖,可是不清晰 融合也很差 各類問題,因此GP-gan 就是能讓這個融合過程更真實,好比下面的天是不同的。
他們是怎麼作的呢?首先有個blending GAN,是有監督的模型,要把一個比較類似的融合好的圖像/融合好的圖像做爲一個目標圖像,因此是一個監督的損失函數,此外裏面有一個Color Constraint 有點像IGAN中光場的那種限制條件,算是一種有監督信息的補充。
上面是解決方法一的第一小種,都是顯性的給一些部分指導,顯性的給一些有監督的信息。
下面是第二種,是給一些隱性的指導,並非真的給一個圖片或者向量。
LAPGAN是2015年facebook的工做,拉普拉斯GAN
第二篇Match-aware 作的事從文字合成圖像的工做,我寫你畫
第三篇 stackGan 任務幾乎同樣
LAPGAN 在2015已經很厲害了,以前的GAN只能生成16*16 32*32的圖像,LAPGAN是第一篇生成到64*64的圖像,思想是不要一次性生成,一步一步生成的,從小到大。
具體實現技巧很欠缺,每一個部分都是不一樣組的gan ,多個G和D,不可以端到端的train。下一步要基於上一步的生成信息,同時還有有noise和onehot的輸入。
Matching-aware 的工做是從文本生成圖像,你們可能認爲C-gan就能夠實現,可是他們提出了重要的改進,三種不一樣的可能性:
1, 很是真實的圖像和文本
2, 我生成了很是真實的圖像可是和文本是不對成的
3, 符合個人要求可是文本是同樣的。
因此說D要分辨兩種不一樣的error,判斷兩種可能性都是假的,
給左邊的描述生成右邊的圖像,有些仍是能夠看的ICML2016。
接下來看StackGan ,當時引發了必定的轟動,是由於生成了256*256的圖像,爲何叫stackGan呢?跟LAPGAN同樣,有點像LAPGAN和matching-aware 的結合同樣,不要一步到位的生成,先把鳥大體的輪廓和顏色分佈畫出來,再精修細節。
在實際訓練過程當中也是同樣,GAN很是擅長分開學習前景和背景,這是GAN的特性,最近專門有人作成一個目標函數,要求先生成比較模糊的背景後生成細節。
接下來看PPGN 17年年末很是的火,全稱叫「Plug and Play Generative Networks」,主要解決的是mode-missing的問題。PPGN能夠生成很是豐富的樣本,效果看起來很是solid
之因此把它歸類爲Fine-grained Guidance 的緣由是:它們用一個迭代的,去噪聲的自動編碼器,生成的,通過了不斷的迭代去噪的過程加了其餘的限制致使圖像很豐富。
之因此把它歸類爲Fine-grained Guidance 的緣由是:它們用一個迭代的,去噪聲的自動編碼器,生成的,通過了不斷的迭代去噪的過程加了其餘的限制致使圖像很豐富。
接下來介紹第一大類中的第三類,雖然有人已經用加強學習來自動選擇網絡結構了,可是仍是更要相信手工煉丹的方法,須要瞭解下哪些結構在GAN的工做被證明有效。
第一篇DC Gan 的重要性在於,在它以前就有4,5篇成功應用了MLP的gan模型,MLP中基本都是全鏈接層,發現其餘結構都不太work
作法以下: 把全部的pooling層 替代成了 strided conv , 也用了bn , 移除了 fc , 加了一些relu , leakyrelu , tanh
第一次在大規模上圖像集,LF 大規模場景理解數據集上work的,有趣的是能夠學出不帶窗戶過渡到帶窗戶的。
第二個pix2pix的工做,提出了U-net在裏面表現的更好,最重要的緣由是U-net加了skip-connection.
GP-GAN在Blending gan中是一個enconder – deconder的結構,可是在最中間加了FC層,徹底拋棄了channel wise的fc,變成fully connect 的全鏈接層,能夠幫助傳播全局信息
給咱們的啓示就是要按照不一樣任務選擇不一樣的網絡結構,第一種會引起的梯度傳導困難的問題基本解決了。
解決 2.1:encoder方法
解決 2.2:Noisy input
第二個問解決方案主要是針對於第三個困難,也就是mode-missing的問題,gan生成出來的樣本常常不夠豐富,這類方法統稱爲加encoder的方法,來解決兩個問題,
1 : 強制生成分佈和真實數據分佈有必定重合度,使得JSD是有必定意義的,就再也不是一個常數了,能夠傳梯度了
2 : 讓encoder來做爲真實數據和生成數據的橋樑,不要直接判別生成數據和真數據,讓它判別假數據生成數據和一個編碼事後的數據.
那麼什麼是mode missing的問題呢? 下面箭頭表明了生成的流形,M1 和 M2 是數據裏的兩個Mode, 藍色比較大, 紫色比較小, 藍色樣本特別多,就是一個大mode, 好比人臉數據集 白人多, 白人就是個大Mode.
OK,若是同時在數據集中存在兩種不一樣大小的Mode的時候, 在作梯度傳導的時候,大部分的梯度都會傳向大Mode , 小Mode 沒法學習.
從數學角度講:最開始的任務是優化min max game 左邊是真是, 讓D 最大化正確的機率,讓G最小化D正確的機率.
等式兩邊發現 理論上相等,可是實際不相等,以下圖的直觀理解, 若是讓生成器去逼近8個高斯分佈(8個平均的Mode,分佈很散),學習時困惑,到低應該逼近哪個Mode
Mode Regularized GANs , 咱們引入了一個encoder, 讓一個image 或者 noise 通過一個Encoder 以後會生成一個表達式, 再經過這個表達式生成真實的樣本, 因此G 是附和在E的上面的. 就會有一個encoding 的L1 的loss,試過L2 可是不work, 那麼生成器的目標函數就會有一些變化,除了要最大化D抓不到的機率 (這裏是替代版的function) ,還要加上enconder的loss , 這些都被加到生成器的loss裏.
判別器不變.
可是依然會出現梯度消失的問題,若是不用複雜的網絡結構,目前仍是用的DCGAN, 生成器前期仍是比較差勁 那能不能用別的方式解決梯度消失的問題呢?
針對於梯度降低 就作了以下改進,
1 Manifold讓生成分佈和真實分佈的流形儘可能長得一個樣,形狀類似
Manifold 就能夠利用encoder獲得的信息, 去比較他們的流形
2 讓兩個東西的機率比較類似.
把整個生成過程拉成了2步, 直觀的理解每一步都有一個D, 在MDGAN中有D1,D2,在兩步分別判斷, 第一個D1 在判斷真實數據和編碼數據的差別,再也不是真實數據和生成數據的分佈, 第二步變成了, 編碼數據和生成數據的差別,也不是判斷生成數據和真實數據的分佈.
如今至關於縮短了,判別器比較的兩種樣本之間的原本的差距, 理論上會認爲, 真實程度是生成的最不真實, 編碼的東西比較真實,真實的數據最真實, 利用編碼器在最不真實和最真實之間加了一座橋,讓D在兩個橋之間比較,縮短了他們之間不類似的機率 , 不類似的程度也就增大了梯度的大小,
假設須要逼近6個高斯,傳統的GAN會在訓練過程當中不停的繞,若是用Reg-Gan 的話,很快就會把 分佈散開, 散開以後會慢慢逼近6個分佈,最後擬合的會比較好.
實驗結果減小了Mode-missing的機率生成了不一樣形態的人.
還有人引入了encoder 作各類各樣的問題, 此外比較火的還有,BE-GAN , 是基於EB-GAN,他們兩個長得很像:
EB-Gan在生成器上方加了一個encoder , 讓Enc 數據傳給Dec 最後輸出一個MSE, 而後再綜合起來輸出一個E(能量),把一個能量函數做爲了D的輸出.
那麼BE-GAN比較不同,把後面的簡化了.
三個本質上都是經過encoder解決了一個問題, 解決了 PR和PG 有overlap 的問題 , 這個問題被不少人發現有更簡單的解決辦法, 能夠歸納爲Noisy input, 咱們只須要把樣本和分佈加一點點noise (其餘空間的分佈) , 就能夠致使他們有overlap , JSD 就會變得頗有指導意義.
1 以前也有人試驗過 往生成器和 判別器的層裏面加Noise
2 instance Noise,直接在image上面加Noise , 真實圖像在傳進去以前也要加Noise, 用這個簡單的東西就能夠實現讓兩個分佈overlap
因此encoder的東西work 不work 還須要仔細探究一下.
最近有人給出了更加直觀的解釋:
從另外一個角度理解,傳統的A是咱們但願的map,兩個domain的圖像,都是向左的map到一塊兒,都是向右的map到一塊兒,若是用傳統Gan去學,會致使b的狀況,Mode Missing的問題
這樣會致使生成這樣的東西很模糊,有點像生成的平均同樣,能夠和以前不少Gan的模型生成的比較模糊聯繫到一塊兒
第三個是簡單把一個Gan加一個encoder的辦法,細節不同,可是歸納了剛纔說的三種方法,
因此就有了後面三篇基本長得同樣的論文
下一篇:Generative Adversarial Networks overview(2)