張俊林:揭去神秘面紗,Sora關鍵技術逆向工程圖解
Sora生成的視頻效果好嗎?確實好。Sora算得上AGI發(fā)展歷程上的里程碑嗎?我個人覺得算。我們知道它效果好就行了,有必要知道Sora到底是怎么做的嗎?我覺得最好是每個人能有知情的選擇權,任何想知道的人都能夠知道,這種狀態(tài)比較好。那我們知道Sora到底是怎么做出來的嗎?不知道。
馬斯克諷刺OpenAI是CloseAI,為示道不同,轉頭就把Grok開源了。且不論Grok效果是否足夠好,馬斯克此舉是否有表演成分,能開源出來這行為就值得稱贊。OpenAI樹大招風,目前被樹立成技術封閉的頭號代表,想想花了上億美金做出來的大模型,憑啥要開源?不開源確實也正常。所謂“開源固然可贊,閉源亦可理解”。
但是,我個人一年多來的感覺,OpenAI技術強歸強,然而有逐漸把技術神秘化的傾向,如果不信您可以去讀一下Altman的各種訪談。在這個AI技術越來越封閉的智能時代,技術神秘化導向的自然結果就是盲目崇拜,智能時代所謂的“信息平權”或只能成夢想。我不認為這是一個好的趨勢,我發(fā)自內心地尊敬對技術開放作出任何貢獻的人或團體,且認為對技術神秘化的去魅,這應該是AI技術從業(yè)者值得追求的目標。
本文試圖盡我所能地以通俗易懂的方式來分析Sora的可能做法,包括它的整體結構以及關鍵組件。我希望即使您不太懂技術,也能大致看明白Sora的可能做法,所以畫了幾十張圖來讓看似復雜的機制更好理解,如果您看完對某部分仍不理解,那是我的問題。
一、Key Messages
這部分把本文關鍵信息列在這里,特供給沒空或沒耐心看長文的同學,當然我覺得您光看這些估計也未必能看明白。
Key Message 1: Sora的整體結構如下(本文后續(xù)有逐步推導過程)
Key Message 2: Sora的Visual Encoder-Decoder很可能采用了TECO(Temporally Consistent Transformer )模型的思路,而不是廣泛傳聞的MAGVIT-v2(本文后續(xù)給出了判斷理由,及適配Sora而改造的TECO具體做法)。Encoder-Decoder部分的核心可能在于:為了能生成長達60秒的高質量視頻,如何維護“長時一致性”最為關鍵。要在信息壓縮與輸入部分及早融入視頻的“長時一致性”信息,不能只靠Diffusion Model,兩者要打配合。
Key Message 3: Sora之所以把Patch部分稱為“Spacetime Latent Patch”,大概是有一定理由的/Patch部分支持“可變分辨率及可變長寬比”視頻,應該是采用了NaVIT的思路,而不是Padding方案(本文后續(xù)部分給出了方案選擇原因)。
Key Message 4: 目前的AI發(fā)展狀態(tài)下,您可能需要了解下Diffusion Model的基本原理(后文會給出較易理解的Diffusion模型基本原理介紹)
Key Message 5: Video DiTs很可能長得像下面這個樣子(本文后續(xù)內容會給出推導過程)
Key Message 6: Sora保持生成視頻的“長時一致性”也許會采取暴力手段(后文給出了可能采用的其它非暴力方法FDM)
Key Message 7: Sora應該包含雙向訓練過程(后文給出了雙向訓練的可能實現機制)
二、為何能對Sora進行逆向工程
能否對Sora進行逆向工程,要依賴一些基本假設,若基本假設成立,則逆向工程可行,如不成立,則無希望。上面列出了Sora可被逆向工程的兩個基本假設。
首先,我們假設Sora并未有重大算法創(chuàng)新,是沿著目前主流技術的漸進式改進。這條無論是從OpenAI的算法設計哲學角度(我來替OpenAI歸納下核心思想:簡潔通用的模型結構才具備Scale潛力,如果可能的話,盡量都用標準的Transformer來做,因為它的Scale潛力目前被驗證是最好的,其它想取代Transformer的改進模型都請靠邊站。模型結構改進不是重點,重點在于懟算力懟數據,通過Scale Transformer的模型規(guī)模來獲取大收益。),還是歷史經驗角度(比如ChatGPT,關鍵技術皆參考業(yè)界前沿技術,RLHF強化學習是OpenAI獨創(chuàng)的,但并非必需品,比如目前有用DPO取代RLHF的趨勢)來看,這個條件大體應該是成立的。
第二個條件,其實Sora技術報告透漏了不少關于模型選型的信息,但是您得仔細看才行。
關于Sora技術報告透漏的信息,這里舉個例子。它明確提到了使用圖片和視頻聯合訓練模型,而不像大多數視頻生成模型那樣,在訓練的時候只用視頻數據。這是關鍵信息,對保證Sora效果也肯定是個重要因素,原因后文會談。既然Sora需要圖片和視頻聯合訓練,這等于對Sora內部結構怎么設計增加了約束條件,而這有利于我們進行逆向工程。
再舉個例子,Sora應采取了逐幀生成的技術路線,而不像很多視頻生成模型那樣,采取“關鍵幀生成+插幀”的模式。上圖中Sora技術報告標紅圈的部分是支持這一判斷的部分證據,如果您參考的文獻足夠多,會發(fā)現一旦提“generating entire video all at once”,一般和“at once”對應的方法指的就是“關鍵幀+插幀”的模式。上圖下方給出了Google 的視頻生成模型Lumiere的論文摘要(可參考:Lumiere: A Space-Time Diffusion Model for Video Generation),也提到了“at once”等字眼,表明自己用的不是“關鍵幀+插幀”的模式,這是把“at once”作為論文創(chuàng)新點高度來提的。
“關鍵幀生成+插幀”是視頻生成模型中普遍采用的模式,但它的問題是會導致生成的視頻整體動作幅度很小、而且不好維護全局的時間一致性。我們看到市面上很多視頻生成產品都有這個問題,就可以倒推它們大概采用了“關鍵幀+插幀”的模式??梢钥闯觯@點也是保證Sora視頻質量好的重要技術選型決策,但若您看文獻不夠仔細,就不太容易發(fā)現這個點。
歸納一下,之所以我們能對Sora進行逆向工程,是因為前述兩個基本假設大致成立,而每當Sora技術報告透漏出某個技術選型,就等于我們在算法龐大的設計空間里就去掉了很多種可能,這相當于通過對主流技術進行不斷剪枝,就可逐步靠近Sora的技術真相。
接下來讓我們根據目前的主流技術,結合Sora的技術報告,假設Sora模型已經訓練好了,來一步步推導出Sora可能采用的整體技術架構。
三、逐步推導Sora的整體結構
Sora給人的第一印象是高質量的<文本-視頻>生成模型:用戶輸入Prompt說清楚你想要生成視頻的內容是什么,Sora能生成真實度很高的10秒到60秒的視頻。至于內部它是怎么做到這一點的,目前我們還一無所知。
首先,我們可如上圖所示,技術性地稍微展開一下,細化Sora的整體輪廓。
用戶給出相對較短且描述粗略的Prompt后,Sora先用GPT對用戶Prompt進行擴寫,擴充出包含細節(jié)描述的長Prompt,這個操作是Sora技術報告里明確提到的。這步Prompt擴寫很重要,Prompt對細節(jié)描述得越明確,則視頻生成質量越好,而靠用戶寫長Prompt不現實,讓GPT來加入細節(jié)描述,這體現了“在盡可能多的生產環(huán)節(jié)讓大模型輔助或取代人”的思路。
那么,Sora內部一定有文本編碼器(Text Encoder),把長Prompt對應的文字描述轉化成每個Token對應的Embedding,這意味著把文字描述從文本空間轉換為隱空間(Latent Space)的參數,而這個Text Encoder大概率是CLIP模型對應的“文本編碼器”(CLIP學習到了兩個編碼器:“文本編碼器”及“圖片編碼器”,兩者通過CLIP進行了文本空間和圖片空間的語義對齊),DALLE 系列里的文本編碼器使用的就是它。
上文分析過,Sora應該走的是視頻逐幀生成的路子,假設希望生成10秒長度、分辨率為1080*1080的視頻,按照電影級標準“24幀/秒”流暢度來算,可知Sora需要生成24*10=240幀1080*1080分辨率的圖片。所以,若已知輸出視頻的長度和分辨率,我們可以在生成視頻前,事先產生好240幀1080*1080的噪音圖,然后Sora在用戶Prompt語義的指導下,按照時間順序,逐幀生成符合用戶Prompt描述的240張視頻幀對應圖片,這樣就形成了視頻生成結果。
從Sora技術報告已知,它采用的生成模型是Diffusion模型,關于Diffusion模型的基本原理我們放在后文講解,但現在面臨的問題是:Diffusion Model也有不同的做法,到底Sora用的是像素空間(Pixel Space)的Diffusion Model,還是隱空間(Latent Space)的Diffusion Model呢?現在我們需要關于此做出技術決策。
在做決策前,先了解下兩個空間的Diffusion Model對應的特點。上圖展示的是在像素空間內做Diffusion Model的思路,很直觀,就是說在像素范圍內通過Diffusion Model進行加噪音和去噪音的過程。因為圖片包含像素太多,比如1080*1080的一張圖片,就包含超過116萬個像素點,所以像素空間的Diffusion Model就需要很大的計算資源,而且無論訓練還是推理,速度會很慢,但是像素空間保留的細節(jié)信息豐富,所以像素空間的Diffusion Model效果是比較好的。這是它的特點。
再說隱空間Diffusion Model的特點。最早的Diffusion Model都是在像素空間的,但速度實在太慢,所以后來有研究人員提出可以在對像素壓縮后的隱空間內做Diffusion Model。具體而言,就是引入一個圖像“編碼器”(Encoder)和“解碼器”(Decoder),編碼器負責把圖片表征從高維度的像素空間壓縮到低維度的參數隱空間,而在經過Diffusion Model去噪后,生成隱空間內的圖片內容,再靠解碼器給隱空間圖片內容添加細節(jié)信息,轉換回圖片像素空間。可以看出,Latent Diffusion Model(LDM)的特點正好和Pixel Diffusion Model(PDM)相反,節(jié)省資源速度快,但是效果比PDM差點。
現在來做技術選型,從Sora技術報告明顯可看出,它采用的是Latent Diffusion Model,這個也正常,目前無論做圖像還是視頻生成,很少有用Pixel Diffusion Model,大部分都用LDM。但是,LDM也存在一個壓縮率的問題,可以壓縮得比較狠,這樣速度會更快,也可以壓縮的不那么狠。我猜Sora在Encoder這一步不會壓縮得太狠,這樣就能保留更多原始圖片細節(jié)信息,效果可能會更好些。Sora大概率會重點保證生成視頻的質量,為此可以多消耗些計算資源,“以資源換質量”。Sora生成視頻速度很慢,很可能跟Encoder壓縮率不高有一定關系。
于是,目前我們得到上圖所示的Sora整體結構圖,主要變化是增加了針對視頻的Encoder和Decoder,以試圖加快模型訓練和推理速度。另外,一般把文本編碼結果作為LDM模型的輸入條件,用來指導生成圖片或視頻的內容能遵循用戶Prompt描述。
現在,我們面臨新的技術決策點:對視頻幀通過Encoder壓縮編碼后,是否會有Patchify(中文翻譯是“切塊”?不確定)操作?Patchify本質上可看成對視頻數據的二次壓縮,從Sora技術報告可看出,它應有此步驟,這也很正常,目前的視頻生成模型一般都包含這個步驟。而且Sora將他們自己的做法稱為“Spacetime Latent Patch”,至于為啥這么叫,我在后文關鍵模塊分析會給出一個解釋。另外,Sora還主打一個“支持不同分辨率、不同長寬比”的圖片與視頻生成,為了支持這個功能,那在Patchify這步就需要做些特殊的處理。
于是,加入Spacetime Latent Patch后,目前的Sora整體結構就如上圖所示。Patchify一般放在視頻編碼器之后,而且輸出時把多維的結果打成一維線性的,作為后續(xù)Diffusion Model的輸入。
我們接著往下推導,來看下實現Diffusion Model時具體采用的神經網絡結構,此處需注意,Diffusion Model是種偏向數學化的算法思想,具體實現時可以采用不同的神經網絡結構。其實目前Diffusion Model視頻生成的主流網絡結構一般會用U-Net,Transformer做Diffusion 視頻生成目前并非主流。當然,Sora出現之后,選擇Transformer來做Diffusion Model肯定很快會成為主流結構。從Sora技術報告可知,它采用的骨干網絡是Transformer,應該主要看中了它良好的可擴展性,方便把模型規(guī)模推上去。當然用Transformer+Diffusion做視頻生成,Sora并不是第一個這么做的,這再次印證了OpenAI經常干的那種操作,就是利用“吸星大法”從開源屆汲取各種前沿思路,但是自己反而越來越封閉的CloseAI作風。
于是,我們把基于Transformer網絡結構的信息融進去,目前Sora整體結構如上圖所示。
讓我們繼續(xù)。Sora在宣傳時特別強調一個特性:可以支持不同分辨率(Variable Resolution)、不同長寬比(Various Aspect Ratio)、不同時長(Various Duration)的視頻訓練與生成。目前主流技術里這么做的不能說沒有,但是確實極少,三者同時做到的在公開文獻里我沒有看到過,要做到這一點,對具體技術選型時也有不少要求,所以作為宣傳點無可厚非。后文為了表達簡潔些,統(tǒng)一以“不同分辨率”來同時代表“不同分辨率和不同長寬比”,這點在閱讀后文的時候還請注意。關于生成視頻時長問題我們后文會單獨分析。
這里先解釋下什么是“不同分辨率和長寬比”。如上圖所示,其實好理解,分辨率的話一般跟圖片大小有關系,圖片小分辨率就低一些,圖片大清晰度或分辨率就高一些,而長寬比就比如我們經??吹降亩桃曨l的“豎屏模式”和長視頻的“橫屏模式”等。Sora都支持。
那為啥要支持“不同的分辨率和長寬比”呢?上圖給了個例子,目前做視頻或者圖片生成的主流技術,為了方面內部處理(訓練時Batch內數據的規(guī)則性),會把輸入的圖片或視頻大小統(tǒng)一起來,比如對于不同大小的圖片,通過Crop操作,就是在圖片中心截取一個正方形的圖片片段,通過這種方式把輸入大小統(tǒng)一。而這么做的問題上圖展示出來了,因為你截圖,所以很容易把一個完整的實體切割開,使用這種經過Crop數據訓練的視頻生成模型,生成的人體就很容易看著不完整,而使用“不同的分辨率和長寬比”,會保持原始數據所有信息,就沒有這個問題,實體表達的完整性就會好很多。從這也可看出,Sora為了保視頻質量,真的是在視頻生成的全環(huán)節(jié)都拼了全力。
我們把Sora這一關鍵特性表達到整體結構圖上,就如上圖所示。如果要支持這一特點,那么在Spacetime Latent Patch以及LDM這兩個階段,需要作出一些特殊的設計決策,這也是我們用來在后面推斷Sora關鍵技術的重要參考和約束信息。
下一個決策點之前我們提到過,Sora使用了圖片和視頻聯合訓練,這對于保證視頻生成質量很重要。
為啥說這點重要呢?上圖給了個例子(可參考Phenaki: Variable Length Video Generation From Open Domain Textual Description),用戶Prompt要求輸出的視頻是“Water Color Style”風格的,如果只用視頻訓練(右側視頻截圖),就做不到這一點,而如果混合了80%的視頻數據和20%的圖片數據訓練的視頻生成模型(左側視頻截圖),做得就不錯。這是因為帶標注的<文本-圖片>數據量多,所以各種風格的圖片數據都包含,而帶標視頻數據數量少,所以很多情景要求下的數據都沒有,就導致了這種生成結果的差異。從此例子可以看出視頻和圖片聯合訓練對于視頻生成質量的影響。
如果Sora要支持圖片和視頻聯合訓練,則需要在視頻編碼-解碼器,以及Spacetime Latent Patch階段做技術選型要作出獨特的設計,這進一步形成了關鍵模塊的設計約束。加上越多約束,其實你能做的技術選擇就越少,就越容易推斷出具體的做法。目前的Sora整體結構如上圖所示。
Sora的另外一大特性是能生成長達60秒的較長時長的視頻,這點眾所周知。
如果把時長要求加進去,Sora應該會在“視覺編碼器-解碼器”階段,以及LDM階段作出一些獨特的設計,才有可能維護這么長時間的視覺連貫性和內容一致性。把所有這些約束都加入后,我們就經過一步步推導,最終得出了Sora完整的整體結構,如上圖所示。
如果對文生視頻領域比較熟悉,我覺得從技術報告推導出Sora的整體結構,這事難度不算大,真正難的地方在于Sora關鍵模塊具體采用的什么技術??闪谐龅年P鍵技術主要有四塊:
- 視頻編碼器-解碼器?
在支持“圖片&&視頻聯合訓練”、“視頻長時一致性”這兩個約束條件下,具體模型應該如何設計?
- Spacetime Latent Patch
在支持“圖片&&視頻聯合訓練”、“可變分辨率”這兩個約束條件下,具體模型應該如何設計?
- 基于Transformer的視頻Diffusion Model?
在支持“可變分辨率”約束條件下,具體模型應該如何設計?(這塊的長時一致性策略放在第四部分了)
- Diffusion Model階段的長時一致性如何維護?
接下來,我們對Sora四個關鍵技術進行更深入的分析。
四、視頻編碼器-解碼器:從VAE到TECO(Temporally Consistent Transformer )
Sora的視頻Encoder-Decoder采用VAE模型概率極大,原因很簡單,因為絕大多數圖片或視頻模型基本都用VAE,定位到VAE不難,難在繼續(xù)探索Sora可能使用的到底是哪個具體模型。
VAE模型出來后有不少改進模型,總體而言可分為兩大類:“連續(xù)Latent” 模型和“離散Latent”模型。VAE本身是連續(xù)Latent的,而離散Latent模型變體眾多,最常用的包括VQ-VAE和VQ-GAN,這兩位在多模態(tài)模型和圖片、視頻各種模型中經?,F身。“離散Latent”之所以比較火,這與GPT模型采用自回歸生成離散Token模式有一定關聯,使用離散Latent模型,比較容易套到類似LLM的Next Token的生成框架里,有望實現語言模型和圖片、視頻生成模型的一體化,典型的例子就是谷歌的VideoPoet。
考慮到Sora主干模型采用Diffusion Model而非Next Token這種類LLM模式,而Diffusion Model加噪去噪的過程,本就比較適合在連續(xù)Latent空間進行,可以推斷Sora采用“連續(xù)Latent”的模式概率較大,倒不是說離散Latent模型不能做Diffusion Model,也是可以的,但如果這么做,一方面把本來是連續(xù)Latent的VAE多做一道轉成離散Latent,感覺沒有太大必要性,有點多此一舉的味道。另一方面,如果對接Diffusion Model,離散Latent效果肯定是不如連續(xù)Latent的,原因后面會談。
之前不少探索Sora實現原理的技術文獻把Sora可能使用的Encoder-Decoder定位到MAGVIT-v2模型(可參考:Language Model Beats Diffusion -- Tokenizer is Key to Visual Generation),它是VQ-VAE的一個變種。不清楚得出這個判斷的原因是什么,但我個人感覺采用MAGVIT-v2的概率應該不大,反而是VQ-GAN的變體模型TECO(Temporally Consistent Transformer)可能性更高些,理由后面會談到。當然如果適配Sora的一些要求,TECO也需要做出些改動,具體怎么改后文也會談。
為了便于理解后續(xù)內容,先介紹下圖片VAE模型的基本思路。如上圖所示,VAE是種類似GPT的自監(jiān)督學習,不需要標注數據,只要有足夠圖片數據就能訓練模型。VAE的基本思想是通過重建圖片,來獲得一個Encoder和對應的Decoder。
輸入隨機某張圖片x后,Encoder對像素進行壓縮,形成一個低維的圖片特征壓縮表示z,而Decoder與Encoder相反,從壓縮后的圖片Latent表征z,試圖還原原始圖像x,產生重建的圖像x’,重建過程中x和x’的差異就可以作為訓練模型的損失函數,以此引導VAE模型的encoder產生高質量的壓縮表示z,decoder則從壓縮表示中盡可能準確地還原x。一般會采用CNN卷積網絡來做Encoder和Decoder,所以VAE本身產生的圖片Latent表征,本來就是連續(xù)的。
說完圖片VAE的思路,再來談視頻VAE的基本思想。如果把一張圖片看作是世界某個時刻三維空間的二維壓縮表示,那視頻就在此之上,加入時間維度,可看做沿著時間軸由若干連續(xù)的二維Space圖片組成的某段物理世界場景的三維Space-time表征。
于是,視頻可以被看成是由多張圖片沿著時間軸組成的有序圖片序列,視頻VAE的任務和圖片VAE是類似的,就是盡可能準確地重建組成視頻的每一幀,在重建視頻的過程中學習視頻壓縮Encoder和視頻解壓縮Decoder。
一般Encoder可以使用Causal CNN 3D卷積來做,和圖片的2D卷積意思類似,最大的不同在于,CNN的卷積核從2D升級成3D卷積。就是說在壓縮第i幀圖片的時候,不僅僅像圖片2D卷積一樣只參考第i幀圖片內容,也可以參考第(i?1)、(i?2)….(i?k)等之前的 k 幀圖片,所以是一種casual 3D卷積(Causal的意思是只能參考前面的,不能參考后面的,因為對于視頻生成來說,后面的幀還沒生成,所以是不可能參考到的,但是第 i 幀之前的 k 幀已經生成了,所以在生成第 i 幀的時候是可以參考的。一般這種就叫causal(因果),類似GPT生成Next Token的時候只能參考之前已經生成的Token,這是為啥GPT的attention被稱作Causal Attention。)
3D卷積因為在重建第 i 幀的時候參考了之前的 k 幀,這其實融入時間信息了,如果 k 可以拉到比較長的時間,那么對于維護生成圖像的時間一致性是有幫助的。但是,僅靠CNN 卷積一般融入的歷史比較短,很難融入較長時間的信息,所以需要有新思路,至于新思路是什么,這個晚些會談。
簡單介紹下“連續(xù)Latent”和“離散Latent”的概念。如上圖所示,如果使用CNN卷積操作對圖片進行掃描,因為卷積結果數值是在連續(xù)實數范圍內,所以得到的卷積結果自然就是連續(xù)的Latent。所謂“離散Latent”,就是把“連續(xù)Latent”進行ID化,從實數向量通過一定方法轉換成一個專屬ID編號,這跟LLM里的字符串Tokenizer離散化過程是比較像的。
具體而言,一般對“連續(xù)Latent”離散化過程的基本思想可參考上圖中的右側子圖:模型維護一個“密碼本”(Codebook),密碼本由很多Codeword構成,每項Codeword維護兩個信息,一個是這個Codeword對應的Latent特征Embedding,這是連續(xù)的,另外就是這個Codeword對應的專屬ID編號。Codebook類似詞典信息。在離散化過程中,對于某個待離散化的”連續(xù)Latent”,會和密碼本里每個Codeword對應的Embedding比對下,找到最接近的,然后把Codeword對應的ID賦予待離散化Latent。你看,其實很簡單。
這里解釋下前面提到的一點:為何說對于Diffusion Model來說,“離散Latent”的效果應該比不上“連續(xù)Latent”。其實從上面離散化過程可以看出來,本質上”連續(xù)Latent”離散化過程,可以看成對圖片片段聚類的過程,賦予的那個ID編號其實等價于聚類的類編號。目前的圖像處理而言,Codeword通常在8000左右,如果再大效果反而不好,這里就看出一個問題了,這種聚類操作導致很多“大體相似,但細節(jié)不同”的圖片被賦予相同的ID,這意味著細節(jié)信息的丟失,所以離散化操作是有信息損失的。這是為何說如果對接Diffusion Model最好還是用“連續(xù)Latent”的原因,因為保留的圖片細節(jié)的信息含量更多,有利于后續(xù)生成更高質量的視頻內容。
再說“離散Latent”的一個典型模型VQ-VAE(可參考:Neural Discrete Representation Learning),思路如上圖所示,其實就是剛提到的如何對VAE獲得的“連續(xù)Latent”進行離散化的過程,思路已說過,此處不贅述。
另外一個“離散化Latent”的典型是VQ-GAN(可參考:Taming Transformers for High-Resolution Image Synthesis),其思路可參考上圖??梢园阉唵卫斫獬杉尤肓薌AN的改進版本VQ-VAE。在VQ-VAE離散化基礎上,集成進GAN的思路,以獲得更好的編碼效果。我們知道,對于GAN而言,主要是由一個“生成器”和一個“判別器”相互欺騙對抗來優(yōu)化模型效果,VAE Decoder 會生成圖像,自然這可作為GAN天然的生成器,再引入一個獨立的GAN判別器即可。
那Sora到底用的哪個VAE模型呢?上圖展示了傳說中被提及率最高的MAGVIT-2。過程較為簡單,它把輸入視頻幀分組,首幀單獨作為一組(這導致它可以支持“圖片&&視頻的聯合訓練”,因為圖片可看成單幀的視頻,首幀單獨表示就可以對單張圖片進行編碼了),其它幀比如可以4幀分為一組。對于每一組4幀圖片,通過Causal 3D 卷積把4幀圖片先壓縮成一個“連續(xù)Latent”。然后再進行上面講的“連續(xù)Latent”離散化操作,就得到了MAGVIT的編碼結果。
我們先不考慮離散化操作,對于Sora來說,很明顯這是不需要的,原因上文有述。單說Causal 3D卷積操作,MAGVIT的這個操作意味著兩個事情:
首先,MAGVIG-v2因為會把4幀最后壓縮成一幀的Latent表示,所以它不僅在空間維度,同時也在時間維度上對輸入進行了壓縮,而這可能在輸入層面帶來進一步的信息損失,這種信息損失對于視頻分類來說不是問題,但是對視頻生成來說可能無法接受。
其次,4幀壓成1幀,這說明起碼MAGVIG-v2的Latent編碼是包含了“局部Time”信息的,這對于維護生成視頻的時間一致性肯定有幫助,但因為僅靠CNN很難融入太長的歷史信息,貌似只能融合短期的時間信息,對于維護“長時一致性”幫助很有限,。
綜合考慮,我個人覺得Sora采用MAGVIT的概率不大。為了能夠生成長達60秒的視頻,我們希望在VAE編碼階段,就能把長周期的歷史信息融入到VAE編碼里來,這肯定是有很大好處的。
問題是:現在公開的研究里,存在這種模型嗎?
您別說,還真讓我找到一個,就是上圖所展示的TECO模型(可參考:Temporally Consistent Transformers for Video Generation)。上圖展示了TECO和Sora兩位Co-Lead之間的淵源,這是UC Berkeley發(fā)的文章,主要研究如何生成“長時間一致性”的視頻,而兩位Co-Lead都博士畢業(yè)于UC Berkeley,也都研究視頻生成相關內容,所以他們起碼肯定知道這個工作,TECO的主題又比較符合他們把Sora打到60秒長度的技術需求,所以參考TECO的概率還是較大的。
TECO結構如上圖所示,核心由兩個任務組成:一個是視頻重建任務,用來訓練視頻Encoder-Decoder;一個是使用MaskGit生成離散化的圖像Token,主要用于生成視頻。TECO有兩個主要特點:
首先,它在VAE編碼階段對Space和Time信息分別編碼,而且Time編碼引入了極長的Long Time信息。確切點說,是所有歷史信息,比如要生成第i 幀視頻,則Time編碼會把第 1 到第 (i?1) 幀的之前所有歷史信息都融合到第 i 幀的時間編碼里。很明顯這樣做對于維護長時一致性是很有幫助的。
其次,TECO在生成視頻的長時一致性方面表現確實很不錯。上圖右下角的效果對比圖測試了長達500幀的生成視頻,TECO效果比基準模型要好(也請關注下里面的紅色曲線模型FDM,后面我們會提到它)。我們可以推斷一下,假設視頻是電影級流暢度達24幀/秒,那么500幀圖像對應正好20秒時長的生成視頻。(Sora生成的大部分視頻都是長度20秒左右,推斷應該也是總長度500幀左右。這是否說明了些什么?)
對Sora來說,如果對TECO適應性地改造一下,基本就可以把它能在VAE階段就融合超長歷史的能力吸收進來。具體而言,需要做兩項改動:首先,VAE離散化是不必要的,所以可以拿掉;其次,MaskGit部分用于訓練模型能夠Token by Token地生成視頻,我們也不需要,只需要保留視頻重建部分即可。
經過上述改造,TECO在VAE Encoder階段的基本思想就展示在上圖中了。首先,是對圖片內容的空間Latent編碼。首幀單獨處理,自己成為一組,這就可以支持“圖片和視頻聯合訓練”了;其它幀兩幀一組,比如對于第i 幀,則把前一幀第 (i?1) 幀也和第 i 幀放在一組。這里要注意,盡管也是2幀一組,但是這和MAGVIT 思路是不一樣的,TECO這個2幀一組類似一個滑動窗口,窗口間是有重疊的,所以不存在多幀壓縮成一幀帶來的信息損失問題。TECO思路正好和MAGVIT相反,在Space Latent編碼階段不僅考慮第i幀,還把第 (i?1) 幀的信息也帶進來,所以它是通過VAE增加更多信息的思路。
視頻幀分組后,使用CNN 3D卷積可以產生每幀圖片對應的“連續(xù)Latent”,這部分是“Space Latent”,主要編碼圖像的空間信息;之后,使用Causal Temporal Transformer對時間信息進行編碼,前面提過,對于同一視頻,TECO會把所有歷史內容Time信息都融合進來。Transformer輸出的時間編碼是線性的,經過Reshape后可以形成和“Space Latent”相同大小的高維表示,這部分就是VAE的“Time Latent”。這樣,每幀視頻經過TECO編碼后,有一個“Space Latent”一個“Time Latent”,兩者并在一起就是這幀視頻的VAE編碼結果。這里可以再次看出,TECO的思路是增加信息,而不是以壓縮減少信息為唯一目的的。
使用TECO除了能在VAE編碼階段就引入盡可能長的時間信息,更好維護生成視頻的一致性外,還有另外一個好處,OpenAI明顯是認準了Transformer的Scale潛力比較大,所以Sora在做Diffusion Model的時候把U-Net換成Transformer。如果采用TECO,則Sora的主體結構基本都基于Transformer了,這明顯是符合OpenAI的模型口味的。
五、Spacetime Latent Patch:Spacetime Latent Patch的含義及NaVIT
我們先介紹單張圖片Patchify的具體含義。本質上,Patchify是對VAE壓縮編碼的二次壓縮,在視頻生成模型里很常見。具體做法很簡單,如上圖所示,對于VAE壓縮后的“連續(xù)Latent”平面,可以設定一個2?2 大小的Patch,不重疊地掃描“連續(xù)Latent”平面,通常是接上一個MLP對 2?2 的小正方形網格輸入做個變換。這樣的話,假設“連續(xù)Latent”本來大小是 8?8 ,經過Patchify操作后,就形成了一個二次壓縮的 4?4 的Patch矩陣,然后可以通過線性化操作把Patch拉成一條直線,這是因為后面接的是Transformer,它需要線性的輸入Patch形式。
目前很多視頻生成研究證明了:Patch Size 越小,生成的視頻質量越高。所以這里Sora 采取2?2 大小的 Patch Size 基本沒疑問。Patch Size 越小說明壓縮率越低,也說明保留的原始圖片信息越多。可以進一步推斷,這說明了VAE 階段也好、Patchify階段也好,這種原始信息壓縮階段,應該盡量多保留原始信息,不要壓縮太狠,否則對視頻生成質量會是負面效果。當然付出的代價是比較消耗計算資源,計算速度會慢很多。目前看很難兼顧,你必須要作出取舍。
了解單張圖片的Patchify 操作后,我們來看一個簡單的視頻 Patch 方法。因為視頻是由多個視頻幀按照時間順序構成的有序序列,一個最簡單的方法是不考慮不同幀之間的關系,每一幀獨立通過上述的Patchify 操作進行二次壓縮,如上圖所示。
之前很多解讀Sora 技術的文章傾向于認為 Sora 在這個階段采用了類似VIVIT 的Tubelet Embedding 的思路。含義如上圖所示:就是除了第一幀,其它視頻幀比如可以2 幀為一組,不僅在空間維度進行壓縮,在時間維度也要進一步壓縮,從時間維度的 2 幀輸入壓縮為 1 幀 Patch,具體技術采取CNN 3D 卷積就可以實現。
我覺得在這里采用類VIVIT 的時間壓縮可能性較小,主要這么操作,在時間維度進一步壓縮,輸入側信息損失太高。VIVIT 搞的是圖像分類任務,屬于比較粗粒度的任務,所以壓縮狠一點問題不大,但是對于視頻生成任務來說,就像上文提到的,看似在輸入側要盡可能保留多一些信息,這么狠的壓縮大概會嚴重影響視頻生成質量。目前也有研究(可參考:Latte: Latent Diffusion Transformer for Video Generation)證明,這么做確實有損害作用,所以在這里,類VIVIT 方案我覺得可以 Pass 掉。
如果假設Sora 在 VAE 階段采用的是 TECO 的話,則可以如上圖這么做。因為每張圖片有兩個 Patch 矩陣,一個是Space Latent,保留的主要是空間信息;一是 Time Latent,保留主要是長時歷史信息。所以,我們可以用一個Patch Size=2?2?2 的 Patch,把同一個圖片的Space Latent 和 Time Latent 合并,壓縮為一個Patch 矩陣。在這里若把這張圖片對應的 Patch 矩陣叫做“Spacetime Latent Patch”,看著貌似問題不大吧?我猜 Sora 這么做的概率還是比較大的,也很可能是OpenAI 強調的“Spacetime Latent Patch”的來源之處。當然這純屬個人猜測,主觀性較強,謹慎參考。
這么做有若干好處。首先,每張圖片對應一個Patch 矩陣,融合過程中既包含了空間信息,也包含了 Long Time 時間信息,信息保留非常充分。其次,如果要支持“圖片&&視頻聯合訓練”,那么首幀需要獨立編碼不能分組,這種方案因為沒有視頻幀分組過程,所以自然就支持“圖片&&視頻聯合訓練”。
前文講過,如果要支持不同分辨率視頻,則需要在Patch 階段做些獨特的工作。之前大家提及率較高的現有技術是 NaVIT,目前看下來,貌似確實也沒有比NaVIT(可參考:Patch n’ Pack: NaViT, a Vision Transformer for any Aspect Ratio and Resolution)更合適的方案了。
上圖展示了NaVIT 的基本思路:其實很簡單,只要我們固定住 Patch Size 的大小,通過掃描不同分辨率的視頻,自然就產生了不同分辨率或長寬比的Patch矩陣,然后把它們線性化即可。
與NaVIT 對應的可以支持可變分辨率的方法是 Padding 方案。如上圖右方子圖所示,只要設定好一個最大圖片大小,其實不管圖片長寬比如何,只要讓它占據從左上角開始的一個局部位置即可,其它相對最大圖片大小空出的位置,用無意義的Padding 占位符號占住就行。很明顯這個方法也可以支持不同分辨率視頻。
那么我們應該選擇NaVIT 還是 Padding 呢?很明顯應該選擇 NaVIT 方案。NaVIT 在提出之初,就是為了改進 Padding 方法的。Padding 方法有什么問題?就是在訓練模型的時候,一個Batch 里被 Padding 這種無意義的占位符號浪費的空間太多了,而NaVIT 不需要對每張圖片進行 Padding,該是多少 Patch 就是多少 Patch,頂多在 Batch 末尾加少量 Padding 來填充到 Batch 最大長度即可。很明顯 NaViT 方案在一個 Batch 里可以放更多視頻幀,而這能極大增加模型的訓練效率。
而且,如果模型能支持的最大分辨率越高,Padding 方法每張圖片 Padding 浪費的比例就越高,采用 NaVIT 也就越合算。我們知道,Sora 最大可以支持 2048*2048 的圖片,在這種情況下,基本不可能采用 Padding 方法,貌似也只能用NaVIT 了,起碼我目前還沒有看到更好的方案。
在將Patch 拉成線性結構后,會丟失 Patch 對應的位置信息,所以為了能夠支持可變分辨率視頻,對于每個Patch,需要特殊設計的位置表征。
很明顯使用Patch 的絕對位置(就是按照 Patch 順序編號)是不行的,只要我們使用三維空間里的相對坐標,并學習對應的Position Embedding,就可以解決這個問題。上圖展示了同一個視頻的連續(xù)三幀,對于藍色 Patch 來說,可以看出它對應的相對坐標位置為:X=2 , Y=3 以及 Z=3 (視頻時間維度的第三幀)。假設我們在模型訓練過程中學習每個坐標位置對應的 embedding,然后把三者的embedding 疊加,就形成了這個 Patch 對應的 Position Embedding,這里包含了這個 Patch 對應的三維相對坐標。對于每個Patch 來說,除了 Patch 表達圖片內容外,對應的,每個Patch 再增加一個位置表征即可。
本部分最后,在 Spacetime Latent Patch階段,讓我們歸納下 Sora 可能采取的技術方案:首先,很可能會對接 TECO 的 VAE 編碼,使用2?2?2 大小的 Patch 來合并每張圖片的 Space Latent 以及 Time Latent,每張圖片被壓成一個Spacetime Latent Patch 矩陣。然后使用 NaVIT 方法來支持可變分辨率視頻,最主要的改動是需要根據空間維度的兩個坐標和時間軸坐標,來學習每個Patch 在空間位置中對應三維空間相對位置坐標的 Position Embedding。
六、Transformer Diffusion Model:從Diffusion Model原理到Video DiTs模型
本部分我們會先介紹下Diffusion Model基本原理,然后逐步推導Video DiTs模型可能的內部結構。
上圖展示了 Diffusion Model 的基本原理,Diffusion Model 由正向加噪和反向去噪過程構成。假設我們有一個很大的圖片庫,可以從中隨機選擇一張x0 ,正向過程分多次,每次加入不同程度的符合正態(tài)分布的噪音到原始圖片里,直到清晰圖完全轉化為純噪音圖 ξ 為止。而反向去噪過程則從轉化來的純噪音圖 ξ 開始,訓練神經網絡預測對應步驟加入的噪音是什么,然后從純噪音圖 ξ 里減掉預測的噪音,圖像清晰程度就增加一些,依次反向逐步一點一點去除噪音,就能恢復出最初的 x0 圖片內容。
Diffusion Model 的前向過程是人為可控地對已知圖片逐步加入不同程度噪音的過程,即噪音的逐步“擴散”過程。經數學推導,對于第 t 個 Time Step 的加噪音過程可以一步完成,不需要上述的逐漸擴散的過程,如上圖所列出公式所示。
給圖片加噪音的具體過程如下:首先,我們從圖片庫中隨機選擇一張清晰圖x0 ,再隨機選擇一個滿足正態(tài)分布的完全噪音圖 ε ;然后,隨機選擇一個 Time Step,并對它進行編碼;接下來按照上述公式直接在原始圖片 x0 基礎上融合噪音 ε 來產生混合噪音圖 xt ,加入噪音程度系數 與 Time Step 有關,原則上,Time Step 越大,則 越小,原始圖片信息融入得越少,噪音程度系數值 則越大,混合后的噪音圖 xt 噪音程度越高,也就是說混入更高比例的噪音到原始清晰圖 x0 中。這樣就一步形成了某個 time step 下的噪音圖。
當人為加入可控噪音后,等于制作出了訓練數據:<構造出的混合噪音圖xt ,構造這張混合噪音圖時對應的 Time Step,被加入的噪音圖 ε >。用這個訓練數據,我們可以來訓練一個神經網絡模型 f(θ) ,輸入混合噪音圖 xt 以及噪音圖對應的 Time Step 信息,讓 f(θ) 根據這兩個信息,反向預測到底加入了怎樣的噪音 ε′ ,而前向過程被加入的噪音圖 ε 就是標準答案。神經網絡 f(θ) 當前預測的噪音圖 ε′ 和標準答案 ε 對比,兩者的差異 (ε?ε′) 形成損失(MSE Loss),把預測差異通過反向傳播去調整神經網絡的參數,使得神經網絡能夠預測得越來越準。這就是訓練Diffusion Model 的過程。當然,這里為了方便講清楚,我做了一定程度的簡化。
如果經過上述過程訓練好 Diffusion Model 之后,在使用階段,Diffusion Model 的反向過程如上圖所示,分為兩個階段。第一個階段,我們把需要進一步去除噪音的某個混合噪音圖xt ,以及混合噪音圖當前對應的去噪步數(Time Step)信息,輸入訓好的神經網絡 f(θ) ,此時神經網絡 f(θ) 會預測出一個噪音圖 ε′ 。第二個階段,拿到了神經網絡預測的噪音圖 ε′ 后,混合噪音圖片 xt 減掉預測的噪音圖 ε′ ,就完成了一步去噪音的過程,圖像包含的噪音就減少一些,變得更清晰一些。去噪過程仍然需要一步一步逐漸完成,不能像加噪過程那樣一步完成。
上面介紹的是無條件約束下的圖像 Diffusion Model 運行過程,而像文生圖模型比如Stable Diffusion 這種模型,是在有文本 Prompt 約束下進行的,希望模型能生成符合文本描述的圖像。如何將無條件的 Diffusion Model 改造成有條件約束的模型呢?很簡單,我們可以使用比如 CLIP 的文本編碼器,把 Prompt 從文本空間映射到與圖像對齊的參數空間內,然后以此作為 Diffusion Model 模型生成圖片的指導條件。類似地,Diffusion Model 預測的噪音ε′ 會和人為加入的噪音標準 ε 進行對比,以減小兩者的差異作為學習目標,來更新 Diffusion Model 的參數,這樣能讓神經網絡預測噪音越來越準,那么去噪效果也就會越來越好。
上面是 Diffusion Model 的基本原理,接下來我們介紹如何推導出Video DiTs 視頻生成模型的結構。首先要明確的是,基于 Transformer的 Diffusion Model 整個工作流程,就是上面介紹的加噪和去噪過程,無非預測噪音的神經網絡結構,從傳統(tǒng)做Diffusion Model 常用的 U-Net 網絡,換成了Transformer 網絡結構而已。
大家都猜測 Sora 是基于 DiTs 模型(可參考:Scalable Diffusion Models with Transformers),原因在于 William Peebles作為 Sora 項目的 Co-Lead,也是 DiTS 模型的一做,所以大家推測 Sora 的 Diffusion Model 是基于 DiTs 改的,這個猜測聽著還是蠻合理的。
DiTs 是基于 Transformer的Diffusion Model 圖像生成模型,看著結構比較復雜,其實整體結構和上文介紹的標準的有條件Transformer Diffusion Model 生成模型基本一致,上圖在 DiTs 結構圖的對應位置標注出了相應的組件名稱,左右兩圖可以對照著看下。
需要注意的是,DiTs 是生成圖片的模型,直接拿來做視頻模型肯定是不行的。我們至少需要在DiTs 上做兩項改造:首先,需要設計一定的模型結構,用來支持不同長寬比和分辨率的視頻;第二,需要把圖片生成模型改成視頻生成模型。
先來看下第一個改造,用來從Transformer 模型結構層面支持不同長寬比和分辨率的視頻。在 Spacetime Latent Patch 階段我們談到過,經過 NaVIT 改造,不同圖片或視頻幀的輸入 Patch 是變長的,所以在 Transformer 階段,我們需要引入 Attention Mask 機制,保證 Transformer 在做 Local Spatial Attention 的時候,屬于某張圖片的 Patch 只能相互之間看到自己這張圖片內的其它Patch,但不能看到其它圖片的內容。另外,因為這個引入的 Attention Mask 是針對輸入 Patch 的,所以 Transformer內的這個 Local Spatial Attention 模塊一定在 Transformer 內部結構的最底層。
經過上述推導,我們可得出如上圖所示的Transformer 內部結構,它目前由兩個子模塊構成:最底層是 Local Spatial Attention 模塊,主要計算圖片或視頻幀的空間信息,也就是對同一個視頻幀內的各個 Patch關系進行建模。在它之上,有一個標準的 MLP 模塊,這個是 Transformer模塊做非線性映射所必需的。
現在的問題是:如果每個視頻幀的Patch 數是固定的,那么這個 Local Spatial Attention 模塊就很容易設計,但是我們面對的是變長 Patch,具體采取什么技術手段才能實現針對變長Patch 的 Local Spatial Attention 呢?
這里給出一個可能的解決方法,主要思路來自于文獻“Efficient Sequence Packing without Cross-contamination: Accelerating Large Language Models without Impacting Performance”。我們可采用“0/1 Attention Mask 矩陣”來達成目標,從上圖可看出思路也很簡潔:如果我們假設 Batch 內序列最大長度是8,就可以設置一個8?8 的 0/1 Attention Mask,只有對角線正方形子Block 位置全是 1,其它地方都設置成 0。左圖中標為綠色的某幀三個 Patch,如果看矩陣前三行,易看出,針對其它幀的Attention Mask 由于都是 0,所以加上 Mask 后就看不到其它圖片,而對于它對應的 3?3 都是 1 的 Attention Mask,又可以保證三個 Patch 相互都能看到。其它圖片也是類似的道理。通過設置Attention Mask,就可以很方便地支持 NaVIT 導致的每幀不同分辨率和長寬比的問題。
接下來進行第二項改造,從 DiTs 到 Video DiTs,也就是讓 DiTs 能夠支持視頻生成。這步改進比較簡單,因為大多數視頻生成模型都有這個模塊,就是在我們上一步改造的Transformer 結構里,加入一個 Casual Time Attention 子模塊。Causal Time Attention 模塊的作用是在生成第 i 幀的時候,收集歷史 Time 信息,也就是通過 Attention 讓第 i 幀看到之前的比如 k 幀內容,這是用來維護生成視頻的時間一致性的,做視頻生成肯定需要它。至于它的位置,因為 Local Spatial Attention 必然在 Transformer 內部最下方,所以Causal Time Attention 放在之前引入的兩個子模塊中間,這是個合理選擇。
Local Spatial Attention 和Causal Time Attention 的具體含義,如果按照時間序列展開,則如上圖所示,比較簡單不解釋了。
前面在講Diffusion Model 原理的時候提過,利用 Diffusion Model 來做文本生成視頻,還需要兩個條件變量:Prompt 文本信息,以及 Time Step 信息。如果把這兩個條件引入,一種設計方案是把兩個條件信息壓縮后,并排放入每一幀的輸入信息里;另外一種思路是可以在Transformer 目前的 3 個子模塊里再引入一個 Condition Attention Block,把輸入條件接入這個模塊,通過 Attention模式工作。目前已有研究(可參考:VDT: General-purpose Video Diffusion Transformers via Mask Modeling)證明,盡管第一種把條件變量塞到輸入部分的做法很簡單,但是效果是很好的,訓練起來模型收斂速度也較快。基于此,我這里就選擇了這種簡潔的方案,思路如上圖所示。
如果歸納下 Video DiTs 的整個邏輯,就如上圖所示。把噪音Patch 線性化后,并入Prompt 和 Time Step 條件,一起作為 Transformer 的輸入。Transformer 內部由三個子模塊構成:Local Spatial Attention 模塊負責收集視頻幀空間信息;Causal Time Attention 模塊負責收集歷史時間信息;MLP 模塊負責對時間和空間信息通過非線性進行融合。疊加比如N 個這種 Transformer 模塊,就可以預測當前 Time Step 加入的噪音,實現一步去噪音操作。對于 Diffusion Model 的逆向去噪過程,Time Step 可能需要如此反復迭代 20 到 50 次去噪過程,才能形成清晰的視頻幀。這也是為何 Sora 比較慢的原因之一。
七、Sora的Long Time Consistency可能策略:暴力美學還是FDM?
如何維護生成長視頻的內容一致性也是一個研究方向,目前一種比較常見的策略是“LLM+Diffusion Model”集成策略,如上圖所示的流程。其基本思想是:可以把長視頻分成多個分鏡場景,對于用戶輸入的Prompt,可以用比如 GPT-4 這種 LLM 模型自動生成多場景各自的拓展 Prompt 描述,然后用視頻生成模型生成對應的分場景視頻,就是“分場景拼接”的模式。
但這里有個問題,比如主角可能在各個分場景都會出現,如果不做一些特殊的維護角色一致性處理的話,可能會出現主角形象老在不斷變化的問題,也就是角色不一致的問題。上面這個工作VideoDrafter(可參考:VideoDrafter: Content-Consistent Multi-Scene Video Generation with LLM)是這么處理的:它讓 LLM 產生一個角色的形象描述文字,然后使用比如 Stable Diffusion 文生圖模型,根據形象描述文字,生成全局固定的角色外觀圖片。在每個分場景內,都依托這個唯一的角色外觀圖片來生成視頻,這樣可以解決不同分場景的角色一致性問題。
Sora會采取這種策略嗎?我猜可能性不太大,對于很通用的Prompt 描述,明確確定主角或特定角色其實是不太容易的,這種明確角色、產生全局固定形象的思路,感覺比較適合特定領域的視頻生成。
這里提一種粗暴野蠻但簡單的可能做法,如上圖所示。就是說,在生成第i 幀視頻的時候,把 Time Attention 拉長,讓第i 幀看到前面從第 1 幀到第(i?1) 幀所有的歷史內容,這類似 TECO 在做 VAE 時集成 Time信息的做法。這種做法看到的歷史比較長,所以可能在維護一致性方面有好處,但明顯對算力要求很高。
Sora有可能這么做嗎?并不能排除這種可能性,證據來自于上圖中Sora 技術報告的截圖,紅圈標出的文字意思是 Sora 為了維持長時一致性,會一次看之前的很多幀。
在 Transformer Diffusion Model 階段維護“長時一致性”策略方面,感覺FDM(Flexible Diffusion Modeling)方法是種簡潔有效的思路。FDM(可參考:Flexible Diffusion Modeling of Long Videos)提出了兩種 Time Attention 改進模型,在維護長時一致性方面效果不錯。之前我們提到TECO 的評測,右下角的評測圖里,除了 TECO 那條藍色線,緊接著的紅色線就是FDM 在 500 幀視頻生成的效果。而且很明顯,FDM 這種 Time Attention 和 TECO 這種 VAE 編碼,兩者都出于維護生成視頻一致性的目的,而在模型中所處的位置不同,所以兩者是有互補性的。
下面介紹下 FDM 的兩種 Time Attention 的思路,在介紹之前,先說明下基準方法,也就是“自回歸方法“(Autoregressive)。如圖所示,“自回歸”思路很直接,先依次生成若干比如 6 幀視頻幀,然后一次生成后續(xù)3 幀,在生成這 3 幀的時候,Time Attention 會看到之前的最近若干幀,比如 4 幀。也就是說,“自回歸”在生成后續(xù)視頻幀的時候,會參考之前最近的若干幀。容易看出,這是一種“短時”Attention,而非“長時” Attention。
“Long Range”是 FDM 提出的第一種“長時一致性”模型,思路如圖所示。想法很直觀:在生成第i幀視頻的時候,不僅僅參考最近的幾幀,也會在較遠歷史里固定住若干幀作為參考。可以看出,“Long Range”既參考短時歷史,也參考長時歷史,不過長時歷史位置是隨機選的,也是固定的。
“Hierarchy 方法”是 FDM 提出的第二種長時 Attention 策略。它首先從較長歷史里間隔采樣,獲得之前歷史的大致輪廓,在全局歷史視頻幀引導下,先產生后面若干關鍵位置的視頻幀,比如第一幀、最后一幀以及中間幀。這意思是根據全局的歷史,來生成全局的未來。之后按順序生成后續(xù)幀,在生成后續(xù)幀的時候,不僅參考最近的歷史,同時也參考第一步生成的未來關鍵位置視頻幀。所以這是一種先謀劃全局,再斟酌現在的“長遠與近期相結合”的層級化的Time Attention。
我無法確定Sora 是否會用類似 FDM 的思路,但是覺得這是維護長時一致性較為可取的一種方法。
八、Sora的訓練過程與技巧:合成數據、兩階段訓練及雙向生成
需要再次強調下:所有文生視頻模型,本質上都是有監(jiān)督學習,是需要大量高質量標注好的<文本,視頻>成對數據來訓練的,它們不是類似 LLM 的那種自監(jiān)督學習那樣,無需標注數據。
盡管有些開源的帶標注視頻數據,但是無論數據量還是質量,想要作出類似Sora 這么高質量的視頻生成模型,基本上是沒可能的。所以,如果想要復現 Sora,如何自動化地做出大量高質量標注視頻數據可能才是最關鍵,也是最難的一步。(當然,我們可以借鑒LLM 蒸餾 GPT4 的歷史經驗,估計這些 GPT-4V 視頻標注蒸餾方案,很快就會出現)。
我覺得,Sora 之所以效果這么好,在制作帶標注視頻合成數據方面的貢獻很可能是最大的。Sora 采用了類似DALLE 3 的方法來制作視頻合成數據。上圖左側展示了 DALLE 3 制作<文本,圖片>合成數據的流程。圖片標注數據網上資源有很多,比如5B 的 LAION 數據,但是標注質量有些問題,一方面是太粗略太短沒有細節(jié)描述,一方面里面有些是錯誤的。
鑒于此,DALLE 3 通過人工標注(或者人加 GPT 相結合?)一些<詳細文本描述,圖片>數據,用這個數據來訓練一個 Image-Caption Model(ICM),就是說 ICM 接受圖片輸入,學習根據圖片內容,自動產生圖片的詳細描述。有了ICM 模型,DALLE 3 用它生成的長文本描述,替換掉原先圖文標注數據里的短文本描述,就制作出了大批量的高質量合成數據,這對DALLE 3 質量提升幫助很大。
Sora的視頻合成數據制作過程應該是類似的(參考上圖右側)。通過人工標注(或人+GPT)一批高質量的<視頻,長文本描述>數據,可以訓練一個 Video-Caption Model。VCM 模型訓練好后,可以接受視頻,輸出詳細的文本描述。之后,可以用 VCM 產生的視頻長描述替換掉標注視頻數據里的簡短文本描述,就產生了高質量的視頻合成數據。
其實思路可以再打開,既然我們有了VCM,也可以給沒有標注的視頻自動打上長文本描述,沒問題吧?這樣的話,可以挑那些高質量視頻,用 VCM 打上詳細文本描述,這就制作出了大量的、非常高質量的視頻標注數據。
另外,既然Sora 是圖片和視頻聯合訓練,那么很顯然,訓練 DALLE 3 的那批圖文合成數據,那肯定在訓練Sora 的時候也用了。
Sora在訓練的時候應該采取了兩階段訓練過程,下面簡述其做法。
一般 VAE 是獨立訓練的,收集大量的圖片或視頻數據后,通過圖片或視頻重建的訓練目標,可以得到對應的“視覺編碼器-解碼器”。此部分訓練是自監(jiān)督學習,不需要標注數據。
第二階段是包括 Diffusion Model 在內整個模型的訓練,這一階段訓練過程中,一般前一階段訓練好的Encoder-Decoder 會凍結模型參數,不隨著這步驟的訓練數據發(fā)生變動,包括 Text Encoder 也是利用現成的比如 CLIP,也會類似地凍結住模型參數。所以這部分訓練主要涉及Spacetime Latent Patch 對應的 Position Embedding,以及預測噪音的基于 Transformer 的 Diffusion Model 的訓練。
另外,Sora 還支持多種方式的視頻生成,比如輸入一張靜態(tài)圖生成完整視頻、生成無限循環(huán)視頻、輸入結尾幾幀圖片倒著生成完整視頻、給定兩段視頻內容生成新內容將兩者平滑地連接起來等。
可以推斷,在 Sora 的訓練過程中,采用了在輸入側中間位置加入已知圖片,然后同時按照時間維度的正向生成視頻和反向生成視頻的雙向生成策略。一方面,引入這種雙向生成策略,可以方便地支持上面講的各種靈活的視頻生成類型;另外一方面,其實如果采取從中間向時間維度兩邊拓展的生成模式,更有利于維護生成內容的連貫性和一致性。因為中間位置向兩邊拓展,只需要維護一半時間窗口的內容一致性即可,兩邊向中間內容靠攏,這看上去是雙向生成策略帶來的額外好處。
比如,之前提到的輸入一張圖片生成完整視頻,從視頻內容可知,這個例子是把輸入圖片放在了輸入噪音圖片序列的最后一幀,然后按照時間順序倒著生成的。再比如,生成無限循環(huán)視頻,可以把某一幀視頻圖片,分別插入在中間位置和頭尾位置,然后從中間位置分別向兩邊生成,這樣就會產生一個看上去總在無限循環(huán)的視頻內容。
可見,若能方便地在指定輸入位置插入圖片,即可方便地支持雙向訓練或靈活的視頻生成方式。那么,如何達成這一點呢?可以采用掩碼策略(思路可參考:VDT: General-purpose Video Diffusion Transformers via Mask Modeling),如上圖所示。圖右側M 是 0/1 掩碼矩陣,對應矩陣取值要么都是 1 要么都是0,而 C 是引入的掩碼幀序列,可以把已知圖片插入到指定位置,并把它對應的掩碼矩陣設置為1,其它掩碼幀可以是隨機噪音,對應掩碼矩陣設置為 0。M 和 C 經過 Bit級矩陣乘法,獲得掩碼運算結果,對應 0 掩碼矩陣內容都被清零,而對應 1 的掩碼矩陣的內容仍然保留,這樣形成掩碼幀。
相應地,對Diffusion Model 的輸入噪音序列F 來說,設置一個反向掩碼矩陣序列 (1?M) ,其 0/1 矩陣取值和對應的掩碼幀 0/1 矩陣 M 正好相反,同樣地, ( (1?M) 和 F 進行掩碼運算后,要插入圖片位置的輸入幀數據被清零,其它噪音幀內容保持不變。
接下來只要將噪音輸入幀和對應的掩碼幀進行矩陣加法運算,這樣就把已指圖片插入到Diffusion Model的指定位置了。
九、Sora能作為物理世界模擬器嗎
OpenAI宣稱Sora是物理世界模擬器,這個問題的答案非常主觀,每個人都有不同的看法。我覺得以目前的技術條件來說,單靠Sora本身很難構造世界模擬器,更愿意把OpenAI這么講看成是他們對Sora寄托的愿景,而非已經成立的事實。對此更詳盡的個人思考可見:https://zhuanlan.zhihu.com/p/684089478。
本文轉載自:??DataFunTalk ??
作者:張俊林
