發表時間:2018(NIPS 2017)
文章要點:文章設計了一個新的基於VAE的自編碼器Vector Quantised-Variational AutoEncoder (VQ-VAE)。區別在於之前的自編碼器去學latent representation的時候都是去學一個連續的向量,這篇文章學了一個離散的表示。注意,離散並不意味着one-hot,只要是離散的數字就ok。
比如圖中這個圖像的例子,最后學到的z(latent feature spaces)就是一個32x32的矩陣,每個位置都是一個取值范圍為1-K的數字。這個K表示的是embedding space的向量個數。z的每個數字就對應一個latent embedding vector \(e_i\)。然后要解碼的時候,就用這個z去embedding space里面去找對應的\(e_i\)然后組裝成紫色那個方塊\(z_q (x)\),然后解碼出圖像。這里embedding space里面的\(e_i\)是一個D維的向量,我個人感覺這個向量是個實值向量,不是one-hot的,文章的離散主要指的是一共只有K個embedding vectors,不管多少張圖片,他的representation都是這K個vectors組合起來的,所以z是離散的。那么z的每個位置的數字是怎么得到的呢?就是從綠色的方塊\(z_e (x)\)得到的。\(z_e (x)\)的每個向量去和embedding vector計算距離,取距離最近的embedding vector對應的index就行。然后這會導致一個小問題,中間這個地方的梯度是斷了的,不能直接PB。文章中的方式也很暴力,就是后面BP到\(z_q (x)\)之后,直接將這個梯度信息對應到\(z_e (x)\)上去。最后還加了個正則項之類的東西,最后損失變成
總結:這篇文章的出發點就是很多時候我們並不需要連續的表征,離散的表征就已經足夠了。比如人只要認識三千個漢字就能說話寫文章,表達豐富的含義了。挺有道理的,但是文章講的有點不清楚,不知道整個理解有沒有到位。比如\(e_i\)是不是one-hot的?如果不是的話,那么要維護K個向量,要維護的模型參數就變多了,畢竟之前的VAE雖然是連續表征,但是也只用維護一個向量。這里相當於有一個離散的z,但是這個z的背后實際上是K個向量。
疑問:具體更新方式其實還沒弄明白,另外loss為啥設計成這樣也不清楚。