由AE到生成模型VAE

2021-10-21 19:28:32 字數 3626 閱讀 5048

vae(variational autoencoder) 變分自編碼器

1:ae、vae:

2: vae以及損失函式:

學習不僅僅在於學習本身,還有創新,深度學習也一樣,不僅在於其強大的學習能力,更在於它的創新能力。

所以,我們將模型分為兩類,一類是判別模型,一類是生成模型。

所謂判別模型,通常是利用訓練樣本來訓練模型,然後利用該模型,對新的輸入樣本x,進行判別或**,得到乙個y。

而生成模型正好是其反過程,是根據一些規則y,來生成新樣本x。

它的主體結構是:

x————>z————>y
其中,x到z的過程是編碼(encode)的過程,x是輸入樣本,z是編碼得到的潛在向量。

z到y的過程是乙個解碼(decode)的過程

ae最主要的乙個應用就是資料壓縮:

很容易理解這個應用,因為上述整個過程其實是對x的乙個壓縮和解壓縮,即先壓縮x到z,再由z還原得到y,這個y應該和x「很像」。

怎麼實現這個很像呢?

答:定義損失函式,通過神經網路進行優化即可。

這個損失函式就是輸入樣本x在壓縮解壓縮(編碼解碼)過程種損失掉的資訊,所以ae事實上是一種有損的資料壓縮

自編碼器ae是一種無監督的學習

因為它無需label,只需要與data本身做loss即可。

ae的整個網路結構可以看成兩部分

乙個由函式z = f(x) 表示的編碼器和乙個生成重構的解碼器y = g(z)。

而ae實現的是讓 y = g(f(x))≈ x所以事實上ae完成的是對輸入樣本x的乙個重構

為什麼ae不是生成模型呢呢?

因為潛在向量z本質上還是從輸入樣本x種產生的,並沒有其他約束不能隨意產生合理的潛在變數。

個人理解:其實也是因為ae是無監督學習,沒有別的label自然無法生成別的樣式。

vae主要針對ae不能隨意產生合理的潛在變數這一點做了改變,即針對z進行了改變。

vae對z增加了一些約束,即對編碼器增加了約束,要求:z滿足正態分佈

z~n(mean,var)

因為正態分佈需要確定mean和var,用神經網路去擬合比用一些傳統方法估計更加簡單,而且效果也不錯,所以選擇神經網路擬合確定mean和var。

p.s.:這裡得到z是因為(那個忘了怎麼讀的符號下面用e代替嘿嘿):

e~n(0,1)

z~n(mean,var)

(z-mean)/sqrt(var) ~ n(0,1)

所以 z = exp[log_sqrt(var)] * e + mean = exp(0.5 * log_var) * e+ mean

這裡e是隨機取樣的,這就可以保證潛在空間的連續性、良好的結構性。而這些特性使得潛在空間的每個方向都表示資料中有意義的變化方向。

(潛在空間指潛在向量z所在的空間)

損失函式是衡量模型優劣的主要指標,vae應從以下兩個方面衡量:

①生成的新影象與原影象的相似度

②隱含空間的分布與正態分佈的相似度

度量影象相似度一般採用交叉熵函式。

度量兩個分布的相似度一般採用kl散度。

(kl(p||q) = σp(xi)log(p(x1)/q(xi))= -h(p(x)) +[-σp(xi)log(q(xi))]= -h(p(x)) + [-h(p,q)])即等於p的熵和pq的交叉熵求和後取負值。

這兩個度量構成了vae的損失函式。

我們先看損失函式的python**:

def loss_function_original(recon_x, x, mu, lo**ar):

bce = f.binary_cross_entropy(recon_x, x.view(-1, 784), reduction='sum')

# 0.5 * sum(1 + log(sigma^2) - mu^2 - sigma^2)

kld = -0.5 * torch.sum(1 + lo**ar - mu.pow(2) - lo**ar.exp())

return bce + kld

注意,這裡由於要採用bce函式,即二分類的交叉熵,則需要將神經網路的輸出限制在【0,1】之間,所以需要加乙個sigmoid函式。損失函式的幾點可改變的地方:1.事實上,這裡的bce和kld是可以加上權重的,這樣可以來權衡重構和生成在該項任務裡的比例。2.bce可以換為l1或者l2 loss,l1效果會比l2好一點

3.如果不要kld項會怎麼樣?

即忽視了重構項,使得模型學到了一組完全隨機的標準正態分佈,即高斯雜訊。

實際上,在ae的基礎上通過encoder產生的向量,可以這麼理解:

假如在ae中,一張滿月的作為輸入,模型得到的輸出是一張滿月的;一張弦月的作為輸入,模型得到的是一張弦月的。當從滿月的code和弦月的code中間sample出乙個點,我們希望是一張介於滿月和弦月之間的,但實際上,對於ae我們沒辦法確定模型會輸出什麼樣的,因為我們並不知道模型從滿月的code到弦月的code發生了什麼變化。

而vae做的事情,實際上就是在原本滿月和弦月生成的code上面加了noise雜訊,即在某個數值區間內,每個點理論上都可以輸出滿月的;在某個數值區間內,每個點理論上都可以輸出弦月的,當調整這個noise的值的時候,也就是改變了這個數值區間,如下圖所示,當兩個區間出現重合的公共點,那麼理論上,這個點既應該像滿月,又應該像弦月,因此輸出的就應該兼具滿月和弦月的特點,也就生成一張介於滿月和弦月之間的月相,而這個月相,在原本的輸入中是不存在的,即生成了新的。

所以,vae通過神經網路學習來確定mean和var事實上就是在確定這個數值區間,即滿月編碼出來的潛在空間的數值區間和弦月編碼出來的潛在空間的數值區間,而在這兩個區間的交集,則即像滿月,又像弦月,就實現了生成這一功效。

再以人臉做以下比較:

ae就是將人臉編碼成幾個特徵(特徵提取),每個特徵都有乙個數值。

而vae則是將人臉編碼成幾個特徵,每個特徵都有乙個數值區間的分布

由PowerDesigner物理模型生成sql語句

tools execute commands edit run script 在開啟的視窗中 past 下面的 option explicit validationmode true interactivemode im batch dim mdl the current model get the...

由SSD到ScratchDet的模型變動小記

ssd 顧名思義就是 使用單個深層神經網路檢測影象中的多物件 該 主要貢獻在於提高了單次檢測器的速度和精度 使用了小卷積filter 特徵圖上固定的一組default box 的位置損失和置信度損失 從不用尺度的特徵圖得到不同尺度的 模型損失是位置損失 例如l1 和置信損失 例如softmax 之間...

AE三維模型處理

video copilot element 3d for mac是一款執行在mac平台上的ae三維模型外掛程式,element 3d mac破解版主要用於建立運動設計和視覺fx,video copilot element 3d for mac版提供組對稱建立模式 動態組資料夾反射 啞光反射模式等強大...