對似然函數(shù)感興趣的讀者,請參閱“馴估學”(上)
建模圖像茴恰,分布若何颠焦?
很多方法可以參數(shù)化圖像。例如往枣,3D場景投影(渲染)為2D可以表示圖像伐庭。或者分冈,將圖像參數(shù)化為向量化的草圖(如SVG圖形)或拉普拉斯金字塔圾另,甚至是機械臂的電機扭矩所途徑的軌跡。簡單起見丈秩,研究人員通常將圖像的似然函數(shù)盯捌,建立在RGB像素上的聯(lián)合分布上淳衙。RGB是一種通用數(shù)字格式蘑秽,已被證明能夠有效地捕獲可見電磁波譜。
每個RGB像素由uint8格式的無符號整數(shù)編碼箫攀,有256個可能的值肠牲。因此,一幅具有3072個像素的圖像靴跛,輔之以256個可能值缀雳,組合成個可能的存在狀態(tài)。由于這個數(shù)量是有限的梢睛,我們【在理論上】就可以使用一個的骰子來表示一幅圖像肥印。然而這個數(shù)字太大了识椰,無法在內(nèi)存中存儲。哪怕只有3個uint8編碼的像素深碱,聯(lián)合建模又可能的類別腹鹉,(對于即使是現(xiàn)代計算機來說也)是極為繁重的任務了。為了使計算易處理敷硅,我們必須將整個圖像的可能性“分解”為條件獨立的像素分布的組合功咒。一種簡單的因子分解方法如下,使每個像素的概率彼此獨立:
這也稱為平均場解碼器(請參閱此注釋绞蹦,其中名稱來自“均值 - 場”)力奋。每個像素都具有易處理的密度函數(shù)或質(zhì)量函數(shù)。
另一種選擇是令像素似然具有自回歸性幽七,其中每個條件分布具有易處理的密度函數(shù)或質(zhì)量函數(shù)景殷。
我們需要考慮如何為上式中每個條件分布建模。以下是一些常見的做法澡屡,以及使用過這些做法的文章:
- 1.每個通道都是伯努利分布(DRAW)
- 2.每個通道都是256個類別的分類分布(PixelRNN滨彻,Image Transformer)
- 3.實數(shù)化數(shù)據(jù)的連續(xù)概率密度(Real-NVP)
- 4.離散邏輯斯蒂混合分布(PixelCNN++,Image Transformer)
像素值作為伯努利分布的輸出概率
【注:“輸出概率”或“發(fā)射概率”挪蹭,在隨機過程中亭饵,與“轉(zhuǎn)移概率”相對×豪鳎“輸出概率”是當下時刻每個狀態(tài)的可能性辜羊,“轉(zhuǎn)移概率”是對于某狀態(tài)、其轉(zhuǎn)移到其他狀態(tài)的可能性词顾。在本文中八秃,輸出概率指伯努利分布的參數(shù),即一次伯努利實驗正面朝上的可能性肉盹∥羟】
在調(diào)試可能性模型時,先在MNIST上忍、FashionMNIST骤肛、NotMNIST數(shù)據(jù)集上實驗是不錯的選擇【, 因為】:
- 這些數(shù)據(jù)集可以完全存儲在計算機RAM中窍蓝;
- 它們不需要大量的網(wǎng)絡架構(gòu)調(diào)整(你可以只專注于算法方面)腋颠;
- 在這些數(shù)據(jù)集上訓練較小的生成模型,只需要普通的硬件設施吓笙,例如缺少GPU的筆記本電腦淑玫。
選擇伯努利隨機變量建模像素的條件似然是很常見的做法。 對于像素值只可能為0或1(正面還是反面)的二值化數(shù)據(jù),伯努利分布就夠用了絮蒿。
但是土涝,MNIST和幾個類似的數(shù)據(jù)庫毁嗦,往往被編碼為[0,1]范圍內(nèi)的浮點值。256個整數(shù)被歸一化為位于[0,1]之間的小數(shù)回铛。這就產(chǎn)生了一個數(shù)字表示問題狗准,因為伯努利分布不能在0到1之間采樣!
對于在非二值化MNIST上訓練的論文茵肃,我們須將編碼值解釋為相應伯努利變量的輸出概率腔长。如果我們看到像素值為0.9,則實際上表示該像素為1的伯努利似然參數(shù)是0.9验残,而不是樣本自己的采樣值是0.9捞附。 優(yōu)化目標是最小化預測概率分布的輸出概率(由一個標量參數(shù)控制)與數(shù)據(jù)中固有的輸出概率之間的交叉熵。 兩個伯努利的交叉熵用輸出概率可寫成:
根據(jù)本文前半部分的結(jié)論您没,最小化這種交叉熵會等價于最大化似然鸟召!這些玩具圖像數(shù)據(jù)集的平均對數(shù)似然(相對熵)通常以nat為單位報告在論文中。
DRAW論文(Gregor等人2015)將這一想法擴展到每通道顏色的建模氨鹏。 然而欧募,將彩色像素數(shù)據(jù)解釋為輸出概率存在嚴重的缺點。 【不加任何修正地使用伯努利分布的話仆抵,】當我們從生成模型中進行采樣時跟继,我們會得到雜亂、布滿斑點的圖像镣丑,而不是看起來像自然的連貫圖像舔糖。 下面這段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ù)據(jù)庫適用,但是不適用于更大規(guī)模的自然圖像趣竣。使用伯努利解碼器的論文通常會顯示輸出概率(例如在重建或插補任務中)而不是實際樣本摇庙。
像素值作為類別分布
較大的彩色圖像數(shù)據(jù)集(SVHN,CIFAR10期贫,CelebA跟匆,ImageNet)是以8位RGB格式編碼的(每個通道是一個uint8整數(shù)异袄,其值的范圍為0到255通砍,包括0和255)。
我們可以嘗試在圖像中實際uint8像素值上對分布進行建模,而不是將它們的像素值解釋為伯努利輸出概率封孙。 最簡單的選擇之一是256類的類別分布【離散的隨機變量迹冤,在有限多(K個)可能的類別中,依照各個類別具有的概率虎忌,落在其中某個類別上泡徙,所形成的分布】。
對于彩色圖像堪藐,通常報告各像素以2為底的對數(shù)(比特)為單位的交叉熵,而不是以e為底的對數(shù)挑围。如果測試集的圖像均為3072像素礁竞,平均似然的交叉熵(單位nats)為,“每像素比特數(shù)”為杉辙。
這個度量受到我們前面討論的啟發(fā)模捂,可類比于“平均似然壓縮比”:對于通常使用8位編碼的像素,我們可以使用生成式模型蜘矢,設計一種無損編碼方案(編碼的平均長度恰好等于熵)狂男,將整個數(shù)據(jù)集壓縮到平均像素位長為3【】。
在撰寫本文時品腹,Cifar10數(shù)據(jù)集上訓練的稀疏變換器(Sparse Transformers)的最佳生成式模型岖食,測試集上達到了每像素2.80比特的似然值。作為比較方案舞吭,PNG和WebP(廣泛使用的無損圖像壓縮算法)分別在Cifar10圖像上達到約5.87和4.61比特的水平(如果不計算像標題和CRC校驗和那樣的額外字節(jié)县耽,PNG格式可低至5.72比特/像素【bpp, bits per pixel】)。
這個結(jié)果令我們歡欣鼓舞镣典,這預示著利用機器學習我們可以設計出比現(xiàn)有壓縮方案更好的兔毙、對內(nèi)容有所感知、編碼又最短的方案兄春。高效的無損壓縮可用于改進哈希算法澎剥,使下載速度更快、改善縮放響應赶舆。最重要的是哑姚,所有這些技術(shù),今天都觸手可得芜茵。
像素值作為“隨機實數(shù)化”的連續(xù)密度分布
如果我們希望通過優(yōu)化連續(xù)密度模型(例如高斯混合模型)叙量,來最大化離散數(shù)據(jù)的對數(shù)似然,可能導致解的“退化”(degeneration)現(xiàn)象九串,最終得到模型給每個可能的離散值{0绞佩,...寺鸥,255}分配相同的可能性。 即使使用了無限充足的數(shù)據(jù)來訓練品山,該模型也可以通過簡單地“擠壓”尖峰胆建,收窄分布,來實現(xiàn)任意高的似然肘交。
【從馴估學(上)得到:
如果取離散值笆载,則當在離散值上等于,其余各處為0時涯呻,達到理論上的最小值凉驻。示意圖在下方左圖「垂蓿】
為了解決這個問題沿侈,常見的做法是將噪聲添加到整數(shù)像素值,來對數(shù)據(jù)進行“實數(shù)化”(De-Quantization)【譯者按:通行譯法是“反量化”或“解量化”市栗,但我覺得“實數(shù)化”更容易理解】缀拭。 這個操作寫為,其中來自均勻分布填帽。據(jù)我所知蛛淋,第一篇在密度建模中使用隨機實數(shù)化的文章是Uria等人的工作(2013年),奠基了Dinh等人在2014年和Salimans等人在2017的工作篡腌,以及建立在這三個工作之上的其他工作褐荷,從此隨機實數(shù)化成為實踐中的常見做法。
離散模型在一個個區(qū)間內(nèi)分配概率質(zhì)量(probability mass)嘹悼,而連續(xù)模型則【依據(jù)密度函數(shù)在區(qū)間的每個點上】分配密度叛甫。令的和分別表示真實數(shù)據(jù)分布的離散概率質(zhì)量和連續(xù)密度,并令的和代表模型對二者的估計杨伙。 我們將在下面推導出其监,依據(jù)實數(shù)化后的數(shù)據(jù),優(yōu)化其連續(xù)似然模型的密度函數(shù)限匣,可以得到優(yōu)化真實數(shù)據(jù)的離散概率質(zhì)量模型的下界抖苦。【原文符號寫錯了米死⌒坷】
將密度函數(shù)在區(qū)間上積分,可以得到密度函數(shù)的總質(zhì)量:
我們從真實數(shù)據(jù)分布中采樣峦筒,采樣噪聲樣本究西,得到。模型的目標是最大化下式中的似然函數(shù):
根據(jù)期望的定義:
展開被積函數(shù):
【物喷,因為只能取離散值卤材,】
根據(jù)Cauchy-Schwarz不等式:
代入密度函數(shù)的總質(zhì)量:
根據(jù)Jensen不等式:
代入密度函數(shù)的總質(zhì)量:
最近的一篇論文Flow ++中提出遮斥,使用學習的實數(shù)化隨機變量,可以改善變分上界的緊致性商膊。直觀理解伏伐,單個重要性采樣的導致的噪聲方差宠进,將小于均勻采樣在積分上導致的噪聲方差【晕拆,而較低的噪聲方差將是上限緊致的關(guān)鍵因素】。由于不同架構(gòu)選擇了迥異的實數(shù)化方案材蹬,所以這一系列工作之間不能以控制變量的方式來公平比較实幕。
【變分法形式化大致如下:
】
【為了公平】比較Flow ++和均勻采樣的實數(shù)化框架的生成模型,一種方法是允許研究人員在訓練時使用(他們喜歡的)任何一種變分下界堤器,但是在模型評估時將似然評估的值昆庇,統(tǒng)一換算成多個樣本的緊密下界。直觀理解闸溃,當整合了更多樣本后整吆,我們的估計模型可以更好地逼近相應離散模型的真實對數(shù)似然。
例如辉川,我們可以報告從固定的采樣得到的實數(shù)化分布的多樣本下界表蝙,就像VAE文獻中通常所做的那樣,給出的多樣本IWAE下界乓旗。有關(guān)VAE和IWAE變分下界的討論超出了本教程的范圍府蛇,我會在將來單獨介紹。
【關(guān)于圖像的討論還未結(jié)束屿愚,另外對標準化流也將在“馴估學”(下)中繼續(xù)汇跨。請接著讀下去,加油妆距!】