如何通俗理解擴散模型?

語言: CN / TW / HK

↑ 點擊 藍字  關注極市平台

作者丨HeptaAI@知乎(已授權)

來源丨https://zhuanlan.zhihu.com/p/563543020

編輯丨極市平台

極市導讀

還有誰沒有看過diffusion的工作,席捲AI圈的diffusion到底是什麼?本文作者用盡量通俗的描述向大家解釋 diffusion 的來龍去脈。   >> 加入極市CV技術交流羣,走在計算機視覺的最前沿

瀉藥。實驗室最近人人都在做擴散,從連續到離散,從 CV 到 NLP,基本上都被 diffusion 洗了一遍。但是觀察發現,裏面的數學基礎並不是模型應用的必須。其實大部分的研究者都不需要理解擴散模型的數學本質,更需要的是對擴散模型的原理的經驗化理解,從而應用到 research 裏面去。筆者做 VAE 和 diffussion 也有一段時間了,就在這裏通俗地解釋一下 diffusion 的來龍去脈。

Variational AutoEncoder (VAE)

要講擴散模型,不得不提 VAE。VAE 和 GAN 一樣,都是從隱變量生成目標數據。它們假設隱變量服從某種常見的概率分佈(比如正態分佈),然後希望訓練一個模型,這個模型將原來的概率分佈映射到訓練集的概率分佈,也就是分佈的變換。注意, VAE 和 GAN 的本質都是概率分佈的映射 。大致思路如下圖所示:

圖片來源:https://zhuanlan.zhihu.com/p/34998569

換句話説,大致意思就是先用某種分佈隨機生成一組隱變量,然後這個隱變量會經過一個生成器生成一組目標數據。VAE 和 GAN 都希望這組數據的分佈和目標分佈儘量接近。

是不是聽上去很 work?但是這種方法本質上是難以 work 的,因為“ 儘量接近 ”並沒有一個確定的關於 XXX 和 X^\hat{X}\hat{X} 的相似度的評判標準。換句話説,這種方法的難度就在於,必須去猜測“它們的分佈相等嗎”這個問題,而缺少真正 interpretable 的價值判斷。有聰明的同學會問,KL 散度不就夠了嗎?不行,因為 KL 散度是針對兩個已知的概率分佈求相似度的,而和 XXX 的概率分佈目前都是未知。

GAN 的做法就是直接把這個度量標準也學過來就行,相當生猛。但是這樣做的問題在於依然不 interpretable,非常不優雅。VAE 的做法就優雅很多了,我們先來看 VAE 是怎麼做的,理解了 VAE 以後再去理解 Diffussion 就很自然了。

到底什麼是生成模型?

我們看回生成模型到底是個啥。我們拿到一批 sample(稱為), 想要用學到它的分佈, 這樣就能同時學到沒被 sample 到的數據了, 用這個分佈就能隨意採樣, 然後獲得 生成結果。但是這個分佈九曲迴腸, 根本不可能直接獲得。所以繞個彎, 整一個隱變量, 這東西可以生成。不妨假設滿足正態分佈, 那就可以先從正態分佈裏面隨便取一個, 然後用和的關係算出。這裏不得不用一下數學公式, 因為後面一直要用到(其實也很簡單, 學過概率學基礎一下就看得懂) :

換句話説, 就是不直接求, 而是造一個別的變量(好聽的名字叫“隱變量"),獲得這個隱變量和我要搞的的關係, 也能搞到。注意, 上式中, 稱為後驗分佈,稱為先驗分佈。

VAE 的核心

VAE 的核心就是, 我們不僅假設是正態分佈, 而且假設每個也是正態分佈。 什麼意思呢? 因為是一組採樣,其實可以表示成, 而我們想要針對每個獲得一個專屬於它和的一個正態分佈。換句話説, 有個sample, 就有個正態分佈。其實也很好理解, 每一個採樣點當然都需要一個相對的分佈, 因為沒有任何兩個採樣點是完全一致的。

那現在就要想方設法獲得這個正態分佈了。怎麼搞? 學!擬合!但是要注意, 這裏的擬合與不同, 本質上是在學習和的關係, 而非學習比較與的標準。

OK, 現在問一個小學二年級就知道的問題, 已知是正態分佈, 學什麼才能確定這個正態分佈? 沒錯, 均值和方差。怎麼學? 有數據啊!不是你自己假設的嗎,是已知的啊, 那你就用這倆去學個均值和方差。

好, 現在我們已經學到了這個正態分佈。那就好説了, 直接從裏面採樣一個, 學 一個 generator,就能獲得了。那接下來只需要最小化方差就行。來看看下面的圖, 仔細理解一下:

仔細理解的時候有沒有發現一個問題? 為什麼在文章最開頭, 我們強調了沒法直接比較和的分佈, 而在這裏, 我們認為可以直接比較這倆? 注意, 這裏的是專屬於 (針對於)的隱變量, 那麼和本身就有對應關係,因此右邊的藍色方框內的“生成器”, 是一一對應的生成。

另外,大家可以看到,均值和方差的計算本質上都是 encoder。也就是説,VAE 其實利用了兩個 encoder 去分別學習均值和方差。

VAE 的 Variational 到底是個啥

這裏還有一個 非常重要 的問題 (對於初學者而言可能會比較困難, 需要反覆思考) : 由於我們通過最小化來訓練右邊的生成器, 最終模型會逐漸使得和趨於一致。但是注 意, 因為是重新隨機採樣過的, 而不是直接通過均值和方差 encoder 學出來的, 這個生成器的輸入是有噪聲的。但是仔細思考一下, 這個噪聲的大小其實就用方差來度量。為了使得分佈的學習儘量接近, 我們希望噪聲越小越好, 所以我們會盡量使得方差趨於 0。

但是方差不能為 0 , 因為我們還想要給模型一些訓練難度。如果方差為 0 , 模型永遠只需要學習高斯分佈的均值, 這樣就丟失了隨機性, VAE 就變成 AE 了...... 這就是為什麼 VAE 要在 AE 前面加一個 Variational:我們希望方差能夠持續存在, 從而帶來噪聲! 那如何解決這個問題呢? 其實保證有方差就行, 但是 VAE 給出了一個優雅的答案: 不僅需要保證有方差, 還要讓所有趨於標準正態分佈!為什麼要這麼做呢? 這裏又需要一個小小的數學推導:

這條式子大家想必都看得懂, 看不懂也沒事......關鍵是結論: 如果所有都趨於, 那麼我們可以保證也趨於, 從而實現先驗的假設, 這樣就形成了一個閉環! 太優雅了! 那怎麼讓所有趨於呢? 加 loss 唄, 具體的 loss 推導這裏就不做深入了, 用到了很多數學知識, 又要被公式淹沒了。到此為止, 我們可以把 VAE 進一步畫成:

VAE 的本質

現在我們來回顧一下 VAE 到底做了啥。VAE 在 AE 的基礎上對均值的 encoder 添加高斯噪聲(正態分佈的隨機採樣),使得 decoder(就是右邊那個生成器)有噪聲魯棒性;為了防止噪聲消失,將所有趨近於標準正態分佈,將 encoder 的均值儘量降為 0,而將方差儘量保持住。這樣一來,當 decoder 訓練的不好的時候,整個體系就可以降低噪聲;當 decoder 逐漸擬合的時候,就會增加噪聲。

本質上,是不是和 GAN 很像?!要我命名,我也可以叫 VAE 是生成對抗 encoder(手動滑稽

Diffusion Model(擴散模型,DM)

好了,到此為止,你已經理解了擴散模型的所有基礎。現在我們來站在 VAE 的基礎上講講擴散模型。目前的教程實在是太數學了,其實可以用更加通俗的語言講清楚。從本質上説,Diffusion 就是 VAE 的升級版。

VAE 有一個做了好幾年的核心問題。大家思考一下, 上面的 VAE 中, 變分後驗 是怎麼獲得的? 是學出來的! 用當 loss, 去學這個。學這個變分後驗就有五花八門的方法了, 除了上面説的擬合法, 還有用純數學來做的, 甚至有用 BERT 這種 PLM 來做的。但是無論如何都逃不出這個 VAE 的框架:必須想辦法設計一個生成器, 使得變分後驗分佈儘量真實。 這種方法的問題在於, 這個變分後驗的表達能力與計算代價是不可兼得的。 換句話説, 簡單的變分後驗表達並不豐富(例如數學公式法), 而複雜的變分後驗計算過於複雜(例如 PLM 法)。

現在回過頭來看看 GAN 做了啥。前面也提到過,GAN 其實就是簡單粗暴,沒有任何 encoder,直接訓練生成器,唯一的難度在於判別器(就是下圖這個“它們的分佈相等嗎”的東西)不好做。

好了,聰明的你也已經知道我要説什麼了。Diffusion 本質就是借鑑了 GAN 這種訓練目標單一的思路和 VAE 這種不需要判別器的隱變量變分的思路,糅合一下,發現還真 work 了……下面讓我們來看看到底是怎麼糅合的。為什麼我們糅合甚至還沒傳統方法好,大佬糅合揉出個 diffusion?

Diffusion 的核心

知道你們都懶得劃上去,我再放一下 VAE 的圖。

前面也已經提到,VAE 的最大問題是這個變分後驗。在 VAE 中,我們先定義了右邊藍色的生成器,再學一個變分後驗來適配這個生成器。能不能反一下,先定義一個變分後驗再學一個生成器呢?

如果你仔細看了上面的 VAE 部分,我相信你已經有思路了。VAE 的生成器,是將標準高斯映射到數據樣本(自己定義的)。VAE 的後驗分佈,是將數據樣本映射到標準高斯(學出來的)。那反過來,我想要設計一種方法 A,使得 A 用一種簡單的“變分後驗”將數據樣本映射到標準高斯(自己定義的),並且使得 A 的生成器,將標準高斯映射到數據樣本(學出來的)。注意,因為生成器的搜索空間大於變分後驗,VAE 的效率遠不及 A 方法:因為 A 方法是學一個生成器(搜索空間大),所以可以直接模仿這個“變分後驗”的 每一小步

好,現在我告訴你,這個 A 方法就是擴散模型(Diffusion Model)的核心思路:定義一個類似於“變分後驗”的從數據樣本到高斯分佈的映射,然後學一個生成器,這個生成器模仿我們定義的這個映射的 每一小步

Diffusion Model 的 Diffusion 到底是個啥

接觸 diffusion 的你肯定知道馬爾可夫鏈!這東西不僅 diffusion 裏面有,各種怪異的算法裏面也都出現了。為什麼用它?因為它的一個關鍵性質:平穩性。一個概率分佈如果隨時間變化,那麼在馬爾可夫鏈的作用下,它一定會趨於某種平穩分佈(例如高斯分佈)。只要終止時間足夠長,概率分佈就會趨近於這個平穩分佈。

這個逐漸逼近的過程被作者稱為前向過程(forward process)。 注意,這個過程的本質還是加噪聲! 試想一下為什麼……其實和 VAE 非常相似,都是在隨機採樣!馬爾可夫鏈每一步的轉移概率,本質上都是在加噪聲。這就是擴散模型中“擴散”的由來:噪聲在馬爾可夫鏈演化的過程中,逐漸進入 diffusion 體系。隨着時間的推移,加入的噪聲(加入的溶質)越來越少,而體系中的噪聲(這個時刻前的所有溶質)逐漸在 diffussion 體系中擴散,直至均勻。看看下面的圖,你應該就恍然大悟了:

現在想想,為什麼要用馬爾可夫鏈。我們把問題詳細地重述一下:為什麼我們創造一個穩定分佈為高斯分佈的馬爾可夫鏈,對於生成器模仿我們定義的某個映射的 每一小步 有幫助呢?這裏你肯定想不出來,不然你也能發明 diffusion model ——答案是, 基於馬爾可夫鏈的前向過程,其每一個 epoch 的逆過程都可以近似為高斯分佈。

懵了吧,我也懵了。真正的推導發了好幾篇 paper,都是些數學巨佬的工作,不得不感歎基礎科學的力量……相關工作主要用的是 SDE(隨機微分方程),我們在這裏不做深入,但是需要理解大致的思路,如下圖所示。

圖源:https://www.zhihu.com/question/536012286/answer/2533146567

下面的是前向過程,上面的是反向過程。前向過程通過馬爾可夫鏈的轉移概率不斷加入噪音,從右邊的採樣數據到左邊的標準高斯;反向過程通過 SDE 來“抄襲”對應正向過程的那一個 epoch 的行為(其實每一步都不過是一個高斯分佈),從而逐漸學習到對抗噪聲的能力。高斯分佈是一種很簡單的分佈,運算量小,這一點是 diffusion 快的最重要原因。

Diffusion 的本質

現在回頭看看 diffusion 到底做了個啥工作。我們着重看一下下圖的 VAE 和 diffussion 的區別:

圖源:https://zhuanlan.zhihu.com/p/525106459

可以很清晰的認識到,VAE 本質是一個基於梯度的 encoder-decoder 架構,encoder 用來學高斯分佈的均值和方差,decoder 用變分後驗來學習生成能力,而將標準高斯映射到數據樣本是自己定義的。而擴散模型本質是一個 SDE/Markov 架構,雖然也借鑑了神經網絡的前向傳播/反向傳播概念,但是並不基於可微的梯度,屬於數學層面上的創新。兩者都定義了高斯分佈作為隱變量,但是 VAE 將作為先驗條件(變分先驗),而 diffusion 將作為類似於變分後驗的馬爾可夫鏈的平穩分佈。

想要更深入的理解?

如評論區指出的,文章的定位本身就是讓讀者讀懂 diffusion 而非對 diffusion 框架本身進行數學創新,是應用向而非結構向的,大佬們如果希望看到更深入的分析可以追更和評論區催更~

參考資料

https://zhuanlan.zhihu.com/p/34998569

https://www.zhihu.com/question/536012286/answer/2533146567

https://zhuanlan.zhihu.com/p/525106459

極市乾貨

算法競賽: 國際賽事證書,220G數據集開放下載!ACCV2022國際細粒度圖像分析挑戰賽開賽!

技術綜述 淺聊對比學習(Contrastive Learning) 深度學習圖像分類任務中那些不得不看的11個tricks總結

極視角動態: 極視角與華為聯合發佈基於昇騰AI的「AICE賦能行業解決方案」 算法誤報怎麼辦?自訓練工具使得算法迭代效率提升50%!

# CV技術社羣邀請函  #

△長按添加極市小助手

添加極市小助手微信 (ID : cvmart2)

備註: 姓名-學校/公司-研究方向-城市(如:小極-北大-目標檢測-深圳)

即可申請加入極市 目標檢測/圖像分割/工業檢測/人臉/醫學影像/3D/SLAM/自動駕駛/超分辨率/姿態估計/ReID/GAN/圖像增強/OCR/視頻理解 等技術交流羣

極市&深大CV技術交流羣 已創建,歡迎深大校友加入,在羣內自由交流學術心得,分享學術訊息,共建良好的技術交流氛圍。

點擊閲讀原文進入CV社區

收穫更多技術乾貨