GAN,CycleGAN,starGAN,CycleGAN-VC,starGAN-VC

  1. GAN

GAN 有兩個網絡,一個是 generator,一個是 discriminator,通過兩個網絡互相對抗來達到最好的生成效果。

公式:

先固定 G,來求解最優的 D

對於一個給定的 x,得到最優的 D 如上圖,範圍在 (0,1) 內,把最優的 D 帶入

可以得到

JS divergence 是 KL divergence 的對稱平滑版本,表示了兩個分佈之間的差異

現在我們需要找個 G,來最小化

觀察式子可以發現,當 PG(x)=Pdata(x) 時,G 是最優的。

 

GAN的訓練:

兩個網絡交替訓練,起初有一個G0,D0,先訓練D0找到xxxx,然後固定D0開始訓練G0,

設定兩個loss:一個D的loss,一個G的loss。

如圖是一個單向GAN

https://upload-images.jianshu.io/upload_images/5806754-e4093d8933f4b99c.PNG?imageMogr2/auto-orient/strip|imageView2/2/w/999

訓練這個單向GAN需要兩個loss:生成器的重建Loss和判別器的判別Loss。

重建Loss:希望生成的圖片Gba(Gab(a))與原圖a儘可能的相似。

https://upload-images.jianshu.io/upload_images/5806754-af2a5e873dd1c3f0.PNG?imageMogr2/auto-orient/strip|imageView2/2/w/546
判別Loss:生成的假圖片和原始真圖片都會輸入到判別器中。公式爲0,1二分類的損失。

https://upload-images.jianshu.io/upload_images/5806754-ccd22365fa661a6f.PNG?imageMogr2/auto-orient/strip|imageView2/2/w/781

 

一句話表述GAN

網絡中有生成器G(generator)和鑑別器(Discriminator)。
有兩個數據域分別爲X,Y。G 負責把X域中的數據拿過來儘可能模仿成真實數據並把它們藏在真實數據中,而 D 就儘可能地要把僞造數據和真實數據分開。經過二者的博弈以後,G 的僞造技術越來越厲害,D 的鑑別技術也越來越厲害。直到 D 再也分不出數據是真實的還是 G 生成的數據的時候,這個對抗的過程達到一個動態的平衡。

 

 

 

 

 

 

 

 

 

2. CycleGAN

(ICCV17)

本質上是兩個鏡像對稱的GAN,構成了一個環形的網絡。

兩個GAN共享兩個生成器G和F,並各自帶一個判別器,即共有兩個判別器和兩個生成器。一個單向GAN兩個loss,兩個即共四個loss。

(採用兩個生成器,是避免所有的x都被映射到同一個Y上,採用兩個,既能滿足X->Y的映射,也能滿足Y->X的映射。這一點其實就是變分自編碼器VAE的思想。)

https://upload-images.jianshu.io/upload_images/5806754-4ac60c84700c6e7e.png?imageMogr2/auto-orient/strip|imageView2/2/w/952

對抗損失

下圖是均方誤差損失表示:(這是判別器Y對X->Y的映射G的損失,判別器X對Y->X映射的損失也非常類似,這兩個是對抗損失

https://upload-images.jianshu.io/upload_images/5806754-582b3cedd6593dec.PNG?imageMogr2/auto-orient/strip|imageView2/2/w/857

循環損失

如下是兩個生成器的循環損失,這裏其實是L1損。因爲網絡需要保證生成的圖像必須保留有原始圖像的特性,所以如果我們使用生成器GenratorA-B生成一張假圖像,那麼要能夠使用另外一個生成器GenratorB-A來努力恢復成原始圖像。此過程必須滿足循環一致性。

 

總損失

優化

對總損失進行優化,先優化D然後優化G和F,這一點和GAN類似

 

 

一句話描述:

CycleGAN的目標是學習映射G: X→Y,使用對抗損失無法區分G(X)和Y的分佈。所以我們又提出了成對的方向映射F:Y→X,並介紹了cycle consistency 損失來增強使得F(G(X))≈X。(這樣可以不要讓所有的x都映射到一個y中了。)CycleGAN的創新點就在於其能夠在沒有成對訓練數據的情況下,將圖片內容從源域遷移到目標域。CycleGAN在訓練時,只需要將源域的圖片和目標域的圖片作爲輸入即可,這裏並不要求源域跟目標域的圖像內容是匹配的。CycleGAN 解決了從一個領域到另一個領域沒有成對數據的圖像轉換問題。



 

 

VAE

https://www.sohu.com/a/226209674_500659

該鏈接文章對於原文清晰分析

http://5b0988e595225.cdn.sohucs.com/images/20180323/8da0009b298c462b9dba190f21f594f5.jpeg

 

 

 

 

 

 

 

  1. StarGAN

2018cvpr

解決圖像轉換一對多的問題,

https://img-blog.csdn.net/2018091720135840?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQ0NTUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

左圖爲一對一圖片轉換所需的生成器,starGAN如右圖。

StarGAN 的簡單介紹,主要包含判別器 D 和生成器 G 。(a)D 對真假圖片進行判別,真圖片判真,假圖片判假,真圖片被分類到相應域。(b)G 接受真圖片和目標域標籤並生成假圖片;(c)G 在給定原始域標籤的情況下將假圖片重建爲原始圖片(重構損失);(d)G 儘可能生成與真實圖像無法區分的圖像,並且通過 D 分類到目標域。

貢獻:

1. StarGAN只要一個G和一個D實現多領域轉換

2. 提供一種掩碼向量方法,使StarGAN能夠控制所有可用的域標籤

3. 在人臉屬性轉移和表情改變方面StarGAN效果很好

 

對抗loss:

https://img-blog.csdn.net/20180917201357989?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQ0NTUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

上圖中 Discriminator 需要去最大化 D(x) (x 爲 Generator 產生的圖片) 的 score,意思是 D 需要儘可能正確地識別 x。而 G 需要最小化 1-D(G(x, c)),意思是 G 需要產出儘可能真實的圖片使得 D(G(x, c)) 越大越好。

Domain Classification Losscls):

對於給定的輸入圖像x和目標域標籤c,我們的目標是將x轉換爲輸出圖像y,並將其正確地分類爲目標域c。爲了達到這個條件,添加了一個輔助分類器去訓練 D。在D的top中加入輔助分類器,域分類器loss在優化D和G時都會用到,作者將這一損失分爲兩個方向,分別用來優化G和D。在G和D中都各加一個分類loss, 一個是真實圖片的域分類損失用來優化D,另一個是fake圖片的域分類損失來優化G。

(優化D)D的:

https://img-blog.csdn.net/2018091720135815?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQ0NTUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

(優化G)G的:

https://img-blog.csdn.net/2018091720135866?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQ0NTUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

通過最小化該loss可讓圖片歸類到domain c

在一般情況下需要現將 D 訓練一段時間之後才能開始訓練 G,因爲在 D 效果很差的情況下 G 產生的數據無法分辨真假。

Reconstruction Loss

通過最小化對抗損失與分類損失,G努力嘗試做到生成目標域中的現實圖片。但是這無法保證學習到的轉換隻會改變輸入圖片的域相關的信息而不改變圖片內容。所以加上了週期一致性損失

Rec_loss: 在最小化上述兩種損失的情況下並不能保證在圖片進行 translation 的時候只改變與領域有關的部分而保存其他部分。爲解決這個問題,引入 Reconstruction Loss, 目的在於使 inputImage 和重建出來的 image (利用 fakeImage 與 origin-domain 產生出來的圖片)越相近越好。

如下圖所示,x 爲 inputImage,c 爲 target-domain, c` 爲 origin-domain。

https://img-blog.csdn.net/20180917201358105?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQ0NTUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

重構loss,c是目標域,c撇是原域,可以看出經過兩次GAN回到了原始圖像,是不是很像cycleGAN呢,嗯

完整的loss:

https://img-blog.csdn.net/20180917201358135?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQ0NTUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

其中 https://upload-images.jianshu.io/upload_images/15934406-1579cabdd5ef614d.png?imageMogr2/auto-orient/strip|imageView2/2/w/28https://upload-images.jianshu.io/upload_images/15934406-667f2faafdb58659.png?imageMogr2/auto-orient/strip|imageView2/2/w/30 是控制分類誤差和重構誤差相對於對抗誤差的相對權重的超參數。在所有實驗中設置https://upload-images.jianshu.io/upload_images/15934406-579f2d1993ef797b.png?imageMogr2/auto-orient/strip|imageView2/2/w/145

在實際操作上,作者將對抗損失換成了WGAN的對抗損失:
https://img2018.cnblogs.com/blog/1236115/201810/1236115-20181014143730328-1703227565.png

starGan適用於多數據集間的轉換。這樣就有一個問題,比如另一個數據集沒有需要的標籤,因爲在重構loss裏需要域雙方都有同類標籤,那麼該怎麼辦呢?作者提出瞭解決辦法。

Mask Vector

https://img-blog.csdn.net/20180917201358159?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQ0NTUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

其中ci代表圖像在第i組數據集的屬性經過編碼後得到的結果,n爲數據集數目(ci可以是one-hot也可以是2分類)。文章中僅涉及兩個數據集,n=2。m爲該圖像所屬數據集的編號經過One-hot編碼後得到的結果。

https://img2018.cnblogs.com/blog/1236115/201810/1236115-20181014145555274-1100272843.png

在多個 dataset 的情況下提出 mask vector,mask vector 是一個 one-hot vector,表示的爲當前提取的數據來源,大小爲 dataset 的數量,例如 Celeba,RaFD 兩個數據集,若當前提取的爲 Celeba 的數據那麼 RaFD 的 label 都將被置0。

訓練時,生成器中加入標籤c,通過這樣做,生成器學會忽略未指定的標籤,這些標籤是零向量,並集中在給定的不爲0的標籤上,通過在CelebA和RaFD之間交替,判別器學習兩個數據集的所有鑑別特徵,並且生成器學習控制兩個數據集中的所有標籤。

對D訓練

(a)D對真假圖片進行判別,真圖片判真,假圖片判假,真圖片被分類到相應域

對G訓練

(b)真圖片+目的標籤c進入G生成假圖片

(c)假圖片+原始標籤c撇進入G又回去生成重構圖片(重構loss)

(d)D對假圖片進行判別,判假圖片爲真

一句話描述:

starGAN顧名思義就是星型GAN結構,其解決的主要問題爲 multi-domain 的 image-to-image 轉換。相比於傳統的擁有 k 個 domain 的多領域圖片轉換需要訓練 k(k-1) 個 generator ,效率極其低下,也無法充分地利用到訓練數據,同時傳統的解決方法也無法銜接多個數據集的 domains。基於上述問題,starGAN 被提出,starGAN 的基本思想爲將 inputImage 和 target domain (一般爲隨機產生,使用binary 或者 one-hot vector 表示)一起作爲 Generator 的輸入得到 fakeImage,再將 fakeImage 和 origin domain 的值作爲同一個 Generator 的輸入得到 reconstructed image ,starGAN 希望的是 reconstructed image 和 inputImage 之間越接近越好。

 

 

 

 

4.cycleGAN-VC

CycleGAN-VC:使用週期一致的對抗網絡進行並行無數據語音轉換

該方法可以學習從源語音到目標語音的映射,而無需依賴並行數據。所提出的方法特別值得注意,因爲它是通用且高質量的,並且無需任何額外的數據,模塊或對齊過程即可工作。

 

我們的方法稱爲CycleGAN-VC,它使用具有門控捲積神經網絡(CNN[4]和身份映射的週期一致對抗網絡(CycleGAN

 

訓練過程:

CycleGAN中,使用對抗損失和週期一致性損失同時學習正向和反向映射(1a)(b)。這使得可以從非並行數據中找到最佳的僞對。此外,對抗性損失可以基於不可區分性而使轉換後的語音接近目標語音,而無需明確的密度估計。這樣可以避免由統計平均引起的過度平滑,這種平滑發生在許多傳統的基於統計模型的顯式表示數據分佈的VC方法中。

循環一致性損失對映射的結構施加了約束。但是,僅保證映射始終保留語言信息是不夠的。爲了鼓勵在不依賴其他模塊的情況下保留語言信息,我們引入了一個標識映射損失,它鼓勵生成器找到保留輸入和輸出之間組成的映射(1c)(d)。

1CycleGAN-VC的培訓過程。GX→Y是將X轉換爲Y正向生成器。GY→X是將Y轉換爲X逆生成器。DXDY分別是XY域中的標識符。(a)(b)我們使用對抗性損失和週期一致性損失從未配對的數據中找到最佳僞對。(c)(d)此外,我們使用身份映射損失來保留語言信息。

 

 

語音的重要特徵之一是它具有順序和層次結構,例如濁音或清音段以及音素或語素。表示這種結構的有效方法是使用RNN,但是由於並行實現的難度,因此對計算的要求很高。取而代之的是,我們使用門控CNN配置一個CycleGAN,它不僅允許對順序數據進行並行化,而且還可以實現語言建模[4]和語音建模[6]的最新技術。在門CNN中,門線性單元(GLU)用作激活函數。GLU是一種數據驅動的激活功能,並且門控機制允許根據先前的層狀態有選擇地傳播信息。我們在2說明了生成器和鑑別器的網絡架構。

 

 

2.生成器和鑑別器的網絡架構。在輸入或輸出層中,hwc分別表示高度,寬度和通道數。在每個卷積層中,kcs分別表示內核大小,通道數和步幅大小。由於生成器是完全卷積的,因此它可以接受任意長度T的輸入。

 

CycleGAN-VC使用一維(1D) CNN作爲生成器,在保留時間結構的同時,捕捉整個關係和特徵方向。這可以看作是逐幀模型的直接時間擴展,該模型只捕獲每幀的這些特性的關係。爲了在保持輸入結構的同時有效地捕獲大範圍的時間結構,該生成器由下采樣層、殘差層和上採樣層組成

另一個值得注意的地方是CycleGAN-VC使用一個門控CNN來捕捉聲學特徵的順序和層次結構

 

CNN中處理的是什麼?

[27] T. Kaneko, H. Kameoka, N. Hojo, Y. Ijima, K. Hiramatsu, and K. Kashino, “Generative adversarial network-based postfilter for statistical parametric speech synthesis,” in Proc. ICASSP, 2017, pp. 4910–4914.根據這篇論文來看,是光譜紋理(spectral texture)。光譜紋理(spectral texture–> Mel-cepstral係數(MCEP

 

CycleGAN-VC使用2D CNN作爲鑑別器來聚焦於2D結構(即,2D光譜紋理)。更精確地說,如圖3(a)所示,考慮到輸入的整體結構,在最後一層使用全連通層來確定真實感。這樣的模型稱爲FullGA。

 

Instance Norm層:可以理解爲對數據做一個歸一化的操作。

GLU:在門控CNN中,門控線性單元(GLUs)被用作一個激活函數,GLU是一個數據驅動的激活函數,並且門控機制允許根據先前的層狀態選擇性地傳播信息。(爲什麼要用激活函數?如果不用激勵函數,每一層輸出都是上層輸入的線性函數,無論神經網絡有多少層,輸出都是輸入的線性組合。如果使用的話,激活函數給神經元引入了非線性因素,使得神經網絡可以任意逼近任何非線性函數,這樣神經網絡就可以應用到衆多的非線性模型中。)

門控CNN思想:模擬lstm的是否遺忘門,或者說判斷權重的思想。再做一個和CNN卷積一樣參數的filter, 取值0-1,判斷這個序列的特徵哪些應該被關注,哪些應該被忽略。

 

 

損失:

LOSS:CycleGAN- vc使用了一個對抗損失[31]和循環一致性損失[39]。此外,爲了鼓勵語言信息的保存,CycleGAN-VC還使用了身份映射損失[37]。

對抗性損失:爲了使轉換後的特徵與目標y難以區分,使用對抗性損失:

鑑別器試圖通過最大化這種損失來尋找實數和轉換特徵之間的最佳決策邊界,而生成器試圖通過最小化這種損失來生成可以欺騙的特徵。

 

循環一致性損失:對抗性損失只限制GX→Y (x)服從目標分佈,不保證輸入輸出特徵的語言一致性。爲了進一步規範映射,使用循環一致性損失:


同時學習正反向映射以穩定訓練。這種損失促使GX→Y, GY→X通過循環變換找到(X, Y)的最優僞對,如圖1(a)所示。

標識映射損失:爲了進一步鼓勵保存輸入,使用標識映射損失:

 

 

 

文章使用語音轉換挑戰2016VCC 2016)數據集 [7]評估了我們的方法。

爲了在非平行條件下評估我們的方法,我們將訓練集分爲兩個沒有重疊的子集。
前半部分的81個句子用作源,其他81個句子用於目標。
這意味着CycleGAN-VC是在不利條件下訓練的(非並行且數據量的一半)。轉換後的語音的質量也可以與基於高斯混合模型的並行VC方法獲得的質量相媲美。我們在下面提供語音樣本。

 

 

5.StarGAN-VC

StarGAN-VC是一種使用稱爲StarGAN的生成對抗網絡(GAN)的變體進行非並行多對多語音轉換(VC)的方法。我們的方法特別值得注意,因爲它(1)不需要並行發聲,轉錄或時間對齊程序來進行語音生成器訓練;2)使用單個生成器網絡同時學習跨不同屬性域的多對多映射(3 )能夠足夠快地生成轉換後的語音信號以允許實時實現,並且(4)僅需要幾分鐘的訓練示例即可生成合理逼真的語音。

 

 

  1. StarGAN-VC加入了一致性損失(identity loss)
  2. StarGAN-VC將分類器獨立出來
  3. StarGAN-VC在生成器和判別中都有連接說話人特徵向量的操作
  4. StarGAN-VC使用了GLU激活層

之前提出了一種使用稱爲循環一致性GANCycleGAN)的GAN變體的非並行VC方法,該方法最初是作爲使用不成對的訓練示例來翻譯圖像的方法而提出的。雖然CycleGAN-VC僅學習一對一映射,但StarGAN-VC能夠使用單個編解碼器類型的生成器網絡G同時學習多對多映射,其中生成器輸出的屬性由輔助輸入控制c。在這裏,Ç表示一個屬性標籤,表示爲一個熱向量的串聯,每個向量在特定類別的類的索引處用1填充,在其他地方用0填充。例如,如果我們將說話者身份視爲唯一的屬性類別,則 c將表示爲單個一鍵通向量,其中每個元素與另一個說話者相關聯。現在,我們希望使Gxc像真實語音特徵一樣真實,並適當地屬於屬性c。爲此,我們引入了一個實/假鑑別符D,它的作用是對輸入是真還是假進行分類,以及域分類器C,其作用是預測輸入所屬的類。通過使用dÇģ可以以這樣的方式被訓練GXC被誤分類爲通過實際的語音特徵序列d和正確地分類爲屬於屬性ÇÇ。我們還將循環一致性損失用於生成器訓練,以確保每對屬性域之間的映射將保留語言信息。

 

StarGAN-VC使用對抗性損失進行生成器訓練,以鼓勵生成器輸出與真實語音無法區分,並確保每對屬性域之間的映射將保留語言信息。值得注意的是, StarGAN-VC在測試時不需要任何關於輸入語音屬性的信息。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章