本篇基於2023/06/11,Leonardo.Ai官方DC中文區的MasterClass大師課實況精華影片的內容來整理,目標對象是使用過AI繪圖工具,但對其底層邏輯沒有概念的朋友。用盡量簡單的方式來講述,深淺結合幫助你在使用上能獲得更高的掌控度。
並逐一介紹在Leo上設置參數與使用功能的技巧,基於 Stable Diffusion 開發的各家AI繪圖工具大同小異,即使平常不是使用Leo的朋友,相信這些基本概念多少也能幫助到你。
對完整版有興趣的朋友也可以到 Leonardo.Ai 官方YouTube頻道觀看VOD!
文章內容的排列順序與精華會有些微不同,希望可以達成方便閱讀的目的,歡迎在閱讀後留下你的建議!
*本篇面向初學者——對機器學習、DDPM的原理沒有概念的朋友,因此在解釋denoising 時不考慮 latent vactor、decoder 等實際情況,只以最簡單、最方便理解的方式來說明。
今天的主題是:
實際上呢,這個問題更完整的句子應該是:
「如何找到更好的方式去控制AI達成我想要的結果?」
那麼在AI生成圖像的這個領域裡,我會把這個原始問句置換成:
因為我們現在用的所有類型的AI繪圖工具,它們都是基於一類叫做 Diffusion Model 的生成模型,其中現在最廣泛應用的技術是Denoising Diffusion Probabilistic Models,簡稱DDPM,通常還是直接叫 Diffusion Model,也就是擴散模型。
擴散概率模型(DDPM)是使用變分推理訓練的參數化馬可夫鏈。
馬可夫鏈為狀態空間中經過從一個狀態到另一個狀態的轉換的隨機過程。該過程要求具備「無記憶」的性質:下一狀態的機率分布只能由當前狀態決定,在時間序列中它前面的事件均與之無關。這種特定類型的「無記憶性」稱作馬可夫性質。
(進階閱讀:DDPM原論文)
Diffusion Model 的基本概念中,「Noise 雜訊」有著重要的影響力。所以首先要來講的,就是雜訊。
它是從一張完全的雜訊裡面,然後以像素為單位逐步去剔除雜訊,然後留下AI認為它應該要留下來的東西在畫面上,最終它就會生成出來的這個圖片。
在這個過程中,AI要怎麽去判斷哪些是要被踢掉的雜訊,哪一些是要留下來變成是我們圖片的,就是基於它受到的訓練。
它在訓練中學習到的資料,跟它接受到的那些干涉,去判斷它到底要剔哪些跟留哪些。
我們現在使用者方面能夠做到的,是去理解我們要如何去干涉這個雜訊,因為它最開始就是一張雜訊,它中間剔除的東西也是雜訊。只要我們可以干涉這些東西的話,那出來的成品就會盡可能的接近我們的要求。
那麼 diffusion model 它的生成過程,其實就是它訓練過程的反向運作。
在訓練的時候是,一步一步地去增加雜訊,從我們原本的乾淨清晰的圖片,到最後會變成一張完全無法看出內容的雜訊。
逐步增加雜訊的過程中,會先從細節開始消失,然後到最後連輪廓都會消失。
當在生成的時候,就是反過來一步一步從這樣子全然的雜訊,開始剔除,細節開始看得出來,衣服跟頭髮的顏色、眼睛的顏色,直到設定好的步數走完,我們得到生成結果。
它的思考方式,可以想像為以像素為單位,像素為單位就是大概像這樣:
全然雜訊的情況,放大來看就是這樣子的東西,AI逐步剔除雜訊時,就是去思考在每個像素裡面,要留下來的是什麽東西?要留下甚麼顏色才是對的?
我們使用者所使用的干涉手段,就是在告訴AI說,現在你學會了吸收資料,也學會了反推成品,那現在我要你在生成的時候,按照我的要求來。最終整張圖會趨近 prompt、i2i、controlnet 等干涉指令所要求的結果。
再簡單一點舉例來說的話:
把AI當成是一個什麽都不知道的小孩,然後教他從0+1……
那個雜訊就是+1+1一直加,加到100。
然後希望AI學會了0加到100之後呢,可以自己做到反過來,
從100-1-1減到最後是0。
我們不希望它減到最後是-1或是-100,我們希望它最後還可以減到0,那就表示說它學會了這個實際上計算的過程。
基本上AI生成圖像它的底層就是這個原理,沒了,就這樣。
如果你把AI生圖當成是一個卡池的話,你的干涉手段不夠,或者是你對基本原理不夠理解的時候,它就比較像是你在一個N卡池裡面,想要撈出一張甚至都沒有保底的SSR。
但是當你可以去運用這些干涉手段的時候呢,就相當於是在SSR幾率提升的限定卡池裡面去抽卡,既省錢,又省時間,你還會比較快樂,也比較知道自己在幹嘛。何樂而不為呢。
題內話,李宏毅老師的機器學習課程錄影系列真的超棒,強烈推薦大家灌爆老師的訂閱跟點讚。
所以話說回來,那……
前面有提到,干涉手段其實就是我們現在平常在使用的這些指令跟功能,包含從……不是從 prompt 開始,是從你的 dimension 開始,就是你畫布的大小(尺寸)。
Dimension 畫布尺寸、Guidance Scale 引導權重(引導量表)、Prompt 提示詞、image to image (i2i) 圖生圖、Controlnet 控制網、Seed 種子、Scheduler 調度器、Sampler 採樣器。
*影片內容勘誤:scheduler 跟 sampler 其實是兩個東西,當時不知道。
這些東西都屬於干涉手段。知道原理之後,再使用干涉手段,才是實際上真的有在指向性的去做這件事情。
接下來我會稍微分享一下我平常對這些東西的使用方式。
本次實況篇幅只講了其中四種,往後會接著講其他的,感興趣的朋友可以追蹤我的專題、我的 youtube 頻道。希望影片與文章內容能對你有幫助。
Image Dimensions
在生成圖片的時候輸入的全然雜訊,什麽都還沒有加入的,最開始的第0步驟的那個雜訊(我稱其為初始雜訊),它就已經有長寬尺寸了,這個尺寸就是你設的 Dimensions 畫布尺寸。
在設定完按下去generate之後,它是不會在生成過程中改變的,會有變化的都是這個圖面上的內容。
所以這個尺寸大小其實是非常非常非常重要的一個東西。
以前剛開始摸Leo,還不太懂的時候呢,我會盡量的去把它的大小設成一幣最大,就一個代幣可以設多大我就把它設多大,但我現在已經不會這樣用了。
我現在是會看這個,在選模型地方,它這邊都會出現一組數字嘛,這是這個模型它訓練的時候,吃進去的訓練資料的尺寸,簡言之是它的訓練尺寸。那我就會照著它的這個訓練尺寸,去設定我要算的 Dimensions。
為甚麼要這樣?其實道理挺簡單的,因為它訓練的素材都是這個尺寸,那麼對它來說一張圖片完整的架構就是基於這個尺寸內來分布的,那它在反推的時候,可以說,它就比較擅長這個尺寸。
訓練尺寸會是一個相對穩定的尺寸,不是說一定不會崩,不過它崩掉的可能性會相對比較低。
你堅持要直接開大尺寸畫布的話也沒有問題,崩掉的可能性就會變高而已。www
崩掉的是怎麽崩呢?
對AI來說,你把它訓練的這個大小,比如說640x832吧。
當你把畫布拉大並且沒有提供其他額外的控制項時,假設拉到1024x768,對它來說它並不會知道要去把他訓練的內容(學習到的內容)放大成1024x768,而是基於他訓練的這個尺寸大小,然後額外多出來的部分放開他的想象,類似像這種感覺。可以說AI是靠猜,猜得準不準、好不好,取決於這個模型訓練得好不好,以及資料量夠不夠大。
Midjourney之所以表現得如此好,很大一部分確實歸功於它的資料量龐大,在SDXL推出之前,應該沒有幾家模型的資料庫品質與數量可以和MJ匹敵。
如果你畫布尺寸開到太過大,比如說你已經開到了1538x1538,幾乎可以說必然會出現:
等等情況,就是因為尺寸設定大過某個程度之後,AI不知道怎麽辦,就會開始把它學到東西全部在畫面上做重覆。
終究你必須要理解一件事情:AI它看不到畫面。
它實際上不理解它生成出來的東西,對人類來說合不合邏輯。但是其實對AI來說,是有邏輯的!因為它盡量都把它認為應該要接在一起的地方都接起來了。
如果你生成圖片的時候,發現你的畫面構成開始相當的不穩定,我會比較建議你把它調回去它的訓練大小。
如果你今天是在測試一些新的Prompt的內容,也比較建議你就是回到它的訓練大小,比較能確實知道這個模型到底能不能反映出你想要的結果,而不是在很多不穩定的錯誤中,只能用感受的,好像它懂,好像又不懂。
Guidance Scale, Prompt
然後再來,我們同時講一下 Prompt 提示詞跟引導權重,就是下面那個Guidance Scale,在SD中寫作 CFG Scale。
Prompt的基本權重規則,就是越放前面越重,Leo現在有多一個控制prompt權重的手段。在你是免費仔的情況下,Leo是不能使用括號增加單個提示詞權重的,除了套用基本規則外別無他法,但括號框起來的詞可以些微加強關聯性。
範例:(bottle of moon) seashore night cosmo
(bottle of moon) 會些微加強作為一個詞組的關聯性,但無法增強權重
還有一個需要注意的點是,prompt 的長度其實是有一個有效範圍的,如果沒有通過額外的方式來加長文字編碼器可以接受的字數,太過長的 prompt 在後面其實是會被AI自動截斷的。
即便加長了,超長 prompt 也容易使AI混亂——並不是無法生成的意思,當然可以這樣寫,也可以順利生成,只是結果可能相對不可控及不如預期——後段的權重也會非常之低。
更別說還有新手時常會犯的錯誤:四處複製來的 prompt 中包含了無作用的、互相衝突的、重複的 prompt,通常在整理過後會發現,其實可以不用寫得那麼長。
我個人是比較偏向短 prompt 派的,因此我對新手的建議是,盡量不要把prompt 寫得太長,等到掌握熟練後再依需要來加長 prompt 吧!
關於如何寫 prompt,之前有做過一個教你寫 prompt 的影片,未來也會整理出文字版。
那 guidance scale 是什麽?
它可以視為 prompt 整體的權重,告訴AI說,我的 prompt 在這次生成中有多重要,要不要完全照著我指示的方式來做。
在Leo我目前只要能設定 guidance scale,我都是設定20拉滿。但 SDwebui 和Comfyui 等介面我通常會使用預設的7,最多也只會拉到9。
因為實測後已知Leo的 GS 在7以後的變化微乎其微,暫時還沒有被修復,原因不明,所以可以放心拉到20沒問題。
Image to image
先給你看一張圖,這個是我覺得相當好理解的圖了。
左邊這張是他丟進去的圖,右邊這兩列就是我們在Leo調的那個 init strength,設定不同值的不同結果,而對 SDwebui 來說是 denoising strength。
放入的參考圖會取代初始雜訊,把圖片權重拉的越高的時候,去除雜訊的步驟就會從越後面才開始,假設說我調到0.5左右,它會從中間開始,那留給它的剔除雜訊的步數沒那麼多情況下,它的生成結果就會跟我的圖越接近。
這邊要注意的是當你在使用Leo時 init strength,調整的是你丟進去的參考圖片,被保留的參考程度,但大部分可以查到的資料,以及 SDwebui、Comfyui等介面上的 denoising strength,調整的則是重繪程度。
簡單來說:除了Leo是參數設定越高,成品變化越小,其他的大部分是參數設定越高,成品變化越大。
除了用作底圖參考,你還可以透過i2i這樣的特性,來做一個顏色風格的控制。
做法是我丟進去的圖,跟我要的東西其實完全不一樣,但因為我把權重調的很低,它會變成一個有點像是底色的東西,幫助我控制整體顏色氛圍。
雖然可以翻成控制網或控制網路,不過大家一般還是會直接叫它controlnet,如果要搜尋教學用英文名稱也比較好找到。
Leo現在 controlnet 的話,有三個可以選嘛。
它這個功能呢,基本上是源自於一個插件,就叫做 ControlNet,它包含有十幾種不同的控制方式,並且持續都在做更新改善。
ControlNet is a neural network structure to control diffusion models by adding extra conditions.
ControlNet是一個透過增加額外的條件來控制擴散模型的神經網路結構。
有興趣的朋友可以點一下這邊,前往它的原 GitHub 頁面看它的技術原理跟各種控制方式的應用說明。
這邊就只看一下Leo現在有的這三個 controlnet,實際上到底是怎麽去參考你丟進去的圖片的。名字其實已經蠻明顯的了。
你上傳的圖片AI是無法直接使用的,他有一個預處理器,把你的圖片在經過處理之後,轉換成針對這三種參考方式的一個圖面訊息,我們來看看它轉換之後會長甚麼樣子。
基本上我會建議畫布尺寸不要跟你丟進去的圖差太多,你要先確定你接下來要算的東西,你的 prompt 寫的內容跟你這張參考圖之間的關系。
如果說你想要盡量照著你丟進去的圖來參考繪製的話,直接照著參考圖的尺寸設定,或者是用同樣比例的去縮放尺寸,它才不容易爆炸。
之前其實也蠻多人有疑問的,為什麽我們使用的平台不能直接公布一個完整的詞典,讓我直接去查那些詞可以寫?
以stable diffusion v1.5 為例,就是市面上大部分模型它的訓練基底,它本身訓練的時候,它的圖庫的數據來自一個叫 LAION 的數據庫,它的文本編碼器叫做CLIP 來自 open AI。
因為你直接給AI一張圖片,AI沒辦法辨認那是甚麼東西嘛,所以他們最開始訓練的時候是把圖片跟文字一起丟進去,告訴它說……比如說一隻狗,給它一個狗的圖片,告訴它,長這樣子的叫作一隻狗。所以它需要的是圖文成對的訓練資料。
然後這個 text encoder 文本編碼器基本上是AI用來理解你的 prompt 的,把人類使用的「文字」轉換成一個機器可以看得懂的「語言」,這些語言將指引模型去尋找它學習過的內容中,與文本相符合的影像特徵。
因此文本編碼器在訓練的時候,一樣是文字配圖片這樣成對的訓練資料。
那 LAION 的圖庫數據量是58.5億組,其中英文數據量占23.2億組。
CLIP 的數據庫,有4億多的圖文成對的數據。
想一想,58.5億再加4億,這只是所謂的「基模」。
SDXL 的基礎模型數據量是35億,細化模型數據量是66億,並使用兩個文字編碼器來生成。總之就是,資料量大到爆。
而我們現在生成時並不是直接去使用1.5跟2.1嘛,我們使用的是比如說像Dreamshaper啊、RPG啊這些基於基模再去訓練的模型,他們在訓練中一樣會放進很多圖片與文字(tag)的資料。
這所有這一些的數據庫的量,不要說平台沒有辦法公布了,任何一個模型的作者他都沒有辦法去公布,告訴你完整有效的 prompt 是什麽。
並且一定要明白一件事情,同一個 prompt 它在不同的模型里面,(因為不同的訓練設置等原因,)它的權重是不一樣的,對應到的圖像特稱可能也是不一樣的。這件事要先理解到,才不會感到莫名其妙,為什麼這個 prompt 在A模型生成得很好,換一個模型就爆炸或是出不了想要效果。
沒有萬用prompt這回事。
當你發現換了個模型後,有一些你想要的特別關鍵的效果不見了,就把 prompt 的位置往前拉來調整。
例如下面這張圖我寫的是:desert apple bubble-pop in the style of moebius and dune, vivid color by John Berkey deepsea Call of Cthulhu (surface ripple)
我在Leo寫prompt不喜歡放逗號,這是個壞習慣請不要理我。
但我現在希望它必須要帶有deepsea深海的元素,可以推測沙漠地形應該是受到desert 跟dune影響,那就可以試著調整為:
deepsea Call of Cthulhu underwater, apple bubble-pop in the style of moebius and landscape, vivid color by John Berkey (surface ripple)
如果我希望它那個vivid color的程度再低一點,但沒有說不要這個效果了,那我可能會把它往後挪一挪。像是:
deepsea Call of Cthulhu underwater, apple bubble-pop in the style of moebius and landscape, by John Berkey (surface ripple) vivid color
其實你不用太去在乎說,語句有沒有通順,沒有差,因為他終究要經過 CLIP 去轉成機器懂的語言,那對AI而言,其實你放前放後,它不是很在乎那整個句子讀起來通不通順,只要字沒有把它切斷就好了。
最基礎的概念是,AI聽不懂你在講什麽的,你講出來的要求AI能不能忠誠去實現,很大程度取決於這個文字編碼器,那你要知道文字編碼器是怎麽訓練,以1.5使用的CLIP為例,它的訓練方式都是比較單詞片語類型,所以你跟它用敘述性的句子去講,它是沒有辦法理解整句話的意思的。
它還是會給你拆成單詞片語,可以這麼說。
你跟它說"那個東西",它不知道你在說什麽東西;你跟他說"這個人"跟"另外一個人"它其實不能理解這樣的敘述內容的區別性。
但,大會報告,SDXL的文本編碼器對於敘述句型的支援度好很多,未來應該也會逐漸朝這個方向演變,讓人類可以用更自然的語言驅使AI。因此我所謂的不應該這樣去寫,也僅止於現階段這樣的寫法還未發展成熟。
今天講的全部的東西,都希望各位能有幾個重要的概念。
你想要影響的是生成的結果,但是你干涉的時候實際上是在干涉雜訊。
AI看不見畫面、認不得東西、也聽不懂你在說甚麼。
用於圖像生成的擴散模型,在文字處理上的邏輯與ChatGPT這類語言模型是不同的。
小明在家旁邊的水溝,用他阿罵的幾件內衣接起來綁在他媽打他用的竹竿上,末端綁上他姊藏在櫃子裡的巧克力,想釣石斑魚當晚餐。釣了一個下午發現釣不上石斑魚,並開始罵這水真爛、這竿真爛、這巧克力真爛。
請問,晚上第一個揍小明的會是誰? σ ゚∀ ゚) ಠ౪ಠ)σ
以我自己的經驗來說,有這些底層概念幫助蠻大的,在測試一些東西的時候,會比較快開始知道我正在做的事有沒有成效,我所寫的prompt好不好。
使用工具一直是人在這個世界上與其他物種有所區分的重要能力,AI也只是一種新的工具,而非新的物種,讓我們一起成為學習使用工具的人吧!
希望這篇文章有幫助到你,有任何問題歡迎底下留言。