Sora的前世今生:從文生圖到文生視頻

作者:monychen

最近AI圈內乃至整個科技圈最爆的新聞莫過於OpenAI的Sora了,感覺熱度甚至遠超之前ChatGPT發佈時的熱度。OpenAI也是放出了Sora的技術報告(有一定的信息量,也留下了大量的想象空間)。

技術報告傳送門:

今天就來嘗試聊一下Sora的前世今生,歡迎交流討論批評指正!

無論是文生圖還是文生視頻,很多這方面的工作其實都可以看成是自編碼器的進階版本,讓我們從自編碼器開始入手。

自編碼器(Autoencoder):壓縮大於生成

自編碼器由編碼器和解碼器兩個部分構成

編碼器負責學習輸入到編碼的映射 ,將高維輸入(例如圖片)轉化爲低維編碼

解碼器則學習編碼到輸出的映射 ,將這些低維編碼還原爲高維輸出(例如重構的圖片)

我們希望壓縮前和還原後的向量儘可能相似(比如讓它們的平均平方誤差MSE儘可能小)

這樣就能讓神經網絡學會使用低維編碼表徵原始的高維向量(例如圖片)。

那有了自編碼器能夠做生成嗎,答案是可以的,只要留下解碼器,我隨便喂入一個低維編碼,不就能夠得到一個生成的高維向量了(例如圖片)。(當然,這裡可能生成一起奇奇怪怪的東西,因爲這裡對低維向量沒有做出約束,自編碼器通過將圖片轉化爲數值編碼再還原回圖片的過程,可能導致對訓練數據過擬合。結果就是,對於未見過的低維編碼,解碼器重構的圖片質量通常不佳。因此自編碼器更多用於數據壓縮。)

變分自編碼器(Variational Autoencoders):邁向更魯棒地生成

自編碼器不擅長圖片生成是因爲過擬合,那如果能夠解決過擬合問題,不就能拿來生成圖片了!

變分自編碼器做的就是這麼一件事:既然自編碼器將圖片編碼爲確定性的數值編碼會導致過擬合,變分自編碼器就將圖片編碼爲一個具有隨機性的概率分佈,比如標準正態分佈。 這樣當模型訓練好後,我們只要給解碼器喂入採樣自標準正態分佈的低維向量,就能夠生成較爲“真實”的圖片了。

因此,變分自編碼器除了希望編碼前和解碼後的樣本儘可能相似(MSE儘可能小),還希望用於解碼的數據服從標準正態分佈,也就是低維編碼的分佈和標準正態分佈的KL散度儘可能小,損失函數加上這麼一項約束。

變分自編碼器減輕了自編碼器過擬合的問題,也確實能夠用來做圖片的生成了,但是大家會發現用它生成圖片通常會比較模糊。可以這樣想一下,變分自編碼器的編碼器和解碼器都是一個神經網絡,編碼過程和解碼過程都是一步就到位了,一步到位可能帶來的問題就是建模概率分佈的能力有限/或者說能夠對圖片生成過程施加的約束是有限的/或者說“可控性”是比較低的。

去噪擴散概率模型(DDPM):慢工出細活

既然變分自編碼器一步到位的編解碼方式可能導致生成圖片的效果不太理想,DDPM就考慮拆成多步來做,它將編碼過程和解碼過程分解爲多步:

編碼過程

解碼過程

因此,所謂的擴散模型由兩個階段構成

前向擴散過程,比如給定一張照片,不斷(也就是多步)往圖片上添加噪聲,直到最後這樣圖片看上去什麼都不是(就是個純噪聲)

反向去噪過程,給定噪聲,不斷執行去噪的這一操作,最終得到一張“真實好看”的照片

下圖中從右往左就是前向擴散的過程,從左往右就是反向去噪的過程

可以看到每一步的下標有一個 , 的範圍從 到 , 代表從數據集中採樣出一張圖片 ,前向過程在每一步從高斯分佈中採樣出噪聲疊加到 時刻的圖像上,當 足夠大時,最終會得到一個各向同性的高斯分佈 (球形高斯分佈,也就是各個方向方差都一樣的多維高斯分佈)。

DDPM通過多步迭代生成得到圖片緩解了變分自編碼器生成圖片模糊的問題,但是由於多步去噪過程需要對同一尺寸的圖片數據進行操作,也就導致了越大的圖片需要的計算資源越多(原來只要處理一次,現在有幾步就要處理幾次)。

DDPM細節推導(選讀)

下面從數學一點的角度對DDPM進行介紹,不感興趣的同學可以直接跳過

假設原始數據的分佈爲 ,從數據集中拿出一張圖片就類似於從原始數據分佈中進行採樣 ,進一步可以定義第 步的前向擴散過程爲

其中 是第 步的方差, 且服從一個指定的變化規律(schedule),比如可以是線性變化、二次變換、或者按照正餘弦的方式進行變化(有點類似於學習率變化的那種意思)。

有了 後,根據前向擴散過程的條件分佈,我們可以通過從高斯分佈中採樣得到

其中 .

PS:爲什麼均值前面有個係數?其實是爲了保證條件概率具有單位方差。

根據前向擴散這個條件分佈,我們還可以將其一步一步展開來看 和 的關係,比如將

代入

可以得到 和 的關係。進一步如果將每一步的擴散過程不過代入消元,最終可以得到

其中 ,這一性質也被稱爲“nice property”。

有了上述前向擴散過程的定義和性質,給定數據 ,就可以一步步疊加噪聲得到 ,其中 爲純噪聲(也可以直接根據nice property得到任意時刻的 );而反向去噪的過程則是從噪聲中採樣一個 出來,然後根據某個 一步步去噪,最終得到 。回顧一下前面疊加噪聲(或者說拆樓)的過程,我們可以得到許多的樣本對 ,那麼“建樓”自然就是從這些數據對中學習一個從 到 的模型,也可以表示爲概率分佈 ,又因爲 這個模型是未知的,所以可以考慮採用神經網絡來近似它!

神經網絡可以被看作一個函數近似器,也就是輸入爲 的函數,記作 ,建樓的過程就是希望 和 儘可能接近,比如說他們的歐式距離儘可能小

不過直接讓神經網絡直接從 來預測 難度也還是比較大的,是不是可以考慮簡化一下?回顧之前在“拆樓”的過程中其實已經具備從 到 的一個關係表示

那也就可以通過移項然後做個除法得到

這裡 就是個係數,是什麼先不管,但是可以認爲這是從 到 的一個表達式,也能夠啓發算法的設計,如果把右邊看作 ,由於 是確定的,那麼 可以表示爲

其中 類似於一個確定項,是不是也意味着我們只需要去預測 時刻的噪聲就可以了! 接着把神經網絡的預測代入希望最小化的損失函數中,化簡可以得到

綜上,算法的訓練流程可以表示爲

算法流程

隨機從數據集中採樣圖片

隨機採樣一個步數

從高斯分佈中採樣一個噪聲並通過nice property得到 步後含噪的圖片

神經網絡根據 預測噪聲,計算誤差,反向傳播

PS:在原論文中作者把方差給固定住了,僅學習均值部分來實現去噪的效果(當然,後續也有改進論文提出把方差也一起拿來學習)。

知道這個網絡怎麼訓練了,我們再來思考一下網絡的結構該如何設計。由於網絡的輸入是疊加噪聲後的圖片 (以及時間步長 ),輸出爲噪聲的預測 ,也就是輸入和輸出的維度其實是一樣的,那麼只要滿足輸入輸出維度一樣的神經網絡結構都可以拿來一試(比如自編碼器、U-net等),作者這邊採用的則是U-net

對於時間步長 ,可以將其轉化爲time embedding(比如類似position embedding的做法),然後疊加到(U-net的各層)圖片上。

模型結構也確定了,怎麼訓練也知道了,那麼訓練完後該如何生成圖片呢?圖片的生成過程也稱爲採樣的過程,流程如下

反向去噪過程:從高斯分佈中採樣一個噪聲,從 時刻開始,每次通過訓練好的神經網絡預測噪聲,然後得到略微去噪後的圖片,再代入神經網絡預測噪聲,不斷迭代,最終得到第0步的圖片。

潛在擴散模型(LDM):藉助VAE來降本增效

既然DDPM在原始空間(像素級別的圖片)進行擴散模型的訓練(hundreds of GPU days)和採樣比較費資源的,那我們就可以考慮把它降維後在latent space進行操作。因此Latent Diffusion Models的做法就是安排上一個自編碼器來對原始圖片進行降維,比如原來的圖片是 的,降成 後再來進行DDPM這一套流程,生成圖片時則是通過擴散模型拿到 大小的圖片,再通過自編碼器的解碼器還原爲 的圖片。

LDM文生圖(選讀)

下面關於LDM的一些細節介紹,不感興趣的同學可以直接跳過。

理解了latent的含義後,接下來再考慮下如何根據文本來生成圖片呢? 既然要接收文本,那就需要給模型安排上文本編碼器(text encoder),把文本轉化爲模型能夠理解的東西。Stable Diffusion採用了CLIP的文本編碼器,它的輸入是一段文本,輸出是77個token的embeddings向量,每個向量的維度爲768(可以理解爲一段話最多保留77個字(或詞),每個字(或詞)用768維的向量表示)。

得到文本的表示後,就需要考慮如何在原來的U-net裡疊加上文本的信息呢? 原來的U-net的輸入由兩部分組成

加噪後的圖片

時間步長( )

現在則是由三部分組成

加噪後的圖片

時間步長( )

文本的token embedding

爲了能夠充分利用文本的信息,讓模型按照文本的意思來繪畫,Stable Diffusion提出了一種文本和圖片之間的交叉注意力機制,具體的

其中, 來自於圖像側, 和 來自於文本側;可以理解爲計算圖像和文本的相似度,然後根據這個相似度作爲係數對文本進行加權。 在前面U-net的基礎上,每個resnet之後接上這樣一個注意力機制就得到了注入文本信息的U-net的結構了。

然後就可以愉快地像之前的DDPM一樣,預測噪聲,最小化MSE,學習模型了!

最後再來一張整體的結構圖總結一下

Diffusion Transformers(DiT):當擴散模型遇到Transformer

LDM的擴散模型使用了U-net這一網絡結構,但這個結構會是最佳的嗎?

參考其他領域或者任務的經驗,比如去年火了一整年的大語言模型、多模態大模型絕大部分用的都是Transformer結構,相比於U-net,Transformer結構的Scaling能力(模型參數量越大,性能越強)更受大家認可。因此,DiT其實就是把LDM中的U-net替換成了Transformer,並在Vision Transformer模塊的基礎上做了略微的修改使得在圖片生成過程能夠接受一些額外的信息,比如時間步 ,標籤 。

Vision Transformer 基礎(選讀)

既然要用Transformer來替換U-net,我們需要了解一下Transformer如何處理圖片數據的呢?經典之作當然是Vision Transformer (ViT)了,它的主要思想就是將圖片分割爲固定大小的圖像塊(image patch/token),對於每個圖像塊進行線性變換並添加位置信息,然後將得到的向量序列送入一個標準的Transformer編碼器。

至於圖片的切割分塊可以參考DiT中的這張圖,假如patch的大小爲 ,那麼一張 的圖片會切成一個 的圖片塊序列,然後當作文本序列來看待就好了。

Sora:視頻生成的新紀元

先拋出我的觀點:Sora就是改進的DiT。

而DiT本質上是 VAE編碼器 + ViT + DDPM + VAE解碼器;從OpenAI的技術報告體現出來的創新點我認爲主要有兩個方面:

改進VAE -> 時空編碼器

改進DiT -> 不限制分辨率和時長

至於圖像分塊、Scaling transformers、視頻re-captioning、視頻編輯(SDEdit)這些其實都是已知的一些做法了。

實現一個最low的視頻生成模型

假如我們具備前面的知識了,或者說給你一個DiT(能夠進行圖片生成),如何能夠實現視頻的生成呢?

那要實現視頻生成是不是可以看作是多幀圖片的生成,因此最low的做法就是把視頻生成看作獨立的圖片生成,使用DiT生成多幀圖片然後串起來就是視頻了。

當然,這樣做的問題顯然很大,因爲沒有考慮視頻不同幀圖片之間的關聯,可能會導致生成的多幀圖像很不連貫,串起來看就不像是視頻了。

改進VAE:融入時間關聯

爲了使得視頻的生成連貫,那在VAE編解碼的過程自然需要去考慮視頻不同幀的關係,原來對圖片進行處理相當於考慮的是圖片空間上的關係,現在換到視頻就是多了時間上的關係,也就是經典的時空聯合建模問題。

對應的就是Sora技術報告中的Video compression network

技術報告中沒有提及具體的做法,但是可以看出這裡顯然是在VAE編碼器上考慮了時空建模,對於解碼器的設計沒有相關介紹(可能也考慮了時空建模,也可能不做改動)。

這裡再分享另外一個工作VideoLDM,他們的做法是在解碼器上插入額外的temporal layers來考慮視頻幀之間的關係,而編碼器是保持不變的。

網上的很多分享都在傳Sora能適配任意分辨率和時長是參考了NaViT這篇文章的做法,其實並非如此,Vision Transformer (ViT)本身就能夠處理任意分辨率(不同分辨率就是相當於不同長度的圖片塊序列,不就類似你給大語言模型提供不同長度的輸入一個意思)!NaViT只是提供了一種高效訓練的方法。

接下來我們來思考下DiT如何處理不同分辨率和時長的視頻數據呢?假如我們有一個 的視頻會切成一個 的圖片塊序列(當然這裡圖片塊的排序也可以有一些講究,比如按空間維度排序,或者按時間維度排序)。

因爲 、 、都是可變的,所以關鍵的問題應該是改進DiT使它能夠更好地識別不同圖片塊是屬於原始視頻中的哪個區域。

一種可行的做法就是從位置編碼的角度入手,比如對於輸入Transformer的圖片塊,我們可以在patch embedding上疊加上時間、空間上的位置信息。

在數據層面上,OpenAI也給出了兩點很有參考價值的方法

‍不對視頻/圖片進行裁剪等預處理,使用native size

數據的質量很重要,比如(文本、視頻)這樣的成對數據,原始的文本可能並不能很好的描述視頻,可以通過re-captioning的方式來優化文本描述,這一點在DALL·E 3的報告中也已經強調了,這裡只是進一步從圖片re-captioning擴展到視頻re-captioning。

那麼DALL·E 3是如何做re-captioning的呢?(選讀)

既然是生成文本,自然就是類GPT的語言模型,做的就是下一個詞預測;考慮到生成的文本是圖像的描述,因此需要基於圖像這個條件,也就是條件生成,要把 image 放進去

那麼圖像以什麼形式放進去呢?簡單點,就用 CLIP 來編碼圖像,然後把圖像embedding放進去就ok了。那這樣一個圖像打標模型怎麼訓練呢?用的就是 CoCa 的方法,也就是同時考慮對比損失和LM損失

模型推理策略

官方展示Sora的應用有很多,比如文生視頻、圖生視頻、視頻反推、視頻編輯、視頻融合等。 這裡就會涉及一些有意思的做法,比如可以這麼做(以下做法並不唯一)

1.文生視頻:喂入DiT的就是文本embedding+全噪聲patch

2.視頻編輯:類似SDEdit的做法,在視頻上加點噪聲(不要搞成全是噪聲),然後拿去逐步去噪

3.圖生視頻、視頻反推、視頻融合:喂入DiT的就是文本embedding(可選)+特定幀用給定圖片的embedding+其他幀用全噪聲patch

未來會是什麼?

不知道大家有沒有注意到,Sora還提到了它除了文生視頻,也支持文生圖,這裡其實透露出了一種統一的味道。我相信未來的發展肯定會出現更加強大的多模態統一,這裡引用一張去年我在一場內部分享中的slides來結束本次的文章,萬物皆可“分詞”,選擇合適的編碼器 + Transformer結構或其他 + 合適的解碼器,就可能實現各種不同模態之前的互相轉換、互相生成!

比如可以參考NExT-GPT的一個結構圖

相信2024年同樣會是AI領域突飛猛進的一年,期待更多精彩的工作。

【參考資料】

Autoencoders,

Auto-Encoding Variational Bayes,

Denoising Diffusion Probabilistic Models,

High-Resolution Image Synthesis with Latent Diffusion Models,

Scalable Diffusion Models with Transformers,

An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale,

Sora,

Video LDM,

NaViT,

CoCa,

NExT-GPT,

相關推薦文章: