嘉賓 | 黃鴻波
整理 | 徐杰承
本文整理自西山居人工智能技術專家黃鴻波在WOT2023大會上的主題分享,更多精彩內容及現場PPT,請關注51CTO技術棧公眾號,發消息【WOT2023PPT】即可直接領取。
圖片
本次分享主要圍繞Stable Diffusion的技術原理和落地來展開。第一部分為Stable Diffusion的工作原理。第二部分是Stable Diffusion做穩定的訓練的主要方法。第三部分則是如何在企業或團隊里將Stable Diffusion落地。
1、Stable Diffusion的工作原理
Stable Diffusion實際上是擴散模型,在Latent的模型里專用于做文圖生成的任務,是基于LDM來構建的。LDM是通過在一個潛在的表示空間中去迭代“去噪”,對數據進行降噪和還原來進行編解碼。最后在GPU上進行圖片生成,降低落地門檻,帶來文生圖的體驗。
其實文生圖技術早在幾年前就已經有了,但那時候文生圖還是一個拼算力的東西,需要大量的算力,一般使用4卡或8卡的P100組合進行訓練,需要單獨訓練文本的部分、單獨訓練圖像部分。
那時還會用到一些模型生成網絡,加上文本的生成,生成一張圖需要20秒、30秒甚至一分鐘,并且無法保證圖片質量。另外一點,生成內容效果比較單一,彼時的技術只能生成例如一只貓、一只狗等圖像,無法理解太過復雜的語義。
而Stable Diffusion的出現或者說LDM的出現,解決了之前文生圖方向的一些缺點。Stable Diffusion準確來說是基于Latent Diffusion Models的整體架構,也就是LDM的架構來完成的。
圖片
其中主要分為三大部分。第一是Pixel部分的內容,編解碼器,把圖像進行編碼,其次經過Latent Space,進行Diffusion傳播,進行去噪,然后進行編輯,再進行解噪。
整體來說,Stable Diffusion在訓練的過程中是通過文本和圖像進行匹配,然后進入VAE和U-Net中進行訓練,訓練后就可以理解文本和圖像的匹配的關系。之后再去加入新的文本,讓其進行擴散學習,通過噪音的疊加部分,最后在潛在空間上進行多次迭代,回到原始圖像。
圖片
U-Net是從噪聲中生成圖像主要的模塊,其原理是通過預測,在過程中反復調用U-Net模塊,將U-Net輸出噪聲的Slice從原有噪聲中進行去除,得到一個去除后的結果。所以它一共分成三部分,像ResnetBlock、Transformer結構、上采樣和下采樣的內容,加在一起就是U-Net的結構。
Diffusion的過程,其實就是擴散的原理,將一個圖像通過各種各樣的迭代噪聲,產生最后的噪聲。下面通過噪聲,通過U-Net再還原成圖像,其實就是一個Forward的正常擴散和逆向擴散的過程。
圖片
正向擴散是逐步對圖像加入高斯噪聲,然后通過噪聲的迭代逐步增加,使得在每一步的過程中,高斯程度越來越高,就會產生一系列的噪聲圖像,最后得到的就是x-T。x-T會經過U-Net的模型在x-T中進行Denoising的解碼的工作,將所生成的噪聲模型進行反向解碼得到清晰的圖。
與正向不同,逆向擴散不能進行反轉噪聲,直接進行噪聲反轉,是沒有辦法計算的。因為高斯程度增長是一個不可逆的過程,所以需要在Diffusion中訓練神經網絡,來近似進行q的還原,通過不斷迭代,使其形成一個服從正態分布的整體的形象,從而定義反轉。所以其逆向和正向的處理過程在這里是不同的。
2、如何利用Stable Diffusion訓練出穩定效果
對于媒體、游戲領域的公司來說,美術的要求會比較嚴格。例如一款游戲分國內版、美版、日版,雖然從用戶角度來看,角色設計大同小異,但實際上美版和日版的美術設計可能會更符合美國或日本的審美,國內則又是另一種審美,美術的實際細節并不一樣。
除此之外,國內的許多武俠游戲,在大眾看來,角色都是穿著長袍、漢服或唐裝,外形看起來都一樣。但深度玩家會知道游戲存在著什么樣的特性,看到游戲的畫風,就能憑經驗知道是哪一款游戲。文生圖最大的矛盾,其實就在這里,程序員和美術的關注點是不同的。
想要解決這個矛盾,讓文生圖能夠生成符合美術要求的圖像,首先要了解什么是DreamBooth。DreamBooth是一個特征詞+類別標簽。在做DreamBooth的訓練或Stable Diffusion訓練時,一般的訓練方式都是基于SD1.5、SD1.4或2.0來進行的。
圖片
但在原始模型中可能已經存在了一些形象的概念,再專門訓練某形象,需要讓模型知道這個形象要用符號代替。訓練完成后,當輸入特定符號,就會出現特定的形象,這是DreamBooth的優勢,但同樣也是弊端。
例如使用Hugging Face時,訓練DreamBooth會讓你提供Prompt,以輸入“a abc dog”為例,增加類別為“a dog”,“abc”則是特定符號,加上類別的好處在于它既學會了特定符號特征,又同時不會忘記類別特征。它的目的在于讓模型既學會新的知識,又不會去忘掉舊的內容。如果不加類別,新的知識學到了,但迭代的次增多,舊的知識可能反而會被忘記。
圖片
LoRA則是一個比較常用的凍結式的微調模型。例如在原始的擴散模型中,通過輸入,經過各種各樣的模塊到輸出。這種模型的問題在于每次訓練時,都要從頭到尾去訓練,相當于訓練整個Stable Diffusion,這需要的顯存會比較高、對算力的要求比較高、對于數據集也會有比較高的要求。
微軟提出的LoRA方式,作用是把模型的大部分進行凍結,模型結構不變,在結構之上再加兩個LoRA層,只有這兩個LoRA層參與微調,實際上相當于整個模型不需要訓練,只需要訓練這兩個LoRA層。它的參數量相比于訓練整個模型要小得多。
在LoRA層加上所需要的各種特征、細節,從而進行訓練,這也就是為什么在LoRA放上幾個圖,加一個prompt,就能生成相關的內容。LoRA的原理就是這樣,在一個大模型的基礎上將其凍結,只把數據集和prompt對應到兩個LoRA層之中,它就能夠得到我們想要的結果。
圖片
但是這種結果其實也有一些弊端,它可能只適合簡單風格的訓練,或者單一的針對于某一個點的訓練,超出這個點,可能就需要再用另外一種方法或者疊加LoRA。
所以很多做Stable Diffusion的人,會在網上找base模型,再去下載一堆LoRA,有微調眼睛的、微調鼻子的、微調手指的,把這些LoRA都疊加進去再進行圖像生成,效果就會很好。所以LoRA的優勢就在于訓練成本低,可以針對某一方面單獨進行訓練。
3、Stable Diffusion在企業中落地
但是在落地方面,如果LoRA和DreamBooth的效果都不能滿足企業需求,就需要Text-to-Image訓練了。Text-to-Image訓練也可以不是從頭到尾訓練,如果基于一個已經訓練好的大模型,再對其進行Finetune,其實就是Text-to-Image。但這對于算力的要求比較高,要想較好的訓練效果,建議用40G以上的顯存。
Text-to-Image的處理分三部分,第一部分是數據集處理;第二部分是底模選擇;第三部分則是各種各樣的參數,對整個模型、整體效果的影響。
首先數據集的處理,在圖片處理時,可以用AI模型將圖片背景全都去掉了,并且貼一個白背景。去掉之后,就變成一個四通道,四通道訓練并不好做,加上白背景,就變成一個三通道,再把大小處理成512×512。
圖片
圖像到文字可以根據圖像一句一句挑描述,這樣是最精準的。還有一種方法則是通過webUI的方式,webUI里一般都有clip等方式,可以生成描述,它生成的針對每一個文件是一個txt的文本,再把文本做一定的數據處理。生成之后可以直接使用描述,基本上不需要做太大的改變,除非需要增加一些比較特殊的詞,比如增加一些項目的名字或者特定的一些內容的名字。
模型的選型方面,推薦用Hugging Face網站,其中有很多Stable Diffusion,有base模型,1.5、2.0、2.1、1.4都有,還有一些專用模型,可以根據需要搜索,把它作為base model進行訓練。C站更多的是比較適用于webUI。
圖片
最后關于模型訓練過程的一些心得和需要避開的坑。當有時模型跑不起來的時候,可以看它提供的一些用低模型的低顯存的方法,但是這里有一個坑,就是低顯存的方法在Text-to-Image中沒有,而在隔離的DreamBooth里說了,可以把里面的兩行配置粘過來,會發現它是能用的。
此外關于調參,經常有一些非算法的同學問我,說這里面的學習率、這里面的loss到底是什么,怎么樣才算把模型訓練好?我會建議他去看loss,看它的變化曲線,它最后是否收斂。
很多時候非技術人員或初學者在用Stable Diffusion或者在網上拿過來的做訓練的時候,他們最大的問題是不知道用多大的數據集,即便知道了用多大的訓練集,也不知道再訓練多少步,而知道該訓練多少步后,又不知道該訓練到什么時候停止。
這里可以提供一個參考,在做Stable Diffusion的大模型的訓練的時候,最需要注意一點是,根據數據集的大小,根據圖片的尺寸,最大的訓練步數需要進行相應的調整。當然,數據集的描述也需要進行調整,最終才能夠訓練出比較好的效果。
嘉賓介紹:
黃鴻波,珠海金山網絡游戲科技有限公司(西山居)AI技術專家,高級算法工程師,谷歌機器學習方向開發者專家,擁有多年軟件開發經驗,著有《TensorFlow進階指南 基礎、算法與應用》一書。曾在格力電器股份有限公司大數據中心擔任人工智能領域專家,且在多家公司擔任過高級工程師,技術經理,技術總監等職務。