back to index

【生成式AI】淺談圖像生成模型 Diffusion Model 原理


link |
00:01.000
今天這堂課是要跟大家簡略的介紹Diffusion Model的基本概念
link |
00:08.000
其實Diffusion Model有很多不同的變形
link |
00:11.000
以下的說明主要來自最知名的Denoising Diffusion Probabilistic Model
link |
00:19.000
大家常常提到的DDPM
link |
00:22.000
今天比較成功的那些用Diffusion Model做的影像生成系統
link |
00:28.000
比如說DALY、Google Imaging、Stable Diffusion
link |
00:32.000
基本上都是用差不多的方法來作為他們的Diffusion Model
link |
00:38.000
這個Diffusion Model是怎麼運作的呢?
link |
00:42.000
運作的方法是這樣子的
link |
00:44.000
我們來看它是怎麼生成一張圖片的
link |
00:47.000
在生成圖片的第一步是你要去Sample一個都是雜訊的圖片
link |
00:55.000
就是你Sample出一個從Gaussian Distribution裡面
link |
00:59.000
你也Sample出一個Vector
link |
01:01.000
這個Vector裡面有的數字
link |
01:03.000
這個Vector的Dimension跟你要生成的圖片大小是一模一樣的
link |
01:08.000
假設你今天要生一張256x256的圖片
link |
01:12.000
從Normal Distribution Sample出來的那個Vector
link |
01:14.000
它的Dimension就要是256x256那麼多
link |
01:18.000
那就把你Sample到的256x256的Vector排成一張圖片的樣子
link |
01:24.000
然後接下來你就有一個Denoise的Module
link |
01:29.000
Denoise的Network
link |
01:30.000
那等一下會講說這個Denoise的Network內部長什麼樣子
link |
01:33.000
這個Denoise的Network從它的名字裡面就可以知道說
link |
01:37.000
輸入一張都是雜訊的圖
link |
01:39.000
那輸出它就會把雜訊濾掉一點
link |
01:42.000
那就可能看到有一個貓的形狀
link |
01:45.000
然後再做Denoise
link |
01:48.000
那貓的形狀就逐漸出來
link |
01:50.000
那就Denoise越做越多
link |
01:53.000
期待最終你就看到一張清晰的圖片
link |
01:57.000
那這個Denoise的次數是事先訂好的
link |
02:01.000
那我們通常會給每一個Denoise的步驟給它一個編號
link |
02:05.000
那產生最終圖片的那個編號比較小啦
link |
02:09.000
那一開始從完全都是雜訊的輸入
link |
02:12.000
開始做Denoise的編號比較大
link |
02:15.000
所以我們這邊就從1999一直排到2排到1
link |
02:19.000
那這個從雜訊到圖片的步驟
link |
02:22.000
它叫做Reverse的Process
link |
02:26.000
那在概念上這件事情
link |
02:28.000
其實就像是米開朗吉羅說的
link |
02:31.000
這個雕像呢
link |
02:33.000
其實本來就已經在大理石裡面
link |
02:36.000
它只是把不要的部分拿掉
link |
02:39.000
Diffusion Model做的事情就是一樣的
link |
02:41.000
本來圖片就已經在雜訊裡面
link |
02:44.000
它只是把製作雜訊的部分把它濾掉
link |
02:47.000
就產生一張圖片
link |
02:50.000
那以下呢
link |
02:52.000
我本來是想用Meat Journey把這句話的意境呈現出來啦
link |
02:55.000
後來發現其實有點困難
link |
02:57.000
我直接把這句話丟到Meat Journey裡面
link |
03:00.000
它就畫了一些雕像的半成品出來
link |
03:03.000
就ChangeBT有一個專門把Pump改成Meat Journey
link |
03:06.000
可以吃的Pump的咒語
link |
03:08.000
然後伸一下看起來是這個樣子
link |
03:10.000
看起來是不太行
link |
03:11.000
然後後來我決定自己手動輸入
link |
03:13.000
然後我輸入的句子是類似
link |
03:16.000
有一個大胃相在石頭裡面
link |
03:19.000
Meat Journey還是沒有很懂這個意境
link |
03:21.000
它沒有辦法畫一個大胃相在石頭裡面的感覺
link |
03:24.000
我想說它可以畫一個有點透明的石頭
link |
03:27.000
然後裡面有一個大胃相
link |
03:29.000
那看起來我Pump的功力非常的弱
link |
03:31.000
我沒有辦法讓它畫這件事情
link |
03:33.000
你如果看那個Meat Journey的Discord
link |
03:35.000
裡面的人都畫出來的圖都讓我嘆為觀止
link |
03:38.000
想說非常的羨慕
link |
03:40.000
每個人都是詠唱大師
link |
03:42.000
所以我詠唱的技巧還非常的不純熟
link |
03:44.000
沒有辦法把我心中想要表達的意境畫出來
link |
03:48.000
好 那接下來呢
link |
03:51.000
就要講這個Denoise的Model了
link |
03:54.000
那從這個圖上看來啊
link |
03:56.000
你可能會想說這個Denoise的Model
link |
03:58.000
是不是同一個呢
link |
03:59.000
是不是同一個Denoise的Model
link |
04:01.000
反覆用很多次呢
link |
04:02.000
是 我們這邊是把同一個Denoise的Model
link |
04:06.000
反覆進行使用
link |
04:08.000
但是因為在這邊每一個狀況
link |
04:12.000
你輸入的圖片差異非常大
link |
04:14.000
在這個狀況你輸入的東西就是一個純雜訊
link |
04:17.000
在這個狀況你輸入的東西它雜訊非常小
link |
04:19.000
它已經非常接近完整的圖
link |
04:22.000
所以如果是同一個模型
link |
04:24.000
它可能不一定能夠真的做得很好
link |
04:26.000
所以怎麼辦呢
link |
04:27.000
你這個Denoise的Model啊
link |
04:29.000
它除了吃要被Denoise的那張圖片以外
link |
04:33.000
它還會多吃一個輸入
link |
04:35.000
這個輸入代表現在Noise嚴重的程度
link |
04:39.000
然後1000代表剛開始Denoise的時候
link |
04:42.000
這個時候Noise的嚴重程度很大
link |
04:44.000
然後1代表說現在Denoise的步驟快結束了
link |
04:48.000
這個是最後一步Denoise的步驟
link |
04:50.000
那顯然雜訊很小
link |
04:51.000
那這個Denoise的Model希望它可以根據我們現在輸入
link |
04:55.000
在第幾個Step的資訊
link |
04:57.000
做出不同的回應
link |
04:59.000
這個是Denoise的Model
link |
05:01.000
所以我們確實只有用一個Denoise的Model
link |
05:04.000
但是這個Denoise的Model會吃一個額外的數字
link |
05:07.000
告訴它說現在是在Denoise的哪一個Step
link |
05:12.000
那Denoise的Module裡面
link |
05:15.000
實際內部做的事情是什麼呢
link |
05:17.000
在Denoise的模組裡面
link |
05:19.000
它實際上有一個Noise Predictor
link |
05:23.000
這個Noise Predictor做的事情
link |
05:25.000
就是去預測說在這張圖片裡面的雜訊長什麼樣子
link |
05:30.000
這個Noise Predictor就吃這個要被Denoise的圖片
link |
05:34.000
跟吃一個Noise現在嚴重的程度
link |
05:37.000
也就是我們現在進行到Denoise的第幾個步驟的代號
link |
05:42.000
然後就輸出一張雜訊的圖
link |
05:46.000
它就是預測說在這張圖片裡面
link |
05:49.000
雜訊應該長什麼樣子
link |
05:51.000
再把它輸出的雜訊
link |
05:53.000
去剪掉這個要被Denoise的圖片
link |
05:56.000
然後就產生Denoise後的結果
link |
06:00.000
所以這邊Denoise的Model
link |
06:02.000
並不是輸入一張有Noise的圖片
link |
06:04.000
輸出就直接是Denoise後的圖片
link |
06:07.000
它其實是產生一個輸入的圖片的雜訊
link |
06:13.000
再把雜訊扣掉輸入的圖片
link |
06:15.000
來達到Denoise的效果
link |
06:18.000
那你可能會想說
link |
06:19.000
那為什麼要這麼麻煩呢
link |
06:21.000
為什麼不直接認一個End-to-End的Model
link |
06:23.000
輸入是要被Denoise的圖片輸出
link |
06:26.000
就直接是Denoise的結果呢
link |
06:28.000
你可以這麼做
link |
06:31.000
我在文獻上也看過有人這麼做
link |
06:34.000
不過現在多數的論文
link |
06:36.000
還是選擇認一個Noise的Predictor
link |
06:39.000
你可以想想看
link |
06:40.000
產生一張圖片跟產生Noise
link |
06:44.000
它的難度是不一樣
link |
06:46.000
如果你今天你的Denoise的Model
link |
06:48.000
可以產生一隻帶雜訊的貓
link |
06:51.000
那它幾乎就可以說
link |
06:52.000
它已經會畫一隻貓了
link |
06:55.000
所以要產生一個帶雜訊的貓
link |
06:58.000
跟產生一張圖片裡面的雜訊
link |
07:00.000
這個難度是不一樣的
link |
07:02.000
所以直接認一個Noise Predictor
link |
07:04.000
可能是比較簡單的
link |
07:06.000
認一個End-to-End的Model
link |
07:07.000
要直接產生Denoise的結果
link |
07:10.000
是比較困難的
link |
07:12.000
那接下來的問題就是
link |
07:14.000
怎麼訓練這個Noise Predictor呢
link |
07:16.000
我們已經知道
link |
07:17.000
我們一個Denoise的Model
link |
07:19.000
是一個Noisy的Image
link |
07:20.000
然後是一個
link |
07:22.000
現在在Denoise的Step的數目
link |
07:24.000
Step的ID
link |
07:25.000
然後產生Denoise的結果
link |
07:27.000
我們要告訴你說
link |
07:28.000
其實Denoise的Model裡面
link |
07:30.000
是一個Noise的Predictor
link |
07:32.000
它是要吃這張圖片
link |
07:34.000
吃一個ID
link |
07:35.000
然後產生一個預測出來的雜訊
link |
07:39.000
但是你要產生出
link |
07:40.000
一個預測出來的雜訊
link |
07:42.000
你得要有Truth
link |
07:44.000
我們在訓練Network的時候
link |
07:45.000
你就是要有Pair Data
link |
07:47.000
才能夠訓練
link |
07:48.000
你需要告訴Noise Predictor
link |
07:50.000
這張圖片裡面的雜訊
link |
07:51.000
長什麼樣子
link |
07:53.000
它才能夠學習
link |
07:54.000
怎麼把雜訊輸出出來
link |
07:57.000
那這件事情怎麼做呢
link |
08:00.000
怎麼製造出這樣子的資料呢
link |
08:03.000
好 這個Noise Predictor
link |
08:05.000
它的訓練資料
link |
08:06.000
是我們人去創造出來的
link |
08:09.000
怎麼創造呢
link |
08:10.000
它的創造方法是這樣
link |
08:11.000
你從你的Database裡面
link |
08:13.000
拿一張圖片出來
link |
08:14.000
你自己加噪音進去
link |
08:16.000
你就Random從Gaussian Distribution裡面
link |
08:19.000
Sample一組雜訊出來
link |
08:21.000
加上去
link |
08:22.000
產生有點Noise的Image
link |
08:24.000
那你可能再Sample一次
link |
08:26.000
才得到更Noise的Image
link |
08:28.000
以此類推
link |
08:29.000
最後整張圖片就看不出來
link |
08:31.000
原來是什麼東西
link |
08:32.000
你把你的手上的
link |
08:34.000
有的照片都做這樣子的事情
link |
08:36.000
這個加噪音的過程
link |
08:38.000
叫做Forward Process
link |
08:40.000
又叫做Diffusion Process
link |
08:42.000
做完這個Diffusion Process以後
link |
08:45.000
你就有Noise Predictor的訓練資料了
link |
08:48.000
怎麼說呢
link |
08:49.000
對Noise Predictor來說
link |
08:51.000
它的訓練資料就是
link |
08:52.000
這一張加完雜訊的圖片
link |
08:55.000
跟現在是第幾次加雜訊
link |
08:58.000
是Network的輸入
link |
09:00.000
而加入的這個雜訊
link |
09:03.000
就是Network應該要Predict的輸出
link |
09:06.000
就是Network輸出的光束
link |
09:08.000
所以你在做完這個Diffusion Process以後
link |
09:11.000
你手上就有訓練資料了
link |
09:13.000
你就告訴Noise Predictor說
link |
09:15.000
看到這張圖
link |
09:16.000
看到第二個Step輸入2這個數字
link |
09:19.000
你要輸出是什麼
link |
09:20.000
你的光束就是一個長這個樣子的Noise
link |
09:24.000
接下來就跟訓練一般的Network一樣
link |
09:27.000
Tread下去就結束了
link |
09:32.000
但是我們要的不只是生圖而已
link |
09:35.000
剛才講的好像是
link |
09:36.000
只是從一個雜訊裡面生出圖
link |
09:39.000
還沒有把文字考慮進來
link |
09:41.000
那要怎麼把文字考慮進來呢
link |
09:44.000
在下一段影片就會講
link |
09:46.000
怎麼把文字考慮進來
link |
09:48.000
但是在講怎麼把文字考慮進來之前
link |
09:50.000
需要先讓大家知道的事情是
link |
09:53.000
如果你今天要訓練一個影像生成的模型
link |
09:57.000
他是吃文字產生圖片
link |
09:59.000
你其實還是需要成對的資料
link |
10:03.000
你還是需要圖片跟文字成對的資料
link |
10:08.000
需要多少成對的資料呢
link |
10:10.000
在我們的作業6裡面
link |
10:12.000
我們其實沒有叫大家從文字生圖片
link |
10:14.000
只有直接生圖片而已
link |
10:16.000
那我們的資料是7萬張圖
link |
10:19.000
那7萬張圖當然非常的少
link |
10:22.000
ImageNet
link |
10:23.000
它是每一張圖片有一個類別的標記
link |
10:27.000
還不是那個圖片的描述
link |
10:28.000
不是像CatCat in the snow
link |
10:29.000
這樣圖片的描述
link |
10:30.000
它只是每一張圖有一個標記
link |
10:32.000
然後它有100萬張圖片
link |
10:34.000
我們先用這個圓圈的大小
link |
10:36.000
來代表圖片的數量
link |
10:38.000
我告訴你今天這些
link |
10:40.000
你在網路上看到的非常厲害的
link |
10:42.000
什麼Meat Journey
link |
10:43.000
Stable Diffusion
link |
10:44.000
或者是Dali
link |
10:46.000
他們的資料往往來自於Lion
link |
10:49.000
Lion有多少Image呢
link |
10:51.000
5.85Billion的圖片
link |
10:54.000
有58.5億張的圖片
link |
10:59.000
所以如果你把圖片的數量
link |
11:01.000
換算成這個有顏色的圈圈的話
link |
11:04.000
ImageNet你可能以為已經很大了
link |
11:06.000
Lion有這麼大
link |
11:08.000
有這麼多圖片
link |
11:09.000
所以難怪今天這一些模型
link |
11:11.000
可以產生這麼好的結果
link |
11:13.000
那Lion其實有一個搜尋的
link |
11:16.000
Demo的這個平台
link |
11:17.000
你可以去裡面看看
link |
11:18.000
它裡面有什麼樣的圖片
link |
11:21.000
那裡面真的是
link |
11:22.000
啥都有
link |
11:23.000
啥都有
link |
11:24.000
比如說貓的圖片呢
link |
11:25.000
它不是只有貓的圖片
link |
11:28.000
跟英文文字的對應
link |
11:30.000
它還有跟中文的對應
link |
11:32.000
還有跟日文的對應
link |
11:33.000
所以就知道說
link |
11:34.000
為什麼今天那一些
link |
11:36.000
影像生成的模型
link |
11:37.000
不是只看得懂英文
link |
11:38.000
你給它中文
link |
11:39.000
它八成都也看得懂
link |
11:40.000
那是因為它的訓練資料裡面
link |
11:42.000
也有中文跟其他的語言
link |
11:46.000
你可以試試看在裡面
link |
11:48.000
你找不找得到自己的照片
link |
11:49.000
我是試一下
link |
11:50.000
我是找不到自己的照片
link |
11:52.000
蠻多名人的照片
link |
11:53.000
比如說川普那個
link |
11:55.000
隨便一找就一大堆
link |
11:56.000
所以你也不用意外說
link |
11:58.000
為什麼那個Midget
link |
11:59.000
你都畫得出川普
link |
12:00.000
因為他就是知道
link |
12:01.000
川普長什麼樣子
link |
12:02.000
所以這個是
link |
12:03.000
你需要準備的訓練資料
link |
12:07.000
好 那有了這個文字
link |
12:10.000
跟影像成對的資料以後
link |
12:12.000
我們先來看一下
link |
12:13.000
Denoise的時候
link |
12:14.000
你是怎麼做的
link |
12:15.000
Denoise的時候
link |
12:17.000
你的做法非常的簡單
link |
12:19.000
把文字加到Denoise的模組
link |
12:23.000
就結束了
link |
12:24.000
所以你現在Denoise的模組
link |
12:26.000
不是只看輸入的圖片做Denoise
link |
12:28.000
它是根據輸入的圖片
link |
12:30.000
加上一段文字的敘述
link |
12:32.000
去把Noise拿掉
link |
12:34.000
所以在每一個Step
link |
12:35.000
你的Denoise的模組
link |
12:37.000
都會有一個額外的輸入
link |
12:38.000
這個額外的輸入
link |
12:39.000
就是你要它
link |
12:41.000
根據這段文字的敘述
link |
12:43.000
生什麼樣的圖片
link |
12:46.000
好 那這個Denoise模組裡面的
link |
12:49.000
Noise Predictor要怎麼改呢
link |
12:51.000
你就是直接把這段文字
link |
12:53.000
給Noise Predictor
link |
12:55.000
就結束了
link |
12:56.000
你就要讓Noise Predictor
link |
12:57.000
多一個額外的輸入
link |
12:58.000
也就是這段文字
link |
13:00.000
就結束了
link |
13:02.000
好 那訓練的部分要怎麼改呢
link |
13:04.000
你現在每一張圖片
link |
13:06.000
都有一段文字
link |
13:07.000
所以今天你先把這張圖片
link |
13:10.000
做完Diffusion的Process以後
link |
13:12.000
你在訓練的時候
link |
13:14.000
不只要給你的Noise Predictor
link |
13:16.000
加入雜訊後的圖片
link |
13:18.000
還有現在Step的ID
link |
13:20.000
多給一個文字的輸入
link |
13:22.000
然後Noise Predictor
link |
13:23.000
會根據這三樣東西
link |
13:25.000
產生適當的Noise
link |
13:28.000
就這樣
link |
13:29.000
產生要去消掉的Noise
link |
13:31.000
產生這個光處
link |
13:33.000
這個就是DDPM
link |
13:35.000
完整演算法的Algorithm
link |
13:37.000
從它原始論文裡面
link |
13:39.000
直接截出來的
link |
13:41.000
沒有更多東西了
link |
13:43.000
就這樣子
link |
13:44.000
但是這兩個Algorithm裡面
link |
13:46.000
其實還是暗藏一些玄機
link |
13:48.000
這個我們就留著
link |
13:50.000
下次再跟大家講