DreamBooth 微調技術的核心在於讓模型學習新的概念,並將其融入到影像生成過程中。這需要仔細定義例項提示和類別提示,並準備足夠的訓練資料。模型訓練過程需要設定多個引數,例如學習率、訓練步數等,以獲得最佳效果。訓練完成後,需要驗證模型的生成效果,並將其轉換為可應用的格式。除了 DreamBooth,LoRA 等新興技術也為模型微調提供了更多選擇,尤其在資源有限的情況下,LoRA 的低秩適配方法更具優勢。SDXL 模型的出現則進一步提升了影像生成的品質,其基礎模型和精煉模型的協同工作,能生成更精細、更逼真的影像。

DreamBooth 微調技術深度解析與實務應用

DreamBooth是一種強大的AI模型微調技術,能夠根據使用者提供的少量圖片(約5至30張),在短時間內(通常不到一小時)訓練出一個高度個人化的自定義模型。這項技術特別適用於需要特定風格或主題的影像生成任務。

DreamBooth 訓練流程詳解

1. 概念定義與資料準備

在開始訓練之前,需要定義要訓練的概念。建議一次只訓練一個概念,以確保最佳的訓練效果。概念的定義包括:

  • 例項提示(instance_prompt):用於觸發模型的特定詞彙,建議使用無特定含義的詞彙,如"ukj"或"zwx"。
  • 類別提示(class_prompt):作為訓練的起始點,例如如果是訓練特定人物的模型,則使用"photo of a person"作為類別提示。
  • 例項資料目錄(instance_data_dir):存放特定概念圖片的目錄。
  • 類別資料目錄(class_data_dir):存放正則化圖片的目錄,用於防止過擬合。
concepts_list = [
    {
        "instance_prompt": "photo of ukj person",
        "class_prompt": "photo of a person",
        "instance_data_dir": "/content/data/ukj",
        "class_data_dir": "/content/data/person"
    }
]

2. 資料上傳與準備

DreamBooth可以透過Google Colab上傳圖片。建議使用20-30張圖片進行訓練,以獲得最佳效果。

import os
from google.colab import files
import shutil

for c in concepts_list:
    print(f"Uploading instance images for `{c['instance_prompt']}`")
    uploaded = files.upload()
    for filename in uploaded.keys():
        dst_path = os.path.join(c['instance_data_dir'], filename)
        shutil.move(filename, dst_path)

3. 模型訓練

使用以下指令進行模型訓練,需注意修改save_sample_prompt以使用指定的token:

!python3 train_dreambooth.py \
    --pretrained_model_name_or_path=$MODEL_NAME \
    --pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse" \
    --output_dir=$OUTPUT_DIR \
    --revision="fp16" \
    --with_prior_preservation --prior_loss_weight=1.0 \
    --seed=1337 \
    --resolution=512 \
    --train_batch_size=1 \
    --train_text_encoder \
    --mixed_precision="fp16" \
    --use_8bit_adam \
    --gradient_accumulation_steps=1 \
    --learning_rate=1e-6 \
    --lr_scheduler="constant" \
    --lr_warmup_steps=0 \
    --num_class_images=50 \
    --sample_batch_size=4 \
    --max_train_steps=800 \
    --save_interval=10000 \
    --save_sample_prompt="photo of ukj person" \
    --concepts_list="concepts_list.json"

4. 訓練結果驗證

訓練完成後,可以透過生成預覽圖片網格來評估模型是否正確理解了所提供的概念:

import os
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

weights_folder = OUTPUT_DIR
folders = sorted([f for f in os.listdir(weights_folder) if f != "0"], key=lambda x: int(x))
row = len(folders)
col = len(os.listdir(os.path.join(weights_folder, folders[0], "samples")))
scale = 4

fig, axes = plt.subplots(row, col, figsize=(col*scale, row*scale), gridspec_kw={'hspace': 0, 'wspace': 0})

for i, folder in enumerate(folders):
    folder_path = os.path.join(weights_folder, folder)
    image_folder = os.path.join(folder_path, "samples")
    images = [f for f in os.listdir(image_folder)]
    
    for j, image in enumerate(images):
        if row == 1:
            currAxes = axes[j]
        else:
            currAxes = axes[i, j]
        if i == 0:
            currAxes.set_title(f"Image {j}")
        if j == 0:
            currAxes.text(-0.1, 0.5, folder, rotation=0, va='center', ha='center', transform=currAxes.transAxes)
        image_path = os.path.join(image_folder, image)
        img = mpimg.imread(image_path)
        currAxes.imshow(img, cmap='gray')
        currAxes.axis('off')

plt.tight_layout()
plt.savefig('grid.png', dpi=72)

5. 模型轉換與應用

最後,需要將訓練好的模型轉換為.ckpt格式,以便在AUTOMATIC1111中使用:

!python convert_diffusers_to_original_stable_diffusion.py \
    --model_path $WEIGHTS_DIR --checkpoint_path $ckpt_path $half_arg

DreamBooth 的優勢與應用場景

  1. 個人化影像生成:透過提供特定人物的照片,可以訓練出能夠生成該人物不同樣式的圖片。
  2. 產品影像生成:企業可以利用自家產品的圖片訓練模型,生成多種產品展示圖。
  3. 藝術風格學習:藝術家可以利用自己的作品訓練模型,生成具有個人風格的新作品。
程式碼範例說明:

以上程式碼展示瞭如何使用DreamBooth進行模型微調,包括資料準備、模型訓練、結果驗證和模型轉換等步驟。每個階段都需要注意相關引數的設定,以確保最佳的訓練效果。

隨著AI技術的不斷進步,DreamBooth等微調技術將在更多領域展現其價值。未來可能會出現更多針對特定任務最佳化的微調方法,進一步提高模型的效能和適用範圍。

圖表說明:

本研究過程中使用了多個圖表來展示模型的訓練過程和結果。例如,透過matplotlib生成的預覽圖片網格,可以直觀地評估模型的表現。

此圖表展示了DreamBooth模型在不同訓練階段生成的影像,反映了模型的學習過程和最終效果。

圖表翻譯: 此圖表展示了模型在不同訓練階段的輸出結果,從中可以觀察到模型如何逐步學習並生成符合預期的影像。每個子圖代表不同訓練步驟下的生成結果,直觀反映了模型的收斂過程和最終表現。

綜上所述,DreamBooth為個人化和定製化AI生成提供了一個強有力的工具,不僅在技術層面展現了其強大的靈活性,也為創作者和開發者提供了廣闊的應用前景。隨著技術的不斷進步和最佳化,DreamBooth有望在更多領域發揮重要作用。

穩定擴散技術的進階應用

穩定擴散(Stable Diffusion)是一種開源的生成模型,廣泛應用於影像生成領域。本章將探討穩定擴散的進階技術,包括模型微調、ControlNet、Segment Anything等,並介紹最新的SDXL模型及其最佳化方法。

模型微調技術

除了Dreambooth之外,還有多種訓練和微調方法可供選擇。Dreambooth是目前最常用的技術。較早的技術是Textual Inversion,它不更新模型權重,而是近似找到代表特定概念的標記位置,但其效果通常不如Dreambooth。

# Dreambooth微調範例
from diffusers import StableDiffusionPipeline

# 載入預訓練模型
pipeline = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4")

# 使用Dreambooth進行微調
# 這裡需要準備特定的訓練資料

內容解密:

  1. 載入預訓練模型:使用StableDiffusionPipeline.from_pretrained方法載入預訓練的穩定擴散模型。
  2. Dreambooth微調:準備特定的訓練資料,使用Dreambooth技術對模型進行微調,以學習新的概念。

另一種有前途的新技術是LoRA(Low-Rank Adaptation of Large Language Models),它透過新增新層並訓練這些新層來構建自定義模型,而不需要耗費太多資源。

# LoRA微調範例
import torch
from lora_diffusion import LoRADiffusion

# 初始化LoRA模型
lora_model = LoRADiffusion(
    model_path="path/to/model",
    lora_rank=4  # 可根據需求調整
)

# 進行微調
lora_model.train_lora(data_path="path/to/training/data")

內容解密:

  1. 初始化LoRA模型:使用LoRADiffusion類別初始化LoRA模型,指定模型路徑和LoRA的秩(rank)。
  2. 進行微調:呼叫train_lora方法,使用指定的訓練資料對LoRA模型進行訓練。

SDXL模型與最佳化

SDXL v1.0模型擁有66億個引數,相比之下,v1.5模型只有9.8億個引數。增加的引數量帶來了更出色的生成效果,因此該模型開始贏得原本堅持使用v1.5模型的使用者的青睞。

SDXL模型的架構優勢

SDXL的強大之處在於其將任務分配給基礎模型和精煉模型(refiner model)。基礎模型負責設定整體構圖,而精煉模型則新增更細節的部分(可選)。

  graph LR
    D[D]
    A[輸入提示詞] --> B[基礎模型]
    B --> C[生成初始影像]
    C --> D{是否使用精煉模型?}
    D -->|是| E[精煉模型]
    D -->|否| F[最終輸出]
    E --> F

圖表翻譯: 此圖示展示了SDXL模型的處理流程。輸入提示詞首先由基礎模型處理,生成初始影像。然後根據是否啟用精煉模型,決定是否進一步最佳化影像細節。

使用精煉模型的技巧

要使用精煉模型,需要在AUTOMATIC1111介面中使用“Switch at”功能。此引數控制在第幾個步驟切換到精煉模型。

# 使用精煉模型的範例程式碼
def generate_image_with_refiner(prompt, switch_at=0.6, steps=30):
    # 初始化基礎模型和精煉模型
    base_model = StableDiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0")
    refiner_model = StableDiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-xl-refiner-1.0")

    # 生成初始影像
    image = base_model(prompt=prompt, num_inference_steps=steps).images[0]

    # 切換到精煉模型進行最佳化
    if switch_at < 1.0:
        refiner_steps = int(steps * (1 - switch_at))
        image = refiner_model(prompt=prompt, num_inference_steps=refiner_steps, image=image).images[0]

    return image

# 生成影像範例
prompt = "動漫貓女孩,粉色頭髮,貓耳裝扮,在涼亭前擺姿勢拍照,真實感,1女孩,角色肖像,鮮花印花,愛麗絲·普林, sots art,官方藝術,日光,波浪髮型,看著觀眾"
image = generate_image_with_refiner(prompt)

內容解密:

  1. 初始化模型:載入SDXL的基礎模型和精煉模型。
  2. 生成初始影像:使用基礎模型根據提示詞生成初始影像。
  3. 切換到精煉模型:根據設定的switch_at引數,決定是否使用精煉模型進一步最佳化影像。

第10章:建構AI驅動的應用程式

在本章中,我們將運用五大提示原則於內容寫作的端對端AI工作流程。此服務將根據使用者對訪談問題的回答,以使用者的寫作風格撰寫部落格文章。該系統首次在Saxifrage部落格上被記錄。

AI部落格寫作

使用AI建立部落格寫作服務的簡單方法是使用提示工程,例如「寫一篇關於{blogPostTopic}的部落格文章」。所產生的內容品質尚可,但不太可能包含有關該主題的寶貴意見或獨特經驗。內容也可能過於簡短和通用,因此不太可能在Google上獲得好的排名。

程式碼實作:簡單提示工程

# 簡單提示工程範例
prompt = f"寫一篇關於{blogPostTopic}的部落格文章"

內容解密:

此範例展示瞭如何使用簡單的提示來生成部落格文章。然而,這種方法生成的內容可能缺乏個性和深度。

更複雜的方法

一種更複雜的方法可能是建立一個更長的提示,包含進一步的指示。例如,可以新增有關寫作語氣、部落格文章架構和關鍵字的詳細資訊。以下是一個常見的部落格寫作提示範例:

輸入: 撰寫一篇關於「{blogPostTopic}」的部落格文章。使用「{tone}」的語氣。 使用轉折詞。 使用主動語態。字數超過1000字。 使用非常有創意的標題。 為每個部分新增標題。確保至少有9個部分,每個部分至少有兩段。 包含以下關鍵字:「{keywords}」。 為這篇文章建立一個好的slug和meta描述,字數不超過100字,並將其新增到部落格文章的末尾。

程式碼實作:複雜提示工程

# 複雜提示工程範例
complex_prompt = f"""
撰寫一篇關於「{blogPostTopic}」的部落格文章。使用「{tone}」的語氣。
使用轉折詞。
使用主動語態。字數超過1000字。
使用非常有創意的標題。
為每個部分新增標題。確保至少有9個部分,每個部分至少有兩段。
包含以下關鍵字:「{keywords}」。
為這篇文章建立一個好的slug和meta描述,字數不超過100字,並將其新增到部落格文章的末尾。
"""

內容解密:

此範例展示瞭如何使用更複雜的提示來生成更高品質的部落格文章。透過新增更多的指示,可以提高生成內容的可讀性和相關性。

五大提示原則檢核表

  1. 方向:雖然提供了一些指示,例如語氣、使用轉折詞和主動語態,但內容仍然可能聽起來像AI,而不是使用者本人。
  2. 格式:雖然提到了一些結構要求,例如九個部分,每部分兩段,但這些指示很可能會被忽略。ChatGPT在數學方面表現不佳,往往無法遵循有關部分或字數的指示。
  3. 範例:沒有提供任何範例,這可能會損害在多個主題或同一主題上多次執行此提示的可靠性。即使提供一個範例(單次提示)也可能大大提高品質。
  4. 評估:這是盲目提示的一個例子(在未經測試的情況下將指示新增到提示中)。有些指示可能對品質沒有影響(不必要地浪費tokens),甚至可能降低品質。
  5. 分割:整個任務僅使用一個提示來完成,這可能會損害效能。如果不將任務分解為子任務,很難瞭解哪個部分是成功的或失敗的。

建構多個LLM鏈結元件

在本章中,我們將建立多個LLM鏈結元件。每個鏈結將使用LangChain實作,以提高可維護性,並提供便於監控和最佳化的日誌記錄。最終系統將幫助生成根據使用者獨特意見和經驗的人類化內容。

主題研究

要有效地使用LangChain的檔案載入器,您需要安裝幾個Python套件,包括:

  • google-searchresults:用於抓取和處理Google搜尋結果的Python函式庫。
  • pandas:提供用於運算元值表格和時間序列資料的資料結構和運算。
  • html2text:將HTML檔案或網頁轉換為markdown(.md)檔案或文字的工具。
  • pytest-playwright:啟用使用Playwright進行端對端測試的套件。
  • chromadb:一個開源向量資料函式庫。
  • nest_asyncio:擴充套件Python標準asyncio,使其與Jupyter Notebooks相容。

程式碼實作:安裝必要的Python套件

pip install google-searchresults pandas html2text pytest-playwright chromadb nest_asyncio --quiet

內容解密:

此命令用於安裝執行LangChain檔案載入器所需的Python套件。確保在終端機中執行此命令,以安裝所有必要的依賴項。

設定程式環境

此外,您還需要選擇一個主題,並設定SERPAPI_API_KEYSTABILITY_API_KEY的環境變數。如果您在沒有Jupyter Notebook的情況下執行指令碼,則不需要使用任何nest_asyncio程式碼。

程式碼實作:設定環境變數和匯入必要的模組

from langchain_openai.chat_models import ChatOpenAI
from langchain.output_parsers import PydanticOutputParser
from langchain_text_splitters import RecursiveCharacterTextSplitter
import os
# 自定義匯入:
from content_collection import collect_serp_data_and_extract_text_from_webpages
from custom_summarize_chain import create_all_summaries, DocumentSummary
import nest_asyncio
nest_asyncio.apply()
# 常數變數:
TOPIC = "神經網路"
os.environ["SERPAPI_API_KEY"] = ""
os.environ["STABILITY_API_KEY"] = ""

內容解密:

此範例展示瞭如何設定環境變數和匯入必要的模組,以開始使用LangChain進行主題研究。請確保填寫您的API金鑰。

  1. 整合更多AI模型:透過整合不同的AI模型,可以進一步提高生成內容的多樣性和相關性。
  2. 改進提示工程:持續最佳化和改進提示工程,以提高生成內容的品質和可讀性。
  3. 擴充套件應用場景:將此係統擴充套件到更多的應用場景,例如自動化新聞寫作或社交媒體內容生成。

此圖示展示了AI驅動部落格寫作服務的工作流程

  graph LR;
    A[使用者輸入] --> B[主題研究];
    B --> C[生成部落格文章];
    C --> D[最佳化內容];
    D --> E[發布內容];

圖表翻譯: 此圖示展示了AI驅動部落格寫作服務的工作流程。首先,使用者輸入主題或關鍵字,然後系統進行主題研究。接著,系統根據研究結果生成部落格文章,並對內容進行最佳化。最後,最佳化後的內容被發布。整個過程透過自動化和AI技術實作,提高了內容生成的效率和品質。