變分自編碼VAE模型理解

2021-10-13 12:46:18 字數 1582 閱讀 7879

從暑假看到現在終於在《這篇文章》的幫助下搞懂了,期間看了無數的中文關於vae的部落格文章,乙個個基本上不是少講了這個就是少講了那個,最後總是搞不懂,還走了不少彎路,去研究變分推斷本身,其實只是為了看懂vae的原理,是不必深度了解變分推斷的。

話不多說,說正題,這裡我只會講下大概,具體的請看原始文章。

自編碼模型是把原始特徵壓縮為中間維度,再講中間維度解碼為原始特徵,最後衡量在這編碼和解碼的過程中損失了多少的資訊,將這個損失的資訊降到最低。

但是在這個過程中,模型可能會為了降低這個loss,就將訓練集的內容死記硬背住了,所以在隱特徵空間只有那麼幾個點有意義,大片的空間都變得沒有意義。

直觀理解

自編碼模型有2個嚴重的問題:

沒有連續性,訓練集在隱藏空間投射的點有意義,但是其中大片的空間都是沒有任何資訊的

隱藏空間沒有規則。

vae就是解決這兩個問題,與ae將x投射到隱藏空間為點不同,vae將之投射為乙個正態分佈,這樣整個空間都會瀰散著這個x的資訊,只不過資訊濃度在正態分佈的均值處最高。僅僅有這個就行了嗎,不行!因為模型會為了降低loss不擇手段,最後把這個分布的方差變的極小,這就又變成ae模型了,所以必須對這個方差施加約束。這就行了嗎?還是不行!雖然方差有了,但是要是這些點距離彼此太遠,中間還是會有大量的空白的無資訊的空間,所以我們得讓所有x在投影分布盡量靠在一起。

我們選擇讓所有投影分布盡量靠近原地,即分布的均值為0,分布的方差恆定為1,這樣就不會被擠壓為0從而變成ae了。

概率模型角度理解

概率模型角度還是和上面的直觀理解有些區別,為了讓隱藏空間有規則,讓神經網路不至於亂來,我們做兩個假設:

這時候我們需要計算出p(z|x)的分布,即x編碼後投影在哪兒,注意注意這裡不是正態分佈,它可以是任何分布,但是要滿足乙個條件:所有x投影的分布綜合起來要是乙個正態分佈。

給定p(z)和p(x|z)計算p(z|x),我們能想到的就是貝葉斯公式,但是在分母部分有乙個p(x)不好算,於是我們採用變分推斷,具體怎麼推導的可以不用管,最後得到乙個loss的式子。

g(x),h(x)就是x的投影分布的均值和方差,f(z)是解碼器把z投射回x的分布的均值。這個式子前面一項表示重構誤差,意思是經過編碼—解碼這個過程的資訊損失,後面一項就是正則項,表示我們對隱藏空間的結構的約束,即是我們在上面一節中解釋的,讓分布盡量擠在一起,然後方差為1。

最後我們把f,g,h都用神經網路表示,就是如下圖的樣子,其中c=1/2c

參考: 我這裡只是乙個大概,牆裂推薦大家閱讀原文!

變分自編碼VAE實戰

import tensorflow as tf from tensorflow.examples.tutorials.mnist import input data mnist input data.read data sets mnist data one hot true import matp...

變分自編碼器VAE

auto encoding variational bayes git antixk pytorch vae a collection of variational autoencoders vae in pytorch.1 原文作者在深度學習上的實戰理論指導 2 具體原理框圖如下 vae主要由編碼...

AI數學 變分自編碼器 VAE

auto encoding variational bayes 你要是能在一周內,把上面這篇文章的數學原理搞懂,那你就是骨骼清奇了。看 可以知道,vae 變分自編碼器 只是aevb 自編碼變分貝葉斯 的乙個應用而已。如果你只是想懂vae的話,還是比較簡單滴。對於aevb更深層的原理,在這裡不去討論,...