Stable Diffusion到底是什么東西?

本來想像一開始接觸Disco Diffusion時候那樣按一些英文的簡單解釋加上自己的使用經(jīng)歷來寫一篇討論Stable DIffusion原理的文章,結(jié)果發(fā)現(xiàn)我根本沒有那個能力(現(xiàn)在看我以前寫的很多內(nèi)容都有問題,哈哈哈)。而且我發(fā)現(xiàn)這個工程量之巨大,即使我把所有數(shù)學(xué)公式和代碼都略過只看文字,也還是越看越覺得不敢下筆。想跳過所有深度學(xué)習(xí)方面的概念直接強(qiáng)行解釋未免也太扯了,但我又想我應(yīng)該是不可能去搞這方面開發(fā)的,所以要寫點東西的話,也就只能做到把我覺得有價值的參考資料總結(jié)一下,再說一點自己的感想——我沒資格說任何結(jié)論性解釋,但是如果你看完我的文章,產(chǎn)生很多疑問和興趣想去自己探索和思考,那我覺得我的目的就達(dá)到了。
所以跟別人寫的文章不一樣,我一開始就把我覺得比較好的參考資料列出來,如果你有數(shù)學(xué)基礎(chǔ),英文也沒問題,那直接去看這些最好,不用聽我廢話。我是了讓自己能用好這些工具才想到去了解這些原理,如果你也是這些東西的使用者,又不想去啃那堆代碼和數(shù)學(xué)公式的話,我后面的內(nèi)容或許能有點用(就是你可以直接跳到參考資料之后去看我的感想部分)。

比較高級(不太友好)但比較權(quán)威的參考資料:
https://jalammar.github.io/illustrated-stable-diffusion/?jalammar
這位叫Jalammar的老哥寫的關(guān)于Stable DIffusion原理的簡明介紹和各種示意圖基本是國內(nèi)自媒體這方面文章的來源了。但是說實話,如果你不知道什么是Attention機(jī)制、什么是U-net,什么是CFG,甚至連Diffusion和GAN的區(qū)別都不知道的話,這些圖表看了也是不會理解的。有很多內(nèi)容他都沒有解釋。
https://huggingface.co/blog/annotated-diffusion
按DDPM論文代碼復(fù)現(xiàn)的方式講解的DIffusion原理。很長,很多代碼,但是里面有U-net的示意圖。
https://lilianweng.github.io/posts/2021-07-11-diffusion-models/
OpenAI?大佬關(guān)于Diffusion很系統(tǒng)的介紹,當(dāng)然也是以數(shù)學(xué)公式為主。
與關(guān)鍵名詞有關(guān)的論文,比如CFG、GLIDE、CLIP、Attention,以及CLIP Latent DIffusion\Stable DIffusion發(fā)布時的“官方”論文等。其中很多都在前三項的參考文獻(xiàn)中有提及。
B站有幾位數(shù)學(xué)或計算機(jī)專業(yè)的UP做過與這些資料相關(guān)的精講(不是營銷廣告號那種),時長將近一兩個小時,可以自搜一下。

下面列一些對我這種外行幫助很大,又不需要啃代碼和數(shù)學(xué)公式就能看懂的資料:
https://stable-diffusion-art.com/how-stable-diffusion-work/?
強(qiáng)推一下這篇文章,在完全不用數(shù)學(xué)公式和代碼的條件下基本把整個工作流講透了,作者這個網(wǎng)站里還有很多關(guān)于SD使用技巧的文章也都很有用。我其實是在找SD負(fù)提示語的寫法時發(fā)現(xiàn)的這個資料。他文末的參考資料列表也把很重要的一些論文提到了。
How AI Image Generators Work (Stable Diffusion _ Dall-E) - Computerphile?
這個視頻站內(nèi)有人搬運,是我見過把Diffusion原理講得最簡單易懂的視頻了,而且還順帶把CFG給解釋了。
顧險鋒2016年的文章《人工智能中的聯(lián)結(jié)主義和符號主義》
你可能會納悶這個跟SD有什么關(guān)系,還有顧險鋒又是誰(說丘成桐的弟子可能就知道了吧)。其實大多數(shù)外行在AI生成技術(shù)之前,對深度學(xué)習(xí)唯一的認(rèn)識可能就是AlphaGO打贏了李世石和柯潔。這篇文章對我很有啟迪,因為Stability AI CEO每次講SD原理時候都會從2017年谷歌關(guān)于Attention機(jī)制的論文說起,而2016年這篇總結(jié)性文章可以幫你梳理這個時代之前的信息。
混沌巡洋艦-許鐵在某乎的一系列專欄,承接第3項的擴(kuò)展閱讀。腦神經(jīng)科學(xué)中的一些概念對理解Diffusion模型的廣泛應(yīng)用似乎很有幫助。
http://colah.github.io/posts/2014-03-NN-Manifolds-Topology/
這篇文章國內(nèi)有人翻譯,叫《用可視化理解神經(jīng)網(wǎng)絡(luò)!》,里面的一些動圖對形象化的理解神經(jīng)網(wǎng)絡(luò)、分類問題、流形假設(shè)很有幫助。
https://nonint.com/
Tortoise.TTS(烏龜?tts)作者的博客,前谷歌現(xiàn)Open AI的研究員,?雖然他跟Stable DIffusion沒什么關(guān)系,但是他的文章里能看到很多對Diffusion原理很淺顯又很深刻的解釋。
關(guān)于SD的使用技巧,尤其是對于非二次元類圖片的制作,以及一些名詞的解釋,CSDN上也有一些內(nèi)容可供參考。

好了,打了快2000字才開始正式內(nèi)容。
所以,Stable?Diffusion到底是什么東西?很多文章會從Diffusion的原理和訓(xùn)練說起,但我覺得這么開始的話還是缺了很多東西。
我推薦先去看一遍顧險鋒的文章。SD首先是人工智能中的聯(lián)結(jié)主義,是模仿人類神經(jīng)元結(jié)構(gòu),去完成一項或多項人類工作的深度學(xué)習(xí)模型。跟符號主義不同的是,它的原理、結(jié)果是不能用數(shù)學(xué)完全解釋的。之所以機(jī)器學(xué)習(xí)處在數(shù)學(xué)-計算機(jī)專業(yè)鄙視鏈的底端,而顧險鋒作為數(shù)學(xué)家,試圖在計算機(jī)視覺領(lǐng)域做出貢獻(xiàn)遭到了很多數(shù)學(xué)專業(yè)人的攻擊,原因就在于此(他們認(rèn)為這對數(shù)學(xué)專業(yè)的發(fā)展毫無益處)。實際上機(jī)器學(xué)習(xí)有點像數(shù)學(xué)與腦神經(jīng)科學(xué)的交叉學(xué)科,而且這個領(lǐng)域的大牛很多都有心理學(xué)等醫(yī)學(xué)方面的背景。如果說電腦和軟件是符號主義推理出來的人工智能產(chǎn)物,那么這些基于神經(jīng)網(wǎng)絡(luò)的AI模型就完全是另一條路線,一種數(shù)學(xué)家沒辦法從理論上證明,但是工程師們卻認(rèn)為可以拿它來替代人類一部分工作的,一種從本質(zhì)上就會引起文科生、理科生和工科生吵架的玩意。

舉個例子,我們知道CLIP模型其實是一個以文本為線索,對相關(guān)圖像訓(xùn)練形成的一個分類器,但它對圖像分類的依據(jù),并不是人類的理性思維,而是一種神經(jīng)網(wǎng)絡(luò)計算出來的參數(shù)體系。那些存儲在神經(jīng)網(wǎng)絡(luò)上的用來表示某種圖像特征的權(quán)重,并不是像人類編寫的百科全書或詞典里那樣,以一個單詞或者詞根、縮寫為單位,而是算法擬合出來的一個次語義級別的單位(token),這個計算過程就叫數(shù)據(jù)表示(Data Presentation),而tensor、embedding、activations、hidden states,不管你怎么翻譯,說的都是這個token所變換成的一個可以存儲在神經(jīng)網(wǎng)絡(luò)中的向量(vector)。你沒辦法按人類學(xué)習(xí)的思路去理解機(jī)器學(xué)習(xí),比如人類詞典里那些超級長的單詞,雖然很荒謬但仍在可以理解的范疇,而CLIP里為何會把下面這些詞作為人類語言的底層元素來對圖像進(jìn)行分類,就實在無法用理性思維解釋了:
thinkbigsundaywithmarsha?和瑪莎一起周日大思考?
blackandwhitephotography?黑白攝影?
internationalwomensday?國際婦女節(jié)?
artificialintelligence?人工智能?
digitaltransformation?數(shù)字轉(zhuǎn)型?
landscapephotography?風(fēng)景攝影?
wednesdaymotivation?周三的激勵?
worldenvironmentday?世界環(huán)境日?
screenshotsaturday?周六截屏?
womenshistorymonth?婦女歷史月?
thepersonalnetwork?私人網(wǎng)絡(luò)?
(以上為CLIP中一些比較長的次語義級別單位)
也許是因為數(shù)據(jù)集中有這些詞的圖片太多了的緣故?那么在GPT這樣的純語言模型中,又為什么會把indivisible(不可分的)拆成了ind,iv,isible?這3個token的呢?
在 https://beta.openai.com/tokenizer?里可以輸入任何英文來查看它被GPT分解成了哪些token。??
我就查到了一些很有趣的分解:如
Chinese=?Ch + inese
Japanese= J + apan + ese
Vietnamese= V + iet +?namese
Cantonese = C + ant + ones + e
這種令人費解的詞義分解方式最后卻能讓GPT模型表現(xiàn)出一種似乎能理解人類語言的能力,正是很多人對機(jī)器學(xué)習(xí)鄙夷的一個原因——你沒辦法從數(shù)學(xué)和常理上去證明它的合理性,你可以隨便舉幾個反例來證明它是“人工智障”。而工程師的看法則相反,你認(rèn)為不可靠是因為看到它只有60%的正確率,但我可以一點點努力把它提高到70%、80%、甚至99%,而每一次提高都可以替代一部分人類的工作,為什么說它沒有用呢?
如果這一段內(nèi)容你看懂的話,你就知道互聯(lián)網(wǎng)上99%關(guān)于人工智能的爭吵都是沒有意義的。
對反對者來說,任何水平的人都可以通過最基本的生活經(jīng)驗和邏輯來“抵制”或者“推翻”當(dāng)前的AI模型,但對支持者來說,你總能發(fā)現(xiàn)它有一定的成功率來替代和超越部分人類的工作。
這也是為何當(dāng)前階段的人工智能,比如AI繪畫、AI音樂、AI編程、AI翻譯、AI寫作,不太可能被已經(jīng)精通這些技能的人所很快接受,而反而被那些沒有精通這些技能的人所快速采納的根本原因。半杯水總比沒水好。

插一段我忽然想到的話題:
比取代一些人工作更可怕的,是AI在教育上的用處。你可以認(rèn)為一個技能水平不如你的人,在工作上使用AI超越你是作弊,但是當(dāng)AI把過去需要四年才能培養(yǎng)出來的專業(yè)人才,用四個月,甚至四天培養(yǎng)出來呢?某棋手不就是這么被逼成網(wǎng)紅了么(笑~)。
很多人沒意識到ChatGPT能寫出大學(xué)生級別的論文代表什么意思——如果某一學(xué)位或某一門課程的學(xué)習(xí)目標(biāo)是以學(xué)生上交的論文為評價標(biāo)準(zhǔn)的,也就是說教育的目的是為了讓學(xué)習(xí)者能根據(jù)教科書、老師的講解、自己的實踐、同學(xué)的交流、廣泛的資料選讀來總結(jié)出有新意的結(jié)論的話,那如果以后這些事情AI能做到都包辦了呢,這個教育體系是否還有必要存在呢?(如果有一天雇主發(fā)現(xiàn)找?guī)讉€高中生用AI培養(yǎng)一下就能完成工作了,還要需要那些老了四歲的大學(xué)生么?機(jī)器學(xué)習(xí)本身用到的數(shù)學(xué)知識甚至都沒比高中數(shù)學(xué)難多少!)
像這篇文章,如果我直接把相關(guān)論文和文章都扔給ChatGPT去總結(jié),比我自己研究得到的結(jié)論會不會來得更加準(zhǔn)確呢!等到了聽AI一句話,勝讀十年書的時候,我們的教育體系可能就會被徹底改變了。AI不僅會讓你失去工作,到一定程度,你引以為榮的專業(yè)背景和資歷也都會不復(fù)存在。世界冠軍都接受不了,何況是普通人了。
再提一下,Stability.AI CEO?對Stable Diffusion的定義,是一種生成式圖片搜索引擎。這是一種從它外在表現(xiàn)去定義的方法論,和我們要探討的聯(lián)結(jié)主義原理是另一種思路。看上去這個模型學(xué)習(xí)了人類幾億張圖片后,就可以按人類提供的語言定義去生成任何一張與之相關(guān)的、之前并不存在的、嶄新的圖片。而這個模型大小,遠(yuǎn)比你把幾億張圖片進(jìn)行壓縮之后,建立的一個按人類定義索引的圖庫要小得多,它的“搜索”結(jié)果也不是一堆相關(guān)圖片的排列組合,而是基于機(jī)器學(xué)習(xí)建立的某種內(nèi)在邏輯而創(chuàng)造出的一組嶄新的示例。和GPT這種大型語言模型一樣,我覺得你也可以把它視為一種被壓縮的“知識”。
所以我們眼前這些AI模型,都可以被視作一種被推送到個人手里的“邊緣計算”,它其實某種意義上講是一種去中心化的知識體系。
如果GPT和SD讓以提供中心化文本和圖像知識推送的谷歌、百度感受到危機(jī)的話,那么等文本到視頻和3D的模型成熟了,依賴中心化算法,控制流量和推送廣告以盈利的視頻網(wǎng)站、游戲廠商就是下一輪被“去中心化”的目標(biāo)。
如果給你一個可以裝在手機(jī)里的,可以自定義各種信息流,而不用看任何廣告的生成式圖文、視頻、游戲引擎,你還需要裝那么多APP么?我沒瞎說,這是OpenAI正在開發(fā)的真實項目(也是微軟投資的真正目的),Stability.AI CEO訪談里也說了,他開源的真正目的也不僅是為了“促進(jìn)行業(yè)發(fā)展”,而是在搶奪下一代互聯(lián)網(wǎng)中心!對他這個計算機(jī)專業(yè)出身的對沖基金經(jīng)理來說,這其實是一種套利,而不是純粹的公益。他想把這些搞AI的大公司都逼到開源領(lǐng)域去,原話。
中心化推薦算法幾乎是現(xiàn)在所有互聯(lián)網(wǎng)企業(yè)的核心,然而馬云說的以后不再會有專門的互聯(lián)網(wǎng)企業(yè),而是所有企業(yè)都是互聯(lián)網(wǎng)企業(yè),其實這么看是有點道理的。

我們還是回到正題上吧,如果你接受了機(jī)器學(xué)習(xí)本身的非“絕對”可靠性和可“相對”提高性,那下一步就應(yīng)該從聯(lián)接主義或者仿生學(xué)的角度,重新審視一下眼前的AI模型。
顧險鋒文中提到了海馬體。對人類記憶原理的一種解釋,就是海馬體是按時間序列來分解和存儲視覺、聽覺神經(jīng)傳遞的信息的,而海馬體的共振頻率和地球的一樣(很多動物都是這樣?。Uf到DIffusion模型的實質(zhì),(我自己的看法)就是一個循環(huán)可逆的、與時間序列相關(guān)的、按照一個或多個線索,對某種標(biāo)準(zhǔn)化的、與時間序列相關(guān)的數(shù)據(jù)分布的某種采樣結(jié)果的去噪音過程。那是不是可以認(rèn)為Stable Diffusion是在模仿人類視覺神經(jīng)從海馬體儲存的記憶數(shù)據(jù)中復(fù)現(xiàn)某種場景的原理呢?

你一定聽過一切事物都是某種頻率或波形的說法。如果我們把文本、圖像、聲音、視頻、某種人類行為等這些非結(jié)構(gòu)化的數(shù)據(jù),按時間序列分布相關(guān),強(qiáng)行正則化之后,是不是都可以視為同一種波形呢?腦神經(jīng)科學(xué)已經(jīng)發(fā)現(xiàn)人腦神經(jīng)元上使用的是一種普適的算法,這也是為何盲人可以利用聽覺神經(jīng)“看見”的原因!(顧險峰的文中有相關(guān)內(nèi)容,一定要看下)
而我們將這些非結(jié)構(gòu)化數(shù)據(jù)進(jìn)行結(jié)構(gòu)化處理的意義,就是為了讓神經(jīng)網(wǎng)絡(luò)去學(xué)習(xí)和分析它。但現(xiàn)在的AI模型和之前不一樣之處在于,我們不再需要繁雜的人工數(shù)據(jù)標(biāo)注去設(shè)計一個龐大的、在人類理性思維看來合理的數(shù)據(jù)集,而是利用超級計算機(jī),直接把有多模態(tài)性質(zhì)的(文本-圖像、文本-聲音、文本-文本)丟給AI,讓它自己去建立學(xué)習(xí)規(guī)則。也就是從大數(shù)據(jù)+小計算的有監(jiān)督學(xué)習(xí)向小數(shù)據(jù)+大計算的無監(jiān)督學(xué)習(xí)過渡。這大概也是為什么以后所有基于大數(shù)據(jù)的互聯(lián)網(wǎng)企業(yè)都會被基于超級算力的AI公司取代的原因。而按Sability.AI CEO的說法,蘋果的芯片因為特別適合于AI模型的計算,會讓這家公司超越谷歌、微軟成為世界上最大的AI公司。實際上當(dāng)前AI發(fā)展突飛猛進(jìn)的真正方向,就是讓AI把那些非結(jié)構(gòu)化數(shù)據(jù)利用起來以形成新的知識。我們不再需要用自己的理性思維去設(shè)計一個體系去將非結(jié)構(gòu)化數(shù)據(jù)(書本、語音、音樂、視頻、行為模式、蛋白質(zhì)中的氨基酸排列等)進(jìn)行歸納、總結(jié)、分析以創(chuàng)造專業(yè)知識和在此基礎(chǔ)上生產(chǎn)新的內(nèi)容,而是把這種數(shù)據(jù)結(jié)構(gòu)化的問題,跨過以前干這些事的專業(yè)人士,直接交給AI,讓他們?nèi)ミM(jìn)行科學(xué)研究和內(nèi)容創(chuàng)新。

我又扯遠(yuǎn)了,再拉回來。之所以強(qiáng)調(diào)是非結(jié)構(gòu)化數(shù)據(jù),就是要說明它是對人類神經(jīng)本能(也可以叫形象思維,靈感,或者叫非理性思維)的一種模擬,相當(dāng)于讓AI看了幾場電影,聽了幾首歌之后,按人類在其中留下的線索(比如,語言),自己去擬合一套人類的標(biāo)準(zhǔn)以總結(jié)出新的知識,而不是讓人類先總結(jié)一些標(biāo)準(zhǔn),再讓AI按計算機(jī)語言去計算。前面講的CLIP和GPT中的次語義級別單位,也就是token,都是AI自己算出來的。我們的語言學(xué)里就不是這么去分割詞根詞綴的,如果讓人類自己去把語言數(shù)據(jù)結(jié)構(gòu)化再做計算,是不會得到這種token的。
所以我感覺之所以說2017年的“Attention is all you need”所提出的Attention機(jī)制能在幾年后引出這一輪利用非結(jié)構(gòu)化數(shù)據(jù)進(jìn)行超級計算的熱潮,可能就是它解決了存儲在神經(jīng)元上的數(shù)據(jù)間的交互問題(Information Entanglement)。因為我實在沒有能力去理解那些數(shù)學(xué)公式,所以這里只能根據(jù)看過的很多資料去想象了。也有人說Attention機(jī)制其實就是一種AI的“注意力”,讓它能夠自己去尋找數(shù)據(jù)間的隱含規(guī)律,以把精力放在最重要的事情上。
這是我在一篇名為“Attention in Natural Language Processing”的論文中找到的一個與Attention有關(guān)的圖示。可以看到,儲存在神經(jīng)網(wǎng)絡(luò)中的token是有關(guān)聯(lián)和層次的,當(dāng)你提出不同的任務(wù)時,所關(guān)聯(lián)到的token和權(quán)重會有所不同。如果這些token分別存儲在不同的神經(jīng)元上,那就相當(dāng)于這些神經(jīng)元會根據(jù)不同的任務(wù)而有層次的被“喚醒”或“點亮”。AI可能就是通過這種機(jī)制自己從非結(jié)構(gòu)數(shù)據(jù)中“學(xué)習(xí)”知識并把它以某種層次“記憶”在神經(jīng)網(wǎng)絡(luò)上的。可能人類自己也是這樣的?

這里還真有一篇論文叫 "Memory is?attention through time",??所以當(dāng)神經(jīng)網(wǎng)絡(luò)中的Attention與時間相關(guān),也成為一種類似頻率的,和原始token一樣結(jié)構(gòu)化的數(shù)據(jù)分布時,是不是也就成為了被存儲在神經(jīng)元間的某種”記憶“,可以通過采樣的辦法被人們提取出來呢?能不能說這就是我們需要的那個AI從非結(jié)構(gòu)化數(shù)據(jù)中壓縮和學(xué)習(xí)到的”知識“呢?實際上,Attention解決的還不止是token間聯(lián)系的問題,它還可以讓神經(jīng)網(wǎng)路變得”可解釋“,也就是甩掉神經(jīng)網(wǎng)絡(luò)那個著名的”黑箱“特點,使得人類可以通過學(xué)習(xí)它的結(jié)構(gòu),獲得有用的”思路“,而不再只是用它來進(jìn)行蠻力計算。
再回到前面講的CLIP上,以前用Disco DIffusion時了解過它的原理,就是讓文本和圖像解碼器分別把那些圖片和與他們相關(guān)的文本分別解碼成同結(jié)構(gòu)的向量之后,讓相同數(shù)據(jù)對間的向量余弦相似度最大,不同數(shù)據(jù)對間的余弦相似度最小以擬合出來的一個神經(jīng)網(wǎng)絡(luò)。其實它只是Diffusion模型中的一個模塊,能做到的是根據(jù)你提供的圖像來給出文字描述,而不是生成圖像。但它非??岬囊稽c,就是zero-shot,可以為訓(xùn)練集中沒有出現(xiàn)過的新圖片預(yù)測它對應(yīng)的文字描述。為什么呢?因為文字token是按次語義級別分解的,新圖片被圖像解碼器解碼成 Image embedding之后,與神經(jīng)網(wǎng)絡(luò)中文字token的向量進(jìn)行余弦值比較,再將最相近的token轉(zhuǎn)換成文字,我們就得到了新的文本描述!而這里一定是存在Attention機(jī)制的,不然我們得到的描述只會是一堆次語義級別token的堆砌,而不是符合人類語言的句子。
這時候一個新問題就出現(xiàn)了,為什么不能直接對CLIP輸入文字,按類似的原理反向解碼輸出圖像呢?是不是因為我們提到的解碼-譯碼結(jié)構(gòu)是單向的,CLIP的The Variational Autoencoder (VAE)?就是只能接受圖像輸出文字,而不能直接反著用呢?
或許我們還可以探討得更深入一點。一只貓(A?Cat)在CLIP中所對應(yīng)的 Image embedding(也就是將圖像解碼后形成的向量表示),到底是什么樣子的?CLIP的預(yù)設(shè)雖然不能畫圖,但是可以通過一個叫CLIP?Front的網(wǎng)站去查詢一個文本能聯(lián)系到哪些圖像。如果我們是某種可以”看見“這個512 X 512(訓(xùn)練集圖片尺寸) X 3 (紅、綠、藍(lán))=786,432維度的像素空間的生物,那么這只貓的樣子應(yīng)該是包括了所有和"A?Cat"有關(guān)聯(lián)的神經(jīng)元一起點亮之后形成的超高維形象。如果把它映射到二維空間,那么它應(yīng)該是一張可以包含所有你查詢 "A?Cat"?時得到的圖像,按照Attention機(jī)制得到的權(quán)重,混合在一起的樣子。。。那它還是我們想看到的一只貓的圖片么?

所以實際上,語言是對圖像一種極大程度上的精煉,要實現(xiàn)從文本生成圖像,你就要設(shè)計一種辦法,讓AI從符合”A Cat“標(biāo)準(zhǔn)的某個超高維度圖像中,”挑“出一張映射到二維空間,而讓和”貓“的視覺元素有關(guān)的所有變量,比如(黑、白、花。。。),(公、母、奶貓。。。),(緬因、貍花、橘貓。。。)(照片、卡通、水彩。。)(在吃飯、睡覺、打架。。。)等,都只是從中分別選擇一項,而不是全部混合在一起。所以是不是可以說,所有利用CLIP生成圖像的嘗試,從DALL-E、CLIPdraw、GLIDE、UnCLIP、StyleGAN 、Latent diffusion\Disco?diffusion,再到現(xiàn)在的Stable DIffusion,?其實都是一種采樣過程呢?
而這里提到的某個超高維度圖像,其實就是一種存在于那個維度下的數(shù)據(jù)分布。最關(guān)鍵的一點,它是一個連續(xù)量,是我們把數(shù)據(jù)集中離散的、所有與貓有關(guān)的圖像“融合”起來的,一種讓機(jī)器能夠識別的某種標(biāo)準(zhǔn)化的數(shù)據(jù)分布。而現(xiàn)在當(dāng)你想從中抽出一個樣本時,怎么才能保證你抽出的是貓在每個變量方向上都是接近離散的狀態(tài),而不是混在一起毫無意義的一團(tuán)呢?
舉個例子,假如數(shù)據(jù)集中的貓只有紅、綠、藍(lán)三種顏色,那我想要的是采樣是落在這三個區(qū)域里,而不是它們中間(比如黃色)。但是當(dāng)你給出的文字提示沒提顏色時,怎么才能告訴它只取那三個顏色區(qū)域周圍的點呢?和貓的圖像有關(guān)的變量,就是它可能變化的視覺元素太多太多了,你真的要用文字全部定義出來嗎?
所以,我覺得所有生成模型的工作原理,其實都是從某種機(jī)器學(xué)習(xí)得到的知識(某個連續(xù)可分的數(shù)據(jù)分布)中,采樣出一個離散的、在人類理解范圍內(nèi)的樣本的過程。

那如果圖片生成模型其實是從高維度空間中采樣的話,我們又該如何得到想要的那種分布呢?假如用最常見的梯度下降算法(Gradient Descent),從一個隨機(jī)采樣得到的分布開始,計算它與目標(biāo)分布的差距,使它往差距變小的方向變化,一直演算下去,直到這個差距我們能夠接受,是不是就會找到我們需要的那個分布了呢?
問題在于,一個代表圖像的數(shù)據(jù)分布,它的均值(mean)往往是沒有任何意義(meaningless)的,就像前面講的,”A Cat“圖像的均值,肯定是一團(tuán)無法分辨的、沒有現(xiàn)實意義的圖像。所以當(dāng)設(shè)定損失函數(shù)(Loss function)時(量化采樣分布與目標(biāo)分布的差距),我們需要的目標(biāo)是一個類似眾數(shù)(mode)的離散值,而不是均值(mean)這樣的連續(xù)量,可是它做不到。于是才需要一些額外的辦法,來間接地實現(xiàn)它。
GAN就是其中一個思路。所謂對抗生產(chǎn)網(wǎng)絡(luò),就是讓”判斷器“列出一系列mode,去判斷”生成器“生成的圖片是否與其中某個mode的差距足夠小,這樣就能得到近似于一張真實存在的、或者應(yīng)該是真實存在的照片的結(jié)果。但GAN存在一種Mode?Collapse的問題(我不明白為何要翻譯成模式坍塌,mode在這里明明是眾數(shù)的意思),就是當(dāng)AI成功地生成了一張類似某個mode的照片后,它忽然發(fā)現(xiàn)這里離其他的mode太遠(yuǎn)了,于是就每次都找同一個mode——這樣的結(jié)果就是雖然GAN能保證生成的圖片很保真,但是缺乏多樣性,看上去好像都是同一張照片衍生出來的一樣。
而頭圖里講的內(nèi)容,就是Tortoise.tts開發(fā)者對Diffusion模型原理的一個解釋。Diffusion其實是一種更加聰明的解決辦法。我們依然以均值(mean)作為向目標(biāo)分布優(yōu)化的參考,但是最后卻能做到讓這個分布收斂在某個mode上,而且每次還不是同一個mode!這是怎么做到的?

到現(xiàn)在我才覺得可以開始提Diffusion的工作原理,因為沒有前面這些內(nèi)容,你沒辦法解釋為什么我們要用它來生成圖像,和為什么它超越了GAN。
Diffusion在這里就是字面上的擴(kuò)散的意思,因為它是受到了非平衡態(tài)熱力學(xué)(Non-equilibrium thermodynamics)中類似的擴(kuò)散過程的啟迪而搞出來的。一個常被提及的擴(kuò)散例子就是把一滴墨水滴入一杯水,看墨水逐漸擴(kuò)散到水中成為均勻溶液的過程。如果把那滴墨水視作一個染料與水的離散分布(墨滴入水前,四周是空值),而它入水?dāng)U散之后,是不是就是一個連續(xù)的數(shù)據(jù)分布了呢(假設(shè)這杯水相對于染料而言是無窮大的空間)。如果純水溶液可以視為一個標(biāo)準(zhǔn)的高斯分布的話,那么我們得到的均勻分布的新的墨水溶液,它的均值是不是還是和原來那滴墨水一樣,只是分布近似于純水溶液呢?如果存在一個條件,能讓我們把這個過程倒退回去呢?不就是從一個近似于無意義的數(shù)據(jù)分布中,生成一個有意義的離散數(shù)據(jù)嗎?
再舉一個跟前面有關(guān)的例子,我們現(xiàn)在的麻煩是將紅、綠、藍(lán)三種顏色的墨滴放進(jìn)了同一杯水里,然后和前面的擴(kuò)散過程一樣看著它們形成一杯分布均勻的白色溶液。如果我們能找到逆轉(zhuǎn)這個過程的條件,不就能保證恢復(fù)出來的還是那三種顏色而不是其他任何顏色嗎?我是不是找到那三個均值分別和紅、綠、藍(lán)三色墨滴一樣的近似純水溶液的分布之后,再把純水溶液的這個分布想辦法減掉,就得到了原來的三色墨滴呢?
我所需要的這個逆轉(zhuǎn)擴(kuò)散過程的條件,就是馬爾可夫鏈(Markov?Chain)。也就是假設(shè)染料在水中擴(kuò)散過程的每一步過程,都只與上一步有關(guān)。于是,與之前所有擴(kuò)散過程有關(guān)的信息,都可以從當(dāng)前的狀態(tài)中找到。所以,只要我知道在反向擴(kuò)散過程的每一步中,該去掉哪些正向擴(kuò)散在這一步插進(jìn)染料分子中間的水分子(噪音),就可以一小步一小步地將那三種顏色的墨滴從一杯分布均勻的白色溶液恢復(fù)出來!于是,我們就找到了一種能從某個連續(xù)可分的數(shù)據(jù)分布中,采樣出一個離散的、在人類理解范圍內(nèi)的樣本的新辦法,也就是一個新的生成模型!

那接下來新的問題來了,怎么去計算這個噪音(每一步該去掉的水分子量和它的分布)呢?怎么去獲得那個均值和目標(biāo)數(shù)據(jù)分布一致,又和純噪音的分布(純水溶液)近似的一個初始分布呢?為了讓AI獲得計算,或者說預(yù)測那個噪音的能力,我們就得先讓AI學(xué)習(xí)一遍正向擴(kuò)散的過程,這就是DIffusion模型的訓(xùn)練原理。既然我們的目的是為了用CLIP模型來生成圖片,那就把CLIP模型的圖片訓(xùn)練集一張一張丟進(jìn)“水”里,讓AI去學(xué)習(xí)這個過程,不就OK了?
但是我們怎么去找到那個均值和目標(biāo)數(shù)據(jù)分布一致,又和純噪音的分布近似的一個初始分布呢?在溶解了幾億張圖片的水溶液(DIffusion模型)里,我怎么才能排除所有其它的信息,構(gòu)造出一個只溶解了我要的那個圖片的水溶液(只含有應(yīng)該去掉的水分子和我需要的那張圖片的一個跟純水溶液差不多的分布)呢?如果我們找不到這個合適的起點,那么就不可能通過反向擴(kuò)散得到我想要的那張圖片!
但是等等,這個學(xué)習(xí)了幾億張圖片的正向擴(kuò)散過程的Difusion模型,到底學(xué)會了什么能力?它見識過幾億張圖片從一個離散的數(shù)據(jù)分布,一小步一小步地加入噪音,直到最后形成和噪音本身分布差不多的一種連續(xù)分布的過程之后,是不是也可以直接從一張完全隨機(jī)的噪音采樣開始進(jìn)行反向擴(kuò)散呢?
當(dāng)你丟給Diffusion模型一個不含任何圖片信息的、純粹由水分子(噪音)構(gòu)成的初始分布,它該怎么去計算那些應(yīng)該減去的水分子分布呢!
看好了,這就是一切魔法開始的地方!
根據(jù)馬爾可夫鏈的假設(shè),這張不含任何圖片信息的純水溶液分布里,也是包含了之前所有擴(kuò)散步驟的信息的。那么從它開始一步步反向擴(kuò)散回去的話,到底會得到什么呢?這里就涉及一個重要的概念,Diffsuion模型是一種可能性模型,因為這種可逆的擴(kuò)散現(xiàn)實中其實是不可能存在的,而根據(jù)馬爾可夫鏈假設(shè)反向擴(kuò)散得到的結(jié)果,只是無數(shù)可能性中的一種。你減掉一個噪音分布后,得到的是任何一個可能會正向擴(kuò)散到這一步的,含有某種信息的一個分布!
所以,在我們沒有進(jìn)行干涉時,Diffusion模型會從一個毫無意義的、不包含任何人類信息的高斯分布噪音開始,一步步向任何一張在它看來合理的圖片方向去“降噪”,于是我們就得到了一個可能會生成任何符合人類標(biāo)準(zhǔn)圖片的生成模型!
但等等,還有一個問題,我們之前說Diffusion能取樣到一張人類能接受的離散數(shù)據(jù)的前提,是因為降噪是從一個和目標(biāo)分布均值一致的初始分布開始的,而現(xiàn)在這個隨機(jī)降噪生成的圖片,它降噪到最后的均值,很可能就落在了我們需要的目標(biāo)值中間,讓我們看到的只是一團(tuán)灰蒙蒙的東西,而不會接近訓(xùn)練集中的原始圖片。怎么避免這種情況呢?
這就是前面Tortoise.tts作者畫的圖中所描繪的,Diffusion模型的神奇之處。我們知道在沒有干涉時,AI會自行判斷當(dāng)前的分布應(yīng)該向哪一個目標(biāo)分布的均值去優(yōu)化。但如果只是單純降噪的話,一旦某一步得到的分布中不包含任何一個mode(錯誤地刪掉了所有想要收斂到的目標(biāo)),那么可能接下來再計算就沒有意義了。所以在每一步降噪之后,還要再加上一定量的高斯噪音,讓AI有機(jī)會修正自己的錯誤。
那么這時候,把兩種噪音的加減放在一起來看的話,到底意味著什么呢?意味著每一步我們都在把這個分布的均值向某一個mode移動一點點,同時還保證,這個分布中至少包含一個和某個數(shù)據(jù)集中真實存在的或應(yīng)該存在的一張圖片的分布均值一致的mode。最后我們就可以得到一個均值和訓(xùn)練集中某張圖片或AI認(rèn)為應(yīng)該存在的某張圖片類似的一個分布。這其實就是在反向擴(kuò)散過程中,AI逐漸地排除掉其他所有可能性,幫我們從一個隨機(jī)噪音樣本中恢復(fù)出一張高質(zhì)量圖片的過程!
而之所以我們會認(rèn)為它是高質(zhì)量的,恰恰是因為它的數(shù)據(jù)分布是向某張真實存在的或在AI看來應(yīng)該存在的圖片收斂的結(jié)果。而如果我們從另一個隨機(jī)噪音樣本開始降噪,就會收斂到另外一張“真實”的圖片上,而不會出現(xiàn)GAN那樣的Mode collapse。所以這就是Diffusion模型為什么總能生成令人驚艷而多樣化的圖像的原因了。
而且它作為種可能性模型,你是不可能看到它輸出一張和訓(xùn)練集中某張圖片完全一致的圖片的,反而是無數(shù)張似曾相識的新圖片!這種舉一返N的能力用水溶液的例子解釋,就是雖然你仍然能夠得到一個看上去和入水前狀態(tài)很相像的紅色墨滴,但細(xì)看會發(fā)覺它里面混進(jìn)去了不少綠色和藍(lán)色的染料。

那有沒有辦法人為去影響這個Diffusion過程,而不是讓AI自己看著辦呢?
這就是Prompts的作用了。當(dāng)我們輸入一段文本作為Prompt時,AI就可以通過CLIP找到它所對應(yīng)的?token-embedding,?也就是一個存在于高維度空間的數(shù)據(jù)分布。這時候我們的Diffusion模型從一個隨機(jī)噪音開始降噪的過程,就多了一個新的條件,那就是在每一步反向擴(kuò)散降噪時,都以這個token-embedding的分布為參考條件去選擇均值移動的方向(去找那個看上去更像的mode,而不是最近的!),直到最后收斂到某一個最合適的mode上。
這樣我們就得到了一張既符合Prompts,又看上去很真實(無論如何都會收斂于某個“真實“的分布上)的新照片!這實在是一種天才的設(shè)計?,F(xiàn)在你是否明白為何每次看到一張AI繪畫作品時,不管上面的內(nèi)容多么天馬行空,都有那么一種似曾相識的感覺的原因了呢?
那么該如何控制這個參考條件的影響呢?這就是 CGS(Clip Guidance Scale) 和 CFG(Classifier-Free Guidance)兩個參數(shù)的意義所在了。前者顧名思義就是直接去調(diào)節(jié)CLIP提供的參考條件對DIffusion過程的影響,以前的Disco DIffusion就是用的這個參數(shù)。而到了Stable DIffusion上,卻換成了CFG——它實際上是個比例,先以Prompts為參考條件做一次降噪,再在不考慮它的情況下做一次降噪,而這個參數(shù)就是在控制這兩者間差別對分布的影響。當(dāng)CFG>1時,它就是在放大Prompt的效果。加大每一次降噪后新的分布的均值向參考分布的均值移動的距離。
等下,那CFG如果小于1會怎樣?那就相當(dāng)于讓AI把每一次降噪后得到的新分布的均值向你給出的參考分布的均值的反方向移動。這就是傳說中的負(fù)提示詞(Negative Prompts)。

說了這么多,其實才只講到了Dall-E和Imagen這種Pixel級別的Diffusion,而我們能拿到手用的,其實都是在Latent?Space(一種低維度的潛在空間)下計算的。前面提到的512?X?512(訓(xùn)練集圖片尺寸)?X?3?(紅、綠、藍(lán))=786,432維度的像素空間,對當(dāng)前的消費級GPU來說要求太高了。所以,Stable DIffusion其實能計算這么快的原因之一,就是把DIffusion降噪的過程,放到了一個4 X 64 X 64的低維度空間中進(jìn)行的,這是一個比原來的像素空間小了48倍的潛空間。所以這是一個VAE結(jié)構(gòu),前面說的隨機(jī)噪音、token-embedding都要先被壓縮到這個空間里,再通過Latent Diffsuion(潛空間中的diffusion)生成一張潛空間中的新圖片,再通過VAE還原到像素級別輸出給人類。而這種Latent Diffusion的訓(xùn)練過程當(dāng)然也是在潛空間中完成的(所以計算成本也下降了!)。
但問題在于,為何經(jīng)過這樣的壓縮處理之后,Latent Diffusion的出圖質(zhì)量不但沒有下降,反而更好呢?這可能和機(jī)器學(xué)習(xí)里的流形假設(shè)(?Manifold hypothesis )有關(guān)。如果認(rèn)為自然數(shù)據(jù)是由低維的流形所表示在空間里的,那它本身就是一個假象,可以直接去低維空間中計算它而得到和高維度相似的結(jié)果。而我在腦神經(jīng)科學(xué)方面文章中看到一點,就是這種將高維圖像壓縮到低維去理解,好像恰恰是人類視覺神經(jīng)的一個運作原理?也就是說,更有助于讓AI將注意力放在低頻段的、總體性的形態(tài)上去——相當(dāng)于讓AI把更多的精力放在判斷一張圖片的整體構(gòu)造上,或者說,把一張圖像的總體性特征放大了給AI看?
不過從輸出結(jié)果上看,我們其實可以看到流形假設(shè)并不完全正確,因為Latent Diffusion在人臉、手這種在圖像整體中占比比較小,但細(xì)節(jié)又不可忽視的地方,表現(xiàn)都不如Dall-E這種像素級別的DIffusion。所以這種低維的計算還是有損的——這也是為何Stable?DIffusion的VAE解碼中,是加入了人臉修正等加強(qiáng)模塊的。更換更好的VAE似乎也是一種增強(qiáng)SD效能的方式。

潛空間中的Latent Difusion,是在一種叫U-net的結(jié)構(gòu)中完成的。這名字就是指這種神經(jīng)網(wǎng)絡(luò)看上去是個U型(這個圖是別的模型里的,跟SD中的可能不一樣!)。這種結(jié)構(gòu)實際上常見于醫(yī)學(xué)影像的處理,輸入數(shù)據(jù)從高維度一層一層地降到低維度后,再從低維度一層一層地上升到高維度形成輸出數(shù)據(jù)。如果這是一個圖像生成模型的話,是不是可以認(rèn)為AI是在神經(jīng)網(wǎng)絡(luò)的最深處,從最低維層次開始生成圖像的低頻段信息,再一點一點上升到更高維度去補(bǔ)充高頻段的細(xì)節(jié)呢?如果是這樣的話,那就和人類繪畫的思路很像了——先定構(gòu)圖和輪廓,最后再補(bǔ)充圖層和細(xì)節(jié)。而這樣一個沿U形前進(jìn)的路線,是不是也可以視為一條馬爾可夫鏈呢?

其實我前面說反向擴(kuò)散DIffusion遵循馬爾可夫鏈的過程,應(yīng)該是省略了很多很多內(nèi)容的。從SD官方的示意圖里可以看到,在Conditioned?Diffusion(參考Promts的擴(kuò)散)路線中,token-embendding是先形成一種Attention層,再去影響殘差網(wǎng)絡(luò)Resnet的Diffusion過程的。有人把這個過程叫Cross-Attention機(jī)制。我理解它的意思可能就是把CLIP中的Attention機(jī)制反過來用一下,把你輸入的文本所分解成的次語義級token和定義它們之間關(guān)系的Attention組合起來,以篩選掉一些不必要的擴(kuò)散目標(biāo)(mode)?這個Attention層與時間相關(guān)之后,是不是可以看作是一種”記憶“或”知識“在被Diffusion過程采樣出來呢?


我覺得到這一步,應(yīng)該基本上是把我能理解到的與Stable DIffusion有關(guān)的原理和性質(zhì)梳理完了??偨Y(jié)起來,除了利用U-net+VAE的結(jié)構(gòu)實現(xiàn)信息損失可控的低維度計算提升了速度外,CFG和Cross-Attention可能也是它在自然語言理解和處理效率上和Disco Diffusion相比有很大提升的一個原因。
但我覺得從Tortoise.tts作者給出的Diffsuion原理解釋上看,其實這類生成模型還是存在致命的弱點的。雖然它可以確保向”真實“的數(shù)據(jù)分布收斂,但一旦訓(xùn)練集的分布不夠多樣化,出現(xiàn)那種過于突出的"mode",就可能會在生成的結(jié)果中放大與它相關(guān)的概率,讓其他一些本來應(yīng)該是有”平等機(jī)會“被選中的”mode“,比現(xiàn)實中的分布更多地視為一種”噪音“而刪掉。
比如,如果你的數(shù)據(jù)集中80%與法官有關(guān)的圖像都是男法官,70%以上的美女照片都是西方面孔,或者某個女演員的照片太多了,那么當(dāng)你的Prompts中只約定是”法官“、”美女“、”女演員“時,你會發(fā)現(xiàn)得到的全是男法官、歐美長相的美女,而那20%的女法官、30%的東方面孔是根本畫不出來的;或者所有的女演員好像都和某個人有血緣關(guān)系。
解決的辦法就是追求更多樣化、重復(fù)性更少的訓(xùn)練集。SD到第二代時棄用了CLIP,使用未經(jīng)篩選的、量級更大的OpenClip就是出于這個原因?;蛘呶覀兛梢云诖撤N更聰明的模型替代它——畢竟能滿足生成模型要求的”連續(xù)分布-離散取樣“解決辦法的,應(yīng)該還有很多吧。

最后說點和使用技巧有關(guān)的內(nèi)容:
Stable Diffusion 1.5 比 2.1版本似乎容易出好圖,基本上國外社區(qū)比較高質(zhì)量的作品都出自1.5;
Stable Diffusion?每一代訓(xùn)練之后,對Prompts的使用都需要調(diào)整,1.5和2.1版本所用的技巧都是不通用的——到3.0之后,應(yīng)該也需要重新探索;
Stable?Diffusion 2.0之后的版本,Negative?Prompts的作用好像都被放大了。一個負(fù)提示詞的效果能頂上十個正提示詞。
隨著SD版本迭代,AI對語義的理解越來越接近“常識”之后,對Prompts的要求也會越來越高。描繪詞絕不是無腦堆砌、越多越好——1個Prompts最多只能有77個token,?所以放太多沒有關(guān)聯(lián)的單詞不一定有好的效果。
(完)