从变分编码、信息瓶颈到正态分布:论遗忘的重要性
作者丨蘇劍林
單位丨廣州火焰信息科技有限公司
研究方向丨NLP,神經網絡
個人主頁丨kexue.fm
這是一篇“散文”,我們來談一下有著千絲萬縷聯系的三個東西:變分自編碼器、信息瓶頸、正態分布。
眾所周知,變分自編碼器是一個很經典的生成模型,但實際上它有著超越生成模型的含義;而對于信息瓶頸,大家也許相對陌生一些,然而事實上信息瓶頸在去年也熱鬧了一陣子;至于正態分布,那就不用說了,它幾乎跟所有機器學習領域都有或多或少的聯系。
那么,當它們三個碰撞在一塊時,又有什么樣的故事可說呢?它們跟“遺忘”又有什么關系呢?
變分自編碼器
筆者曾經寫過若干篇介紹 VAE 的文章。下面簡單回顧一下。
變分自編碼器VAE:原來是這么一回事
再談變分自編碼器VAE:從貝葉斯觀點出發
變分自編碼器VAE:這樣做為什么能成?
變分自編碼器VAE:一步到位的聚類方案
理論形式回顧
簡單來說,VAE 的優化目標是:
其中 q(z) 是標準正態分布,p(z|x),q(x|z) 是條件正態分布,分別對應編碼器、解碼器。具體細節可以參考再談變分自編碼器VAE:從貝葉斯觀點出發。
這個目標最終可以簡化為:
顯然,它可以分開來看:這一項相當于普通的自編碼器損失(加上了重參數),是后驗分布與先驗分布的 KL 散度。第一項是希望重構損失越小越好,也就是希望中間的隱變量 z 能盡可能保留更多的信息,第二項是要隱變量空間跟正態分布對齊,意思是希望隱變量的分布更加規整一些。
與自編碼器的比較
所以,相比普通的自編碼器,VAE 的改動就是:?
1. 引入了均值和方差的概念,加入了重參數操作;
?
2. 加入了 KL 散度為額外的損失函數。
信息瓶頸
自認為本人介紹 VAE 的信息已經夠多了,因此不再贅述,馬上轉到信息瓶頸(Information Bottleneck,IB)的介紹。?
揭開DL的黑箱?
去年九月份有一場關于深度學習與信息瓶頸的演講,聲稱能解開深度學習(DL)的黑箱,然后大牛 Hinton 聽后評價“這太有趣了,我需要再看上 10000 遍...”(參考揭開深度學習黑箱:希伯來大學計算機科學教授提出「信息瓶頸」),然后信息瓶頸就熱鬧起來了。
不久之后,有一篇文章來懟這個結果,表明信息瓶頸的結論不是普適的(參考戳穿泡沫:對「信息瓶頸」理論的批判性分析),所以就更熱鬧了。?
不管信息瓶頸能否揭開深度學習的秘密,作為實用派,我們主要看信息瓶頸能夠真的能提取出一些有價值的東西出來用。
所謂信息瓶頸,是一個比較樸素的思想,它說我們面對一個任務,應用試圖用最少的信息來完成。這其實跟我們之前討論的“最小熵系列”是類似的,因為信息對應著學習成本,我們用最少的信息來完成一個任務,就意味著用最低的成本來完成這個任務,這意味著得到泛化性能更好的模型。
信息瓶頸的原理
為什么更低的成本/更少的信息就能得到更好的泛化能力?這不難理解,比如在公司中,我們如果要為每個客戶都定制一個解決方案,派專人去跟進,那么成本是很大的;如果我們能找出一套普適的方案來,以后只需要在這個方案基礎上進行微調,那么成本就會低很多。
“普適的方案”是因為我們找到了客戶需求的共性和規律,所以很顯然,一個成本最低的方案意味著我們能找到一些普適的規律和特性,這就意味著泛化性能。
在深度學習中,我們要如何體現這一點呢?答案就是“變分信息瓶頸”(VIB),源于文章 Deep Variational Information Bottleneck [1]。
▲?信息瓶頸示意圖
假設我們面對分類任務,標注數據對是。我們把這個任務分為兩步來理解,第一步是編碼,第二步就是分類。第一步是把 x 編碼為一個隱變量 z,然后分類器把 z 識別為類別 y。
然后我們試想在 z 處加一個“瓶頸” β,它像一個沙漏,進入的信息量可能有很多,但是出口就只有 β 那么大,所以這個瓶頸的作用是:不允許流過 z 的信息量多于 β。跟沙漏不同的是,沙漏的沙過了瓶頸就完事了,而信息過了信息瓶頸后,還需要完成它要完成的任務(分類、回歸等),所以模型迫不得已,只好想辦法讓最重要的信息通過瓶頸。這就是信息瓶頸的原理。
變分信息瓶頸
定量上是怎么操作呢?我們用“互信息”作為指標,來度量通過的信息量:
這里的 p(z) 不是任意指定的分布,而是真實的隱變量的分布,理論上,知道 p(z|x) 后,我們就可以將 p(z) 算出來,因為它形式上等于:
當然,這個積分往往不好算,后面我們再另想辦法。
然后,我們還有個任務的 loss,比如分類任務通常是交叉熵:
寫成這樣的形式,表明我們有個編碼器先將 x 編碼為 z,然后再對 z 分類。
怎么“不允許流過 z 的信息量多于 β”呢?我們可以直接把它當作懲罰項加入,使得最終的 loss 為:
也就是說,互信息大于 β?之后,就會出現一個正的懲罰項。當然,很多時候我們不知道 β?設為多少才好,所以一個更干脆的做法是去掉 β,得到:
這就單純地希望信息量越小越好,而不設置一個特定的閾值。
現在,公式已經有了,可是我們說過 p(z) 是算不出的,我們只好估計它的一個上界:假設 q(z) 是形式已知的分布,我們有:
這就表明,是的上界,如果我們優化前者,那么后者也不會超過前者。
既然后者沒法直接算出來,那么只好來優化前者了。所以,最終可用的 loss 是:
或者等價地寫成:
這就是“變分信息瓶頸”。
結果觀察與實現
可以看到,如果 q(z) 取標準正態分布(事實上我們一直都是這樣取,所以這個“如果”是滿足的),(2) 跟 VAE 的損失函數 (1) 幾乎是一樣的。只不過 (2) 討論的是有監督的任務,而 (1) 是無監督學習,但我們可以將 VAE 看成是標簽為自身 x 的有監督學習任務,那么它就是 (2) 的一個特例了。
所以,相比原始的監督學習任務,變分信息瓶頸的改動就是:?
1. 引入了均值和方差的概念,加入了重參數操作;
?
2. 加入了 KL 散度為額外的損失函數。
跟 VAE 如出一轍!?
在 Keras 中實現變分信息瓶頸的方式非常簡單,我定義了一個層,方便大家調用:
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: Improving Imitation Learning, Inverse RL, and GANs by Constraining Information Flow [2] 的論文被評為 ICLR 2019 的高分論文(同期出現的還有那著名的 BigGAN),論文作者已經不滿足僅僅將變分信息瓶頸用于普通的監督任務了,論文發展出“變分判別瓶頸”,并且一舉將它用到了 GAN、強化學習等多種任務上,并都取得了一定的提升!信息瓶頸的威力可見一斑。?
不同于 (2) 式,在 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模型的插值效果圖
這種線性插值的過程是:首先采樣兩個隨機向量 z1,z2~N(0,1),顯然好的生成器能將 z1,z2 都生成一個真實的圖片 g(z1),g(z2),然后我們考慮 g(zα),其中:
考慮 α 從 0 到 1 的變化過程,我們期望看到的 g(zα) 是圖片 g(z1) 逐漸過渡到圖片 g(z2),事實上也正是如此。
為什么插值一定要在隱變量空間差值呢?為什么直接對原始圖片插值得不到有價值的結果。這其實和也和正態分布有關,因為我們有如下的卷積定理(此卷積非彼卷積,它是數學的卷積算子,不是神經網絡的卷積層):
如果,并且它們是相互獨立的隨機變量,那么:
特別地,如果,那么:
這也就是說正態分布的隨機變量的和還是正態分布。這意味著什么呢?意味著在正態分布的世界里,兩個變量的線性插值還仍然處在這個世界。這不是一個普通的性質,因為顯然對兩個真實樣本插值就不一定是真實的圖片了。
對于有監督任務,線性插值這個性質有什么價值呢?有,而且很重要。我們知道標注數據集很難得,如果我們能將有限的訓練集的隱變量空間都合理地映射到標準正態分布,那么,我們可以期望訓練集沒有覆蓋到的部分也可能被我們考慮到了,因為它的隱變量可能只是原來訓練集的隱變量的線性插值。
也就是說,當我們完成有監督訓練,并且把隱變量分布也規整為標準正態分布之后,我們實際上已經把訓練集之間的過渡樣本也考慮進去了,從而相當于覆蓋了更多的樣本了。
注:我們通常考慮的是空間域均勻線性插值,即 β=1?α 的形式,但從的角度看,最好的選擇是的插值,即:
其次,可能讀者會想到,當 GAN 的先驗分布用均勻分布時,不也可以線性插值嗎?這好像不是正態分布獨有的呀?
其實均勻分布的卷積不再是均勻分布了,但是它的概率密度函數剛好集中在原來均勻分布的中間(只不過不均勻了,相當于取了原來的一個子集),所以插值效果還能讓人滿意,只不過從理論上來看它不夠優美。另外從實踐來看,目前 GAN 的訓練中也多用正態分布了,訓練起來比用均勻分布效果更好些。
學習與遺忘
最后,說了那么多,其實所有內容有一個非常直觀的對應:遺忘。
遺忘也是深度學習中一個很重要的課題,時不時有相關的研究成果出來。比如我們用新領域的數據集的微調訓練好的模型,模型往往就只能適用于新領域,而不是兩個領域都能用,這就是深度學習的“災難性遺忘”問題。又比如前段時間出來個研究,說 LSTM 的三個門之中,只保留“遺忘門”其實就足夠了。
至于前面說了很長的信息瓶頸,跟遺忘也是對應的。因為大腦的容量就固定在那里,你只好用有限的信息完成你的任務,這就提取出了有價值的信息。
還是那個經典的例子,銀行的工作人員也許看一看、摸一摸就能辨別出假幣出來,但是他們對人民幣非常了解嗎?他們能畫出人民幣的輪廓嗎?我覺得應該做不到。因為他們為了完成這個任務所分配的大腦容量也有限的,他們只需要辨別假幣的最重要的信息。這就是大腦的信息瓶頸。
前面說的深度學習的信息瓶頸,也可以同樣地類比。一般認為神經網絡有效的基礎是信息損失,逐層把無用的信息損失掉(忘記),最后保留有效的、泛化的信息,但神經網絡參數實在太多,有時候不一定能達到這個目的,所以信息瓶頸就往神經網絡加了個約束,相當于“強迫”神經網絡去忘記無用的信息。
但也正因為如此,VIB 并非總是能提升你原來模型的效果,因為如果你的模型本來就已經“逐層把無用的信息損失掉(忘記),最后保留有效的、泛化的信息”了,那么 VIB 就是多余的了。VIB 只是一個正則項,跟其他所有正則項一樣,效果都不是絕對的。
我突然想到了《倚天屠龍記》里邊張無忌學太極劍的一段描述:
“要知張三豐傳給他的乃是“劍意”,而非“劍招”,要他將所見到的劍招忘得半點不剩,才能得其神髓,臨敵時以意馭劍,千變萬化,無窮無盡。倘若尚有一兩招劍法忘不乾凈,心有拘囿,劍法便不能純”。
原來遺忘才是最高境界!所以,本文雖然看上去不扣題,但卻是一篇實實在在的散文——《論遺忘的重要性》。
▲?《倚天屠龍記之魔教教主》截屏
參考文獻
[1] Alexander A. Alemi, Ian Fischer, Joshua V. Dillon and Kevin Murphy. Deep Variational Information Bottleneck. In International Conference on Learning Representations (ICLR), 2017.
[2] Xue Bin Peng, Angjoo Kanazawa, Sam Toyer, Pieter Abbeel, Sergey Levine: Variational Discriminator Bottleneck: Improving Imitation Learning, Inverse RL, and GANs by Constraining Information Flow. CoRR abs/1810.00821 (2018)
點擊以下標題查看作者其他文章:?
變分自編碼器VAE:原來是這么一回事 | 附開源代碼
再談變分自編碼器VAE:從貝葉斯觀點出發
變分自編碼器VAE:這樣做為什么能成?
深度學習中的互信息:無監督提取特征
全新視角:用變分推斷統一理解生成模型
細水長flow之NICE:流模型的基本概念與實現
細水長flow之f-VAEs:Glow與VAEs的聯姻
深度學習中的Lipschitz約束:泛化與生成模型
關于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
▽ 點擊 |?閱讀原文?| 查看作者博客
總結
以上是生活随笔為你收集整理的从变分编码、信息瓶颈到正态分布:论遗忘的重要性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Byte Cup 2018机器学习大赛进
- 下一篇: 线下活动 × 深圳 | 大咖云集!第11