對似然函數(shù)感興趣的讀者,請參閱“馴估學(xué)”(上)
建模圖像,分布若何?
很多方法可以參數(shù)化圖像。例如,3D場景投影(渲染)為2D可以表示圖像?;蛘?,將圖像參數(shù)化為向量化的草圖(如SVG圖形)或拉普拉斯金字塔,甚至是機(jī)械臂的電機(jī)扭矩所途徑的軌跡。簡單起見,研究人員通常將圖像的似然函數(shù),建立在RGB像素上的聯(lián)合分布上。RGB是一種通用數(shù)字格式,已被證明能夠有效地捕獲可見電磁波譜。
每個RGB像素由uint8格式的無符號整數(shù)編碼,有256個可能的值。因此,一幅具有3072個像素的圖像,輔之以256個可能值,組合成個可能的存在狀態(tài)。由于這個數(shù)量是有限的,我們【在理論上】就可以使用一個
的骰子來表示一幅圖像。然而這個數(shù)字太大了,無法在內(nèi)存中存儲。哪怕只有3個uint8編碼的像素,聯(lián)合建模又
可能的類別,(對于即使是現(xiàn)代計(jì)算機(jī)來說也)是極為繁重的任務(wù)了。為了使計(jì)算易處理,我們必須將整個圖像的可能性“分解”為條件獨(dú)立的像素分布的組合。一種簡單的因子分解方法如下,使每個像素的概率彼此獨(dú)立:
這也稱為平均場解碼器(請參閱此注釋,其中名稱來自“均值 - 場”)。每個像素都具有易處理的密度函數(shù)或質(zhì)量函數(shù)。
另一種選擇是令像素似然具有自回歸性,其中每個條件分布具有易處理的密度函數(shù)或質(zhì)量函數(shù)。
我們需要考慮如何為上式中每個條件分布建模。以下是一些常見的做法,以及使用過這些做法的文章:
- 1.每個通道都是伯努利分布(DRAW)
- 2.每個通道都是256個類別的分類分布(PixelRNN,Image Transformer)
- 3.實(shí)數(shù)化數(shù)據(jù)的連續(xù)概率密度(Real-NVP)
- 4.離散邏輯斯蒂混合分布(PixelCNN++,Image Transformer)
像素值作為伯努利分布的輸出概率
【注:“輸出概率”或“發(fā)射概率”,在隨機(jī)過程中,與“轉(zhuǎn)移概率”相對?!拜敵龈怕省笔钱?dāng)下時刻每個狀態(tài)的可能性,“轉(zhuǎn)移概率”是對于某狀態(tài)、其轉(zhuǎn)移到其他狀態(tài)的可能性。在本文中,輸出概率指伯努利分布的參數(shù),即一次伯努利實(shí)驗(yàn)正面朝上的可能性?!?/p>
在調(diào)試可能性模型時,先在MNIST、FashionMNIST、NotMNIST數(shù)據(jù)集上實(shí)驗(yàn)是不錯的選擇【, 因?yàn)椤浚?/p>
- 這些數(shù)據(jù)集可以完全存儲在計(jì)算機(jī)RAM中;
- 它們不需要大量的網(wǎng)絡(luò)架構(gòu)調(diào)整(你可以只專注于算法方面);
- 在這些數(shù)據(jù)集上訓(xùn)練較小的生成模型,只需要普通的硬件設(shè)施,例如缺少GPU的筆記本電腦。
選擇伯努利隨機(jī)變量建模像素的條件似然是很常見的做法。 對于像素值只可能為0或1(正面還是反面)的二值化數(shù)據(jù),伯努利分布就夠用了。

但是,MNIST和幾個類似的數(shù)據(jù)庫,往往被編碼為[0,1]范圍內(nèi)的浮點(diǎn)值。256個整數(shù)被歸一化為位于[0,1]之間的小數(shù)。這就產(chǎn)生了一個數(shù)字表示問題,因?yàn)椴植疾荒茉?到1之間采樣!
對于在非二值化MNIST上訓(xùn)練的論文,我們須將編碼值解釋為相應(yīng)伯努利變量的輸出概率。如果我們看到像素值為0.9,則實(shí)際上表示該像素為1的伯努利似然參數(shù)是0.9,而不是樣本自己的采樣值是0.9。 優(yōu)化目標(biāo)是最小化預(yù)測概率分布的輸出概率(由一個標(biāo)量參數(shù)控制)與數(shù)據(jù)中固有的輸出概率之間的交叉熵。 兩個伯努利的交叉熵用輸出概率可寫成:
根據(jù)本文前半部分的結(jié)論,最小化這種交叉熵會等價于最大化似然!這些玩具圖像數(shù)據(jù)集的平均對數(shù)似然(相對熵)通常以nat為單位報告在論文中。
DRAW論文(Gregor等人2015)將這一想法擴(kuò)展到每通道顏色的建模。 然而,將彩色像素數(shù)據(jù)解釋為輸出概率存在嚴(yán)重的缺點(diǎn)。 【不加任何修正地使用伯努利分布的話,】當(dāng)我們從生成模型中進(jìn)行采樣時,我們會得到雜亂、布滿斑點(diǎn)的圖像,而不是看起來像自然的連貫圖像。 下面這段Python代碼,可以重現(xiàn)這個問題:
import tensorflow_datasets as tfds
import numpy as np
import matplotlib.pyplot as plt
builder = tfds.builder("cifar10")
builder.download_and_prepare()
datasets = builder.as_dataset()
np_datasets = tfds.as_numpy(datasets)
img = next(np_datasets['train'])['image']
sample = np.random.binomial(1,p=img.astype(np.float32)/256)
fig, arr = plt.subplots(1, 2)
arr[0].imshow(img)
arr[1].imshow((sample*255).astype(np.uint8))

將像素值解釋為“輸出概率”會產(chǎn)生不合實(shí)際的樣本。這樣做雖然對于手寫數(shù)字和小數(shù)據(jù)庫適用,但是不適用于更大規(guī)模的自然圖像。使用伯努利解碼器的論文通常會顯示輸出概率(例如在重建或插補(bǔ)任務(wù)中)而不是實(shí)際樣本。
像素值作為類別分布
較大的彩色圖像數(shù)據(jù)集(SVHN,CIFAR10,CelebA,ImageNet)是以8位RGB格式編碼的(每個通道是一個uint8整數(shù),其值的范圍為0到255,包括0和255)。
我們可以嘗試在圖像中實(shí)際uint8像素值上對分布進(jìn)行建模,而不是將它們的像素值解釋為伯努利輸出概率。 最簡單的選擇之一是256類的類別分布【離散的隨機(jī)變量,在有限多(K個)可能的類別中,依照各個類別具有的概率,落在其中某個類別上,所形成的分布】。

對于彩色圖像,通常報告各像素以2為底的對數(shù)(比特)為單位的交叉熵,而不是以e為底的對數(shù)。如果測試集的圖像均為3072像素,平均似然的交叉熵(單位nats)為,“每像素比特數(shù)”為。
這個度量受到我們前面討論的啟發(fā),可類比于“平均似然壓縮比”:對于通常使用8位編碼的像素,我們可以使用生成式模型,設(shè)計(jì)一種無損編碼方案(編碼的平均長度恰好等于熵),將整個數(shù)據(jù)集壓縮到平均像素位長為3【】。
在撰寫本文時,Cifar10數(shù)據(jù)集上訓(xùn)練的稀疏變換器(Sparse Transformers)的最佳生成式模型,測試集上達(dá)到了每像素2.80比特的似然值。作為比較方案,PNG和WebP(廣泛使用的無損圖像壓縮算法)分別在Cifar10圖像上達(dá)到約5.87和4.61比特的水平(如果不計(jì)算像標(biāo)題和CRC校驗(yàn)和那樣的額外字節(jié),PNG格式可低至5.72比特/像素【bpp, bits per pixel】)。
這個結(jié)果令我們歡欣鼓舞,這預(yù)示著利用機(jī)器學(xué)習(xí)我們可以設(shè)計(jì)出比現(xiàn)有壓縮方案更好的、對內(nèi)容有所感知、編碼又最短的方案。高效的無損壓縮可用于改進(jìn)哈希算法,使下載速度更快、改善縮放響應(yīng)。最重要的是,所有這些技術(shù),今天都觸手可得。
像素值作為“隨機(jī)實(shí)數(shù)化”的連續(xù)密度分布
如果我們希望通過優(yōu)化連續(xù)密度模型(例如高斯混合模型),來最大化離散數(shù)據(jù)的對數(shù)似然,可能導(dǎo)致解的“退化”(degeneration)現(xiàn)象,最終得到模型給每個可能的離散值{0,...,255}分配相同的可能性。 即使使用了無限充足的數(shù)據(jù)來訓(xùn)練,該模型也可以通過簡單地“擠壓”尖峰,收窄分布,來實(shí)現(xiàn)任意高的似然。
【從馴估學(xué)(上)得到:
如果取離散值,則當(dāng)
在離散值上等于
,其余各處為0時,
達(dá)到理論上的最小值。示意圖在下方左圖。】

為了解決這個問題,常見的做法是將噪聲添加到整數(shù)像素值,來對數(shù)據(jù)進(jìn)行“實(shí)數(shù)化”(De-Quantization)【譯者按:通行譯法是“反量化”或“解量化”,但我覺得“實(shí)數(shù)化”更容易理解】。 這個操作寫為,其中來自均勻分布。據(jù)我所知,第一篇在密度建模中使用隨機(jī)實(shí)數(shù)化的文章是Uria等人的工作(2013年),奠基了Dinh等人在2014年和Salimans等人在2017的工作,以及建立在這三個工作之上的其他工作,從此隨機(jī)實(shí)數(shù)化成為實(shí)踐中的常見做法。
離散模型在一個個區(qū)間內(nèi)分配概率質(zhì)量(probability mass),而連續(xù)模型則【依據(jù)密度函數(shù)在區(qū)間的每個點(diǎn)上】分配密度。令的和
分別表示真實(shí)數(shù)據(jù)分布的離散概率質(zhì)量和連續(xù)密度,并令
的和
代表模型對二者的估計(jì)。 我們將在下面推導(dǎo)出,依據(jù)實(shí)數(shù)化后的數(shù)據(jù)
,優(yōu)化其連續(xù)似然模型的密度函數(shù)
,可以得到優(yōu)化真實(shí)數(shù)據(jù)的離散概率質(zhì)量模型
的下界。【原文符號寫錯了?!?/p>
將密度函數(shù)在區(qū)間上積分,可以得到密度函數(shù)的總質(zhì)量:
我們從真實(shí)數(shù)據(jù)分布中采樣,采樣噪聲樣本
,得到
。模型的目標(biāo)是最大化下式中的似然函數(shù):
根據(jù)期望的定義:
展開被積函數(shù):
【,因?yàn)?img class="math-inline" src="https://math.jianshu.com/math?formula=x" alt="x" mathimg="1">只能取離散值,
】
根據(jù)Cauchy-Schwarz不等式:
代入密度函數(shù)的總質(zhì)量:
根據(jù)Jensen不等式:
代入密度函數(shù)的總質(zhì)量:
最近的一篇論文Flow ++中提出,使用學(xué)習(xí)的實(shí)數(shù)化隨機(jī)變量,可以改善變分上界的緊致性。直觀理解,單個重要性采樣的導(dǎo)致的噪聲方差,將小于均勻采樣
在積分
上導(dǎo)致的噪聲方差【,而較低的噪聲方差將是上限緊致的關(guān)鍵因素】。由于不同架構(gòu)選擇了迥異的實(shí)數(shù)化方案,所以這一系列工作之間不能以控制變量的方式來公平比較。
【變分法形式化大致如下:
】
【為了公平】比較Flow ++和均勻采樣的實(shí)數(shù)化框架的生成模型,一種方法是允許研究人員在訓(xùn)練時使用(他們喜歡的)任何一種變分下界,但是在模型評估時將似然評估的值,統(tǒng)一換算成多個樣本的緊密下界。直觀理解,當(dāng)整合了更多樣本后,我們的估計(jì)模型可以更好地逼近相應(yīng)離散模型的真實(shí)對數(shù)似然。
例如,我們可以報告從固定的采樣得到的實(shí)數(shù)化分布的多樣本下界,就像VAE文獻(xiàn)中通常所做的那樣,給出的多樣本IWAE下界。有關(guān)VAE和IWAE變分下界的討論超出了本教程的范圍,我會在將來單獨(dú)介紹。
【關(guān)于圖像的討論還未結(jié)束,另外對標(biāo)準(zhǔn)化流也將在“馴估學(xué)”(下)中繼續(xù)。請接著讀下去,加油!】