從變分編碼、資訊瓶頸到正態分佈:論遺忘的重要性

jasonzhangxianrong發表於2024-07-08

這是一篇“散文”,我們來談一下有著千絲萬縷聯絡的三個東西:變分自編碼器、資訊瓶頸、正態分佈。

眾所周知,變分自編碼器是一個很經典的生成模型,但實際上它有著超越生成模型的含義;而對於資訊瓶頸,大家也許相對陌生一些,然而事實上資訊瓶頸在去年也熱鬧了一陣子;至於正態分佈,那就不用說了,它幾乎跟所有機器學習領域都有或多或少的聯絡。

那麼,當它們三個碰撞在一塊時,又有什麼樣的故事可說呢?它們跟“遺忘”又有什麼關係呢?

變分自編碼器 #

在本部落格你可以搜尋到若干幾篇介紹VAE的文章。下面簡單回顧一下。

理論形式回顧 #

簡單來說,VAE的最佳化目標是:
\begin{equation}KL(\tilde{p}(x)p(z|x)\Vert q(z)q(x|z))=\iint \tilde{p}(x)p(z|x)\log \frac{\tilde{p}(x)p(z|x)}{q(x|z)q(z)} dzdx\end{equation}
其中$q(z)$是標準正態分佈,$p(z|x),q(x|z)$是條件正態分佈,分別對應編碼器、解碼器。具體細節可以參考《變分自編碼器(二):從貝葉斯觀點出發》

這個目標最終可以簡化為
\begin{equation}\mathbb{E}_{x\sim \tilde{p}(x)} \Big[\mathbb{E}_{z\sim p(z|x)}\big[-\log q(x|z)\big]+KL\big(p(z|x)\big\Vert q(z)\big)\Big]\label{eq:vae}\end{equation}
顯然,它可以分開來看:$\mathbb{E}_{z\sim p(z|x)}\big[-\log q(x|z)\big]$這一項相當於普通的自編碼器損失(加上了重引數),$KL\big(p(z|x)\big\Vert q(z)\big)$是後驗分佈與先驗分佈的KL散度。第一項是希望重構損失越小越好,也就是希望中間的隱變數$z$能儘可能保留更多的資訊,第二項是要隱變數空間跟正態分佈對齊,意思是希望隱變數的分佈更加規整一些。

與自編碼器的比較 #

所以,相比普通的自編碼器,VAE的改動就是:

1、引入了均值和方差的概念,加入了重引數操作;

2、加入了KL散度為額外的損失函式。

資訊瓶頸 #

自認為本空間介紹VAE的資訊已經夠多了,因此不再贅述,馬上轉到資訊瓶頸(Information Bottleneck,IB)的介紹。

揭開DL的黑箱? #

去年九月份有一場關於深度學習與資訊瓶頸的演講,聲稱能解開深度學習(DL)的黑箱,然後大牛Hinton聽後評價“這太有趣了,我需要再看上10000遍...”(參考《揭開深度學習黑箱:希伯來大學電腦科學教授提出「資訊瓶頸」》),然後資訊瓶頸就熱鬧起來了。不久之後,有一篇文章來懟這個結果,表明資訊瓶頸的結論不是普適的(參考《戳穿泡沫:對「資訊瓶頸」理論的批判性分析》),所以就更熱鬧了。

不管資訊瓶頸能否揭開深度學習的秘密,作為實用派,我們主要看資訊瓶頸能夠真的能提取出一些有價值的東西出來用。所謂資訊瓶頸,是一個比較樸素的思想,它說我們面對一個任務,應用試圖用最少的資訊來完成。這其實跟我們之前討論的“最小熵系列”是類似的,因為資訊對應著學習成本,我們用最少的資訊來完成一個任務,就意味著用最低的成本來完成這個任務,這意味著得到泛化效能更好的模型。

資訊瓶頸的原理 #

為什麼更低的成本/更少的資訊就能得到更好的泛化能力?這不難理解,比如在公司中,我們如果要為每個客戶都定製一個解決方案,派專人去跟進,那麼成本是很大的;如果我們能找出一套普適的方案來,以後只需要在這個方案基礎上進行微調,那麼成本就會低很多。“普適的方案”是因為我們找到了客戶需求的共性和規律,所以很顯然,一個成本最低的方案意味著我們能找到一些普適的規律和特性,這就意味著泛化效能

資訊瓶頸示意圖

資訊瓶頸示意圖

在深度學習中,我們要如何體現這一點呢?答案就是“變分資訊瓶頸”(VIB),源於文章《Deep Variational Information Bottleneck》

假設我們面對分類任務,標註資料對是$(x_1,y_1),\dots,(x_N,y_N)$。我們把這個任務分為兩步來理解,第一步是編碼,第二步就是分類。第一步是把$x$編碼為一個隱變數$z$,然後分類器把$z$識別為類別$y$。
$$x \quad \to \quad z \quad \to \quad y$$

然後我們試想在$z$處加一個“瓶頸”$\beta$,它像一個沙漏,進入的資訊量可能有很多,但是出口就只有$\beta$那麼大,所以這個瓶頸的作用是:不允許流過$z$的資訊量多於$\beta$。跟沙漏不同的是,沙漏的沙過了瓶頸就完事了,而資訊過了資訊瓶頸後,還需要完成它要完成的任務(分類、迴歸等),所以模型迫不得已,只好想辦法讓最重要的資訊透過瓶頸。這就是資訊瓶頸的原理。

變分資訊瓶頸 #

定量上是怎麼操作呢?我們用“互資訊”作為指標,來度量透過的資訊量:
\begin{equation}\iint p(z|x)\tilde{p}(x)\log \frac{p(z|x)}{p(z)}dxdz\end{equation}
這裡的$p(z)$不是任意指定的分佈,而是真實的隱變數的分佈,理論上,知道$p(z|x)$後,我們就可以將$p(z)$算出來,因為它形式上等於
\begin{equation}p(z) = \int p(z|x)\tilde{p}(x)dx\end{equation}
當然,這個積分往往不好算,後面我們再另想辦法。

然後,我們還有個任務的loss,比如分類任務通常是交叉熵:
\begin{equation}-\iint p(z|x)\tilde{p}(x)\log p(y|z)dxdz\end{equation}
寫成這樣的形式,表明我們有個編碼器先將$x$編碼為$z$,然後再對$z$分類。

怎麼“不允許流過$z$的資訊量多於$\beta$”呢?我們可以直接把它當作懲罰項加入,使得最終的loss為
\begin{equation}-\iint p(z|x)\tilde{p}(x)\log p(y|z)dxdz + \lambda \iint p(z|x)\tilde{p}(x)\max\left(\log \frac{p(z|x)}{p(z)} - \beta, 0\right)dxdz\end{equation}
也就是說,互資訊大於$\beta$之後,就會出現一個正的懲罰項。當然,很多時候我們不知道$\beta$設為多少才好,所以一個更乾脆的做法是去掉$\beta$,得到
\begin{equation}-\iint p(z|x)\tilde{p}(x)\log p(y|z)dxdz + \lambda \iint p(z|x)\tilde{p}(x)\log \frac{p(z|x)}{p(z)}dxdz\end{equation}
這就單純地希望資訊量越小越好,而不設定一個特定的閾值。

現在,公式已經有了,可是我們說過$p(z)$是算不出的,我們只好估計它的一個上界:假設$q(z)$是形式已知的分佈,我們有
\begin{equation}\begin{aligned}&\iint p(z|x)\tilde{p}(x)\log \frac{p(z|x)}{p(z)}dxdz\\
=&\iint p(z|x)\tilde{p}(x)\log \frac{p(z|x)}{q(z)}\frac{q(z)}{p(z)}dxdz\\
=&\iint p(z|x)\tilde{p}(x)\log \frac{p(z|x)}{q(z)} + \iint p(z|x)\tilde{p}(x)\log \frac{q(z)}{p(z)}dxdz\\
=&\iint p(z|x)\tilde{p}(x)\log \frac{p(z|x)}{q(z)} + \int p(z)\log \frac{q(z)}{p(z)}dz\\
=&\iint p(z|x)\tilde{p}(x)\log \frac{p(z|x)}{q(z)} - \int p(z)\log \frac{p(z)}{q(z)}dz\\
=&\int \tilde{p}(x) KL\big(p(z|x)\big\Vert q(z)\big) dx - KL\big(p(z)\big\Vert q(z)\big)\\
< &\int \tilde{p}(x) KL\big(p(z|x)\big\Vert q(z)\big) dx\end{aligned}\end{equation}
這就表明,$\int\tilde{p}(x) KL\big(p(z|x)\big\Vert q(z)\big) dx$是$\iint p(z|x)\tilde{p}(x)\log \frac{p(z|x)}{p(z)}dxdz$的上界,如果我們最佳化前者,那麼後者也不會超過前者。既然後者沒法直接算出來,那麼只好來最佳化前者了。所以,最終可用的loss是
\begin{equation}-\iint p(z|x)\tilde{p}(x)\log p(y|z)dxdz + \lambda \int\tilde{p}(x) KL\big(p(z|x)\big\Vert q(z)\big) dx\end{equation}
或者等價地寫成
\begin{equation}\mathbb{E}_{x\sim \tilde{p}(x)} \Big[\mathbb{E}_{z\sim p(z|x)}\big[-\log p(y|z)\big]+\lambda\cdot KL\big(p(z|x)\big\Vert q(z)\big)\Big]\label{eq:vib}\end{equation}
這就是“變分資訊瓶頸”。

結果觀察與實現 #

可以看到,如果$q(z)$取標準正態分佈(事實上我們一直都是這樣取,所以這個“如果”是滿足的),$\eqref{eq:vib}$跟VAE的損失函$\eqref{eq:vae}$幾乎是一樣的。只不過$\eqref{eq:vib}$討論的是有監督的任務,而$\eqref{eq:vae}$是無監督學習,但我們可以將VAE看成是標籤為自身$x$的有監督學習任務,那麼它就是$\eqref{eq:vib}$的一個特例了。

所以,相比原始的監督學習任務,變分資訊瓶頸的改動就是:

1、引入了均值和方差的概念,加入了重引數操作;

2、加入了KL散度為額外的損失函式。

跟VAE如出一轍!

在Keras中實現變分資訊瓶頸的方式非常簡單,我定義了一個層,方便大家呼叫:

from keras.layers import Layer
import keras.backend as K

class VIB(Layer):
"""變分資訊瓶頸層
"""
def init(self, lamb, kwargs):
self.lamb = lamb
super(VIB, self).init(
kwargs)
def call(self, inputs):
z_mean, z_log_var = inputs
u = K.random_normal(shape=K.shape(z_mean))
kl_loss = - 0.5 * K.sum(K.mean(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), 0))
self.add_loss(self.lamb * kl_loss)
u = K.in_train_phase(u, 0.)
return z_mean + K.exp(z_log_var / 2) * u
def compute_output_shape(self, input_shape):
return input_shape[0]

用法很簡單,在原來的任務上稍做改動即可,請參考:
https://github.com/bojone/vib/blob/master/cnn_imdb_vib.py

效果:相比沒有加VIB的模型,加了VIB的模型收斂更快,而且容易跑到89%+的驗證正確率,而不加VIB的模型,通常只能跑到88%+的正確率,並且收斂速度更慢些。

變分判別瓶頸 #

原論文《Deep Variational Information Bottleneck》表明,VIB是一種頗為有效的正則手段,在多個任務上都提高了原模型效能。

然而資訊瓶頸的故事還沒有完,就在前不久,一篇名為《Variational Discriminator Bottleneck》的論文被評為ICLR 2019的高分論文(同期出現的還有那著名的的BigGAN),論文作者已經不滿足僅僅將變分資訊瓶頸用於普通的監督任務了,論文發展出“變分判別瓶頸”,並且一舉將它用到了GAN、強化學習等多種任務上,並都取得了一定的提升!資訊瓶頸的威力可見一斑。

不同於$\eqref{eq:vib}$式,在《Variational Discriminator Bottleneck》一文資訊瓶頸的更新機制做了修改,使它絕有一定的自適應能力,但根本思想沒有變化,都是透過限制互資訊來對模型起到正則作用。不過這已經不是本文的重點了,有興趣的讀者請閱讀原論文。

正態分佈 #

透過對比,我們已經發現,VAE和VIB都只是在原來的任務上引入了重引數,並且加入了KL散度項。直觀來看,正則項的作用都是希望隱變數的分佈更接近標準正態分佈。那麼,正態分佈究竟有什麼好處呢?

規整和解耦 #

其實要說正態分佈的來源、故事、用途等等,可以寫上一整本書了,很多關於正態分佈的性質,在其他地方已經出現過,這裡僅僅介紹一下跟本文比較相關的部分。

其實,KL散度的作用,要讓隱變數的分佈對齊(多元的)標準正態分佈,而不是任意正態分佈。標準正態分佈相對規整,均有零均值、標準方差等好處,但更重要的是標準正態分佈擁有一個非常有價值的特點:它的每個分量是解耦的,用機率的話說,就是相互獨立的,滿足$p(x,y)=p(x)p(y)$。

我們知道如果特徵相互獨立的話,建模就會容易得多(樸素貝葉斯分類器就是完全精確的模型),而且相互獨立的特徵可解釋行也好很多,因此我們總希望特徵相互獨立。早在1992年LSTM之父Schmidhuber就提出了PM模型(Predictability Minimization),致力於構建一個特徵解耦的自編碼器,相關故事可以參考《從PM到GAN - LSTM之父Schmidhuber橫跨22年的怨念》。沒錯,就是在我還沒有來到地球的那些年,大牛們就已經著手研究特徵解耦了,可見特徵解耦的價值有多大。

在VAE中(包括後來的對抗自編碼器),直接透過KL散度讓隱變數的分佈對齊一個解耦的先驗分佈,這樣帶來的好處便是隱變數本身也接近解耦的,從而擁有前面說的解耦的各種好處。因此,現在我們可以回答一個很可能會被問到的問題:

問:從特徵編碼的角度看,變分自編碼器相比普通的自編碼器有什麼好處?

答:變分自編碼器透過KL散度讓隱變數分佈靠近標準正態分佈,從而能解耦隱變數特徵,簡化後面的建立在該特徵之上的模型。(當然,你也可以聯絡前面說的變分資訊瓶頸來回答一波,比如增強泛化效能等^_^)

線性插值與卷積 #

此外,正態分佈還有一個重要的性質,這個性質通常被用來演示生成模型的效果,它就是如下的線性插值:

引用自Glow模型的插值效果圖

引用自Glow模型的插值效果圖

這種線性插值的過程是:首先取樣兩個隨機向量$z_1,z_2\sim \mathcal{N}(0, 1)$,顯然好的生成器能將$z_1,z_2$都生成一個真實的圖片$g(z_1),g(z_2)$,然後我們考慮$g(z_{\alpha})$,其中
\begin{equation}z_{\alpha} = (1 - \alpha) z_1 + \alpha z_2,\quad 0 \leq \alpha \leq 1\end{equation}
考慮$\alpha$從0到1的變化過程,我們期望看到的$g(z_{\alpha})$是圖片$g(z_1)$逐漸過渡到圖片$g(z_2)$,事實上也正是如此。

為什麼插值一定要在隱變數空間插值呢?為什麼直接對原始圖片插值得不到有價值的結果。這其實和也和正態分佈有關,因為我們有如下的卷積定理(此卷積非彼卷積,它是數學的卷積運算元,不是神經網路的卷積層):

如果$z_1\sim \mathcal{N}(\mu_1, \sigma_1^2),z_2\sim \mathcal{N}(\mu_2, \sigma_2^2)$,並且它們是相互獨立的隨機變數,那麼
$$z_1 + z_2 \sim\mathcal{N}(\mu_1+\mu_2, \sigma_1^2+\sigma_2^2)$$

特別地,如果$z_1\sim \mathcal{N}(0, 1),z_2\sim \mathcal{N}(0, 1)$,那麼
$$\alpha z_1 + \beta z_2 \sim \mathcal{N}(0, \alpha^2+\beta^2)$$

這也就是說正態分佈的隨機變數的和還是正態分佈。這意味著什麼呢?意味著在正態分佈的世界裡,兩個變數的線性插值還仍然處在這個世界。這不是一個普通的性質,因為顯然對兩個真實樣本插值就不一定是真實的圖片了。

對於有監督任務,線性插值這個性質有什麼價值呢?有,而且很重要。我們知道標註資料集很難得,如果我們能將有限的訓練集的隱變數空間都合理地對映到標準正態分佈,那麼,我們可以期望訓練集沒有覆蓋到的部分也可能被我們考慮到了,因為它的隱變數可能只是原來訓練集的隱變數的線性插值。

也就是說,當我們完成有監督訓練,並且把隱變數分佈也規整為標準正態分佈之後,我們實際上已經把訓練集之間的過渡樣本也考慮進去了,從而相當於覆蓋了更多的樣本了。

注:我們通常考慮的是空間域均勻線性插值,即$\beta = 1-\alpha$的形式,但從$\alpha z_1 + \beta z_2 \sim \mathcal{N}(0, \alpha^2+\beta^2)$的角度看,最好的選擇是$\alpha^2+\beta^2=1$的插值,即
$$z_{\theta}=z_1\cdot\cos\theta + z_2\cdot\sin\theta$$

其次,可能讀者會相當,當GAN的先驗分佈用均勻分佈時,不也可以線性插值嗎?這好像不是正態分佈獨有的呀?其實均勻分佈的卷積不再是均勻分佈了,但是它的機率密度函式剛好集中在原來均勻分佈的中間(只不過不均勻了,相當於取了原來的一個子集),所以插值效果還能讓人滿意,只不過從理論上來看它不夠優美。另外從實踐來看,目前GAN的訓練中也多用正態分佈了,訓練起來比用均勻分佈效果更好些。

學習與遺忘 #

最後,說了那麼多,其實所有內容有一個非常直觀的對應:遺忘

遺忘也是深度學習中一個很重要的課題,時不時有相關的研究成果出來。比如我們用新領域的資料集的微調訓練好的模型,模型往往就只能適用於新領域,而不是兩個領域都能用,這就是深度學習的“災難性遺忘”問題。又比如前段時間出來個研究,說LSTM的三個門之中,只保留“遺忘門”其實就足夠了。

至於前面說了很長的資訊瓶頸,跟遺忘也是對應的。因為大腦的容量就固定在那裡,你只好用有限的資訊完成你的任務,這就提取出了有價值的資訊。還是那個經典的例子,銀行的工作人員也許看一看、摸一摸就能辨別出假幣出來,但是他們對人民幣非常瞭解嗎?他們能畫出人民幣的輪廓嗎?我覺得應該做不到。因為他們為了完成這個任務所分配的大腦容量也有限的,他們只需要辨別假幣的最重要的資訊。這就是大腦的資訊瓶頸。

前面說的深度學習的資訊瓶頸,也可以同樣地類比。一般認為神經網路有效的基礎是資訊損失,逐層把無用的資訊損失掉(忘記),最後保留有效的、泛化的資訊,但神經網路引數實在太多,有時候不一定能達到這個目的,所以資訊瓶頸就往神經網路加了個約束,相當於“強迫”神經網路去忘記無用的資訊。但也正因為如此,VIB並非總是能提升你原來模型的效果,因為如果你的模型本來就已經“逐層把無用的資訊損失掉(忘記),最後保留有效的、泛化的資訊”了,那麼VIB就是多餘的了。VIB只是一個正則項,跟其他所有正則項一樣,效果都不是絕對的。

我突然想到了《倚天屠龍記》裡邊張無忌學太極劍的一段描述:

要知張三丰傳給他的乃是“劍意”,而非“劍招”,要他將所見到的劍招忘得半點不剩,才能得其神髓,臨敵時以意馭劍,千變萬化,無窮無盡。倘若尚有一兩招劍法忘不乾淨,心有拘囿,劍法便不能純。

原來遺忘才是最高境界!所以,本文雖然看上去不扣題,但卻是一篇實實在在的散文——《論遺忘的重要性》。

《倚天屠龍記之魔教教主》截圖

《倚天屠龍記之魔教教主》截圖

轉載到請包括本文地址:https://spaces.ac.cn/archives/6181

更詳細的轉載事宜請參考:《科學空間FAQ》

相關文章