Stable Diffusion && GAN

背景

生成式AI興起之前,市場上的AI產品主要是分析式AI

從功能上看,過去的分析式AI的應用主要是幫助人們進行預測,進而提升決策效率。儘管如此,這類AI可以獨立完成的任務並不多,也不能生成新的內容,在大多數時候,它充其量只能充當一個輔助角色。

而生成式AI則不同,除了擁有和分析式AI類似的預測功能外,它們還能根據決策獨立作出判斷、生成內容

因此,它們的應用潛力和經濟影響要比分析式AI大得多。

昨晚看東方衛視,已經用虛擬新聞主播擔任主持人。

生成式AI的幾個模型

目前,生成式AI主要有這五大模型:vaes、GANs、Diffusion、Transformers、NeRFs。

1、VAEs

使用編碼器-解碼器架構來生成新數據,通常用於圖像和視頻生成,例如生成用於隱私保護的合成人臉。

2、GANs

使用生成器和鑒別器來生成新數據,通常用於視頻遊戲開發中以創建逼真的遊戲角色。

3、Diffusion

添加然後消除雜訊以生成具有高細節水平的高質量圖像,從而創建近乎逼真的自然場景圖像。

4、Transformers

可以有效地並行處理順序數據,以進行機器翻譯、文本摘要和圖像創建。

5、NeRFs

提供了一種使用神經表示的3D場景重建的新方法。

實際場景中,經常會將以上結合使用。比如OpenAI Sora就集成了Diffusion模型和Transformer模型。

什麼是Stable Diffusion

Stable Diffusion是一種潛在擴散模型,2022年發布的深度學習文本到圖像生成模型。它主要用於根據文本的描述產生詳細圖像,儘管它也可以應用於其他任務,如內補繪製、外補繪製,以及在提示詞指導下產生圖生圖的轉變。

源代碼和模型權重已分別公開發布在GitHub和Hugging Face,可以在我們有GPU的電腦硬體上本地運行。

以前的專有文生圖模型(如DALL-E和Midjourney)只能通過雲計算服務訪問。

它是一種使用擴散過程逐步細化雜訊源來生成合成數據的方法。該方法涉及將潛在雜訊向量迭代地轉換為目標信號。

由3個部分組成:變分自編碼器(VAE)、U-Net和一個文本編碼器。

Stable Diffusion建議在10GB以上的顯存(GDDR或HBM)下運行。

擴散模型所用的去噪過程如下所示:

什麼是GAN

生成對抗網路(Generative Adversarial Network)是非監督式學習的一種方法,通過兩個神經網路相互博弈的方式進行學習。

該方法由伊恩·古德費洛等人於2014年提出。GAN背後的基本思想是它們涉及兩個神經網路:生成器判別器

生成網路從潛在空間(latentspace)中隨機取樣作為輸入,其輸出結果需要盡量模仿訓練集中的真實樣本。

判別網路的輸入則為真實樣本或生成網路的輸出,其目的是將生成網路的輸出從真實樣本中儘可能分辨出來。

而生成網路則要儘可能地欺騙判別網路。

兩個網路相互對抗、不斷調整參數,最終目的是使判別網路無法判斷生成網路的輸出結果是否真實。

GAN 工作原理如下圖所示:

Diffusion與GAN的不同點

雖然Stable Diffusion和GAN之間有一些相似之處,例如它們都專註於生成合成數據,但也存在一些關鍵差異,使這兩種方法彼此不同。

1、穩定擴散是一種自監督方法,可以從自身的迭代細化過程中學習,而GAN則涉及生成器和判別器

2、穩定擴散被設計為在連續的潛在空間中運行,而GAN在離散的像素空間中運行。

Diffusion試用

from diffusers import DiffusionPipeline
import torch

#載入base&refiner
base = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
base.to("cuda")
refiner = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-refiner-1.0",
    text_encoder_2=base.text_encoder_2,
    vae=base.vae,
    torch_dtype=torch.float16,
    use_safetensors=True,
    variant="fp16",
)
refiner.to("cuda")

#定義步驟數和百分比(80/20)
n_steps = 40
high_noise_frac = 0.8

# 生成一個梵高風格的西安鐘樓照片
prompt = "Generate a photo of the Xi'an Bell Tower in the style of Van Gogh"

# 運行
image = base(
    prompt=prompt,
    num_inference_steps=n_steps,
    denoising_end=high_noise_frac,
    output_type="latent",
).images
image = refiner(
    prompt=prompt,
    num_inference_steps=n_steps,
    denoising_start=high_noise_frac,
    image=image,
).images[0]

生成效果