深度學習與計算機視覺教程(16) | 生成模型(PixelRNN,PixelCNN,VAE,GAN)(CV通關指南·完結)

ShowMeAI發表於2022-06-14

ShowMeAI研究中心


Generative Models; 深度學習與計算機視覺

本系列為 史丹佛CS231n 《深度學習與計算機視覺(Deep Learning for Computer Vision)》的全套學習筆記,對應的課程視訊可以在 這裡 檢視。更多資料獲取方式見文末。


引言

之前瞭解到的都是監督學習(Supervised Learning):我們有資料x和標籤y,目標是學習到一個函式可以將資料x對映到標籤y,標籤可以有很多形式。

典型的有監督學習有:分類問題中輸入一張圖片,輸出圖片的分類;目標檢測中輸入一張圖片,輸出目標物體的邊框;語義分割中,給每個畫素都打上標籤。

CS231n第13講給大家介紹的是無監督學習(Unsupervised Learning)以及生成模型的一些知識。

本篇重點

  • 無監督學習
  • 生成模型
    • Pixel RNN/CNN
    • 變分自編碼器(VAE)
    • 生成對抗網路(GAN)

1.無監督學習

無監督學習在我們只有一些沒有標籤的訓練資料的情況下,學習資料中隱含的結構。無監督學習由於沒有標籤,資料獲取也很容易。典型的無監督學習包括下述演算法:

1.1 聚類(k-Means)

關於聚類演算法的詳細知識也可以參考ShowMeAI的下述文章

聚類(Clustering)是找到資料的分組,組內資料在某種度量方式下是相似的。隨機初始k箇中心位置,將每個樣本分配到最近的中心位置,然後根據分配的樣本更新中心位置。重複這個過程直至收斂(中心位置不再變化)。

無監督學習; 聚類 k-Means

1.2 PCA(主成分分析)

關於PCA降維演算法的詳細知識也可以參考ShowMeAI的下述文章

資料降維Dimensionality reduction):找出一些投影方向(軸),在這些軸上訓練資料投影的方差最大。這些軸就是資料內潛在的結構。我們可以用這些軸來減少資料維度,資料在每個保留下來的維度上都有很大的方差。

無監督學習; 主成分分析 PCA

1.3 特徵學習(Feature Learning)

我們還有一些特徵學習的方法,比如自編碼(Autoencoders):

無監督學習; 特徵學習 Feature Learning

1.4 密度估計( Density Estimation)

密度估計( Density Estimation)也是一種無監督演算法,我們會估計資料的內在分佈情況,比如下圖上方有一些一維和二維的點,我們用高斯函式來擬合這一密度分佈,如下圖所示:

無監督學習; 密度估計 Density Estimation

2.生成模型(Generative Models)

生成模型是一種無監督學習方法。它對應的任務是:根據一批由真實分佈p-data(x) 產生的訓練資料,通過訓練學習,得到一個可以以近似於真實的分佈p-model(x) 來產生新樣本的模型。

生成模型; Generative Models

為什麼生成模型重要,因為其可以支撐一系列問題的解決:生成樣本,著色問題,強化學習應用,隱式表徵推斷等。

下圖左邊為生成的圖片,中間生成的人臉,還可以做超解析度或者著色之類的任務。

生成模型; Generative Models

生成模型分為「顯式」和「隱式」的生成模型,往下分又可以分成很多子類。如下圖所示。

我們在本篇內容中主要討論3種模型:PixelRNN / CNN,變分自動編碼器屬於顯示密度模型,生成對抗網路(GAN)屬於隱式密度估計模型。

生成模型; Generative Models

2.1 PixelRNN 和 PixelCNN

PixelRNN 和 PixelCNN 使用概率鏈式法則來計算一張圖片出現的概率。其中每一項為給定前 \(i-1\) 個畫素點後第 \(i\) 個畫素點的條件概率分佈。這個分佈通過神經網路 RNN 或 CNN 來建模,再通過最大化圖片 \(x\) 的似然概率來學習出 RNN 或 CNN 的引數。

條件概率公式為:

PixelRNN; PixelCNN

\[p(x)=\prod_{i=1}^{n} p(x_{i} \mid x_{1}, \ldots, x_{i-1}) \]

其中:

  • \(p(x)\): 影像x的似然概率
  • \(p(x_{i} \mid x_{1}, \ldots, x_{i-1})\): 條件概率

PixelRNN 中,從左上角開始定義「之前的畫素」。由於 RNN 每個時間步的輸出概率都依賴於之前所有輸入,因此能夠用來表示上面的條件概率分佈。

PixelRNN; PixelCNN

我們訓練這個 RNN 模型時,一次前向傳播需要從左上到右下序列走一遍,然後根據上面的公式求出似然,並最大化似然以對引數做一輪更新。因此訓練非常耗時。

PixelCNN中,使用一個CNN來接收之前的所有畫素,並預測下一個畫素的出現概率:

\[p(x)=\prod_{i=1}^{n} p(x_{i} \mid x_{1}, \ldots, x_{i-1}) \]

PixelRNN; PixelCNN

對比 PixelRNN 和 PixelCNN,後者在訓練時可以平行計算公式中的每一項,然後進行引數更新,因此訓練速度遠快於 PixelRNN。

不過,在測試階段,我們會發現PixelRNN和PixelCNN都要從左上角開始逐個畫素點地生成圖片,實際應用階段生成影像的速度是很慢的。

生成模型; 生成的圖片樣本

PixelRNN 和 PixelCNN 能顯式地計算似然 \(p(x)\),是一種可優化的顯式密度模型,該方法給出了一個很好的評估度量,可以通過計算的資料的似然來度量出生成樣本有多好。

生成模型; PixelRNN 和 PixelCNN優缺點

2.2 變分自編碼器(VAE)

PixelCNN定義了一個易於處理的密度函式,我們可以直接優化訓練資料的似然;而我們下面介紹到的變分自編碼器方法中,密度函式就不易處理了,我們要通過附加的隱變數 \(z\) 對密度函式進行建模:

\[p_{\theta}(x)=\int p_{\theta}(z) p_{\theta}(x \mid z) d z \]

我們資料的似然 \(p(x)\) 是等式右邊的積分形式,即對所有可能的 \(z\) 值取期望,但它是無法直接優化的,我們只能找出一個似然函式的下界然後再對該下界進行優化。

1) 自編碼器

自編碼器是為了無監督地學習出樣本的特徵表示,原理如下:

變分自編碼器 VAE; 自編碼器

如上圖,自編碼器由編碼器和解碼器組成,編碼器將樣本 \(x\) 對映到特徵 \(z\),解碼器再 \(x\) 將特徵 \(z\) 對映到重構樣本。我們設定損失函式為 \(x\) 與重構樣本之間的 L2 損失,訓練出編碼器和解碼器的引數,希望能夠使 \(z\) 解碼後恢復出原來的 \(x\)

編碼器

編碼器可以有多種形式,常用的是神經網路。最先提出的是非線性層的線性組合,然後有了深層的全連線網路(MLP),後來又使用 CNN,我們通過神經網路對輸入資料 \(x\) 計算和對映,得到特徵 \(z\)\(z\) 的維度通常比 \(x\) 更小。這種降維壓縮可以壓縮保留 \(x\) 中最重要的特徵。

解碼器

解碼器主要是為了重構資料,它輸出一些跟 \(x\) 有相同維度的結果並儘量擬合 \(x\) 。解碼器一般使用和編碼器相同型別的網路(與編碼器對稱)。

訓練好完整的網路後,我們會把解碼器的部分去掉,使用訓練好的編碼器實現特徵對映。

通過編碼器得到輸入資料的特徵,編碼器頂部有一個分類器,如果是分類問題我們可以用它來輸出一個類標籤,在這裡使用了外部標籤和標準的損失函式如 Softmax。

變分自編碼器 VAE; 自編碼器

無標籤資料得到的模型,可以幫助我們得到普適特徵(比如上述自編碼器對映得到的特徵),它們作為監督學習的輸入是非常有效的(有些場景下監督學習可能只有很少的帶標籤的訓練資料,少量的資料很難訓練模型,可能會出現過擬合等其他一些問題),通過上述方式得到的特徵可以很好地初始化下游監督學習任務的網路。

自編碼器具有重構資料、學習資料特徵、初始化一個監督模型的能力。這些學習到的特徵具有能捕捉訓練資料中蘊含的變化因素的能力。我們獲得了一個含有訓練資料中變化因子的隱變數 \(z\)

2) VAE的思想

VAE模型的思路是,如果我們無法直接獲得樣本 \(x\) 的分佈,那麼我們可以假設存在一個 \(x\) 對應的隱式表徵 \(z\)\(z\) 的分佈是一個先驗分佈(比如高斯分佈或其他簡單的分佈)。

舉例來說,如果我們想要生成微笑的人臉, \(z\) 代表的是眉毛的位置,嘴角上揚的弧度,它經過解碼網路後,能夠對映得到 \(x\) 的近似真實分佈。那在樣本生成階段,我們可以通過標準正態分佈取樣得到 \(z\) ,然後解碼得到樣本近似分佈,再在此分佈上取樣來生成樣本。

對於這個取樣過程,真實的引數是 \(\theta \ast\) ,是有關於先驗假設和條件概率分佈的引數,我們的目的在於獲得一個樣本生成式模型,從而利用它來生成新的資料,真實引數是我們想要估計並得出的。

我們表示這個生成式模型的方法是:選一個簡單的關於 \(z\) 的先驗分佈,例如高斯分佈,對於給定 \(z\)\(x\) 的條件概率分佈 \(p(x \mid z)\) 很複雜,我們會使用神經網路來對 \(p(x \mid z)\) 進行建模。

變分自編碼器 VAE; VAE的思想

3) 如何訓練VAE

我們的目標是:從一堆樣本中學習出解碼網路的引數,使得在標準高斯分佈上取樣得到的 \(z\) ,經過解碼後得到的 \(x\) 的分佈,剛好近似於 \(x\) 的真實分佈。

我們通過「最大化樣本 \(x\) 的似然 \(P(x)\)」來達到上述目標。 在已經給定隱變數 \(z\) 的情況下,寫出 \(x\) 的分佈 \(p\) 並對所有可能的 \(z\) 值取期望,因為 \(z\) 值是連續的所以表示式是一個積分:

\[p_{\theta}(x)=\int p_{\theta}(z) p_{\theta}(x \mid z) d z \]

問題是利用求導來直接求最大化的似然,很不好解。

第一項是 \(z\) 的分佈 \(p(z)\) ,這裡將它簡單地設定為高斯分佈,所以很容易求;\(p(x \mid z)\) 是一個指定的神經網路解碼器,也容易得到。

但是計算所有的 \(z\) 對應的 \(p(x \mid z)\) 很困難,所以無法計算該積分。這樣也導致 \(p(z \mid x)\) 是難解的。

解決方法是,在使用神經網路解碼器來定義一個對 \(p(x \mid z)\) 建模神經網路的同時,額外定義一個編碼器 \(q(z \mid x)\) ,將輸入 \(x\) 編碼為 \(z\) ,從而得到似然 \(p(z \mid x)\)

也就是說我們定義該網路來估計出 \(p(z \mid x)\) ,這個後驗密度分佈項仍然是難解的,我們用該附加網路來估計該後驗分佈,這將使我們得到一個資料似然的下界,該下界易解也能優化。

變分自編碼器 VAE; 如何訓練VAE

在變分自編碼器中我們想得到一個生成資料的概率模型,將輸入資料 \(x\) 送入編碼器得到一些特徵 \(z\) ,然後通過解碼器網路把 \(z\) 對映到影像 \(x\)

我們這裡有編碼器網路和解碼器網路,將一切引數隨機化。引數是 \(\phi\) 的編碼器網路 \(q(z \mid x)\) 輸出一個均值和一個對角協方差矩陣;解碼器網路輸入 \(z\) ,輸出均值和關於 \(x\) 的對角協方差矩陣。為了得到給定 \(x\) 下的 \(z\) 和給定 \(z\) 下的 \(x\) ,我們會從這些分佈(\(p\)\(q\))中取樣,現在我們的編碼器和解碼器網路所給出的分別是 \(z\)\(x\) 的條件概率分佈,並從這些分佈中取樣從而獲得值。

下面是推導過程

\[\log \mathrm{L}=\log p(x)=\log p(x) \cdot 1=\log p(x) \int_{z} q(z \mid x) d z \]

這裡引入了一個分佈 \(q(z \mid x)\) ,就是編碼網路。這裡我們暫時只把它當作一個符號,繼續推導即可:

\[\begin{aligned} \log \mathrm{L} &=\log p(x) \int_{z} q(z \mid x) d z \\ &=\int_{z} q(z \mid x) \log \frac{p(x, z)}{p(z \mid x)} d z \\ &=\int_{z} q(z \mid x)\left[\log \frac{p(x, z)}{q(z \mid x)}-\log \frac{p(z \mid x)}{q(z \mid x)}\right] d z \\ &=\int_{z} q(z \mid x) \log \frac{p(x, z)}{q(z \mid x)} d z+\int_{z} q(z \mid x) \log \frac{q(z \mid x)}{p(z \mid x)} d z \\ &=\int_{z} q(z \mid x) \log \frac{p(x, z)}{q(z \mid x)} d z+D_{K L}(q(z \mid x) \| p(z \mid x)) \end{aligned} \]

對第一項,我們有:

\[\begin{aligned} \int_{z} q(z \mid x) \log \frac{p(x, z)}{q(z \mid x)} d z &=\int_{z} q(z \mid x) \log p(x \mid z) d z+\int_{z} q(z \mid x) \log \frac{p(x)}{q(z \mid x)} d z \\ &=\mathrm{E}_{z \sim q}[\log p(x \mid z)]-D_{K L}(q(z \mid x) \| p(z)) \end{aligned} \]

這樣我們就得到了 VAE 的核心等式:

\[\log p(x)=\mathrm{E}_{z \sim q}[\log p(x \mid z)]-D_{K L}(q(z \mid x) \| p(z))+D_{K L}(q(z \mid x) \| p(z \mid x)) \]

注意到這個式子的第三項中,含有 \(p(z \mid x)\) ,而

\[p_{\theta}(z \mid x)=p_{\theta}(x \mid z) p_{\theta}(z) / p_{\theta}(x) \]

\[p_{\theta}(x)=\int p_{\theta}(z) p_{\theta}(x \mid z) d z \]

變分自編碼器 VAE; 如何訓練VAE

由於這個積分無法求解出來,因此我們沒辦法求第三項的梯度。幸運的是,由於第三項是一個KL散度,其恆大於等於 \(0\),因此前兩項的和是似然的一個下界。因此我們退而求其次,來最大化似然的下界,間接達到最大化似然的目的。

現在我們引入編碼器網路來對 \(q(z \mid x)\) 建模,我們的訓練框架如下:

變分自編碼器 VAE; 如何訓練VAE

如何得到下界

① 第1項是對所有采樣的 \(z\) 取期望, \(z\)\(x\) 經過編碼器網路取樣得到,對 \(z\) 取樣然後再求所有 \(z\) 對應的 \(p(x \mid z)\) 。讓 \(p(x \mid z)\) 變大,就是最大限度地重構資料。

② 第2項是讓KL的散度變小,讓我們的近似後驗分佈和先驗分佈變得相似,意味著我們想讓隱變數z遵循我們期望的分佈型別。

這個框架就非常類似於自編碼器。

其中最大化下界的第一項表示我們要能從解碼器最大概率地重構出 \(x\) ,這一步等價於去最小化與樣本 \(x\) 的均方誤差。最小化下界的第二項則限定了 \(z\) 要遵循我們事先給它指定的分佈。

公式是我們要優化及最大化的下界,前向傳播按如上流程處理,對輸入資料 \(x\) ,讓小批量的資料傳遞經過編碼器網路的到 \(q(z \mid x)\) ,通過 \(q(z \mid x)\) 來計算 KL 項,然後根據給定 \(x\)\(z\) 分佈對 \(z\) 進行取樣,由此獲得了隱變數的樣本,這些樣本可以根據 \(x\) 推斷獲得;然後把 \(z\) 傳遞給第二個解碼器網路,通過解碼器網路 \(x\) 在給定 \(z\) 的條件下的兩個引數,均值和協方差,最終可以在給定 \(z\) 的條件下從這個分佈中取樣得到 \(x\)

訓練時需要獲得該分佈,損失項是給定 \(z\) 條件下對訓練畫素值取對數,損失函式要做的是最大化被重構的原始輸入資料的似然;對於每一個小批量的輸入我們都計算這一個前向傳播過程,取得所有我們需要的項,他們都是可微分的,接下來把他們全部反向傳播回去並獲得梯度,不斷更新我們的引數,包括生成器和解碼器網路的引數 \(\theta\)\(\phi\) 從而最大化訓練資料的似然。

訓練好變分自編碼器,當生成資料時只需要用解碼器網路,我們在訓練階段就對 \(z\) 取樣,而不用從後驗分佈中取樣,在生成階段會從真實的生成過程中取樣。先從設定好的先驗分佈中取樣,接下來對資料 \(x\) 取樣。

需要注意的是,這個框架裡面,梯度無法通過「取樣」這個運算元反向傳播到編碼器網路,因此我們使用一種叫做重取樣的 trick。即將 \(z\) 取樣的運算元分解為:

變分自編碼器 VAE; 如何訓練VAE

這樣梯度不需要經過取樣運算元就能迴流到編碼器網路中。

4) VAE的優缺點

總結一下,VAE 是在原來的自編碼器上加了隨機成分,我們使用VAE不是直接取得確定的輸入 \(x\) 然後獲得特徵 \(z\) 最後再重構 \(x\) ,而是採用隨機分佈和取樣的思想,這樣我們就能生成資料。 為了訓練模型 VAEs,我們定義了一個難解的密度分佈,我們推匯出一個下界然後優化下界,下界是變化的,「變分」指的是用近似來解決這些難解的表示式,這是模型被稱為變分自動編碼器的原因。

VAEs優點

VAEs 就生成式模型來說是一種有據可循的方法,它使得查詢推斷稱為可能,如此一來便能夠推斷出像 \(q(z \mid x)\) 這樣的分佈,這些東西對其他任務來說會是很有用的特徵表徵。

VAEs缺點

最大化似然下界思想是OK的,但是不像 PixelRNN 和 PixelCNN 那樣精準評估。而 VAE 相對後續會講到的GAN等方法,生成的影像結果更模糊。

2.3 生成對抗網路(Generative Adversarial Nets, GAN)

1) GAN的核心思路

我們之前的 PixelCNN 和 PixelRNN 定義了一個易於處理的密度函式,通過密度函式優化訓練資料的似然;VAEs有一個額外定義的隱變數 \(z\) ,有了 \(z\) 以後獲得了很多的有利性質但是我們也有了一個難解的密度函式,對於該函式我們不能直接優化,我們推到了一個似然函式的下界,然後對它進行優化。

現在我們放棄顯式地對密度函式建模,我們想要得到的是從分佈中取樣並獲得質量良好的樣本。GANs 中不再在顯式的密度函式上花費精力,而是採用一個博弈論的方法,並且模型將會習得從訓練分佈中生成資料,具體的實現是基於「生成器」和「判別器」這一對博弈玩家。

相比變分自編碼器,GAN 的核心思路非常簡單。

在 GAN 中我們定義了兩個網路:「生成器」和「判別器」。

  • 判別器負責辨別哪些樣本是生成器生成的假樣本,哪些是從真實訓練集中抽出來的真樣本。
  • 生成器負責利用隨機噪聲 \(z\) 生成假樣本,它的職責是生成儘可能真的樣本以騙過判別器。

生成對抗網路; 理解GAN如何工作

這種對抗形式的目標可以寫成如下形式:

\[\min _{\theta_{g}} \max _{\theta_{d}}\left[\mathbb{E}_{x \sim p_{\text {data }}} \log D_{\theta_{d}}(x)+\mathbb{E}_{z \sim p(z)} \log \left(1-D_{\theta_{d}}\left(G_{\theta_{g}}(z)\right)\right)\right] \]

生成對抗網路; 理解GAN如何工作

現在我們有兩個玩家,通過一個 \(\min \max\) 博弈公式聯合訓練這兩個網路,該 \(\min \max\) 目標函式就是如圖所示的公式,我們的目標是:

  • 讓目標函式在 \(\theta_ g\) 上取得最小值,同時要在 \(\theta_ d\) 上取得最大值。
  • 其中:\(\theta_g\) 是生成器網路g的引數,\(\theta_d\)指的是判別器網路的引數。

公式中各項的含義

  • 第1項是在訓練資料的分佈上 \(log(D(x))\) 的期望,\(log(D(x))\) 是判別器網路在輸入為真實資料(訓練資料)時的輸出,該輸出是真實資料從分佈 p-data 中取樣的似然概率;
  • 第2項是對 \(z\) 取期望, \(z\) 是從 \(p(z)\) 中取樣獲得的,這意味著從生成器網路中取樣,同時 \(D(G(z))\) 這一項代表了以生成的偽資料為輸入判別器網路的輸出,也就是判別器網路對於生成網路生成的資料給出的判定結果。

對該過程的解釋:我們的判別器的目的是最大化目標函式也就是在 \(\theta_d\) 上取最大值,這樣一來 \(D(x)\) 就會接近1,也就是使判別結果接近真,因而該值對於真實資料應該相當高,這樣一來 \(D(G(z))\) 的值也就是判別器對偽造資料輸出就會相應減小,我們希望這一值接近於 \(0\)

如果我們能最大化這一結果,就意味著判別器能夠很好的區別真實資料和偽造資料。

對於生成器來說,我們希望它最小化該目標函式,也就是讓 \(D(G(z))\) 接近 \(1\),如果 \(D(G(z))\) 接近 \(1\),那麼用 \(1\) 減去它就會很小,判別器網路就會把偽造資料視為真實資料,也就意味著我們的生成器在生成真實樣本。

從資料準備上看,整個過程是一個無監督學習,我們無需人工給每個圖片打上標籤。具體網路學習時候,我們會把生成器生成的圖片標記為 \(0\)(對應假圖片),訓練集標記為 \(1\)(都是真圖片)。

判別器的損失函式會使用上述資訊,判別器是一個分類器,我們希望它能經過訓練獲得分辨能力:對生成器生成的圖片輸出 \(0\),而對真實圖片輸出 \(1\)

訓練方法

對於GAN,我們最初能想到的訓練方式如下:

① 對判別器進行梯度上升,學習到 \(\theta_d\) 來最大化該目標函式;

\[\max _{\theta_{d}}\left[\mathbb{E}_{x \sim p_{\text {data }}} \log D_{\theta_{d}}(x)+\mathbb{E}_{z \sim p(z)} \log \left(1-D_{\theta_{d}}\left(G_{\theta_{g}}(z)\right)\right)\right] \]

② 對生成器進行梯度下降, \(\theta_g\) 進行梯度下降最小化目標函式(此時目標函式如下的部分,因為只有它與 \(\theta_g\) 有關)

\[\min _{\theta_{g}} \mathbb{E}_{z \sim p(z)} \log \left(1-D_{\theta_{d}}\left(G_{\theta_{g}}(z)\right)\right) \]

不斷在上述 ① 和 ② 之間重複。

這裡有個trick:我們觀察生成器的損失函式形狀如下:

生成對抗網路; 理解GAN如何工作

發現當生成器效果不好(\(D(G(z)\) 接近 \(0\))時,梯度非常平緩;當生成器效果好(\(D(G(z)\)接近\(1\))時,梯度很陡峭。這就與我們期望的相反了,我們希望在生成器效果不好的時候梯度更陡峭,這樣能學到更多。因此我們使用下面的目標函式來替代原來的生成器損失:

\[\max _{\theta_{g}} \mathbb{E}_{z \sim p(z)} \log \left(D_{\theta_{d}}\left(G_{\theta_{g}}(z)\right)\right) \]

這樣就使得在生成器效果不好時具有較大的梯度。此外,聯合訓練兩個網路很有挑戰,交替訓練的方式不可能一次訓練兩個網路,還有損失函式的函式空間會影響訓練的動態過程。

在每一個訓練迭代期都先訓練判別器網路,然後訓練生成器網路,GAN 的總體訓練過程如下:

  • 訓練判別器

    • 對於判別器網路的k個訓練步,先從噪聲先驗分佈 \(z\) 中取樣得到一個小批量樣本,接著從訓練資料 \(x\) 中取樣獲得小批量的真實樣本,下面要做的將噪聲樣本傳給生成器網路,並在生成器的輸出端獲得生成的影像。
  • 此時我們有了一個小批量偽造影像和小批量真實影像,我們有這些小批量資料在判別器生進行一次梯度計算,接下來利用梯度資訊更新判別器引數,按照以上步驟迭代幾次來訓練判別器。

  • 訓練生成器

    • 在這一步取樣獲得一個小批量噪聲樣本,將它傳入生成器,對生成器進行反向傳播,來優化目標函式。

訓練 GAN 的過程會交替進行上述兩個步驟。

生成對抗網路; 理解GAN如何工作

訓練完畢後,就可以用生成器來生成比較逼真的樣本了。

2) GAN的探索

生成對抗網路; GAN的探索

  • 傳統的GAN生成的樣本還不是很好,這篇論文在GAN中使用了CNN架構,取得了驚豔的生成效果:[Radford et al, “Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks”, ICLR 2016]
  • Wasserstein GAN 一定程度解決了GAN訓練中兩個網路如何平衡的問題。
  • 用GAN來做text -> image

3) GAN的優缺點以及熱門研究方向

GAN 的優點

  • GAN通過一種博弈的方法來訓練,通過兩個玩家的博弈從訓練資料的分佈中學會生成資料。
  • GAN可以生成目前最好的樣本,還可以做很多其他的事情。

GAN 的缺點

  • GAN沒有顯式的密度函式(它是利用樣本來隱式表達該函式)
  • GAN不好訓練且不穩定,我們並不是直接優化目標函式,我們要努力地平衡兩個網路。

GAN 的熱門研究方法

  • 更好的損失函式設計,更穩定的訓練方式(例如Wasserstein GAN, LSGAN及其他)
  • 條件GAN,GAN的各種應用領域探索

3.擴充學習

可以點選 B站 檢視視訊的【雙語字幕】版本

[video(video-ohaiAwnB-1655045024553)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=759478950&page=13)(image-https://img-blog.csdnimg.cn/img_convert/4d2759bf157ddfb1b29f92f922554f9d.png)(title-【字幕+資料下載】史丹佛CS231n | 面向視覺識別的卷積神經網路 (2017·全16講))]

4.要點總結

本篇講了三種目前最常用生成模型:

  • PixelCNN 和 PixelRNN 他們是顯式密度模型,該模型優化的是一個顯式的似然函式併產生良好的樣本,但是效率很低,它是一個順序的生成過程。
  • VAE 優化的是一個似然函式的下界,它會產生一個有用的隱式表徵,可以用它來進行查詢推斷,生成的樣本也不是特別好。
  • GAN 是目前能生成最好樣本的模型,但是訓練需要技巧且不穩定,查詢推斷上也有一些問題。
  • 還有一些將模型的優點結合起來做的研究。

ShowMeAI 史丹佛 CS231n 全套解讀

ShowMeAI 系列教程推薦

showmeai用知識加速每一次技術成長

相關文章