【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 輸入:
資料集
做為例子,可以設想
X 為 MNIST 資料集。因此,我們有六萬張 0~9 的手寫體 的灰度圖(訓練集), 大小為28×28 。進一步,將每個畫素歸一化到[0,1] ,則X⊂[0,1]784 。
圖1. MNIST demo (圖片來源)
1.2 輸出:
一個輸入為
圖 2. decoder
- 在輸入輸出維度滿足要求的前提下,decoder 以為任何結構——MLP、CNN,RNN 或其他。
- 由於我們已經將輸入資料規一化到 [0, 1] 區間,因此,我們令 decoder 的輸出也在這個範圍內。這可以通過在 decoder 的最後一層加上 sigmoid 啟用實現 :
f(x)=11+e−x - 作為例子,我們取 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 訓練
圖 3. VAE 結構框架
1.3.1 encoder
為了訓練 decoder,我們需要一個輔助的 encoder 網路(又稱 recognition model)(如圖3)。encoder 的輸入為
圖 4. encoder
1.3.2 取樣(sampling)
我們將 encoder 的輸出(
接著上面的例子,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
圖5. 取樣
這裡運用了 reparemerization 的技巧。由於
z∼N(μ,σ) ,我們應該從N(μ,σ) 取樣,但這個取樣操作對μ 和σ 是不可導的,導致常規的通過誤差反傳的梯度下降法(GD)不能使用。通過 reparemerization,我們首先從N(0,1) 上取樣ϵ ,然後,z=σ⋅ϵ+μ 。這樣,z∼N(μ,σ) ,而且,從 encoder 輸出到z ,只涉及線性操作,(ϵ 對神經網路而言只是常數),因此,可以正常使用 GD 進行優化。方法正確性證明見[1] 2.3小節和[2] 第3節 (stochastic backpropagation)。
圖6. Reparameterization (圖片來源)
preparameterization 的代價是隱變數必須連續變數[7]。
1.3.3 優化目標
encoder 和 decoder 組合在一起,我們能夠對每個
注:嚴格而言,按照模型的假設,我們要優化的並不是
x 與x^ 之間的距離,而是要最大化x 的似然。不同的損失函式,對應著不是p(x|z) 的不同概率分佈假設。此處為了直觀,姑且這麼解釋,詳細討論見下文([1] 附錄C)。
由於
xent 越小,
我們也可以用均方誤差來度量:
mse 越小,兩者越接近。
訓練過程中,輸出即是輸入,這便是 VAE 中 AE(autoencoder,自編碼)的含義。
另外,我們需要對 encoder 的輸出 z_mean(
這裡的KL, 其實是 KL 散度的負值,見下文。
總的優化目標(最小化)為:
或
相關推薦
【Learning Notes】變分自編碼器(Variational Auto-Encoder,VAE)
近年,隨著有監督學習的低枝果實被採摘的所剩無幾,無監督學習成為了研究熱點。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):VAE(Variational 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基本原