前言
終于開(kāi)寫(xiě)本CV多模態(tài)系列的核心主題:stable diffusion相關(guān)的了,為何執(zhí)著于想寫(xiě)這個(gè)stable diffusion呢,源于三點(diǎn)
- 去年stable diffusion和midjourney很火的時(shí)候,就想寫(xiě),因?yàn)榻?jīng)常被刷屏,但那會(huì)時(shí)間錯(cuò)不開(kāi)
- 去年11月底ChatGPT出來(lái)后,我今年1月初開(kāi)始寫(xiě)ChatGPT背后的技術(shù)原理,而今年2月份的時(shí)候,一讀者“天之驕子呃”在我這篇ChatGPT原理文章下面留言:“點(diǎn)贊,十年前看你的svm懂了,但感覺(jué)之后好多年沒(méi)寫(xiě)了,還有最近的AI繪畫(huà) stable diffusion 相關(guān)也可以寫(xiě)一下以及相關(guān)的采樣加速算法
我當(dāng)時(shí)回復(fù)到:哈,十年之前了啊,歡迎回來(lái),感謝老讀者、老朋友
確實(shí)非常非常多的朋友都看過(guò)我那篇SVM筆記,影響力巨大,但SVM筆記之后,也還是寫(xiě)了很多新的博客/文章滴,包括但不限于:xgboost、CNN、RNN、LSTM、BERT等
今后基本每季度都有更新的計(jì)劃,歡迎常來(lái)
關(guān)于Stable Diffusion,可以先看下這篇圖解Stable Diffusion的文章”(此篇文章也是本文的參考之一) - 今年3月中旬,當(dāng)OpenAI宣稱(chēng)GPT4具備了CV多模態(tài)的能力之后,讓我對(duì)AI繪畫(huà)和CV多模態(tài)有了更強(qiáng)的動(dòng)力去研究探索,并把背后的技術(shù)細(xì)節(jié)寫(xiě)出來(lái)
其實(shí)當(dāng)時(shí)就想寫(xiě)了,但當(dāng)時(shí)因?yàn)閷?xiě)各種開(kāi)源平替模型的原理、部署、微調(diào)去了,所以一直沒(méi)來(lái)得及寫(xiě),包括之前計(jì)劃的100篇論文也因此耽擱
4.23,我所講的ChatGPT原理課開(kāi)課之后,終于有時(shí)間開(kāi)寫(xiě)這篇多模態(tài)博客,然想寫(xiě)清楚stable diffusion和midjourney背后的技術(shù)細(xì)節(jié),不得不先從擴(kuò)散模型開(kāi)始,于此便有了上一篇《AI繪畫(huà)能力的起源:從VAE、擴(kuò)散模型DDPM、DETR到ViT/MAE/Swin transformer》「且如果你此前不了解何謂擴(kuò)散模型、何謂DDPM,務(wù)必先看該文,不然沒(méi)法看懂本文」
援引上一篇文章的這段話“AI繪畫(huà)隨著去年stable diffusion和Midjourney的推出,使得文生圖火爆異常,各種游戲的角色設(shè)計(jì)、網(wǎng)上店鋪的商品/頁(yè)面設(shè)計(jì)都用上了AI繪畫(huà)這樣的工具,更有不少朋友利用AI繪畫(huà)取得了不少的創(chuàng)收,省時(shí)省力還能賺錢(qián),真香”,此外,包括我司LLM項(xiàng)目團(tuán)隊(duì)開(kāi)發(fā)的AIGC模特生成系統(tǒng)也用到了這方面的技術(shù):基于SD二次開(kāi)發(fā)
沿著上文之后,本文將寫(xiě)清楚下面表格中帶下劃線的模型
1月 | 3月 | 4月 | 5月 | 6月 | 8月 | 9月 | 10月 | 11月 | |
20年 | DETR | DDPM | DDIM VisionTransf..? |
||||||
21年 | CLIP DALL·E |
SwinTransformer | MAE SwinTransf..V2 |
||||||
22年 | BLIP | DALL·E 2 | StableDiffusion? BEiT-3 Midjourney V3 |
||||||
23年 | BLIP2 | VisualChatGPT? GPT4 Midjourney V5 |
SAM(Segment Anything Model) | FastSAM (中科院版SAM) MobileSAM |
DALLE3 |
且過(guò)程中會(huì)順帶介紹MiniGPT-4、VisualGPT到HuggingGPT、AutoGPT這幾個(gè)模型
第一部分 從CLIP到BLIP1、BLIP2
1.1 CLIP:基于對(duì)比文本-圖像對(duì)的預(yù)訓(xùn)練方法
我第一次見(jiàn)識(shí)到CLIP這個(gè)論文的時(shí)候,當(dāng)時(shí)的第一反應(yīng)是,特么也太強(qiáng)悍了.. ?
CLIP由OpenAI在2021年1月發(fā)布
- 通過(guò)超大規(guī)模模型預(yù)訓(xùn)練提取視覺(jué)特征,進(jìn)行圖片和文本之間的對(duì)比學(xué)習(xí) (簡(jiǎn)單粗暴理解就是發(fā)微博/朋友圈時(shí),人喜歡發(fā)一段文字然后再配一張或幾張圖,CLIP便是學(xué)習(xí)這種對(duì)應(yīng)關(guān)系)
- 且預(yù)訓(xùn)練好之后不微調(diào)直接推理 (即zero-shot,用見(jiàn)過(guò)的圖片特征去判斷沒(méi)見(jiàn)過(guò)的圖片的類(lèi)別,而不用下游任務(wù)訓(xùn)練集進(jìn)行微調(diào))
使得在ImageNet數(shù)據(jù)集上,CLIP模型在不使用ImageNet數(shù)據(jù)集的任何一張圖片進(jìn)行訓(xùn)練的的情況下,最終模型精度能跟一個(gè)有監(jiān)督的訓(xùn)練好的ResNet-50打成平手 (在ImageNet上zero-shot精度為76.2%,這在之前一度被認(rèn)為是不可能的)??
為了訓(xùn)練CLIP,OpenAI從互聯(lián)網(wǎng)收集了共4個(gè)億的文本-圖像對(duì),論文稱(chēng)之為WIT(Web Image Text,WIT質(zhì)量很高,而且清理的非常好,其規(guī)模相當(dāng)于JFT-300M,這也是CLIP如此強(qiáng)大的原因之一,后續(xù)在WIT上還孕育出了DALL-E模型)
其訓(xùn)練過(guò)程如下圖所示:
- 如下圖的第一步所示,CLIP的輸入是一對(duì)對(duì)配對(duì)好的的圖片-文本對(duì)(比如輸入是一張狗的圖片,對(duì)應(yīng)文本也表示這是一只狗),這些文本和圖片分別通過(guò)Text Encoder和Image Encoder輸出對(duì)應(yīng)的特征。然后在這些輸出的文字特征和圖片特征上進(jìn)行對(duì)比學(xué)習(xí)
假如模型輸入的是對(duì)圖片-文本對(duì),那么這對(duì)互相配對(duì)的圖像–文本對(duì)是正樣本(上圖輸出特征矩陣對(duì)角線上標(biāo)識(shí)藍(lán)色的部位),其它對(duì)樣本都是負(fù)樣本,這樣模型的訓(xùn)練過(guò)程就是最大化個(gè)正樣本的相似度,同時(shí)最小化個(gè)負(fù)樣本的相似度
? Text Encoder可以采用NLP中常用的text transformer模型
? 而Image Encoder可以采用常用CNN模型或者vision transformer等模型
相似度是計(jì)算文本特征和圖像特征的余弦相似性cosine similarity
之后,CLIP可以直接實(shí)現(xiàn)zero-shot的圖像分類(lèi),即不需要任何訓(xùn)練和微調(diào),其實(shí)現(xiàn)zero-shot分類(lèi)只需要簡(jiǎn)單的兩步,如下第2、3點(diǎn)所示 - 根據(jù)任務(wù)的分類(lèi)標(biāo)簽構(gòu)建每個(gè)類(lèi)別的描述文本:A photo of {label},然后將這些文本送入Text Encoder得到對(duì)應(yīng)的文本特征,如果類(lèi)別數(shù)目為n,那么將得到n個(gè)文本特征
- 將要預(yù)測(cè)的圖像送入Image Encoder得到圖像特征,然后與n個(gè)文本特征計(jì)算縮放的余弦相似度(和訓(xùn)練過(guò)程保持一致),然后選擇相似度最大的文本對(duì)應(yīng)的類(lèi)別作為圖像分類(lèi)預(yù)測(cè)結(jié)果
進(jìn)一步地,可以將這些相似度看成logits,送入softmax后可以到每個(gè)類(lèi)別的預(yù)測(cè)概率
以下是對(duì)應(yīng)的偽代碼
# image_encoder - ResNet or Vision Transformer
# text_encoder - CBOW or Text Transformer
# I[n, h, w, c] - 輸入圖片維度
# T[n, l] - 輸入文本維度,l表示序列長(zhǎng)度
# W_i[d_i, d_e] - learned proj of image to embed
# W_t[d_t, d_e] - learned proj of text to embed
# t - learned temperature parameter
# 分別提取圖像特征和文本特征
I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder(T) #[n, d_t]
# 對(duì)兩個(gè)特征進(jìn)行線性投射,得到相同維度的特征d_e,并進(jìn)行l(wèi)2歸一化,保持?jǐn)?shù)據(jù)尺度的一致性
# 多模態(tài)embedding [n, d_e]
I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
T_e = l2_normalize(np.dot(T_f, W_t), axis=1)
# 計(jì)算縮放的余弦相似度:[n, n]
logits = np.dot(I_e, T_e.T) * np.exp(t)
# symmetric loss function
labels = np.arange(n) # 對(duì)角線元素的labels
loss_i = cross_entropy_loss(logits, labels, axis=0) # image loss
loss_t = cross_entropy_loss(logits, labels, axis=1) # text loss
loss = (loss_i + loss_t)/2 # 對(duì)稱(chēng)式的目標(biāo)函數(shù)
2021年10月,Accomplice發(fā)布的disco diffusion,便是第一個(gè)結(jié)合CLIP模型和diffusion模型的AI開(kāi)源繪畫(huà)工具,其內(nèi)核便是采用的CLIP引導(dǎo)擴(kuò)散模型(CLIP-Guided diffusion model)
且后續(xù)有很多基于CLIP的一系列改進(jìn)模型,比如Lseg、GroupViT、ViLD、GLIP
1.2 從BLIP1、BLIP2到miniGPT4
1.2.1 BLIP1:ViT + BERT ——通過(guò)encoder-decoder統(tǒng)一理解與生成任務(wù)
隨著AI的迅速發(fā)展,多模態(tài)日漸成為一種趨勢(shì),而「Vision-Language Pre-training (VLP) + Fine-tuning => Zero Shot / Few Shot」的模式是快速解決多下游任務(wù)的一個(gè)好的模式,VLP 是這個(gè)模式的開(kāi)端,所以對(duì)于 VLP 的相關(guān)研究也很多。BLIP 是一個(gè)新的 VLP 架構(gòu),可以靈活、快速的應(yīng)用到下游任務(wù),如:圖像-文本檢索、圖像翻譯、以及 VQA 等
簡(jiǎn)單來(lái)講,BLIP的主要特點(diǎn)是結(jié)合了encoder和decoder,形成了統(tǒng)一的理解和生成多模態(tài)模型。再利用BLIP進(jìn)行后續(xù)工作的時(shí)候,既可以使用其理解的能力(encoder),又可以利用其生成的能力(decoder),拓展了多模態(tài)模型的應(yīng)用
1.2.1.1 BLIP的模型結(jié)構(gòu)
CLIP 采用了 image-encoder (ViT / ResNet) & text-encoder (transformer),然后直接拿 圖片特征 和 文本特征 做余弦相似度對(duì)比,得到結(jié)果,而B(niǎo)LIP 的做法要復(fù)雜挺多
如下圖所示,為了預(yù)訓(xùn)練一個(gè)同時(shí)具有理解和生成能力的統(tǒng)一模型,BLIP模型主要由4個(gè)部分組成,從左至右分別是
-
上圖第1部分:視覺(jué)編碼器Image Encoder(ViT)——提取圖片特征
視覺(jué)編碼器本質(zhì)就是?ViT 的架構(gòu):將輸入圖像分割成一個(gè)個(gè)的 Patch 并將它們編碼為一系列 Image Embedding,并使用額外的 [CLS] token 來(lái)表示全局的圖像特征 -
上圖第2部分:文本編碼器Text Encoder(BERT)——提取文本特征
文本編碼器就是 BERT 的架構(gòu),其中 [CLS] token 附加到文本輸入的開(kāi)頭以總結(jié)句子,作用是提取文本特征與第1部分的圖像特征做對(duì)比學(xué)習(xí)
在這個(gè)過(guò)程中會(huì)訓(xùn)練一個(gè)對(duì)比學(xué)習(xí)目標(biāo)函數(shù) (Image-Text Contrastive Loss, ITC)
ITC 作用于第1部分的視覺(jué)編碼器(ViT)和第2部分的文本編碼器(BERT),目標(biāo)是對(duì)齊視覺(jué)和文本的特征空間,方法是使得正樣本圖文對(duì)的相似性更大,負(fù)樣本圖文對(duì)的相似性更低,在 ALBEF 里面也有使用到。作者在這里依然使用了 ALBEF 中的動(dòng)量編碼器,它的目的是產(chǎn)生一些偽標(biāo)簽,輔助模型的訓(xùn)練
為方便對(duì)比,把BLIP的模型結(jié)構(gòu)圖再貼一遍
-
上圖第3部分:視覺(jué)文本編碼器Image-grounded Text Encoder(變種 BERT)——BERT中插入交叉注意層,從而針對(duì)圖片特征和文本特征做二分類(lèi)
視覺(jué)文本編碼器的具體做法是在文本編碼器比如BERT的每個(gè)transformer? block的自注意(Bi Self-Att)層和前饋網(wǎng)絡(luò)(Feed Forward)之間額外插入一個(gè)交叉注意(Cross-Attention),以引入視覺(jué)特征,作用是根據(jù) ViT 給的圖片特征和文本輸入做二分類(lèi),所以使用的是編碼器,且注意力部分是雙向的 Self-Attention,且添加一個(gè)額外的 [Encode] token,作為圖像文本的聯(lián)合表征
在這個(gè)過(guò)程中則訓(xùn)練一個(gè)圖文匹配目標(biāo)函數(shù) (Image-Text Matching Loss, ITM)
ITM 作用于第1部分的視覺(jué)編碼器和第3部分的視覺(jué)文本編碼器,是一個(gè)二分類(lèi)任務(wù),目標(biāo)是學(xué)習(xí)圖像文本的聯(lián)合表征,使用一個(gè)分類(lèi)頭來(lái)預(yù)測(cè) image-text pair 的 正匹配 還是 負(fù)匹配,目的是學(xué)習(xí) image-text 的多模態(tài)表示,調(diào)整視覺(jué)和語(yǔ)言之間的細(xì)粒度對(duì)齊,作者在這里依然使用了 ALBEF 中的 hard negative mining 技術(shù)
-
上圖第4部分:視覺(jué)文本解碼器Image-grounded Text Decoder(變種 BERT)——根據(jù)圖片特征和文本特征做文本生成
視覺(jué)文本解碼器使用 Cross-Attention,作用是根據(jù) ViT 給的圖片特征和文本輸入做文本生成的任務(wù),所以使用的是解碼器,且將 上圖第3部分的 Image-grounded Text Encoder 結(jié)構(gòu)中的 Bi Self-Att 替換為 Causal Self-Att,目標(biāo)是預(yù)測(cè)下一個(gè) token,且添加一個(gè)額外的 [Decode] token 和結(jié)束 token,作為生成結(jié)果的起點(diǎn)和終點(diǎn)
一個(gè)需要注意的點(diǎn)是:相同顏色的部分是參數(shù)共享的,即視覺(jué)文本編碼器和視覺(jué)文本解碼器共享除 Self-Attention 層之外的所有參數(shù)。每個(gè) image-text 在輸入時(shí),image 部分只需要過(guò)一個(gè) ViT 模型,text 部分需要過(guò)3次文本模型
過(guò)程中訓(xùn)練一個(gè)語(yǔ)言模型目標(biāo)函數(shù) (Language Modeling Loss, LM)
畢竟由于BLIP 包含解碼器,用于生成任務(wù)。既然有這個(gè)任務(wù)需求,那就意味著需要一個(gè)針對(duì)于生成任務(wù)的語(yǔ)言模型目標(biāo)函數(shù),LM 作用于第1部分的視覺(jué)編碼器和第4部分的視覺(jué)文本解碼器,目標(biāo)是根據(jù)給定的圖像以自回歸方式來(lái)生成關(guān)于文本的描述。與 VLP 中廣泛使用的 MLM 損失(完形填空)相比,LM 使模型能夠?qū)⒁曈X(jué)信息轉(zhuǎn)換為連貫的字幕
1.2.1.2?BLIP的字幕與過(guò)濾器方法CapFiltg
上述整個(gè)過(guò)程中,有一個(gè)不可忽略的問(wèn)題,即高質(zhì)量的人工注釋圖像-文本對(duì)(例如,COCO) 因?yàn)槌杀靖甙核詳?shù)量不多
- CLIP 的數(shù)據(jù)來(lái)源于 Web 上爬來(lái)的 圖像-文本對(duì),所以數(shù)據(jù)集很容易擴(kuò)充的很大,而且采用 對(duì)比學(xué)習(xí)的方式,基本屬于自監(jiān)督了,不太需要做數(shù)據(jù)標(biāo)注;
- BLIP 改進(jìn)了 CLIP 直接從 Web 取數(shù)據(jù) 噪聲大 的缺點(diǎn),提出了 Captioning and Filtering (CapFilt) 模塊,這個(gè)模塊就是用來(lái) 減小噪聲、豐富數(shù)據(jù)的,主要包括兩個(gè)模塊:即字幕與過(guò)濾器方法CapFilt (Captioning and Filtering)
如下圖所示
CapFilt 方法包含兩個(gè)模塊:
- 字幕器 Captioner:相當(dāng)于給一張網(wǎng)絡(luò)圖片,生成字幕。它是一個(gè)視覺(jué)文本解碼器(對(duì)應(yīng)于上述BLIP模型結(jié)構(gòu)的第4部分),在 COCO數(shù)據(jù)集上使用 LM 目標(biāo)函數(shù)微調(diào),對(duì)給定圖像的文本進(jìn)行解碼,從而實(shí)現(xiàn)給定網(wǎng)絡(luò)圖片,Captioner 生成字幕的效果
-
過(guò)濾器 Filter:過(guò)濾掉噪聲圖文對(duì)image-text pair,它是一個(gè)視覺(jué)文本編碼器(對(duì)應(yīng)于上述BLIP模型結(jié)構(gòu)的第3部分),看文本是否與圖像匹配,在 COCO 數(shù)據(jù)集上使用 ITC 和 ITM 目標(biāo)函數(shù)微調(diào)
Filter 刪除原始 Web 文本和合成文本 中的嘈雜文本,如果 ITM 頭將其預(yù)測(cè)為與圖像不匹配,則認(rèn)為文本有噪聲
最后,將過(guò)濾后的圖像-文本對(duì)與人工注釋對(duì)相結(jié)合,形成一個(gè)新的數(shù)據(jù)集,作者用它來(lái)預(yù)訓(xùn)練一個(gè)新的模型
下圖展示了被過(guò)濾器接受和拒絕的文本可視化(綠色 文本是被 filter 認(rèn)可的,而 紅色 文本是被 filter 拒絕的)
1.2.2 BLIP2:CLIP ViT-G/14 + Q-Former +?FLAN-T5
下圖是BLIP-2的模型結(jié)構(gòu) (論文地址:BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models),其中視覺(jué)側(cè)和文本側(cè)分別使用預(yù)訓(xùn)練的CLIP ViT-G/14模型和FLAN-T5模型,僅中間的起橋接作用的Q-Former參與訓(xùn)練,訓(xùn)練需要的成本和數(shù)據(jù)量進(jìn)一步降低,BLIP-2的訓(xùn)練數(shù)據(jù)量?jī)H129M,16卡A100訓(xùn)練9天
- 后來(lái)的LLAVA工作更是將這一思路簡(jiǎn)化到極致,僅通過(guò)一個(gè)projection layer將CLIP ViT-L/14和Vicuna語(yǔ)言模型縫合在一起,訓(xùn)練數(shù)據(jù)僅用了595K圖文對(duì)以及158K指令微調(diào)數(shù)據(jù)
- miniGPT4則是在復(fù)用BLIP-2的vision encoder + Q-Former的基礎(chǔ)上,通過(guò)一層project layer縫合了Vicuna語(yǔ)言模型,訓(xùn)練數(shù)據(jù)僅用了5M的圖文對(duì)數(shù)據(jù)+3.5K的指令微調(diào)數(shù)據(jù)
1.2.3?MiniGPT4:基于LLaMA微調(diào)的Vicuna + BLIP2 + 線性投影層
MiniGPT-4具有許多類(lèi)似于GPT-4所展示的功能,如詳細(xì)的圖像描述生成和從手寫(xiě)草稿創(chuàng)建網(wǎng)站,以及根據(jù)給定圖像編寫(xiě)靈感的故事和詩(shī)歌,為圖像中顯示的問(wèn)題提供解決方案,比如教用戶如何根據(jù)食物照片烹飪等
模型結(jié)構(gòu)
miniGPT4的模型架構(gòu)由一個(gè)語(yǔ)言模型拼接一個(gè)視覺(jué)模型,最后加一個(gè)線性投影層來(lái)對(duì)齊,具體而言
-
它先是使用基于LLaMA微調(diào)的小羊駝Vicuna,作為語(yǔ)言解碼器
-
在視覺(jué)感知方面,采用了與BLIP-2相同的預(yù)訓(xùn)練視覺(jué)組件(該組件由EVA-CLIP[13]的ViT- G/14和Q-Former組成)
-
再之后,增加了一個(gè)單一的投影層,將編碼的視覺(jué)特征與語(yǔ)言模型小羊駝對(duì)齊,并凍結(jié)所有其他視覺(jué)和語(yǔ)言組件
模型訓(xùn)練:預(yù)訓(xùn)練(500萬(wàn)圖像文本對(duì))-微調(diào)
訓(xùn)練上,還是經(jīng)典的預(yù)訓(xùn)練-微調(diào)模式
- 在整個(gè)預(yù)訓(xùn)練過(guò)程中,無(wú)論是預(yù)訓(xùn)練的視覺(jué)編碼器還是LLM都保持凍結(jié)狀態(tài),只有線性投影層被預(yù)訓(xùn)練。具體是使用Conceptual Caption、SBU和LAION的組合數(shù)據(jù)集來(lái)訓(xùn)練我們的模型,歷經(jīng)2萬(wàn)個(gè)訓(xùn)練步驟,批大小為256,覆蓋了大約500萬(wàn)對(duì)圖像-文本,整個(gè)過(guò)程花費(fèi)大約10小時(shí),且使用的4個(gè)A100 (80GB) gpu
- 然而,簡(jiǎn)單地將視覺(jué)特征與LLM對(duì)齊不足以訓(xùn)練出像聊天機(jī)器人那樣具有視覺(jué)會(huì)話能力的高性能模型,并且原始圖像-文本對(duì)背后的噪聲可能導(dǎo)致語(yǔ)言輸出不連貫。因此,我們收集了另外3500個(gè)高質(zhì)量對(duì)齊的圖像-文本對(duì),用設(shè)計(jì)好的會(huì)話模板進(jìn)一步微調(diào)模型(只需要400個(gè)訓(xùn)練步驟,批量大小為12,使用單個(gè)A100 GPU最終7分鐘即可完成),以提高生成語(yǔ)言的自然度及其可用性
第二部分 從DALLE到DALLE 2、DALLE 3
2.1 DALL-E:Zero-Shot Text-to-Image Generation
有趣的是,DALL-E和CLIP一樣,也是21年年初發(fā)布的,對(duì)應(yīng)論文為《Zero-Shot Text-to-Image Generation》,其參數(shù)大小有著12B,其數(shù)據(jù)集是2.5 億個(gè)圖像文本對(duì)
- 通過(guò)上一篇文章可知,VQ-VAE的生成模式是pixcl-CNN +codebook,其中pixcl-CNN就是一個(gè)自回歸模型
- OpenAI 將pixcl-CNN換成GPT,再加上那會(huì)多模態(tài)相關(guān)工作的火熱進(jìn)展,可以考慮使用文本引導(dǎo)圖像生成,所以就有了DALL·E
DALL·E和VQ-VAE-2一樣,也是一個(gè)兩階段模型:
-
Stage1:Learning the Visual Codebook
先是輸入:一對(duì)圖像-文本對(duì)(訓(xùn)練時(shí)),之后編碼特征,具體編碼時(shí)涉及到兩個(gè)步驟
首先,文本經(jīng)過(guò)BPE編碼得到256維的特征
其次,256×256的圖像經(jīng)過(guò)VQ-VAE(將訓(xùn)練好的VQ-VAE的codebook直接拿來(lái)用),得到32×32的圖片特征
We train a discrete variational autoencoder (dVAE) to compress each 256×256 RGB image into a 32 × 32 grid of image tokens -
Stage2:Learning the Prior
重構(gòu)原圖
將拉直為1024維的tokens,然后連上256維的文本特征,這樣就得到了1280維的token序列,然后直接送入GPT(masked decoder)重構(gòu)原圖
推理時(shí),輸入文本經(jīng)過(guò)編碼得到文本特征,再將文本通過(guò)GPT利用自回歸的方式生成圖片,生成的多張圖片會(huì)通過(guò)CLIP模型和輸入的文本進(jìn)行相似度計(jì)算,然后調(diào)出最相似(描述最貼切)的圖像
2.2 DALLE 2:Hierarchical Text-Conditional Image Generation with CLIP Latents
對(duì)于DALL·E2而言,基本就是整合了CLIP和基于擴(kuò)散模型的GLIDE,而后者則采用了兩階段的訓(xùn)練方式:文本 → 文本特征 → 圖片特征 → 圖片
-
CLIP訓(xùn)練過(guò)程:學(xué)習(xí)文字與圖片的對(duì)應(yīng)關(guān)系
如上圖所示,CLIP的輸入是一對(duì)對(duì)配對(duì)好的的圖片-文本對(duì)(根據(jù)對(duì)應(yīng)文本一條狗,去匹配一條狗的圖片),這些文本和圖片分別通過(guò)Text Encoder和Image Encoder輸出對(duì)應(yīng)的特征,然后在這些輸出的文字特征和圖片特征上進(jìn)行對(duì)比學(xué)習(xí) -
DALL·E2:prior +?decoder
上面的CLIP訓(xùn)練好之后,就將其凍住了,不再參與任何訓(xùn)練和微調(diào),DALL·E2訓(xùn)練時(shí),輸入也是文本-圖像對(duì),下面就是DALL·E2的兩階段訓(xùn)練:
? 階段一 prior的訓(xùn)練:根據(jù)文本特征(即CLIP text encoder編碼后得到的文本特征),預(yù)測(cè)圖像特征(CLIP image encoder編碼后得到的圖片特征)
換言之,prior模型的輸入就是上面CLIP編碼的文本特征,然后利用文本特征預(yù)測(cè)圖片特征(說(shuō)明白點(diǎn),即圖中右側(cè)下半部分預(yù)測(cè)的圖片特征的ground truth,就是圖中右側(cè)上半部分經(jīng)過(guò)CLIP編碼的圖片特征),就完成了prior的訓(xùn)練
推理時(shí),文本還是通過(guò)CLIP text encoder得到文本特征,然后根據(jù)訓(xùn)練好的prior得到類(lèi)似CLIP生成的圖片特征,此時(shí)圖片特征應(yīng)該訓(xùn)練的非常好,不僅可以用來(lái)生成圖像,而且和文本聯(lián)系的非常緊(包含豐富的語(yǔ)義信息)
? 階段二 decoder生成圖:常規(guī)的擴(kuò)散模型解碼器,解碼生成圖像
這里的decoder就是升級(jí)版的GLIDE(GLIDE基于擴(kuò)散模型),所以說(shuō)DALL·E2 = CLIP + GLIDE
2.3 DALLE 3:Improving Image Generation with Better Captions
我司LLM項(xiàng)目團(tuán)隊(duì)于23年11月份在給一些B端客戶做文生圖的應(yīng)用時(shí),對(duì)比了各種同類(lèi)工具,發(fā)現(xiàn)DALLE 3確實(shí)強(qiáng),加之也要在論文100課上講DALLE三代的三篇論文,故接下來(lái),咱們結(jié)合DALLE 3和相關(guān)paper好好看下DALLE 3的訓(xùn)練細(xì)節(jié)
2.3.1 為提高文本圖像配對(duì)數(shù)據(jù)集的質(zhì)量:基于谷歌的CoCa?微調(diào)出圖像字幕生成器
目前文生圖模型的一個(gè)很大的問(wèn)題是模型的文本理解能力,這個(gè)文本理解能力指的是生成的圖像是否能和文本保持一致,也就是論文里面所說(shuō)的prompt following能力
如論文中所說(shuō)
-
論文提出來(lái)字幕改進(jìn)(caption improvement)的方法
畢竟現(xiàn)在text-to-image模型現(xiàn)存的一個(gè)基本問(wèn)題便是:這些模型訓(xùn)練所用的文本-圖像配對(duì)數(shù)據(jù)的質(zhì)量較差
We hypothesize that a fundamental issue with existing text-to-image models is the poor quality of the text and image pairing of the datasets they were trained on -
故論文提出可以通過(guò)改進(jìn)「文本-圖像配對(duì)數(shù)據(jù)集中的針對(duì)圖像的文本描述的質(zhì)量」來(lái)解決這個(gè)問(wèn)題(We propose to address this by generating improved captions for the images in our dataset)
為實(shí)現(xiàn)這個(gè)目標(biāo),首先訓(xùn)練一個(gè)強(qiáng)大的圖像字幕生成器(image captioner),以生成詳細(xì)、準(zhǔn)確的圖像描述,然后我們便可以把這個(gè)圖像字幕生成器應(yīng)用到已有的文本-圖像配對(duì)數(shù)據(jù)集中,以為各個(gè)圖像生成更詳細(xì)、準(zhǔn)確的圖像描述或字幕,最后在改進(jìn)的數(shù)據(jù)集上訓(xùn)練text-to-image模型
We do this by first learning a robust image captioner which produces detailed, accurate descriptions of images. We then apply this captioner to our dataset to produce more detailed captions. We finally train text-to-image models on our improved dataset.
總之,對(duì)于稍微復(fù)雜的文本,目前的文生圖模型生成的圖像往往會(huì)容易忽略部分文本描述,甚至無(wú)法生成文本所描述的圖像。這個(gè)問(wèn)題主要還是由于訓(xùn)練數(shù)據(jù)集本身所造成的,更具體的是說(shuō)是圖像caption不夠準(zhǔn)確
- 一方面,圖像常規(guī)的文本描述往往過(guò)于簡(jiǎn)單(比如COCO數(shù)據(jù)集),它們大部分只描述圖像中的主體而忽略圖像中其它的很多信息,比如背景,物體的位置和數(shù)量,圖像中的文字等
- 另外一方面,目前訓(xùn)練文生圖的圖像文本對(duì)數(shù)據(jù)集(比如LAION數(shù)據(jù)集)都是從網(wǎng)頁(yè)上爬取的,圖像的文本描述其實(shí)就是alt-text,但是這種文本描述很多是一些不太相關(guān)的東西,比如廣告。訓(xùn)練數(shù)據(jù)的caption不行,訓(xùn)練的模型也就自然而然無(wú)法充分學(xué)習(xí)到文本和圖像的對(duì)應(yīng)關(guān)系,那么prompt following能力必然存在問(wèn)題
2.3.1.1 什么是谷歌的CoCa
OpenAI最終基于谷歌的CoCa來(lái)訓(xùn)練這個(gè)image captioner來(lái)合成圖像的caption,CoCa構(gòu)建在encoder-decoder的基礎(chǔ)上,其中Image Encoder和Text Decoder均采用Transformer模型,其中Image Encoder的參數(shù)量為1B,而Text Decoder的參數(shù)量達(dá)到1.1B,這樣整個(gè)CoCa模型的參數(shù)量為2.1B(對(duì)于圖像,其輸入大小為288×288,而patch size為18x18,這樣總共有256個(gè)image tokens。同時(shí),這里也設(shè)計(jì)了兩個(gè)更小模型:CoCa-Base和CoCa-Large)
不過(guò)這里將text decoder均分成兩個(gè)部分:一個(gè)單模態(tài)解碼器unimodal text decoder和一個(gè)多模態(tài)解碼器multimodal text decoder,然后增加一個(gè)cls token在文本的最后(CoCa相比CLIP額外增加了一個(gè)Multimodel Text Encoder來(lái)生成caption,如此,它訓(xùn)練的損失包含了CLIP的對(duì)比損失和captioing的交叉熵?fù)p失,所以CoCa不僅可以像CLIP那樣進(jìn)行多模態(tài)檢索,也可以用于caption生成)
具體而言,如下圖的左半部分所示
- unimodal text decoder不參與對(duì)圖像特征的cross-attention(We omit cross-attention in unimodal decoder layers to encode text-only representations,相當(dāng)于把 Transformer Decoder 中的cross attention去掉,只保留 masked self-attention 和 FFNN)
??這樣cls token經(jīng)過(guò)unimodal text decoder之后就能夠得到整個(gè)句子的全局特征
? 同時(shí)采用attention pooling對(duì)image encoder得到特征提取圖像的全局特征(這里的attention pooling其實(shí)就是一個(gè)multi-head attention,只不過(guò)key和value是image encoder得到的特征,而query是預(yù)先定義的一個(gè)可訓(xùn)練的embedding,由于我們只需要提取一個(gè)全局特征,所以只需要定義一個(gè)query就好了)
兩個(gè)全局特征就可以實(shí)現(xiàn)圖像-文本的對(duì)比學(xué)習(xí)「相當(dāng)于image encoder和unimodal text decoder的兩個(gè)[CLS]向量作為圖片和文本的表示,進(jìn)行batch 內(nèi)對(duì)比學(xué)習(xí),同 CLIP」 - multimodal text decoder將用來(lái)執(zhí)行生成任務(wù),這里也通過(guò)一個(gè)attention pooling對(duì)image encoder得到的特征進(jìn)行提取,不過(guò)這里query數(shù)量定義為256,這樣attention pooling可以得到256個(gè)特征,它作為multimodal text decoder的cross-attention的輸入(cascademultimodal decoder layers cross-attending to image encoder outputs to learn multimodal image-textrepresentations)
相當(dāng)于就是正常的Transformer Decoder,包含masked self-attention、cross-attention、FFNN,用于融合圖片和文本信息,實(shí)現(xiàn)雙模態(tài),最后做文本生成 - 所以,CoCa將同時(shí)執(zhí)行對(duì)比學(xué)習(xí)和文本生成任務(wù),它的訓(xùn)練損失也包括兩個(gè)部分:
順帶說(shuō)一句,這個(gè)CoCa和如下圖所示的ALBEF(這是其論文)還挺像的,所以有人評(píng)論它兩的關(guān)系就像BERT和RoBERTa(可以簡(jiǎn)單理解為是對(duì)BERT的精調(diào))
- 但CoCa 與 ALBEF 最大的不同在于:CoCa 右側(cè)處理文本和進(jìn)行多模態(tài)融合的網(wǎng)絡(luò)是一個(gè) decoder,而非ALBEF那里是 encoder
- 再說(shuō)一句,其實(shí)下圖的下半部分不就是類(lèi)似一個(gè)CLIP么?^_^
2.1.1.2 分別通過(guò)短caption、長(zhǎng)caption微調(diào)預(yù)訓(xùn)練好的image captioner
為了提升模型生成caption的質(zhì)量,OpenAI對(duì)預(yù)訓(xùn)練好的image captioner進(jìn)行了進(jìn)一步微調(diào),這個(gè)微調(diào)包括兩個(gè)不同的方案,兩個(gè)方案構(gòu)建的微調(diào)數(shù)據(jù)集不同
- 第一個(gè)方案的微調(diào)數(shù)據(jù)集是只描述圖像主體的短caption(類(lèi)似COCO風(fēng)格的caption)
- 而第二個(gè)方案的微調(diào)數(shù)據(jù)集是詳細(xì)描述圖像內(nèi)容的長(zhǎng)caption
相應(yīng)地,兩個(gè)微調(diào)模型分別可以生成:短caption(short synthetic captions,簡(jiǎn)稱(chēng)SSC)、長(zhǎng)caption(descriptive synthetic captions,簡(jiǎn)稱(chēng)DSC)
下圖展示了三個(gè)樣例圖像各自的原始caption(ground-truth),以及生成的短caption、長(zhǎng)caption
- 每個(gè)樣例圖像的原始caption是從網(wǎng)頁(yè)上得到的alt-text,其質(zhì)量較差
- 每個(gè)樣例圖像的合成的短caption簡(jiǎn)潔地描述了圖像的主體內(nèi)容
- 每個(gè)樣例圖像的合成的長(zhǎng)caption詳細(xì)描述了圖像的很多內(nèi)容,細(xì)節(jié)比較豐富
2.1.1.3 為提高合成caption對(duì)文生圖模型的性能:采用描述詳細(xì)的長(zhǎng)caption,訓(xùn)練的混合比例高達(dá)95%
接下來(lái)要解決兩個(gè)問(wèn)題
- 通過(guò)實(shí)驗(yàn)來(lái)分析合成caption對(duì)文生圖模型性能的影響
- 另外一點(diǎn)是探討訓(xùn)練過(guò)程中合成caption和原始caption的最佳混合比例
這里之所以要混合合成caption和原始caption(opted to blend synthetic captions with ground truth captions),主要是為了防止模型過(guò)擬合到合成caption的某些范式
比如最常見(jiàn)的例子是合成的caption往往以"a"和"an"開(kāi)頭,解決這個(gè)問(wèn)題最好的方法便是:通過(guò)接近the style and formatting that humans might use,以regularize our inputs to a distribution of text
所以,我們?cè)谟?xùn)練過(guò)程中,在合成caption中混入原始caption(human-written text),相當(dāng)于一種模型正則化
首先是合成caption對(duì)模型性能的影響,這里共訓(xùn)練了三個(gè)模型,它們的差異是采用不同類(lèi)型的caption,分別是
- 只用原始caption
- 5%的原始caption + 95%的合成短caption
- 5%的原始caption + 95%的合成長(zhǎng)caption
通過(guò)上一節(jié)對(duì)DALLE 2的分析,我們得知最后的文生圖decoder模型是基于擴(kuò)散模型的
而DALLE 3的論文中訓(xùn)練的文生圖是latent diffusion模型
- 其VAE和SD一樣都是8x下采樣
- 而text encoder采用T5-XXL,之所以用T5-XXL,可能主要有兩個(gè)原因,一方面T5-XXL可以編碼更長(zhǎng)的文本,另外一方面是T5-XXL的文本編碼能力也更強(qiáng)
- 這里訓(xùn)練的圖像尺寸為256x256(這只是實(shí)驗(yàn),所以低分辨率訓(xùn)練就足夠了),采用batch size為2048共訓(xùn)練50W步,這相當(dāng)于采樣了1B樣本
論文中并沒(méi)有說(shuō)明UNet模型的具體架構(gòu),只是說(shuō)它包含3個(gè)stages,應(yīng)該和SDXL類(lèi)似(SDXL包含3個(gè)stage,只下采樣了2次,第一個(gè)stage是純卷積,而后面兩個(gè)stages包含attention)
這里只是想驗(yàn)證模型的prompt following能力,所以采用了CLIP score來(lái)評(píng)價(jià)模型,這里的CLIP score是基于以下兩者的相似度,即
- CLIP ViT-B/32來(lái)計(jì)算生成圖像的image embedding即
- 和text prompt對(duì)應(yīng)的text embedding即的余弦相似度(這里是生成了50000個(gè)圖像并取平均值,并乘以100)
下圖展示了采用三種caption訓(xùn)練的模型在CLIP score上的差異:
- 左圖在計(jì)算CLIP score時(shí),text采用原始caption(ground truth caption),從整體上來(lái)看,無(wú)論是采用合成的長(zhǎng)caption還是短caption,其CLIP score比只采用原始caption要好一點(diǎn),但是波動(dòng)比較大
- 右圖計(jì)算CLIP score時(shí),text采用合成的長(zhǎng)caption,這里就可以明顯看到:合成長(zhǎng)caption > 合成短caption > 原始caption,而且CLIP score要比左圖要高很多
這說(shuō)明采用長(zhǎng)caption來(lái)計(jì)算CLIP score是比較合理的,因?yàn)閳D像的image embedding信息很大,而短文本信息少,所以?xún)烧叩南嗨贫染蜁?huì)低一些,而且還可能存在一定的波動(dòng)
總之,從上面的實(shí)驗(yàn)來(lái)看,采用合成的長(zhǎng)caption對(duì)模型的prompt following能力是有比較大的提升的。
接下來(lái)的問(wèn)題就是通過(guò)實(shí)驗(yàn)來(lái)找到最佳的數(shù)據(jù)混合比例。所以又增加了混合比例為65%、80%、90%的實(shí)驗(yàn),下圖展示了不同混合比例訓(xùn)練出來(lái)的模型其CLIP score的差異,可以看到采用95%的合成caption訓(xùn)練的模型在效果上要明顯高于采用更低比例的caption訓(xùn)練的模型。
所以最終的結(jié)論是采用合成的caption對(duì)模型提升幫助比較大,而且要采用描述詳細(xì)的長(zhǎng)caption,訓(xùn)練的混合比例高達(dá)95%,這也是后面DALL-E 3的數(shù)據(jù)訓(xùn)練策略。
不過(guò)采用95%的合成長(zhǎng)caption來(lái)訓(xùn)練,得到的模型也會(huì)“過(guò)擬合”到長(zhǎng)caption上,如果采用常規(guī)的短caption來(lái)生成圖像,效果可能就會(huì)變差
為了解決這個(gè)問(wèn)題,OpenAI采用GPT-4來(lái)“upsample”用戶的caption,下面展示了如何用GPT-4來(lái)進(jìn)行這個(gè)優(yōu)化,不論用戶輸入什么樣的caption,經(jīng)過(guò)GPT-4優(yōu)化后就得到了長(zhǎng)caption:
下圖展示了三個(gè)具體的例子,可以看到使用優(yōu)化后的長(zhǎng)caption(圖中第二排)其生成圖像效果要優(yōu)于原來(lái)的短caption(圖中第一排):
所以,DALL-E 3接入ChatGPT其實(shí)是不得已而為之的事情,因?yàn)檫@樣才能保證DALL-E 3的輸入不偏離訓(xùn)練的分布
2.3.2 訓(xùn)練細(xì)節(jié)總結(jié):原始caption和合成長(zhǎng)caption混合訓(xùn)練 + T5 +?latent decoder
DALLE 3的論文提到,DALL-E 3的具體實(shí)現(xiàn)有兩個(gè)關(guān)鍵點(diǎn):
- 首先,DALL-E 3也采用95%的合成長(zhǎng)caption和5%的原始caption混合訓(xùn)練,這也應(yīng)該是DALL-E 3性能提升的關(guān)鍵
- 另外,DALL-E 3的模型是上述實(shí)驗(yàn)中所采用的模型的一個(gè)更大版本(基于T5-XXL的latent diffusion模型),同時(shí)加上其它的改進(jìn)(但論文中并沒(méi)有說(shuō)是具體的哪些改進(jìn),只說(shuō)DALL-E 3也不應(yīng)簡(jiǎn)單地歸功于在合成caption的數(shù)據(jù)集上訓(xùn)練,所以DALL-E 3的其它改進(jìn)應(yīng)該也會(huì)比較重要)
目前DALL-E 3生成的圖像的分辨率都是在1024x1024以上,所以DALL-E 3的模型應(yīng)該類(lèi)似于SDXL,采用遞進(jìn)式的訓(xùn)練策略(256 -> 512 -> 1024),而且最后也是采用了多尺度訓(xùn)練策略來(lái)使模型能夠輸出各種長(zhǎng)寬比的圖像
另外如小小將所說(shuō),附錄里面給出了一個(gè)細(xì)節(jié)是
- DALL-E 3額外訓(xùn)練了一個(gè)latent decoder來(lái)提升圖像的細(xì)節(jié),特別是文字和人臉?lè)矫妫@個(gè)應(yīng)該是為了解決VAE所產(chǎn)生的圖像畸變。這里采用的擴(kuò)散模型是基于DDPM中的架構(gòu),所以是pixel diffusion
從直觀上來(lái)看,這個(gè)latent decoder就是替換原始的VAE decoder,因此這個(gè)擴(kuò)散模型的condition是VAE的latent
但是具體是怎么嵌入到擴(kuò)散模型的UNet中,這里沒(méi)有說(shuō)明,最簡(jiǎn)單的方式應(yīng)該是通過(guò)上采樣或者一個(gè)可學(xué)習(xí)的網(wǎng)絡(luò)將latent轉(zhuǎn)變?yōu)楹驮胍魣D像一樣的維度,然后與噪音圖像拼接在一起- 同時(shí)為了加速,基于Consistency Models中提出的蒸餾策略將去噪步數(shù)降低為2步,所以推理是相當(dāng)高效的
This diffusion decoder is a convolutional U-Net identical to the one described in Ho et al. (2020). Once trained, we used the consistency distillation process described in Song et al. (2023) to bring it down to two denoising steps
2.3.3?DALL-E 3的評(píng)測(cè)結(jié)果
對(duì)于DALL-E 3的評(píng)測(cè),論文是選取了DALL-E 2和SDXL(加上refiner模塊)來(lái)進(jìn)行對(duì)比。模型評(píng)測(cè)包括自動(dòng)評(píng)測(cè)和人工評(píng)測(cè)。
2.3.3.1 針對(duì)DALLE 3的自動(dòng)評(píng)測(cè)
自動(dòng)評(píng)測(cè)主要有3個(gè)指標(biāo)
- 首先是計(jì)算CLIP score,評(píng)測(cè)數(shù)據(jù)集是從COCO 2014數(shù)據(jù)集中選擇4096個(gè)captions
這里的評(píng)測(cè)數(shù)據(jù)集是Imagen中所提出的DrawBench評(píng)測(cè)集(共包括200個(gè)包含不同類(lèi)型的prompts) - 然后是采用GPT-4V來(lái)進(jìn)行評(píng)測(cè)
這里的評(píng)測(cè)是將生成的圖像和對(duì)應(yīng)的text輸入到GPT-4V,然后讓模型判斷生成的圖像是否和text一致,如果一致就輸出正確,否則就輸出不正確 - 最后是采用T2I-CompBench來(lái)評(píng)測(cè)
這個(gè)評(píng)測(cè)集包含6000個(gè)組合類(lèi)型的text prompts,它包括多個(gè)方面,這里只選擇color binding、shape binding和texture binding三個(gè)方面進(jìn)行評(píng)測(cè),評(píng)測(cè)是通過(guò)BLIP-VQA model來(lái)得到評(píng)分
下表給出了DALL-E 3與其它模型的對(duì)比結(jié)果,可以看到DALL-E 3還是明顯優(yōu)于DALL-E 2和SDXL。不過(guò)自動(dòng)評(píng)測(cè)所選擇的三個(gè)指標(biāo)都是評(píng)測(cè)模型的prompt following能力,并不涉及到圖像質(zhì)量
2.3.3.2 針對(duì)DALLE 3的人工評(píng)測(cè)
人工評(píng)測(cè)主要包括三個(gè)方面
- 第一個(gè)是prompt following,給出兩張不同的模型生成的圖像,讓人來(lái)選擇哪個(gè)圖像和文本更一致
- 第二個(gè)是style,這里不給文本,只給兩張圖像,讓人選擇更喜歡的那個(gè)圖像
- 第三個(gè)是coherence,這里也不給文本,讓人從兩張圖像中選擇包含更多真實(shí)物體的圖像
可以看到后面的兩個(gè)方面其實(shí)就是評(píng)測(cè)模型生成圖像的質(zhì)量,對(duì)于prompt following和style,這里使用的評(píng)測(cè)集是DALL-E 3 Eval,它共包含170個(gè)captions,是從用戶應(yīng)用場(chǎng)景收集得到的。而coherence方面的評(píng)測(cè)集是從COCO數(shù)據(jù)集抽樣的250個(gè)captions,因?yàn)閏oherence是評(píng)測(cè)真實(shí)性,所以采用更偏真實(shí)場(chǎng)景的COCO數(shù)據(jù)集
另外,之前DrawBench評(píng)測(cè)集是采用GPT-4V來(lái)自動(dòng)評(píng)測(cè)的,但是GPT-4V也會(huì)犯錯(cuò),比如在計(jì)數(shù)方面,所以這里也額外增加了DrawBench評(píng)測(cè)集的人工評(píng)測(cè)。
所有人工評(píng)測(cè)的對(duì)比結(jié)果如表所示,可以看到DALL-E 3具有明顯優(yōu)勢(shì):
這里的ELO score是GLIDE中所提出的來(lái)計(jì)算勝率的指標(biāo):
盡管DALL-E 3在prompt following方面有很大的提升,但是它依然有一定的局限性
- 首先是模型在空間位置關(guān)系上還是會(huì)比較容易出錯(cuò),當(dāng)prompt包含一些位置關(guān)系描述如"to the left of",模型生成的圖像并不一定會(huì)符合這樣的位置關(guān)系,這主要是因?yàn)楹铣傻腸aption在這方面也并不可靠
- 另外就是文字生成能力,雖然DALL-E 3在生成文字方面很強(qiáng),但是還是會(huì)出現(xiàn)多詞或者少詞的情況,一個(gè)可能的原因T5-XXL的tokenizer并不是字符級(jí)的
- 還有一個(gè)比較大的問(wèn)題是合成的caption會(huì)幻想圖像中的重要細(xì)節(jié),比如給一幅植物的繪圖,image captioner可能會(huì)虛構(gòu)出一個(gè)植物并體現(xiàn)在合成的caption上。這就意味著模型可能會(huì)學(xué)到錯(cuò)誤的綁定關(guān)系,也導(dǎo)致模型在生成特定種類(lèi)的東西并不可靠
- 最后一點(diǎn)是模型的安全性和偏見(jiàn),這個(gè)是所有大模型所面臨的問(wèn)題,也是由于訓(xùn)練集所導(dǎo)致的,對(duì)于這點(diǎn),DALL·E 3 system card有更多的評(píng)測(cè)
// 待更文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-494761.html
第三部分 通俗理解stable diffusion:文本到圖像的潛在擴(kuò)散模型(改進(jìn)版DDPM)
3.1 SD與DDPM的對(duì)比
我們?cè)谏掀┛汀禔I繪畫(huà)能力的起源:從VAE、擴(kuò)散模型DDPM、DETR到ViT/MAE/Swin transformer》中,已經(jīng)詳細(xì)介紹了擴(kuò)散模型DDPM,為方便對(duì)后續(xù)內(nèi)容的理解,特再回顧下DDPM相關(guān)的內(nèi)容(至于詳細(xì)的請(qǐng)看上篇博客):
前向過(guò)程加噪
逆向過(guò)程去噪,由于反向擴(kuò)散過(guò)程不可直接計(jì)算,因此訓(xùn)練神經(jīng)網(wǎng)絡(luò)來(lái)近似它,訓(xùn)練目標(biāo)(損失函數(shù))如下
所以,DDPM的關(guān)鍵是訓(xùn)練噪聲估計(jì)模型,使其預(yù)測(cè)的噪聲??與真實(shí)用于破壞的噪聲?相近,具體怎么個(gè)訓(xùn)練過(guò)程呢?
- 比如可以選擇選擇一個(gè)訓(xùn)練圖像,例如海邊沙灘的照片,然后生成隨機(jī)噪聲圖像,通過(guò)將此噪聲圖像添加到一定數(shù)量的步驟來(lái)?yè)p壞訓(xùn)練圖像
- 然后通過(guò)一個(gè)噪聲估計(jì)器U-Net?預(yù)測(cè)添加的噪聲,使其與實(shí)際噪聲做差異對(duì)比,從而建立損失函數(shù)做反向傳播,最后更新噪聲估計(jì)器的參數(shù)
說(shuō)白了,就是通過(guò)告訴U-Net 我們?cè)诿恳徊教砑恿硕嗌僭肼?,從而手把手一步步教U-Net 怎么去估計(jì)噪聲 - U-Net訓(xùn)練好了之后(意味著其對(duì)噪聲的估計(jì)比較準(zhǔn)確了),我們便可以基于訓(xùn)練好的 U-Net 來(lái)生成圖像
原理很簡(jiǎn)單,通過(guò)噪聲估計(jì)器預(yù)測(cè)出噪聲后,不模糊的圖片便減去每一步添加的噪聲以清晰化 不就ok了么
而如果用一句話介紹stable diffusion,可以理解為:改進(jìn)版的DDPM,Stable Diffusion原來(lái)的名字叫“Latent Diffusion Model”(LDM),很明顯就是擴(kuò)散過(guò)程發(fā)生隱空間中(即latent space,下文或其他地方也有說(shuō)潛在空間或壓縮空間之類(lèi)的,都一個(gè)意思),其實(shí)就是對(duì)圖片做了壓縮
不過(guò),為何要弄這么個(gè)隱空間或潛在空間呢?
原因很簡(jiǎn)單,為了使擴(kuò)散模型在有限的計(jì)算資源上訓(xùn)練,并且保留它們的質(zhì)量和靈活性,故首先訓(xùn)練了一個(gè)強(qiáng)大的預(yù)訓(xùn)練自編碼器,這個(gè)自編碼器所學(xué)習(xí)到的是一個(gè)潛在的空間,這個(gè)潛在的空間要比像素空間要小的多,把擴(kuò)散模型在這個(gè)潛在的空間去訓(xùn)練,大大的降低了對(duì)算力的要求,這也是Stable Diffusion比原裝Diffusion速度快的原因
總之,Stable Diffusion會(huì)先訓(xùn)練一個(gè)自編碼器,來(lái)學(xué)習(xí)將圖像壓縮成低維表示
- 通過(guò)訓(xùn)練好的編碼器,可以將原始大小的圖像壓縮成低維的latent data(圖像壓縮)
- 通過(guò)訓(xùn)練好的解碼器,可以將latent data還原為原始大小的圖像
在將圖像壓縮成latent data后,便可以在latent space中完成擴(kuò)散過(guò)程,對(duì)比下和Diffusion擴(kuò)散過(guò)程的區(qū)別,如下圖所示:
可以看到Diffusion擴(kuò)散模型就是在原圖??上進(jìn)行的操作,而Stale Diffusion是在壓縮后的圖像??上進(jìn)行操作
3.2 理解stable diffusion的三層境界
3.2.1 第一層境界:不看公式只看意圖整體理解SD
SD的整體框架流程圖
stable diffusion和上面DALL E2的原理其實(shí)差不多,具體而言,會(huì)先后經(jīng)歷以下幾個(gè)步驟「左邊紅色是像素空間 pixel space(含編碼器和解碼器)、中間綠色區(qū)域是潛在空間latent space、右邊灰色的是條件condition」
-
將圖像從像素空間(Pixel Space)壓縮到潛在空間(Latent Space)
具體而言,圖像編碼器將圖像從515??512的像素空間,壓縮到更小維度4??64??64的潛在空間 -
針對(duì)潛在空間的圖片做擴(kuò)散(Diffusion Process):添加噪聲
對(duì)潛在空間Latent Space中的圖片添加噪聲,進(jìn)行擴(kuò)散過(guò)程 -
根據(jù)用戶的輸入text/prompt 獲取去噪條件(Conditioning)
通過(guò) CLIP的文本編碼器 將輸入的描述語(yǔ)(text/prompt)轉(zhuǎn)換為去噪過(guò)程的條件 -
噪聲估計(jì)器U-Net 預(yù)測(cè)噪聲,然后依據(jù)「去噪條件」去噪:生成圖片的潛在表示
首先,噪聲估計(jì)器 U-Net 將潛在噪聲圖像和文本提示作為輸入,并預(yù)測(cè)噪聲「該過(guò)程也在潛在空間(4x64x64 張量)中」
之后,基于上面第3步的條件對(duì)圖像通過(guò)?噪聲估計(jì)器U-NET?進(jìn)行去噪(Denoising),以獲得生成圖片的潛在表示
當(dāng)然了,去噪步驟可以靈活地以文本、圖像和其他形式為條件,比如以文本為條件即text2img、以圖像為條件即 img2img -
潛在空間轉(zhuǎn)換成最終圖像
圖像解碼器通過(guò)將圖像從潛在空間轉(zhuǎn)換回像素空間來(lái)生成最終圖
問(wèn)題1:怎么理解潛在空間
如何理解 “潛在空間” 呢?
- 大家都有自己的身份證號(hào)碼,前 6 位代表地區(qū)、中間 8 位代表生日、后 4 位代表個(gè)人其他信息。放到空間上如圖所示,這個(gè)空間就是「人類(lèi)潛在空間」
這個(gè)空間上相近的人,可能就是生日、地區(qū)接近的人。人可以對(duì)應(yīng)為這個(gè)空間的一個(gè)點(diǎn),這個(gè)空間的一個(gè)點(diǎn)也對(duì)應(yīng)一個(gè)人。如果在空間中我的附近找一個(gè)點(diǎn),對(duì)應(yīng)的人可能跟我非常相似,沒(méi)準(zhǔn)就是我失散多年的兄弟 - AI 就是通過(guò)學(xué)習(xí)找到了一個(gè)「圖片潛在空間」,每張圖片都可以對(duì)應(yīng)到其中一個(gè)點(diǎn),相近的兩個(gè)點(diǎn)可能就是內(nèi)容、風(fēng)格相似的圖片
問(wèn)題2:CLIP的應(yīng)用舉例
如果讓你把左側(cè)三張圖和右側(cè)三句話配對(duì),你可以輕松完成這個(gè)連線。但對(duì) AI 來(lái)說(shuō),圖片就是一系列像素點(diǎn),文本就是一串字符,要完成這個(gè)工作可不簡(jiǎn)單。
原因在于
- 這需要 AI 在海量「文本-圖片」數(shù)據(jù)上學(xué)習(xí)圖片和文本的匹配。圖中綠色方塊是「圖片潛在空間」的 N 張圖片,紫色方塊是「文本潛在空間」的 N 句描述語(yǔ)
CLIP會(huì)努力將對(duì)應(yīng)的 I1與T1(藍(lán)色方塊)匹配,而不是 I2與T3(灰色方塊)匹配 - 當(dāng) AI 能成功完成這個(gè)連線,也就意味著 AI 建立了「文字潛在空間」到「圖片潛在空間」的對(duì)應(yīng)關(guān)系,這樣才能通過(guò)文字控制圖片的去噪過(guò)程,實(shí)現(xiàn)通過(guò)文字描述得到圖像的生成
3.2.2 第二層境界:依托公式深入模型結(jié)構(gòu)
SD的模型結(jié)構(gòu):autoencoder +?CLIP text encoder +?UNet
還是看這個(gè)圖
-
上圖最左側(cè):編碼輸入/解碼輸出
編碼器encoder??可以對(duì)圖像進(jìn)行壓縮,可以理解為它能忽略圖片中的高頻信息,只保留重要的深層特征,將其壓縮到一個(gè) latent space「維度為(4, 64, 64)」,然后我們可以在這個(gè) latent space 中進(jìn)行 Diffusion Process,將其結(jié)果作為 U-Net 的輸入
解碼器decoder 負(fù)責(zé)將去噪后的 latent 圖像恢復(fù)到原始像素空間「各維度為:(3,512,512),即(紅/綠/藍(lán), 寬, 高)」
這個(gè)就是所謂的感知壓縮(Perceptual Compression),即“將高維特征壓縮到低維,接著在低維空間上進(jìn)行操作”的方法具有普適性,可以很容易的推廣到文本、音頻、視頻等不同模態(tài)的數(shù)據(jù)上 -
上圖最右側(cè):用戶的輸入text或prompt
通過(guò)CLIP的text encoder提取輸入text的text embeddings(維度為77??768,意味著77個(gè)token嵌入向量,其中每個(gè)向量包含768個(gè)維度)
然后通過(guò)cross attention方式送入噪聲估計(jì)模型UNet中作為去噪條件condition
a?) 事實(shí)上,擴(kuò)散模型可以理解為一個(gè)時(shí)序去噪自編碼器,我們需要訓(xùn)練使得預(yù)測(cè)的噪聲與真實(shí)噪聲相近,則目標(biāo)函數(shù)為:
b?) 而在 Latent Diffusion Models 中,引入了預(yù)訓(xùn)練的感知壓縮模型,它包含一個(gè)編碼器和一個(gè)解碼器,這樣就可以在訓(xùn)練時(shí)利用?得到 latent representation?,從而讓模型在潛在表示空間中學(xué)習(xí),其目標(biāo)函數(shù)為:
c?) 對(duì)于條件生成任務(wù),我們將拓展為:,這樣就可以通過(guò)來(lái)控制圖片合成的過(guò)程,通過(guò)在 UNet 上增加?cross-attention?機(jī)制來(lái)實(shí)現(xiàn)
而為了能夠從不同的模態(tài)預(yù)處理,論文引入了一個(gè)領(lǐng)域?qū)S镁幋a器,它用來(lái)將映射成一個(gè)中間表示,這樣我們就可以很方便的引入各種形式的條件,例如文本、類(lèi)別、layout等
d?) 最終模型可通過(guò)一個(gè)?cross-attention?將去噪條件引導(dǎo)融入到 UNet 中,cross-attention 表示為:
其中是 UNet 的一個(gè)中間表征
最終,目標(biāo)函數(shù)可以寫(xiě)為:
-
上圖中底部:?????基于噪聲估計(jì)模型U-Net實(shí)現(xiàn)文本條件引導(dǎo)下的latent生成
加噪后的隱式表達(dá)和文本語(yǔ)義表征通過(guò)Attention的方式輸入到U-Net,用以更好的學(xué)習(xí)文本和圖像的匹配關(guān)系,這里文本的語(yǔ)義向量就是條件(用戶的輸入text或prompt),控制圖像生成往我們想要的方向發(fā)展,通過(guò)U-Net來(lái)預(yù)測(cè)每一步要減少的噪聲
然后計(jì)算網(wǎng)絡(luò)輸出噪聲和真實(shí)噪聲的差距,最小化損失來(lái)反向傳播更新參數(shù),注意整個(gè)訓(xùn)練階段VAE是凍結(jié)的
下圖亦可輔助理解
3.2.3 第三層境界:從源碼層面理解SD
// 待更
3.3 七月AIGC模特生成平臺(tái):基于SD的微調(diào)與二次開(kāi)發(fā)
3.3.1 如何快速微調(diào)SD
目前Stable Diffusion 模型微調(diào)主要有4 種方式:
- Dreambooth
- LoRA(Low-Rank Adaptation of Large Language Models)
- Textual Inversion
- Hypernetworks
//待更文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-494761.html
3.4?SDXL Turbo
// 待更
3.5 LCM
參考文獻(xiàn)與推薦閱讀
-
Learning Transferable Visual Models From Natural Language Supervision
CLIP原始論文 - ?????CLIP 論文逐段精讀,這是針對(duì)該視頻解讀的筆記之一:CLIP和改進(jìn)工作串講
-
BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation
BLIP原始論文 -
多模態(tài)超詳細(xì)解讀 (六):BLIP:統(tǒng)一理解和生成的自舉多模態(tài)模型
極智AI | 多模態(tài)新姿勢(shì) 詳解 BLIP 算法實(shí)現(xiàn) - 理解DALL·E 2, Stable Diffusion和 Midjourney工作原理
- 讀完 DALL-E 論文,我們發(fā)現(xiàn)大型數(shù)據(jù)集也有平替版
-
Hierarchical Text-Conditional Image Generation with CLIP Latents
DALL E2原始論文 - DALL·E 2(內(nèi)含擴(kuò)散模型介紹),這是針對(duì)該視頻解讀的筆記
- DALL-E 3技術(shù)報(bào)告閱讀筆記
- OpenAI一夜顛覆AI繪畫(huà)!DALL·E 3+ChatGPT強(qiáng)強(qiáng)聯(lián)合,畫(huà)面直接細(xì)節(jié)爆炸
- CoCa:對(duì)比+生成式任務(wù)構(gòu)建“全能型多模態(tài)模型”,這是其論文地址
- 關(guān)于CoCa的另外幾篇文章:CoCa: 在圖生文過(guò)程中加入對(duì)比學(xué)習(xí)、如何評(píng)價(jià)谷歌的 CoCa,在 ImageNet 上達(dá)到新的 SOTA:91.0%?
- 淺析多模態(tài)大模型的前世今生
- The Illustrated Stable Diffusion,這是圖解SD的翻譯版
-
Stable Diffusion Clearly Explained!
How does Stable Diffusion paint an AI artwork? Understanding the tech behind the rise of AI-generated art. - Getting Started With Stable Diffusion
- High-Resolution Image Synthesis with Latent Diffusion Models
- 知乎上關(guān)于SD原理的幾篇文章:Stable Diffusion 的技術(shù)原理是什么?、人工智能Ai畫(huà)畫(huà)——stable diffusion 原理和使用方法詳解、十分鐘讀懂Stable Diffusion
- Memory-efficient array redistribution through portable collective communication
- stable diffusion 原理介紹 - AI繪畫(huà)每日一帖
- How does Stable Diffusion work?
- Stable Diffusion 原理介紹與源碼分析(一)
- 保姆級(jí)講解 Stable Diffusion
- 李宏毅生成式AI模型diffusion model/stable diffusion概念講解
- 速度驚人!手機(jī)跑Stable Diffusion,12秒出圖,谷歌加速擴(kuò)散模型破記錄
- SDXL Turbo、LCM相繼發(fā)布,AI畫(huà)圖進(jìn)入實(shí)時(shí)生成時(shí)代:字打多快,出圖就有多快
- 文生圖10倍速,視頻實(shí)時(shí)渲染!清華發(fā)布LCM:兼容全部SD大模型、LoRA、插件等
- 七月在線:AIGC下SD/MDJ的原理與實(shí)戰(zhàn)課 [深度探究AI繪畫(huà)/多模態(tài)]
首發(fā)之后的創(chuàng)作、修改、新增記錄
- 端午假期三天,持續(xù)完善BLIP/BLIP2、DALLE/DALLE 2等相關(guān)的內(nèi)容
- 6.25,開(kāi)始寫(xiě)SD的原理部分
- 6.26,考慮到公式太多 容易把初學(xué)者繞暈,故把理解SD劃分為三層境界
第一層境界 不涉及任何公式,從意圖層面整體理解SD
且初步寫(xiě)清SD的基本邏輯
順帶感嘆,這幾天在網(wǎng)上反復(fù)看了大量關(guān)于stable diffusion原理的解讀文章
?我站在初學(xué)者角度上,沒(méi)有一篇令我滿意
?我也不知道怎么回事,把文章寫(xiě)通俗沒(méi)有那么難啊.. ? - 6.27,修改SD的原理部分,以讓邏輯清晰明確
- 6.28,寫(xiě)清楚DALL·E2的模型架構(gòu)
- 6.29,寫(xiě)DALL·E的部分,并梳理全文邏輯
斷斷續(xù)續(xù)兩個(gè)月,總算通過(guò)本文和上一篇文章把SD相關(guān)的基本寫(xiě)清楚了,后續(xù)就是不斷優(yōu)化所有行文細(xì)節(jié)
?以讓邏輯更清晰 細(xì)節(jié)更明確,初學(xué)最?lèi)?ài)看
感嘆過(guò)程中 被各種資料反復(fù)繞暈過(guò),好在 終究還是像之前解讀各種稍復(fù)雜點(diǎn)的模型一樣
一如既往的繞出來(lái)了 - 7.7,優(yōu)化對(duì)潛在空間的說(shuō)明描述
- 7.16,潤(rùn)色關(guān)于噪聲估計(jì)器的部分描述
- 10.30,開(kāi)始新增DALLE 3的部分
前幾天寫(xiě)完了旋轉(zhuǎn)位置編碼,未來(lái)幾天都在持續(xù)寫(xiě)DALLE 3的技術(shù)細(xì)節(jié)
一方面,它生成圖的質(zhì)量確實(shí)挺高
二方面,近期需要為某合作伙伴做一個(gè)文生圖的應(yīng)用,?所以研究下各個(gè)相關(guān)模型的技術(shù)細(xì)節(jié) - 10.31,優(yōu)化SD的部分
- 11.10,重讀DALLE 3論文并優(yōu)化相關(guān)細(xì)節(jié)的描述
如在微博上所說(shuō)的,“為準(zhǔn)備這周日的DALLE 3公開(kāi)課,在一字一句重?fù)窪ALLE 3論文,但其本質(zhì)不算論文,很多訓(xùn)練細(xì)節(jié)沒(méi)透露
好在現(xiàn)在完全可以一字一句耐心讀paper了,一年前還是有點(diǎn)痛苦的,加之研究能力的不斷提升,可以通過(guò)研究相關(guān)paper去補(bǔ)齊它的訓(xùn)練細(xì)節(jié)” - 11.12,優(yōu)化第二部分中關(guān)于DALLE、DALLE 2的部分內(nèi)容,以為闡述更精準(zhǔn)
比如關(guān)于DALLE 2的訓(xùn)練步驟 - 11.13,繼續(xù)優(yōu)化第二部分中關(guān)于DALLE 3部分內(nèi)容的描述細(xì)節(jié)
- 11.23,因11.25要在fanbook上做SD的專(zhuān)場(chǎng)公開(kāi)課,故優(yōu)化本文關(guān)于SD的部分內(nèi)容
- 24年1.5,因本文一讀者于評(píng)論中留言提醒:DALL·E3在計(jì)算余弦相似度的時(shí)候,直接根據(jù)公式計(jì)算就行了,沒(méi)必要再用1去減
一看,確實(shí)如此,特此修正,感謝該朋友的指出
到了這里,關(guān)于AIGC下的CV多模態(tài)原理解析:從CLIP/BLIP到stable diffusion/Midjourney、GPT4的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!