要講擴(kuò)散模型,不得不提VAE。VAE和GAN一樣,都是從隱變量
Z
Z
Z生成目標(biāo)數(shù)據(jù)
X
X
X。
它們假設(shè)隱變量服從某種常見的概率分布(比如正態(tài)分布),然后希望訓(xùn)練一個模型
X
=
g
(
Z
)
X=g(Z)
X=g(Z),這個模型將原來的概率分布映射到訓(xùn)練集的概率分布,也就是分布的變換
。注意,VAE和GAN的本質(zhì)都是概率分布的映射
。
tip:
關(guān)于隱變量解釋:
換句話說,大致意思就是先用某種分布隨機(jī)生成一組隱變量,然后這個隱變量會經(jīng)過一個生成器生成一組目標(biāo)數(shù)據(jù)。VAE和GAN都希望這組數(shù)據(jù)的分布
X
^
\hat{X}
X^和目標(biāo)分布
X
X
X盡量接近
。
但是這種方法本質(zhì)上是難以實現(xiàn),因為“盡量接近”并沒有一個確定的關(guān)于 X ^ \hat{X} X^和 X X X的相似度的評判標(biāo)準(zhǔn)。換句話說,這種方法的難度就在于,必須去猜測“它們的分布相等嗎”這個問題,而缺少真正interpretable的價值判斷。
兩個已知的概率分布求相似度的
,而
X
^
\hat{X}
X^和
X
X
X的概率分布目前都是未知。GAN的做法就是直接把這個度量標(biāo)準(zhǔn)也學(xué)過來就行
,相當(dāng)生猛。但是這樣做的問題在于依然不interpretable,非常不優(yōu)雅。VAE的做法就優(yōu)雅很多了,我們先來看VAE是怎么做的,理解了VAE以后再去理解Diffussion就很自然了。
隱變量
Z
Z
Z,這東西可以生成
Z
Z
Z。不妨假設(shè)
Z
Z
Z滿足正態(tài)分布,那就可以先從正態(tài)分布里面隨便取一個
Z
Z
Z,,然后用
Z
Z
Z和
X
X
X的關(guān)系算出
P
(
X
)
P(X)
P(X),公式:
P
(
X
)
=
∑
Z
P
(
X
∣
Z
)
P
(
Z
)
P(X)=\sum_ZP(X|Z)P(Z)
P(X)=Z∑?P(X∣Z)P(Z)在整個 VAE 模型中,我們并沒有去使用
P
(
Z
)
P(Z)
P(Z)(先驗分布,隱變量空間的分布)是正態(tài)分布的假設(shè),我們用的是假設(shè)
P
(
Z
∣
X
)
P(Z|X)
P(Z∣X)(后驗分布)是正態(tài)分布。
具體來說,給定一個真實樣本
X
k
X_k
Xk?,我們假設(shè)存在一個專屬于
X
k
X_k
Xk?的分布
P
(
Z
∣
X
k
)
P(Z|X_k)
P(Z∣Xk?)(后驗分布),并進(jìn)一步假設(shè)這個分布是(獨立的、多元的)正態(tài)分布。
為什么要強(qiáng)調(diào)“專屬”呢?
這時,每一個 X k X_k Xk?都配上了一個專屬的正態(tài)分布,,才方便后面的生成器做還原。但這樣有多少個 X X X就有多少個正態(tài)分布了( k k k個 X X Xsample,就有 k k k個正態(tài)分布 P ( X k ∣ Z ) P(X_k|Z) P(Xk?∣Z))。
我們知道正態(tài)分布有兩組參數(shù):均值
μ
μ
μ和方差
σ
2
σ_2
σ2?(多元的話,它們都是向量),那怎么找出專屬于
X
k
X_k
Xk?的正態(tài)分布
P
(
Z
∣
X
k
)
P(Z|X_k)
P(Z∣Xk?)的均值和方差呢?好像并沒有什么直接的思路。那好吧,那我就用神經(jīng)網(wǎng)絡(luò)來擬合出來吧!這就是神經(jīng)網(wǎng)絡(luò)時代的哲學(xué):難算的我們都用神經(jīng)網(wǎng)絡(luò)來擬合。
于是我們構(gòu)建兩個神經(jīng)網(wǎng)絡(luò)
μ
k
=
f
1
(
X
k
)
,
log
?
σ
k
2
=
f
2
(
X
k
)
μ_k=f_1(X_k),\logσ^2_k=f_2(X_k)
μk?=f1?(Xk?),logσk2?=f2?(Xk?)來算它們了,。我們選擇擬合
log
?
σ
k
2
\logσ^2_k
logσk2?而不是直接擬合
σ
k
2
σ^2_k
σk2?,是因為
σ
k
2
σ^2_k
σk2?總是非負(fù)的,需要加激活函數(shù)處理,而擬合
log
?
σ
k
2
\logσ^2_k
logσk2?不需要加激活函數(shù),因為它可正可負(fù)。
到這里,就能知道專屬于
X
k
X_k
Xk?的均值和方差了,也就知道它的正態(tài)分布長什么樣了,然后從這個專屬分布中采樣一個
Z
k
Z_k
Zk?出來,然后經(jīng)過一個生成器得到
X
^
k
=
g
(
Z
k
)
\hat{X}_k=g(Z_k)
X^k?=g(Zk?),現(xiàn)在我們可以放心地最小化
D
(
X
^
k
,
X
k
)
2
D(\hat{X}_k,X_k)^2
D(X^k?,Xk?)2,因為
Z
k
Z_k
Zk?是從專屬
X
k
X_k
Xk?的分布中采樣出來的,這個生成器應(yīng)該要把開始的
X
k
X_k
Xk?還原回來。
圖中均值方差計算模塊就是兩個神經(jīng)網(wǎng)絡(luò): μ k = f 1 ( X k ) , log ? σ k 2 = f 2 ( X k ) μ_k=f_1(X_k),\logσ^2_k=f_2(X_k) μk?=f1?(Xk?),logσk2?=f2?(Xk?)
均值和方差的計算本質(zhì)上都是encoder,VAE其實利用了兩個encoder去分別學(xué)習(xí)均值和方差
生成器是通過最小化 D ( X ^ k , X k ) 2 D(\hat{X}_k,X_k)^2 D(X^k?,Xk?)2來訓(xùn)練的,最終會使得 X k X_k Xk?和 X ^ k \hat{X}_k X^k?趨向一致
因為 Z k Z_k Zk?是通過重新采樣過的,,而不是直接通過均值和方差encoder算出來的,所以這個生成器的輸入 Z Z Z是有噪聲的,也就是重構(gòu)過程受噪聲影響
顯然噪聲會增加重構(gòu)的難度,不過好在這個噪聲強(qiáng)度(也就是方差決定的)通過一個神經(jīng)網(wǎng)絡(luò)算出來的,所以最終模型為了重構(gòu)得更好(也就是最終會使得
X
k
X_k
Xk?和
X
^
k
\hat{X}_k
X^k?趨向一致),肯定會想盡辦法讓方差為
0
0
0。而方差為
0
0
0的話
,也就沒有隨機(jī)性了,所以不管怎么采樣其實都只是得到確定的結(jié)果(也就是均值,根據(jù)方差公式就可以得出每個采樣都是均值)
,只擬合一個當(dāng)然比擬合多個要容易,而均值是通過另外一個神經(jīng)網(wǎng)絡(luò)算出來的,模型則會慢慢退化成普通的AutoEncoder,噪聲不再起作用
,VAE就變成AE了
VAE就是讓所有的 P ( Z ∣ X ) P(Z|X) P(Z∣X)趨于標(biāo)準(zhǔn)的正態(tài)分布 N ( 0 , I ) N(0,I) N(0,I),這樣就防止了噪聲為零,同時保證了模型具有生成能力。
怎么理解“保證了生成能力”呢?
這樣我們的先驗假設(shè)得證:
P
(
Z
)
P(Z)
P(Z)是標(biāo)準(zhǔn)的正態(tài)分布。然后就可以從
N
(
0
,
I
)
N(0,I)
N(0,I)中采樣來生成圖像了
那怎么讓所有的 p ( Z ∣ X ) p(Z|X) p(Z∣X)都向 N ( 0 , I ) N(0,I) N(0,I)看齊呢?
不過,這又會面臨著這兩個損失的比例要怎么選取的問題,選取得不好,生成的圖像會比較模糊。所以,原論文直接算了一般(各分量獨立的)正態(tài)分布與標(biāo)準(zhǔn)正態(tài)分布的KL散度
K
L
(
N
(
μ
,
σ
2
)
∥
N
(
0
,
I
)
)
KL(N(μ,σ^2)∥N(0,I))
KL(N(μ,σ2)∥N(0,I))作為這個額外的loss,計算結(jié)果為:
KaTeX parse error: No such environment: equation at position 7: \begin{?e?q?u?a?t?i?o?n?}? \begin{aligned…
下面分別里面的三項:
即 L o s s μ , σ 2 = 1 2 ∑ i = 1 d ( ? log ? σ i 2 + μ i 2 + σ i 2 ? 1 ) Loss_{μ,σ^2} = \frac{1}{2} \sum_{i=1}^squ6kqw(-\log \sigma_i^2 + \mu_i^2 + \sigma_i^2-1) Lossμ,σ2?=21?i=1∑d?(?logσi2?+μi2?+σi2??1)
這里的
d
d
d是隱變量
Z
Z
Z的維度,而
μ
i
μ_i
μi?和
σ
i
2
σ^2_i
σi2?分別代表一般正態(tài)分布的均值向量和方差向量的第
i
i
i個分量。直接用這個式子做補(bǔ)充
l
o
s
s
loss
loss,就不用考慮均值損失和方差損失的相對比例問題了。顯然,這個
l
o
s
s
loss
loss也可以分兩部分理解:
L
o
s
s
μ
,
σ
2
=
L
μ
+
L
σ
2
Loss_{μ,σ^2}= L_\mu +L_\sigma^2
Lossμ,σ2?=Lμ?+Lσ2?
L
μ
=
1
2
∑
i
=
1
d
=
1
2
∥
f
1
(
X
)
∥
2
L_\mu=\frac{1}{2}\sum_{i=1}^squ6kqw=\frac{1}{2}∥f_1(X)∥^2
Lμ?=21?i=1∑d?=21?∥f1?(X)∥2
L
σ
2
=
1
2
∑
i
=
1
d
(
?
log
?
σ
i
2
+
σ
i
2
?
1
)
L_\sigma^2=\frac{1}{2}\sum_{i=1}^squ6kqw\left(-\log \sigma_i^2 + \sigma_i^2-1\right)
Lσ2?=21?i=1∑d?(?logσi2?+σi2??1)
VAE的本質(zhì)是什么?
在VAE中,它的Encoder有兩個,一個用來計算均值,一個用來計算方差,這已經(jīng)讓人意外了:Encoder不是用來Encode的,是用來算均值和方差的,還是用神經(jīng)網(wǎng)絡(luò)計算的
它本質(zhì)上就是在我們常規(guī)的自編碼器的基礎(chǔ)上,對encoder的結(jié)果(在VAE中對應(yīng)著計算均值的網(wǎng)絡(luò))加上了“高斯噪聲”(正態(tài)分布的隨機(jī)采樣),使得結(jié)果decoder能夠?qū)υ肼曈恤敯粜?;而那個額外的KL loss(目的是讓均值為0,方差為1),事實上就是相當(dāng)于對encoder的一個正則項,希望encoder出來的東西均有零均值
,為了防止噪聲消失,將所有$P(Z|X)$趨近于標(biāo)準(zhǔn)正態(tài)分布,將encoder的均值盡量降為 0,而將方差盡量保持住。這樣一來,當(dāng)decoder訓(xùn)練的不好的時候,整個體系就可以降低噪聲;當(dāng)decoder逐漸擬合的時候,就會增加噪聲。
那另外一個encoder(對應(yīng)著計算方差的網(wǎng)絡(luò))的作用呢?它是用來動態(tài)調(diào)節(jié)噪聲的強(qiáng)度的。直覺上來想,當(dāng)decoder還沒有訓(xùn)練好時(重構(gòu)誤差遠(yuǎn)大于KL loss),就會適當(dāng)降低噪聲(KL loss增加),使得擬合起來容易一些(重構(gòu)誤差開始下降);反之,如果decoder訓(xùn)練得還不錯時(重構(gòu)誤差小于KL loss),這時候噪聲就會增加(KL loss減少),使得擬合更加困難了(重構(gòu)誤差又開始增加),這時候decoder就要想辦法提高它的生成能力了
。
我們希望X經(jīng)過編碼后,Z的分布都具有零均值和單位方差,這個“希望”是通過加入了KL loss來實現(xiàn)的,如果現(xiàn)在多了類別信息Y,我們可以希望同一個類的樣本都有一個專屬的均值
μ
Y
μ^Y
μY(方差不變,還是單位方差),這個
μ
Y
μ^Y
μY讓模型自己訓(xùn)練出來。這樣的話,有多少個類就有多少個正態(tài)分布,而在生成的時候,我們就可以通過控制均值來控制生成圖像的類別。事實上,這樣可能也是在VAE的基礎(chǔ)上加入最少的代碼來實現(xiàn)CVAE的方案了,因為這個“新希望”也只需通過修改KL loss實現(xiàn):
L
o
s
s
μ
,
σ
2
=
1
2
∑
i
=
1
d
(
?
log
?
σ
i
2
+
(
μ
i
?
μ
i
Y
)
2
+
σ
i
2
?
1
)
Loss_{μ,σ^2} = \frac{1}{2} \sum_{i=1}^squ6kqw(-\log \sigma_i^2 + (\mu_i-\mu_i^Y)^2 + \sigma_i^2-1)
Lossμ,σ2?=21?i=1∑d?(?logσi2?+(μi??μiY?)2+σi2??1)
蘇劍林
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧