1. 程式人生 > >【Learning Notes】變分自編碼器(Variational Auto-Encoder,VAE)

【Learning Notes】變分自編碼器(Variational Auto-Encoder,VAE)

近年,隨著有監督學習的低枝果實被採摘的所剩無幾,無監督學習成為了研究熱點。VAE(Variational Auto-Encoder,變分自編碼器)[1,2] 和 GAN(Generative Adversarial Networks) 等模型,受到越來越多的關注。

筆者最近也在學習 VAE 的知識(從深度學習角度)。首先,作為工程師,我想要正確的實現 VAE 演算法,以及瞭解 VAE 能夠幫助我們解決什麼實際問題;作為人工智慧從業者,我同時希望在一定程度上了解背後的原理。

作為學習筆記,本文按照由簡到繁的順序,首先介紹 VAE 的具體演算法實現;然後,再從直觀上解釋 VAE 的原理;最後,對 VAE 的數學原理進行回顧。我們會在適當的地方,對變分、自編碼、無監督、生成模型

等概念進行介紹。

我們會看到,同許多機器演算法一樣,VAE 背後的數學比較複雜,然而,工程實現上卻非常簡單。

1. 演算法實現

這裡介紹 VAE 的一個比較簡單的實現,儘量與文章[1] Section 3 的實驗設定保持一致。完整程式碼可以參見 repo

1.1 輸入:

資料集 XRn

做為例子,可以設想 XMNIST 資料集。因此,我們有六萬張 0~9 的手寫體 的灰度圖(訓練集), 大小為 28×28。進一步,將每個畫素歸一化到[0,1],則 X[0,1]784

MNIST
圖1. MNIST demo (圖片來源)

1.2 輸出:

一個輸入為 m

維,輸出為 n 維的神經網路,不妨稱之為 decoder [1](或稱 generative model [2])(圖2)。

decoder
圖 2. decoder

  • 在輸入輸出維度滿足要求的前提下,decoder 以為任何結構——MLP、CNN,RNN 或其他。
  • 由於我們已經將輸入資料規一化到 [0, 1] 區間,因此,我們令 decoder 的輸出也在這個範圍內。這可以通過在 decoder 的最後一層加上 sigmoid 啟用實現 :
    f(x)=11+ex
  • 作為例子,我們取 m = 100,decoder 的為最普遍的全連線網路(MLP)。基於 Keras Functional API
    的定義如下:
n, m = 784, 2
hidden_dim = 256
batch_size = 100

## Encoder
z = Input(batch_shape=(batch_size, m))
h_decoded = Dense(hidden_dim, activation='tanh')(z)
x_hat = Dense(n, activation='sigmoid')(h_decoded)

1.3 訓練

VAE overview
圖 3. VAE 結構框架

1.3.1 encoder

為了訓練 decoder,我們需要一個輔助的 encoder 網路(又稱 recognition model)(如圖3)。encoder 的輸入為 n 維,輸出為 2×m 維。同 decoder 一樣,encoder 可以為任意結構。

encoder
圖 4. encoder

1.3.2 取樣(sampling)

我們將 encoder 的輸出(2×m 個數)視作分別為 m 個高斯分佈的均值(z_mean)和方差的對數(z_log_var)。

接著上面的例子,encoder 的定義如下:

## Encoder
x = Input(batch_shape=(batch_size, n))
h_encoded = Dense(hidden_dim, activation='tanh')(x)
z_mean = Dense(m)(h_encoded)    # 均值
z_log_var = Dense(m)(h_encoded) # 方差對數

然後,根據 encoder 輸出的均值與方差,生成服從相應高斯分佈的隨機數:

epsilon = K.random_normal(shape=(batch_size, m), 
                          mean=0.,std=epsilon_std) # 標準高斯分佈
z = z_mean + exp(z_log_var / 2) * epsilon

z 就可以作為上面定義的 decoder 的輸入,進而產生 n 維的輸出 x^

sampler
圖5. 取樣

這裡運用了 reparemerization 的技巧。由於 zN(μ,σ),我們應該從 N(μ,σ) 取樣,但這個取樣操作對 μσ 是不可導的,導致常規的通過誤差反傳的梯度下降法(GD)不能使用。通過 reparemerization,我們首先從 N(0,1) 上取樣 ϵ,然後,z=σϵ+μ。這樣,zN(μ,σ),而且,從 encoder 輸出到 z,只涉及線性操作,(ϵ 對神經網路而言只是常數),因此,可以正常使用 GD 進行優化。方法正確性證明見[1] 2.3小節和[2] 第3節 (stochastic backpropagation)。

reparameterization
圖6. Reparameterization (圖片來源)

preparameterization 的代價是隱變數必須連續變數[7]。

1.3.3 優化目標

encoder 和 decoder 組合在一起,我們能夠對每個 xX,輸出一個相同維度的 x^。我們目標是,令 x^x 自身儘量的接近。即 x 經過編碼(encode)後,能夠通過解碼(decode)儘可能多的恢復出原來的資訊。

注:嚴格而言,按照模型的假設,我們要優化的並不是 xx^ 之間的距離,而是要最大化 x 的似然。不同的損失函式,對應著不是 p(x|z) 的不同概率分佈假設。此處為了直觀,姑且這麼解釋,詳細討論見下文([1] 附錄C)。

由於 x[0,1],因此,我們用交叉熵(cross entropy)度量 xx^ 差異:

xent=i=1n[xilog(x^i)+(1xi)log(1x^i)]

xent 越小,xx^ 越接近。

我們也可以用均方誤差來度量:

mse=i=1n(xix^i)2
mse 越小,兩者越接近。

訓練過程中,輸出即是輸入,這便是 VAE 中 AE(autoencoder,自編碼)的含義。

另外,我們需要對 encoder 的輸出 z_mean(μ)及 z_log_var(logσ2)加以約束。這裡使用的是 KL 散度(具體公式推導見下文):

KL=0.5(1+logσ2μ2σ2)=0.5(1+logσ2μ2exp(logσ2))

這裡的KL, 其實是 KL 散度的負值,見下文。

總的優化目標(最小化)為:

loss=xent+KL

相關推薦

Learning Notes編碼Variational Auto-EncoderVAE

近年,隨著有監督學習的低枝果實被採摘的所剩無幾,無監督學習成為了研究熱點。VAE(Variational Auto-Encoder,變分自編碼器)[1,2] 和 GAN(Generative Adversarial Networks) 等模型,受到越來越多的關注

從零上手編碼VAE

閱讀更多,歡迎關注公眾號:論文收割機(paper_reader) Kingma D P, Welling M. Auto-encoding variational bayes[J]. arXiv preprint arXiv:1312.6114, 2013. Rez

編碼編碼大雜燴

1.變分自編碼          變分是數學上的概念,大致含義是尋求一箇中間的函式,通過改變中間函式來檢視目標函式的改變。變分推斷是變分自編碼的核心,那麼變分推斷是要解決的是什麼問題?? 問題描述如下,假如我們有一批樣本X,這個時候,我們想生成一批和它類似的樣本,且分佈相同,這個時候我們該怎麼辦呢? 1

TensorFlow-windows學習筆記六——編碼

前言 對理論沒興趣的直接看程式碼吧,理論一堆,而且還有點複雜,我自己的描述也不一定準確,但是程式碼就兩三句話搞定了。 國際慣例,參考博文 理論 基礎知識 似然函式(引自百度百科) 似然函式是關於統計模型中的引數的函式,

VAE----編碼Keras實現

這篇部落格用來記錄我自己用keras實現(抄寫)VAE過程中,掉進的一個坑。。。。。。 最近這幾天在網上看了很多VAE的介紹,並且看了一下keras中的實現。自我感覺良好,就想按著官方的程式碼自己也去寫一遍。不寫不知道,一寫嚇一跳!!我跳進了一個很大坑中(笑哭),我在把程式碼寫完以後,開始訓

[深度學習]半監督學習、無監督學習之Variational Auto-Encoder編碼(附程式碼)

論文全稱:《Auto-Encoding Variational Bayes》 論文地址:https://arxiv.org/pdf/1312.6114.pdf 論文程式碼: keras 版本:https://github.com/bojone/vae pytorch 版本:https

Autoencorder理解(5):VAEVariational Auto-Encoder編碼

reference: http://blog.csdn.net/jackytintin/article/details/53641885 近年,隨著有監督學習的低枝果實被採摘的所剩無幾,無監督學習成為了研究熱點。VAE(Variational Auto-Encode

論文閱讀利用深度編碼神經網路預測藥物相似度

論文來源: Prediction of Drug-Likeness Using Deep Autoencoder Neural Networks 摘要 由於各種各樣的原因,大多數候選藥物最終不能成為上市藥物。建立可靠的預測候選化合物是否具有藥物相似度對提高藥物的發現

白話Variational Autoencoder編碼

本文將簡單介紹一下Variational Autoencoder。作者也在學習當中,如有不正確的地方,請大家指正,謝謝~原始的autoencoder一般分為兩個部分encoder part和decoder part。 encoder是將input轉化為encoding vec

VAE編碼的一點理解

前言 網上很多關於VAE的教程都包含大量枯燥難懂的數學公式,如果有大佬特別喜歡推導這些公式,很高興能夠附上以下連結。然而,今天只是想簡單的談下自己的理解,只有圖片,沒有公式。 主要內容 如下圖所示,其實VAE的主要思想就是以均值方差計算模組來作為Enc

你瞭解編碼嗎? 請看這裡

10.9  變分自編碼器前面所描述的自編碼器可以降維重構樣本,在這基礎上我們來學習一個更強大的自編碼器。10.9.1  什麼是變分自編碼器變分自編碼器學習的不再是樣本的個體,而是要學習樣本的規律。這樣訓練出來的自編碼器不單單具有重構樣本的功能,還具有了仿照樣本的功能。聽起來這

深度解碼Deep Auto-encoder

本部落格是針對李巨集毅教授在youtube上釋出的課程視訊的學習筆記。 Auto-encoder Encoder and Decoder Each one of them can’t be trained respectively(no

LearningNotes 編碼 VariationalAutoEncoder VAE

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

分貝葉斯、編碼遷移

目錄 變分法簡介 變分推斷 變分貝葉斯 變分自編碼 變分與遷移 :heart: 一些資料 變分法簡介 變分法是研究依賴於某些未知函式的積分型泛函極值的一門科學。也就是求泛函極值的方法稱為變分法。 典型例子最速降線

編碼網路的實現

1、VAE跟Gan有點類似,都是可以通過一些輸入,生成一些樣本資料。不同點是VAE是假設在資料的分佈是服從正態分佈的,而GAN是沒有這個假設的,完全是由資料驅動,進行訓練得出規律的。 下面是變分自編碼網路的程式碼: import numpy as np import te

Variational Autoencoder編碼

使用通用自編碼器的時候,首先將輸入encoder壓縮為一個小的 form,然後將其decoder轉換成輸出的一個估計。如果目標是簡單的重現輸入效果很好,但是若想生成新的物件就不太可行了,因為其實我們根本不知道這個網路所生成的編碼具體是什麼。雖然我們可以通過結果去對比不同的物件,但是要理解

編碼VAE及程式碼解讀

這幾天在看GAN模型的時候,順便關注了另外一種生成模型——VAE。其實這種生成模型在早幾年就有了,而且有了一些應用。著名黑客George Hotz在其開源的自主駕駛專案中就應用到了VAE模型。這其中的具體應用在我上一篇轉載的部落格comma.ai中有詳細介紹。在對VAE基本原