生成對抗網絡網絡
思想和原理機器學習
先給你們講一個故事,有一夥犯罪分子想要去製造假鈔混進市場使用,從而不法牟利。而銀行系統則須要依靠相關技術鑑別出假鈔來。不法分子爲了讓本身利益最大化,須要不斷地提升自身的造假能力;而銀行系統爲了可以準確的識別出假鈔也須要不斷地提升本身的識別能力。雙方的技術在這個競爭的過程當中都獲得不斷地提升,最後達到一個最佳的水平,也就是一種平衡,是什麼呢,就是銀行系統識別出假幣的機率爲50%,壞蛋們造的假幣不被發現也是50%。雙方都達到最高的要求,這是一種平衡,沒有辦法再進一步了。函數
下面說正事。作一個科普,在機器學習中含有兩種模型,生成式模型(Generative Model)和判別式模型(Discriminative Model)。從機率分佈的角度考慮,對於一堆樣本數據,每一個樣本都有特徵Xi和與之對應的分類標記yi。性能
生成模型:學習獲得聯合機率分佈P(x,y),即特徵x和標記y共同出現的機率,而後求條件機率分佈,可以學習到數據生成的機制。學習
判別模型:學習獲得條件機率分佈P(y|x),即在特徵x出現的狀況下標記y出現的機率。優化
生成式模型主要是用來生成具備和訓練樣本分佈一致的樣本(至關於上一段比喻的壞蛋們),判別式模型主要是用來對訓練樣本進行分類(至關於上一段比喻的銀行系統)。判別式模型因其多方面的優點,在以往的研究和應用中佔了很大的比例,尤爲是在目標識別和分類等方面;而生成式模型則只有不多的研究和發展,並且模型的計算量也很大很複雜,實際上的應用也就比判別式模型要少不少。而本文就是一篇對生成式模型的研究,一經問世就在機器學習界掀起波瀾,如此重要的文章,你沒法拋棄它!那麼,它與傳統的生成式模型的區別在哪裏呢?spa
生成對抗網絡(GAN)中對抗的雙方是生成式模型和判別式模型。在GAN中,咱們同時訓練這兩個模型,就像對抗的時候是兩我的在對抗同樣。這兩個模型分別叫G網絡和D網絡,G網絡是生成式模型,主要是經過學習獲取信息分佈,使用隱空間的隨機變量生成接近於真實的數據(實際上是虛假數據),即便得D網絡將生成的數據識別爲真實的訓練數據(也就是那羣壞蛋製做出接近於真鈔的假幣,以矇混銀行系統);而D網絡是判別式模型,主要是經過學習,判斷一個樣本是由模型分佈(fake)仍是由數據分佈(real)生成的,儘量地區分開真實的訓練數據與生成的虛假數據(也就是銀行系統能分清這些是假幣,那些是真鈔)。G網絡和D網絡都是可微的,所以可使用BP進行學習。3d
OK,理解上面這些你就能夠直接進入GAN的最核心內容了!高能預警!blog
對抗在機器裏是怎樣實現的呢?圖片
真實數據x的分佈爲1維的正態分佈p(data),生成器G爲一個多層感知機(就是神經網絡),它從隨機噪聲中隨機挑選數據z輸入,輸出爲G(z),G的分佈爲p(g)。判別器D也是一個多層感知機,它的輸出D(x)表明着斷定判別器的輸入x屬於真實數據而不是來自於生成器的機率。再回到博弈問題,G的目的是讓p(g)和p(data)足夠像,那麼D就沒法未來自於G的數據鑑別出來,即D(G(z))足夠大;而D的目的是可以正確的將G(z)鑑別出來,即便D(x)足夠大,且D(G(z))足夠小,即(D(x)+(1-D(G(z))))足夠大。
整理一下。x是真實數據,z是隨機噪聲,G(z)是虛假數據,經過生成器G產生,服從p(g)分佈,D是判別器,D(x)是斷定 判別器的輸入x是真實數據的機率【也就是你給真鈔,銀行系統認爲錢是真鈔】,D(G(z))是斷定 判別器的輸入G(z)是真實數據的機率【也就是你給假鈔,銀行系統認爲錢是真鈔】,(1-D(G(z)))是斷定 判別器的輸入G(z)是虛假數據的機率【也就是你給假鈔,銀行系統認爲錢是假鈔】。這樣一來,所謂的對抗,其實就是:G的目的是讓D(G(z))足夠大,而D的目的是讓D(x)足夠大,讓D(G(z))足夠小。
GAN的目標函數:
這個式子的好處在於,固定 G,max V(G,D) 就表示 PG 和 Pdata 之間的差別,而後要找一個最好的 G,讓這個最大值最小,也就是兩個分佈之間的差別最小。
從判別器D的角度看,它但願本身能儘量區分真實樣本和虛假樣本,所以但願D(x)儘量大,D(G(z))儘量小,即V(D,G)儘量大。從生成器G的角度看,它但願本身儘量騙過D,也就是但願D(G(z))儘量大,即V(D,G)儘量小。兩個模型相對抗,最後達到全局最優。因而模型就成了優化這個目標函數的問題了。這樣的話就只須要經過反向傳播來對訓練模型就行了,最終達到p(data)=p(g),D(G(z))=1/2。
在對抗訓練的過程當中,pg和pdata的分佈變化以下:
黑色曲線是真實樣本的機率分佈函數,綠色曲線是虛假樣本的機率分佈函數,藍色曲線是判別器D的輸出,它的值越大表示這個樣本越有多是真實樣本。最下方的平行線是噪聲z,它映射到了x。
咱們能夠看到,一開始雖然G(z)和x是在同一個特徵空間裏的,但它們分佈的差別很大,這時,雖然鑑別真實樣本和虛假樣本的模型D性能也不強,但它很容易就能把二者區分開來,而隨着訓練的推動,虛假樣本的分佈逐漸與真實樣本重合,D雖然也在不斷更新,但也已經力不從心了。最後,黑線和綠線幾乎重合,模型達到了最優狀態,這時對於任意樣本,D的輸出都是 0.5。
最優化問題表達
定義最優化問題的方法由兩部分組成。首先咱們須要定義一個判別器 D 以判別樣本是否是從Pdata(x)分佈中取出來的,所以有:
其中 E 指代取指望。這一項是根據「正類」(即辨別出 x 屬於真實數據 data)的對數損失函數而構建的。最大化這一項至關於令判別器 D 在 x 服從於 data 的機率密度時能準確地預測 D(x)=1
另一項是企圖欺騙判別器的生成器 G。該項根據「負類」的對數損失函數而構建,即:
咱們定義目標函數爲:
對於D而言要儘可能使公式最大化(識別能力強),而對於G又想使之最小(生成的數據接近實際數據)。整個訓練是一個迭代過程。其實極小極大化博弈能夠分開理解,即在給定G 的狀況下先maxV(D,G)而取D,而後固定D,並minV(D,G)而獲得G。其中,給定G,maxV(D,G)評估了Pg和Pdata之間的差別或距離。
最後,咱們能夠將最優化問題表達爲:
太難理解?那咱們換個說法,咱們的目標函數就是對於生成器G,目標函數爲(梯度降低):
而對於判別器D,目標函數爲(梯度上升):
咱們直接給出結論,由於證實的過程太長了……
咱們以前的推論是,咱們要讓PG=Pdata,這樣咱們生成的數據纔可以以假亂真。
咱們回到這裏。在極小極大博弈的第一步中,給定生成器G,maxV(D,G)而得出最優判別器D。其中,maxV(D,G)評估了PG和Pdata之間的差別或距離。由於在原論文中價值函數可寫爲在 x 上的積分,即將數學指望展開爲積分形式:
在數據給定,G 給定的前提下, Pdata(x) 與 PG(x) 均可以看做是常數,咱們能夠分別用 a,b 來表示他們,這樣咱們就能夠獲得以下的式子:
因而可知在G已給的狀況下,D的最優解爲:
如今咱們須要找個 G,來最小化
咱們以前已經說過,咱們優化的目標是PG=Pdata,那麼在知足這個條件的時候,這意味着判別器已經徹底困惑了,它徹底分辨不出 Pdata 和 PG 的區別,即判斷樣原本自 Pdata 和 PG 的機率都爲 1/2,此時G是最優的。
這樣咱們就比較清楚地得知訓練過程了:
在訓練的時候沒法先訓練好D,再去訓練G,因此咱們是D和G同時進行訓練。咱們能夠在起初有一個G0 ,,先固定G0訓練D0 找到 :
而後固定D0 開始訓練G0,使G0升級到G1,訓練的過程均可以使用gradient descent,以此類推,訓練 D1,G2,D2,G3,...但這樣在實際狀況中效果並很差,
咱們來說講爲何很差。首先已經確認了,訓練的步驟是先固定G,再訓練D,使最大化V(G,D),意味着最大化G和D的差別,就是生成數據和真實數據的差別最大,在圖像裏就是找到小紅點(圖裏的G不是橫座標,橫座標是D。根據D的變化,V(G,D)在變化,懂嗎?下面的G只是表示此時固定的是G一、G二、G3)。訓練幾回D以後(由於一次不必定能找到小紅點,須要多訓練幾回,固然多訓練幾回也不必定能找到,但儘可能能maxV(G,D)),咱們固定D,再訓練G,使得minmaxV(G,D),意味着最小化G和D的差別,這個G的更新會引發曲線的變化。
但這裏會有一個問題,咱們能夠看到此時已經固定了D,咱們好不容易訓練出G1,應該是但願V(G,D)能夠比G0時更小,但從G0梯度降低到G1,若是step太大,會致使圖中的狀況,在固定G1以後訓練D,D1會和D0差的比較遠,這樣有可能V(G,D)反而變大了(別忘了,咱們的過程應該是判別器的判別能力愈來愈低纔對,你這一弄反而讓V(G,D)高了,V(G,D)表明真實數據和生成數據的差別啊喂(#`O′),銀行系統辨別假鈔的能力愈來愈高咱們還怎麼生成數據啊!)。可是咱們只要控制住G的變化程度,這個問題就能夠避免,好比我就使G訓練一次,這樣曲線的變化就不會太大,這樣能保證每次訓練,D一直在max附近,G一直在min化。
因此咱們每訓練k個步驟的D網絡,再訓練1個步驟的G網絡。只要G變化足夠慢,就能夠保證D保持在其最佳解的附近。
因此咱們其實是先固定G,再訓練D,就是maxV(G,D),訓練(這裏用梯度上升)K步以後,儘可能找到max,而後固定D,訓練(這裏用梯度降低)1步G,就是min maxV(G,D),再固定G,訓練K步D...
應用:圖像生成(好比給你100個汽車圖片,他會自動給你生成汽車圖片,仿製得有模有樣),數據加強(模糊的圖或生圖進行美化)