返回文章列表

生成式AI模型GANs擴散模型與Transformers

本文探討了生成式人工智慧(GAI)模型的三種型別:生成對抗網路(GANs)、擴散模型(Diffusers)以及轉換器(Transformers)。文章以Stable Diffusion模型為例,在Google

機器學習 深度學習

隨著人工智慧技術的快速發展,生成式AI模型已成為研究熱點。本文聚焦於GANs、擴散模型和Transformers,闡述它們的運作機制並比較其優缺點。我們將以Stable Diffusion模型為例,在Google Colab中使用Python和Diffusers函式庫構建影像生成流程,並使用CLIP模型評估生成影像與文字提示的匹配度。此流程包含模型載入、影像生成和結果渲染等步驟,並輔以程式碼說明。最後,我們將探討這些技術的應用場景、未來發展趨勢以及可能帶來的倫理挑戰。

生成式人工智慧模型綜覽:GANs、Diffusers 與 Transformers 的型別與模式探討

在探討生成式人工智慧(Generative AI, GAI)模型的世界中,我們將重點關注三種主要的模型型別:生成對抗網路(Generative Adversarial Networks, GANs)、擴散模型(Diffusers)以及轉換器(Transformers)。本章節將透過理論與實務並重的教學,帶領讀者瞭解這些模型的運作原理、實作方法以及其在資料科學和機器學習中的創新應用。

實際操作環境建置:Jupyter Notebook 與 Google Colab

在開始實作之前,我們需要選擇一個合適的開發環境。Jupyter Notebook 提供了即時程式碼執行、視覺化以及解釋性文字的功能,非常適合用於原型設計和資料分析。另一方面,Google Colab 是 Jupyter Notebook 的雲端版本,專為機器學習原型設計而開發,提供免費的 GPU 資源,並與 Google Drive 整合以便於檔案儲存和分享。我們將使用 Google Colab 作為主要的開發環境。

穩定擴散轉換器(Stable Diffusion Transformer)

首先,我們將介紹預訓練的穩定擴散模型,這是一種由 CompVis、Stability AI 以及 LAION 的研究人員和工程師共同開發的文字到影像潛在擴散模型(Patil et al., 2022)。擴散過程用於從複雜、高維度的分佈中抽取樣本,當它與文字嵌入(text embeddings)互動時,便創造了一個強大的條件影像合成模型。

穩定擴散模型的特點

穩定擴散模型在訓練過程中保持了某些特性,從而穩定了學習過程。這類別模型能夠根據文字提示,從給定的資料分佈中創造出全新的樣本,具有豐富的潛力。

實作:使用 Diffusers 函式庫建置穩定擴散管道

首先,我們需要在 Google Colab 中安裝必要的函式庫,包括 diffuserspytorch-fidtorchcliptransformers 以及 accelerate。安裝完成後,我們將匯入所需的函式庫,並定義三個關鍵函式:load_modelgenerate_images 以及 render_images

!pip install pytorch-fid torch diffusers clip transformers accelerate

from typing import List
import torch
import matplotlib.pyplot as plt
from diffusers import StableDiffusionPipeline, DDPMScheduler

def load_model(model_id: str) -> StableDiffusionPipeline:
    """載入指定 model_id 的模型"""
    return StableDiffusionPipeline.from_pretrained(
        model_id,
        torch_dtype=torch.float16,
        revision="fp16",
        use_auth_token=False
    ).to("cuda")

def generate_images(
    pipe: StableDiffusionPipeline,
    prompts: List[str]
) -> torch.Tensor:
    """根據提供的提示生成影像"""
    with torch.autocast("cuda"):
        images = pipe(prompts).images
    return images

def render_images(images: torch.Tensor):
    """顯示生成的影像"""
    plt.figure(figsize=(10, 5))
    for i, img in enumerate(images):
        plt.subplot(1, 2, i + 1)
        plt.imshow(img)
        plt.axis("off")
    plt.show()

內容解密:

  1. load_model 函式:負責載入預訓練的穩定擴散模型至 GPU 以加速處理。
  2. generate_images 函式:利用載入的模型和提供的文字提示生成影像。其中,torch.autocast("cuda") 用於加速運算同時保持準確性。
  3. render_images 函式:使用 matplotlib 將生成的影像以網格形式顯示出來。

執行影像生成

接下來,我們將選擇模型版本、定義管道並執行影像生成過程。

model_id = "CompVis/stable-diffusion-v1-4"
prompts = [
    "A hyper-realistic photo of a friendly lion",
    "A stylized oil painting of a NYC Brownstone"
]
pipe = load_model(model_id)
images = generate_images(pipe, prompts)
render_images(images)

內容解密:

  • 我們首先指定了模型版本為 "CompVis/stable-diffusion-v1-4",並定義了兩個文字提示。
  • 然後,我們載入模型、生成影像並顯示結果。

結果與評估

生成的影像如圖 2.1 所示,展示了擴散過程所創造出的充滿創意和想象力的結果。然而,如何評估模型是否忠實於提供的文字提示是一個重要的問題。

使用 CLIP 模型評估生成影像品質

在生成影像後,下一步是評估這些影像與提示之間的品質和相關性。這時 CLIP 模型就派上用場了。CLIP 能夠透過分析文字和影像之間的語義相似性,給出一個真實的量化指標,來衡量合成影像與提示之間的匹配程度。

使用 CLIP 模型進行評分

CLIP 是透過學習將相似的影像和文字放置在分享空間中的相鄰位置來理解文字和影像之間的關係。在評估生成的影像時,CLIP 會檢查影像與提供的文字描述之間的匹配程度。分數越高,表示匹配越好,即影像準確地代表了文字。相反,較低的分數則表示與文字有偏差,表明影像品質或與提示的匹配程度較低,從而提供了一個量化的指標來衡量生成的影像與預期描述的匹配程度。

載入必要的函式庫

from typing import List, Tuple
from PIL import Image
import requests
from transformers import CLIPProcessor, CLIPModel
import torch

載入 CLIP 模型和處理器

# 常數定義
CLIP_REPO = "openai/clip-vit-base-patch32"

def load_model_and_processor(model_name: str) -> Tuple[CLIPModel, CLIPProcessor]:
    """
    載入 CLIP 模型和處理器。
    """
    model = CLIPModel.from_pretrained(model_name)
    processor = CLIPProcessor.from_pretrained(model_name)
    return model, processor

處理輸入資料

def process_inputs(processor: CLIPProcessor, prompts: List[str], images: List[Image.Image]) -> dict:
    """
    使用 CLIP 處理器處理輸入資料。
    """
    return processor(text=prompts, images=images, return_tensors="pt", padding=True)

計算匹配機率

def get_probabilities(model: CLIPModel, inputs: dict) -> torch.Tensor:
    """
    使用 CLIP 模型計算匹配機率。
    """
    outputs = model(**inputs)
    logits = outputs.logits_per_image
    # 定義溫度引數 - 較高的溫度會使分佈更均勻
    T = 10
    # 對 logits 應用溫度引數
    temp_adjusted_logits = logits / T
    probs = torch.nn.functional.softmax(temp_adjusted_logits, dim=1)
    return probs

顯示影像及其匹配分數

def display_images_with_scores(images: List[Image.Image], scores: torch.Tensor) -> None:
    """
    顯示影像及其匹配分數。
    """
    # 設定列印選項以提高可讀性
    torch.set_printoptions(precision=2, sci_mode=False)
    for i, image in enumerate(images):
        print(f"Image {i + 1}:")
        display(image)
        print(f"Scores: {scores[i, :]}")
        print()

執行評估流程

# 載入 CLIP 模型
model, processor = load_model_and_processor(CLIP_REPO)
# 處理影像和文字輸入資料
inputs = process_inputs(processor, prompts, images)
# 提取匹配機率
probs = get_probabilities(model, inputs)
# 顯示每個影像及其對應的分數
display_images_with_scores(images, probs)

實際應用場景

透過 CLIP 模型,我們可以獲得每個合成影像的分數,這些分數量化了合成影像與提供的文字之間的匹配程度。這個指標在實際應用中具有廣泛的用途,例如:

  • 內容審核:透過比較影像與預定義的描述性提示,自動審核或標記不當內容。
  • 影像檢索:透過將文字查詢與龐大的影像資料函式庫進行匹配,實作精細化的影像搜尋。
  • 影像標題生成:透過識別最相關的描述性提示,協助生成準確的影像標題。
  • 廣告投放:根據網頁上的影像內容,量身定製廣告,以提高使用者參與度。
  • 無障礙功能:為視覺障礙人士提供準確的影像描述,以增強無障礙功能。

圖示說明

此圖示展示了 CLIP 評估結果的視覺化呈現。

圖 2.2:CLIP 評估結果

對於我們的“友好獅子”示例,我們計算出了每個提示的匹配機率分別為 83% 和 17%,這意味著第一個提示與影像的匹配程度較高。

詳細解說

  1. 輸入準備:首先,我們需要準備好輸入資料,包括要評估的影像以及對應的文字提示。
  2. CLIP 模型載入:載入預訓練的 CLIP 模型及其處理器,用於處理輸入資料並計算匹配機率。
  3. 機率計算:透過 CLIP 模型計算每個影像與文字提示之間的匹配機率。
  4. 結果展示:最後,將每個影像及其對應的匹配機率一併展示出來,以便直觀地評估生成影像的品質。

透過上述步驟,我們能夠有效地評估生成影像與預期文字描述之間的匹配程度,從而在多個實際應用場景中發揮重要作用。

生成式人工智慧技術綜覽:GANs、Diffusers 與 Transformers 深度解析

本章節探討了領先的生成式人工智慧(GAI)技術,包括生成對抗網路(GANs)、擴散模型(Diffusion Models)以及轉換器模型(Transformers),分析它們的理論基礎、實際應用及其獨特優勢。我們利用雲端Python環境實作這些模型,生成引人入勝的影像,並使用CLIP評估輸出品質。進一步分析了漸進式成長和分類別器引導等技術如何提升輸出品質,同時考慮了這些技術的社會影響,呼籲開發者透過透明和倫理實踐來解決潛在的危害。

GANs、Diffusers 與 Transformers 的核心優勢

  1. GANs 的影像合成能力:GANs 能夠合成極為逼真的影像,透過生成器和判別器的對抗訓練,不斷提升影像品質。

  2. 擴散模型的優雅生成過程:擴散模型透過逐步去噪的過程生成影像,具有高度的靈活性和可控性。

  3. Transformers 的語言生成能力:Transformers 在自然語言處理領域表現卓越,能夠生成連貫且富有上下文的文字內容。

程式碼實作範例

import torch
from diffusers import StableDiffusionPipeline

# 載入預訓練的Stable Diffusion模型
model_id = "CompVis/stable-diffusion-v1-4"
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16)

# 將模型遷移到GPU(如果可用的話)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
pipe.to(device)

# 生成影像
prompt = "一個未來主義城市的天際線"
image = pipe(prompt).images[0]

# 儲存生成的影像
image.save("future_city.png")

內容解密:

  • 載入預訓練的Stable Diffusion模型,利用diffusers函式庫簡化模型的載入與使用。
  • 將模型遷移到GPU以加速運算,如果系統支援CUDA。
  • 定義一個文字提示(prompt),用於引導模型生成相關的影像。
  • 使用模型生成影像,並將結果儲存為檔案。

技術深度與未來趨勢

這些生成式模型不僅在影像和文字生成方面展現出巨大的潛力,也對未來的創意產業、資料分析等領域產生深遠影響。然而,它們的發展也伴隨著諸多挑戰,如倫理問題、潛在的濫用風險等。因此,在推動這些技術發展的同時,我們必須審慎考慮其社會影響,並採取適當的措施來減輕潛在風險。

圖表說明

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 生成式AI模型GANs擴散模型與Transformers

package "生成式 AI 模型" {
    package "GANs" {
        component [生成器] as generator
        component [判別器] as discriminator
        component [對抗訓練] as adversarial
    }

    package "擴散模型" {
        component [正向擴散] as forward
        component [逆向去噪] as reverse
        component [Stable Diffusion] as sd
    }

    package "Transformers" {
        component [自注意力] as attention
        component [文字嵌入] as embedding
        component [CLIP 評估] as clip
    }
}

generator --> discriminator : 生成樣本
discriminator --> adversarial : 真偽判斷
adversarial --> forward : 模型輸出
forward --> reverse : 加噪過程
reverse --> sd : 去噪重建
sd --> attention : 潛在空間
attention --> embedding : 特徵提取
embedding --> clip : 文字條件

note right of adversarial
  GANs 特性:
  - 生成對抗
  - 隱式分佈
  - 模式崩潰風險
end note

note right of clip
  評估指標:
  - CLIP Score
  - FID 分數
  - 文圖匹配度
end note

@enduml

此圖示展示了使用Stable Diffusion模型進行文字到影像生成的流程。使用者輸入文字提示後,模型根據提示生成對應的影像,並將結果儲存。

圖表內容解密:

  • 圖表以線性流程展示了從輸入文字提示到生成影像的整個過程。
  • 每一步驟都清晰標示,幫助讀者理解文字到影像生成的技術流程。