最近在研究編碼器,閱讀大量論文,歷程艱辛,特此記錄。如果博文有不妥之處,請告知,我一定及時修正!
AE分為兩個部分:編碼器和解碼器。編碼器可以是任意模型,現在一般都使用卷積神經網路。輸入一張圖片經過編碼器得到潛變數 ,類似於降維,得到這張圖片的主要成分,然後再通過解碼網路進行恢復出原圖,所以判斷編碼和解碼網路好壞的 。
那這個降維得到的潛變數代表什麼意思呢?以MNIST為例, 潛變數$Z$就是一個內在的變數, 它在這張圖片生成之前先決定了要生成哪一張,這就是 。比如輸入一張數字 「7」圖片,寫這個數字需要什麼元素呢?需要一橫一豎,橫豎之間需要一定的角度。這些元素就是該數字的潛變數。單個潛變數元素分析是沒有意義的,也是未知的,稍微改變這個潛變數或者不改變,都能得到數字 「7」,只不過會有偏移,比如粗細,胖瘦,傾斜角度。
對於AE,AE中學習的是 和 ,只能從一個 ,得到對應的重構 。但是無法生成新的樣本。重建一張圖片是沒有什麼問題的,但是生成呢?AE無法無輸入有效生成,我們無法去構造隱藏向量,因為我們是通過一張圖片輸入編碼得到隱向量的。
那生成如何解決呢?這時候就出現了VAE,簡單的說就在編碼過程給它增加一些限制,迫使其生成的隱含向量能夠粗略的遵循一個標準正態分佈。
VAE結構圖:
設輸入的數據為 ,其分佈為 ,這個分佈是未知的,難採樣,所以把 改下:
其中 表示用 來表示 的模型。假設最後得到的這個潛變數 服從正態分佈,也就是 。如果滿足這個條件,我們就可以從滿足正態分佈的雜訊裏採樣,得到新的樣本。(上述公式可以看成生成便於我們理解)
那麼上面的公式目的就修改成為:(下面可以看成編碼來看)
如果我們繼續假設 為正態分佈 ,那麼上述公式就變為: 這就可以啦!
這就是下面這張圖的思路:
這裡我們可以看出每一個樣本,都有其專屬的正態分佈。那麼有超多的樣本,就有超多的專屬分佈。正態分佈的兩組參數(均值 ,方差 )(所以這邊是個向量)。
裡面是使用神經網路來計算均值和方差,詳細可以看代碼。為什麼要使用均值和方差?因為:從 中採樣一個 出來,這個 是正態分佈,需要可導便於反向傳播。所以利用均值方差,因為均值和方差是靠模型算出來的,這邊利用了一個事實:
採樣一個 ,相當與從 採樣一個 ,然後讓 。 這就是論文中所說的:重參數技巧。
那下面這種圖裡面為什麼要將 像標準正態看齊呢?
我個人的理解是: 中, 為圓點, 為半徑畫空間。這裡為啥要 不為0,目的是防止了雜訊為零,同時保證了模型具有生成能力。拿大牛的解釋是:VAE本質上就是在常規的自編碼器的基礎上,對 的結果(在VAE中對應著計算均值的網路)加上了「高斯雜訊」,使得結果 能夠對雜訊有魯棒性;那另外一個 (計算方差的網路)的作用呢?用來動態調節雜訊的強度。
而怎麼將 逼近 ,論文中使用的是 散度。 這個我前面的博客介紹了:(https://blog.csdn.net/qq_33948796/article/details/88723125)
總結一下: 從圖像中採樣,產生 的概率分佈, 在 中採樣該點,然後返回一個生成的圖像。所以對於一張給定的圖像來說, 產生一個分佈,在 中該分佈中採樣出一個點出來,然後將該點輸入到 當中,產生一個圖像。
上述生成是不能控制的,但是現實中很多情況往往是希望能夠實現控制某個變數來實現生成某一類圖像。CVAE可以實現這個:
訓練的時候,輸入給 和 的圖像對應的數字是給定的。在這種情況下,這個標籤被表示成 。
推薦閱讀: