能量視角下的GAN模型(三):生成模型=能量模型
本文的模型在ImageNet(128x128)上的條件生成效果
今天要介紹的結果還是跟能量模型相關,來自論文《Implicit Generation and Generalization in Energy-Based Models》 。當然,它已經跟GAN沒有什麼關係了,但是跟本系列第二篇所介紹的能量模型關係較大,所以還是把它放到這個系列好了。
我當初留意到這篇論文,是因為機器之心的報導《MIT本科學神重啟基於能量的生成模型,新框架堪比GAN》 ,但是說實在的,這篇文章沒什麼意思,說句不中聽的,就是炒冷飯系列,媒體的標題也算中肯,是“重啟”。這篇文章就是指出能量模型實際上就是某個特定的Langevin方程的靜態解,然後就用這個Langevin方程來實現取樣,有了取樣過程也就可以完成能量模型的訓練,這些理論都是現成的,所以這個過程我在學習隨機微分方程的時候都想過,我相信很多人也都想過。因此,我覺得作者的貢獻就是把這個直白的想法通過一系列煉丹技巧實現了。
但不管怎樣,能訓練出來也是一件很不錯的事情,所以我論文的整體思路整理一下,讓讀者能夠更全面地理解能量模型。
跟《能量視角下的GAN模型(二):GAN=“分析”+“取樣”》 一樣,假設我們有一批資料$x_1,x_2,\dots,x_n\sim p(x)$,我們希望用一個概率模型去擬合它,我們選取的模型為
\begin{equation}q_{\theta}(x) = \frac{e^{-U_{\theta}(x)}}{Z_{\theta}}\end{equation}
其中$U_{\theta}$是帶引數$\theta$的未定函式,我們稱為“能量函式”,而$Z_{\theta}$是歸一化因子(配分函式)
\begin{equation}Z_{\theta} = \int e^{-U_{\theta}(x)}dx\label{eq:z}\end{equation}
這樣的分佈可以稱為“能量分佈”,在物理中也被稱為“玻爾茲曼分佈”。
為了求出引數$\theta$,我們先定義對數似然函式:
\begin{equation}\mathbb{E}_{x\sim p(x)} \big[\log q_{\theta}(x)\big]\end{equation}
我們希望它越大越好,也就是希望
\begin{equation}L_{\theta}=\mathbb{E}_{x\sim p(x)} \big[-\log q_{\theta}(x)\big]\end{equation}
越小越好,為此,我們對$L_{\theta}$使用梯度下降。我們有(具體推導參考第二篇)
\begin{equation}\nabla_{\theta}\log q_{\theta}(x)=-\nabla_{\theta} U_{\theta}(x)+\mathbb{E}_{x\sim q_{\theta}(x)}\big[\nabla_{\theta} U_{\theta}(x)\big]\end{equation}
所以
\begin{equation}\nabla_{\theta} L_{\theta} = \mathbb{E}_{x\sim p(x)}\big[\nabla_{\theta} U_{\theta}(x)\big] - \mathbb{E}_{x\sim q_{\theta}(x)}\big[\nabla_{\theta} U_{\theta}(x)\big]\label{eq:q-grad}\end{equation}
這意味著梯度下降的更新公式是
\begin{equation}\theta \leftarrow \theta - \varepsilon \Big(\mathbb{E}_{x\sim p(x)}\big[\nabla_{\theta} U_{\theta}(x)\big] - \mathbb{E}_{x\sim q_{\theta}(x)}\big[\nabla_{\theta} U_{\theta}(x)\big]\Big)\end{equation}
在式$\eqref{eq:q-grad-gd}$中,$\mathbb{E}_{x\sim p(x)}\big[\nabla_{\theta} U_{\theta}(x)\big]$是容易估算的,直接抽樣一批真實資料來計算就行了;但是$\mathbb{E}_{x\sim q_{\theta}(x)}\big[\nabla_{\theta} U_{\theta}(x)\big]$卻很困難,因為我們不知道怎麼實現從$q_{\theta}(x)$中取樣。
《能量視角下的GAN模型(二):GAN=“分析”+“取樣”》 中的思路是定義另外一個容易取樣的分佈$q_{\varphi}(x)$,然後改為從$q_{\varphi}(x)$中取樣,同時去縮小$q_{\varphi}(x)$和$q_{\theta}(x)$的差異,使得$q_{\varphi}(x)$確實可以成為$q_{\theta}(x)$的一個良好近似。但這篇論文不一樣,它直接從能量模型對應的Langevin方程取樣。
其實思路很簡單,在上一篇文章已經已經提到過,對於Langevin方程:
\begin{equation}x_{t+1} = x_t - \frac{1}{2}\varepsilon \nabla_x U(x_t) + \sqrt{\varepsilon}\alpha,\quad \alpha \sim \mathcal{N}(\alpha;0,1)\label{eq:sde}\end{equation}
當$\varepsilon\to 0$且$t\to\infty$時,序列$\{x_t\}$所服從的分佈就是$q_{\theta}(x)$,換句話說,$q_{\theta}(x)$是該Langevin方程的靜態分佈,再換句話說,那就是給定$U_{\theta}(x)$後($q_{\theta}(x)$也確定了),式$\eqref{eq:sde}$的遞迴過程就可以幫我們得到一批從$q_{\theta}(x)$取樣的樣本來。嗯嗯,有了這個取樣過程,那就完事了呀,首先$\mathbb{E}_{x\sim q_{\theta}(x)}\big[\nabla_{\theta} U_{\theta}(x)\big]$可以估算了,因此能量模型可以完成訓練了;訓練完成之後,還是由式$\eqref{eq:sde}$幫助我們從中取樣出一批新樣本了,這樣就完成生成過程了。
當然,理論是這樣子,實際操作肯定有很多細節,而且少不了煉丹。我當初也就只是思考到這一步,覺得裡邊的邊角問題太多,難以解決,就沒有繼續做下去了。但作者堅持下去了,終究是跑通了,這一點我是很佩服的。
首先是作者往模型$U_{\theta}(x)$加入了譜歸一化,而$U_{\theta}(x)$本身就相當於GAN中的判別器地位,所以加入譜歸一化是可以理解的。其次,在訓練的過程中,用的能量函式不是$U_{\theta}(x)$,而是加上一個小的L2正則:$U_{\theta}(x) + \lambda U_{\theta}^2(x)$,其中$\lambda$是一個小的正常數,作者的意思是這樣會使得整個loss更光滑,訓練起來更穩定(使用時還是$U_{\theta}(x)$)。
然後,回到取樣問題,取樣是通過式$\eqref{eq:sde}$進行的,它是一個迭代過程,既然是迭代就需要初始值。然而如果直接從隨機分佈(比如均勻分佈)中取樣隨機向量作為初始值,作者提到會出現模式單一的問題,即迭代出來的圖片形式比較單一,導致取樣不充分,所以作者維護了一個Buffer,它把歷史的的取樣結果快取起來,作為下一次取樣的候選初始值。
總的來說,模型的更新過程如下:
假定資料樣本分佈為$p(x)$,選定迭代步長$\varepsilon$(參考值為1/200)、迭代步數$K$(參考值20~50)和batch size $N$,Buffer記為$\mathcal{B}$,初始化是空集。
迴圈執行,直到收斂:
迴圈執行,得到一批真假樣本:
1、從$p(x)$中取樣一個真樣本$x_r$,加入到當前批;
2、以95%的概率從$\mathcal{B}$(或者以5%的概率從均勻分佈)選取一個樣本作為初始值$x_{f,0}$;
3、以$x_{f,0}$為初始值,迭代式$\eqref{eq:sde}$共$K$步,得到$x_{f,K}$;
4、將$x_{f,K}$作為假樣本$x_f$,加入到當前批,同時加入到$\mathcal{B}$。
有了真假樣本後,執行一步優化器,優化目標為:
$\frac{1}{N}\sum\limits_{x_r, x_f} \Big\{U_{\theta}(x_r) - U_{\theta}(x_f) + \lambda \big[U_{\theta}^2(x_r) - U_{\theta}^2(x_f)\big]\Big\}$
而訓練完成後的取樣,同樣需要維護Buffer,並且作者為了保證多樣性,他將模型分別訓練幾次,得到若干個不同權重的統一模型,然後同時從這若干個模型中取樣,並且共享、共同維護一個Buffer。其他細節問題大家直接看原論文即可,因為不打算復現,所以就不考究了。
作者實現:https://github.com/openai/ebm_code_release
總的來說,我認為這是一篇中規中矩、差強人意的論文。首先思路和理論都是成熟的,能量模型與Langevin方程的關係前人早已得出,不算什麼創新;但是能夠攻克其中的細節難題,真正把這個思路落實下去,也不是一件容易的事情,體現了作者在生成模型領域深厚的(煉丹)功底。從能量模型的角度看,也可以說是為訓練複雜的能量模型提供了一個可行的方案。
至於效果上,可以說它媲美GAN,也可以說比不上GAN。作者主要在Cifar10和ImageNet上做實驗,這兩個資料集當然很難,可以說一般的GAN都生成不好,從效果圖來看,確實可以PK大多數GAN了,在Cifar10上明顯完勝Glow。說它比不上,則是感覺它太有技巧性了,不夠優雅,比如Langevin方程的所導致的取樣思路,我感覺就沒有什麼底,維護一個Buffer的做法,雖然實踐效果還可以,但顯然工程味道太濃了....
在cifar10的無條件生成上的效果圖
轉載到請包括本文地址: https://kexue.fm/archives/6612
如果您還有什麼疑惑或建議,歡迎在下方評論區繼續討論。
如果您覺得本文還不錯,歡迎/本文。打賞並非要從中獲得收益,而是希望知道科學空間獲得了多少讀者的真心關注。當然,如果你無視它,也不會影響你的閱讀。再次表示歡迎和感謝!
如果您需要引用本文,請參考:
蘇劍林. (2019, May 10). 《能量視角下的GAN模型(三):生成模型=能量模型 》[Blog post]. Retrieved fromhttps://kexue.fm/archives/6612