อนิฟิวชั่น-SD

Dec 23 2022
TL;DR นี่คือโมเดลใหม่ที่คล้ายกับการกระจายแบบเสถียร (ปรับจาก SD2) สำหรับภาพอนิเมะ รองรับความละเอียด 768x768 และมีประสิทธิภาพดีกว่าโมเดลอนิเมะยอดนิยมบางรุ่นตาม evals ของเราอย่างมาก จุดตรวจสอบเป็นแบบสาธารณะ (คำแนะนำในการติดตั้ง) การสาธิตสามารถใช้ได้ในบางครั้ง

TL;ดร

นี่คือโมเดลใหม่ที่มีลักษณะการกระจายที่เสถียร (ปรับจาก SD2) สำหรับภาพอนิเมะ รองรับความละเอียด 768x768 และมีประสิทธิภาพดีกว่าโมเดลอนิเมะยอดนิยมบางรุ่นตาม evals ของเราอย่างมาก จุดตรวจสอบเป็นแบบสาธารณะ ( คำแนะนำในการติดตั้ง ) การสาธิตสามารถใช้ได้ในบางครั้ง

  • บทนำ
  • ความเป็น มา
    - แบบจำลองการแพร่กระจาย
    - การแพร่กระจายแฝง - การแพร่กระจาย ที่ เสถียร - การแพร่กระจาย
    Waifu - การแพร่กระจายที่เสถียร2

  • โมเดลของเรา: การฝึกอบรม
    - การ ปรับสภาพ
    - ปัญหาทางเทคนิคและการเพิ่มประสิทธิภาพ
    - การอัปเดตชุดการฝึกอบรม
    - การฝึกอบรมที่มีความละเอียดสูงขึ้น
    - การเปลี่ยนแปลงการสุ่มตัวอย่าง
  • ผล
  • เปรียบเทียบกับโมเดลอะนิเมะอื่น ๆ
  • การอภิปราย
  • อ้างอิง
  • ตัวชี้

หลังจากการทดลองของฉัน กับการฝึกอบรมโมเดลการแพร่กระจายตั้งแต่เริ่มต้น มีคนหลายคนชี้ให้เห็นว่ามีเวอร์ชัน การแพร่กระจายที่เสถียรที่ปรับแต่งแล้วจำนวนมากในชุดข้อมูลเดียวกัน/คล้ายกัน โดยเฉพาะอย่างยิ่ง:

  • Waifu Diffusion : มันใช้ชุดย่อยที่ค่อนข้างเล็กของข้อมูล และเพียงแค่ป้อนพรอมต์แท็กลงใน CLIP สำหรับการปรับสภาพ) โดยไม่มีการแก้ไขโค้ดใด ๆ กับ Stable Diffusion ดั้งเดิม (นี่คือปัญหาของ IMO) อย่างไรก็ตามดูเหมือนว่าจะเป็นรูปแบบการแพร่กระจายของอะนิเมะที่ได้รับความนิยมสูงสุดในขณะนี้ มันเปิดตัวจุดตรวจสำหรับสาธารณะซึ่งแตกต่างจากรุ่นถัดไป
  • NovelAI : สิ่งนี้ดำเนินการโดยบริษัทจริง ไม่ใช่โดยนักวิจัย/วิศวกรอิสระ พวกเขาไม่ปล่อยโมเดล แต่ให้ส่วนต่อประสานแบบชำระเงินแก่มัน เห็นได้ชัดว่ามีประเด็นดราม่าเกี่ยวกับจุดตรวจสอบและรหัสของพวกเขาที่รั่วไหลออกมา ซึ่งดูเหมือนว่าพวกเขาได้ปรับเปลี่ยนเล็กน้อยกับ Stable Diffusion เดิม;
  • Anything-v3 : อันนี้ปรากฏขึ้นในภายหลัง มีข้อมูลไม่มากนักเกี่ยวกับโมเดล แต่คาดว่าน่าจะปรับแต่งจาก WaifuDiffusion (อย่างน้อยก็ใช้การแปลงพร้อมท์ที่คล้ายกันก่อนที่จะส่งไปยัง CLIP) มันสร้างภาพที่มีรายละเอียดมากและดูสวยงาม แต่ไม่ค่อยซื่อสัตย์ต่อข้อความแจ้ง พื้นที่เอาต์พุตมีขนาดเล็กมาก (ขาดความหลากหลาย ภาพทั้งหมดมีสไตล์เดียวกันและคล้ายกัน) และชวนให้นึกถึงโมเดล GAN ก่อนการแพร่กระจาย รุ่นนี้แตกต่างจากรุ่นอื่นๆ เนื่องจากไม่สามารถสร้าง NSFW ได้ ดังนั้นบางทีอาจได้รับจากการปรับแต่งชุดข้อมูลขนาดเล็กของภาพคุณภาพสูงโดยศิลปินคนเดียว

อย่างไรก็ตาม เนื่องจากมีโมเดลมากมายในพื้นที่นี้ ตอนแรกฉันตัดสินใจที่จะไม่ยุ่งเกี่ยวกับการมีส่วนร่วมและปล่อยให้ความคืบหน้าดำเนินไป แต่ตอนนี้Stable Diffusion 2เปิดตัวแล้วและยังไม่มีความคืบหน้าในโมเดลอนิเมะ ดังนั้นฉันจึงตัดสินใจลองดู — ในโพสต์นี้ ฉันกำลังอธิบายวิธีที่ฉันปรับแต่ง Stable Diffusion 2 ด้วยคอนดิชันเนอร์พรอมต์แบบกำหนดเอง และแสดงผลลัพธ์ แน่นอน ฉันเผยแพร่โมเดลด้วย — จากข้อความเตือนสองสามข้อที่ฉันได้ลอง มันดีกว่าโมเดลที่ระบุไว้ด้านบน ส่วนถัดไปจะมุ่งเน้นไปที่รายละเอียดทางเทคนิค หากคุณไม่สนใจ คุณสามารถข้ามไปที่ผลลัพธ์ ได้ โดยตรง

พื้นหลัง

เพื่อให้เข้าใจถึงสิ่งที่เกิดขึ้นและสิ่งที่เปลี่ยนแปลงไป มาดูภาพรวมสั้นๆ ของโมเดลที่มีอยู่ก่อน

แบบจำลองการแพร่กระจาย

ฉันจะไม่ลงรายละเอียดเกี่ยวกับแบบจำลองการแพร่กระจาย มีบทวิจารณ์ที่ดีมากมายในอินเทอร์เน็ตแล้ว สำหรับจุดประสงค์ของเรา ก็เพียงพอแล้วที่จะรู้ว่าแนวคิดคือการย่อยสลายกระบวนการสร้างภาพเป็นลำดับของขั้นตอน "ลดนอยส์" ในระหว่างการฝึก โมเดลแกนหลัก (ในกรณีของรูปภาพ — มักจะเป็นUNet) ได้รับอิมเมจที่เสียหายและขั้นตอนการ denoising และกำลังพยายามเลิกทำขั้นตอนที่เสียหายเพียงขั้นตอนเดียว ในระหว่างการอนุมาน เราเริ่มจากเสียงสุ่มและใช้แกนหลักซ้ำๆ เพื่อ "เลิกทำ" ขั้นตอนการทุจริตในจินตนาการทั้งหมด คณิตศาสตร์ที่แน่นอนเบื้องหลังสิ่งนี้จำเป็นต้องแม่นยำ ในเวลาอนุมาน แบบจำลองการแพร่กระจายที่ทันสมัยส่วนใหญ่ปรับเปลี่ยนกระบวนการเพื่อลดจำนวนขั้นตอนการสุ่มตัวอย่าง (สิ่งนี้เกิดขึ้นได้จากบางคนที่สังเกตเห็นว่ากระบวนการนี้คล้ายกับการแก้สมการเชิงอนุพันธ์สุ่มด้วยวิธีเชิงตัวเลขอย่างน่าสงสัย และใช้ตัวแก้ DE ที่ฉลาดกว่า แทน).

การแพร่กระจายแฝง

นี่เป็นแนวคิดที่สำคัญที่สุดที่ใช้ในแบบจำลองการแพร่กระจายแบบเปิดส่วนใหญ่ บริษัทอย่าง Google หรือ OpenAI สามารถฝึกอบรมและใช้โมเดลการแพร่กระจายในพื้นที่พิกเซลดั้งเดิมได้ เนื่องจากมีฮาร์ดแวร์มากมาย แต่สำหรับคนธรรมดา การฝึกอบรม (หรือแม้แต่การวิ่ง) UNet ในพื้นที่ 512x512 พิกเซลนั้นมีราคาแพงมาก แนวคิดคือการฝึกโปรแกรมเข้ารหัสอัตโนมัติซึ่งจะบีบอัดรูปภาพจากพื้นที่เดิม 512x512x3 ไปยังพื้นที่แฝง (ในกรณีของ Stable Diffusion — 64x64x4) ตัวเข้ารหัสอัตโนมัติได้รับการฝึกฝนให้เป็นVAEพร้อมการปรับให้เป็นมาตรฐานตาม KL เพื่อรักษาพื้นที่แฝงที่ "ดี"

จากนั้น แบบจำลองจะทำการแพร่กระจายในพื้นที่ขนาด 64x64x4 ซึ่งมีประสิทธิภาพมากกว่าอย่างเห็นได้ชัด ข้อเสียคือ VAE ยังไม่สมบูรณ์แบบ และข้อมูลบางส่วนจะสูญหายไปขณะบีบอัดรูปภาพ แต่ในทางปฏิบัติแล้วได้ผลดีทีเดียว

FWIW แนวทางอื่นเป็นไปได้ เช่นImagenสร้างภาพที่มีมิติต่ำในพื้นที่พิกเซล แล้วเพิ่มสเกลขึ้นเรื่อยๆ อย่างไรก็ตาม สิ่งนี้ไม่เกี่ยวข้องกับรุ่นที่เรากำลังอธิบายในบทความนี้

การแพร่กระจายที่เสถียร

นี่เป็นเรื่องทางสังคมมากกว่าความก้าวหน้าทางเทคนิค โมเดลนี้เป็นโมเดลการแพร่กระจายแฝง "วานิลลา" ซึ่งได้รับการฝึกฝนบนLAIONและไม่เหมือนกับโมเดลสร้างภาพก่อนหน้าส่วนใหญ่ มันถูกเผยแพร่สู่สาธารณะ สิ่งนี้ทำให้เทคโนโลยีพร้อมใช้งานสำหรับผู้ชมในวงกว้างที่ไม่คุ้นเคยกับการเรียนรู้ของเครื่อง จุดประกายความคิดสร้างสรรค์ การอภิปราย และผู้คนจำนวนมากปรับแต่งมันในชุดข้อมูลต่างๆ (เช่น โมเดลอนิเมะที่กล่าวถึงข้างต้น)

ทางเลือกหนึ่งที่น่าสนใจในสถาปัตยกรรมที่เกี่ยวข้องกับเรามากคือวิธีที่โมเดลกำลังปรับสภาพ โดยปกติแล้ว โมเดลจะได้รับการฝึกอบรมทั้งในโหมด "ไม่มีเงื่อนไข" ( UNet(ภาพที่เสียหาย) ~ รูปภาพ ) และแบบมีเงื่อนไข ( UNet(ภาพที่เสียหาย เงื่อนไข) ~ ภาพ ) และใช้คำแนะนำที่ไม่มีตัวแยกประเภทเมื่อสุ่มตัวอย่าง: แทนที่จะใช้UNet ( ภาพที่เสียหาย , condition ) เมื่อสร้างรูปภาพ จะใช้C * UNet ( รูปภาพเสียหาย , condition ) — ( C — 1) * UNet ( รูปภาพเสียหาย ) และCมีค่ามากกว่า 1 อย่างมีนัยสำคัญ (เช่น 7) สิ่งนี้ไม่ได้ใช้งานง่ายนัก แต่ช่วยปรับปรุงทั้งคุณภาพของภาพและความเที่ยงตรงของภาพที่สร้างขึ้นอย่างมาก

สิ่งที่เกี่ยวข้องกับเราคือเงื่อนไขที่ได้มา ใน Stable Diffusion พวกเขาใช้ตัวเข้ารหัสข้อความเลเยอร์สุดท้ายที่ซ่อนอยู่ของโมเดลCLIP มันถูกแช่แข็ง กล่าวคือ การไล่ระดับสีจะไม่ถูกทำซ้ำในระหว่างการฝึก ถือได้ว่าเป็นรูปแบบตัวเข้ารหัสภาษา โดยองค์ประกอบรองบางอย่างของภาพจะเอนเอียงความเข้าใจภาษาไปสู่ความเข้าใจด้วยภาพ

Waifu การแพร่กระจาย

นี่คือการแพร่กระจายที่เสถียรซึ่งปรับแต่งภาพอนิเมะ ดูเหมือนว่าพวกเขาใช้ชุดย่อยของDanbooru2021 (หรืออะไรที่คล้ายกัน) เป็นชุดการฝึก พวกเขาใช้ Stable Diffusion เหมือนเดิม โดยไม่มีการแก้ไขโค้ดใดๆ (พวกเขาได้ปรับแต่งส่วนถอดรหัสของ VAE เพื่อให้ทำงานได้ดีขึ้นเล็กน้อยกับภาพอนิเมะ)

ด้วยเหตุนี้ พวกเขาจึงใช้ CLIP เป็นคอนดิชันเนอร์ในทำนองเดียวกัน โดยป้อนสตริงที่มีแท็กเป็นพรอมต์ ฉันเดาว่ามันทำงานได้ค่อนข้างแย่ เนื่องจากพวกเขายังประมวลผลแท็กล่วงหน้า (เช่น แทนที่เครื่องหมายขีดล่างด้วยช่องว่าง) แต่ถึงกระนั้นก็ดูเหมือนว่าความเข้าใจของ CLIP เกี่ยวกับข้อความแจ้งนั้นไม่ดีพอ

การแพร่กระจายที่เสถียร2

นี่คือรุ่นที่เพิ่มขึ้นซึ่งฝึกโมเดลใหม่ (ขนาดเดียวกัน) ตั้งแต่เริ่มต้น และยังแทนที่ครีมนวดผมด้วยOpenCLIP นอกจากนี้ยังมีคุณสมบัติเพิ่มเติมที่น่าสนใจ เช่น img2img เชิงลึก และรุ่นที่มีความละเอียดสูงกว่า (768x768 พิกเซล)

โมเดลของเรา: การฝึกอบรม

เป้าหมายคือการปรับแต่ง Stable Diffusion 2 บนภาพอนิเมะ โดยแทนที่เอ็นโค้ดเดอร์ด้วยโมเดลที่กำหนดเองสำหรับชุดแท็กเป็นอินพุต ซึ่งตรงข้ามกับภาษาธรรมชาติของ CLIP นอกจากการปรับสภาพที่ดีขึ้นแล้ว ยังช่วยให้ได้เทคนิคการเสริมจมูกที่รวดเร็วจากAnifusionซึ่งช่วยให้มีคุณภาพและความหลากหลายอย่างมาก

ครีมนวดผม

เราใช้วิธีเดียวกับใน Anifusion: โมเดลการปรับสภาพเป็น หม้อแปลงขนาด BERTโดยไม่มีการวางตำแหน่ง (เพื่อจับความสมมาตรของแท็กพร้อมท์: ลำดับของแท็กไม่ควรมีความสำคัญ) เราเพียงแค่เปลี่ยนคอนดิชั่นเนอร์ โดยรักษาส่วนที่เป็น cross-attention ของ diffusion backbone ไว้เหมือนเดิม

คำถามสำคัญที่นี่คือวิธีเริ่มต้นหม้อแปลงตุ้มน้ำหนัก เริ่มจากการปรับสภาพที่ไม่ได้รับการฝึกฝนและ UNet ที่ผ่านการฝึกอบรม และการฝึกร่วมกันสามารถนำไปสู่กระบวนการฝึกอบรมที่ทำลายหรือลดน้ำหนักของ UNet ลงอย่างมาก โชคดีที่มันแก้ไขได้ไม่ยาก: เราสามารถหยุดการทำงานของ UNet และเรียกใช้การฝึกอบรมเฉพาะส่วนของหม้อแปลงได้ในบางครั้ง

ปัญหาทางเทคนิคและการเพิ่มประสิทธิภาพ

เพื่อให้การฝึกอบรมมีประสิทธิภาพ สิ่งสำคัญคือต้องบีบขนาดแบตช์ให้สูงที่สุดเท่าที่จะเป็นไปได้ในแรมวิดีโอ (เช่น เนื่องจากค่าใช้จ่ายในการใช้ลอจิกเครื่องมือเพิ่มประสิทธิภาพจะจ่ายเพียงครั้งเดียวต่อแบตช์) โดยทั่วไปมีสองทิศทางที่นี่

การเปลี่ยนแปลงท่อ

รหัสการฝึกอบรม SD แบบบัญญัติเรียกใช้โปรแกรมเปลี่ยนไฟล์ VAE ทางออนไลน์ โดยแยกวิเคราะห์ภาพดิบและเข้ารหัส นี่เป็นปัญหาที่ต่ำที่สุดที่จะกำจัด: น้ำหนัก VAE ใช้ VRAM ตัวแปรระดับกลางจากการใช้ตัวเข้ารหัสนี้ใช้ VRAM เช่นกัน กระบวนการเข้ารหัสต้องใช้เวลา โดยเฉพาะอย่างยิ่ง หากเราส่งผ่านข้อมูลหลายครั้ง ก็ไม่สมเหตุสมผลที่จะเสียค่าใช้จ่ายในการเข้ารหัสภาพเดียวกันหลายครั้ง

โชคดีที่ส่วนนี้ปรับแต่งได้ง่าย เราเพียงแค่เข้ารหัสรูปภาพทั้งหมดในชุดการฝึกไว้ล่วงหน้า ประโยชน์เพิ่มเติมคือชุดการฝึกอบรมที่ได้มีขนาดเล็กกว่ามาก (ในแง่ของขนาดดิสก์) กว่าภาพต้นฉบับ 512x512 ในพื้นที่พิกเซล

อีกวิธีหนึ่งในการประหยัด VRAM เล็กน้อยคือการปิดใช้งาน EMA ค่าเฉลี่ยเคลื่อนที่แบบเอกซ์โปเนนเชียลเป็นเคล็ดลับในการปรับปรุงคุณภาพของแบบจำลองเล็กน้อยโดยการหาน้ำหนักเฉลี่ย (โดยประมาณ) จากจุดตรวจสุดท้ายหลายๆ จุด และการไม่จัดเก็บ EMA เป็นวิธีง่ายๆ ในการใช้ VRAM น้อยลงโดยไม่ทำให้แบบจำลองผลลัพธ์เสียหายมากนัก

การเปลี่ยนแปลงการฝึกอบรม

วิธียอดนิยมในการเพิ่มความเร็วการฝึกและประหยัด VRAM คือการใช้ความแม่นยำที่ต่ำกว่า แทนที่จะใช้ fp32 (ตัวเลขทศนิยม 32 บิตแบบปกติ) ให้ใช้ fp16 หรือ bf16 (รูปแบบต่างๆ ของตัวเลขทศนิยม 16 บิต) หรือความแม่นยำแบบผสม (ดำเนินการ การดำเนินการบางอย่างใน fp16)

ฉันลองแล้ว และมันก็ช่วยเรื่องประสิทธิภาพได้จริงๆ แต่มันอันตรายเกินไป โดยเฉพาะอย่างยิ่ง เมื่อถึงจุดหนึ่ง ฉันได้เพิ่ม "with torch.autocast():" (ความแม่นยำแบบผสม) เพื่อเรียกร้องความสนใจ จากนั้นฉันก็เสียเวลาพอสมควรในการหาสาเหตุที่โมเดลค่อยๆ เบี่ยงเบนเมื่อเวลาผ่านไป

เป็นผลให้ฉันตัดสินใจว่าจะปลอดภัยกว่าที่จะไม่ใช้การปรับให้เหมาะสมในลักษณะนี้กับโมเดล เนื่องจากการฝึกอบรมนั้นค่อนข้างมีประสิทธิภาพอยู่แล้ว

อัพเดทชุดฝึก

ใน Anifusion มีการใช้ชุดข้อมูล Danbooruเวอร์ชันเก่าดังนั้นฉันจึงตัดสินใจว่าเป็นเวลาที่ดีที่จะอัปเดตชุดข้อมูลดังกล่าว ในขณะเดียวกันก็ขยายขนาดของชุดการฝึกและชุดแท็กที่รองรับในพรอมต์ มีความยุ่งยากสองสามประการ: (1) ชุดข้อมูลเวอร์ชันใหม่ไม่ใช่ชุดธรรมดาธรรมดาของชุดก่อนหน้า และ (2) ฉันตัดสินใจทำในขณะที่โมเดลกำลังฝึกอยู่ ดังนั้นงานเพิ่มเติมบางอย่างเพื่อเปลี่ยนชุดที่มีอยู่ จำเป็นต้องมีจุดตรวจ

ความแตกต่างของชุดข้อมูล

นี่เป็นเรื่องเล็กน้อย แต่หลังจากดาวน์โหลดข้อมูลเมตาสำหรับชุดข้อมูลเวอร์ชันใหม่ ฉันสังเกตเห็นว่ารูปภาพจำนวนมาก (สองสามเปอร์เซ็นต์) หายไป แท็กบางแท็กที่เคยติดอันดับ 2.5k ก่อนหน้านี้ก็หายไปเช่นกัน (รวมถึงแท็กยอดนิยมบางแท็กด้วย) นอกจากนี้ รูปภาพที่ถูกลบยังตรงกับแท็กที่ถูกลบอีกด้วย

การตรวจสอบเพิ่มเติมพบว่าแท็กที่หายไปนั้นตรงกับรูปแบบ "Fringy NSFW" ทั้งหมด (บางแท็กก็เยิ่นเย้อจนฉันไม่รู้ด้วยซ้ำว่ามีสิ่งเหล่านี้อยู่…) มันไม่สอดคล้องกันเนื่องจากแท็กและรูปภาพที่มีลักษณะคล้ายกันอื่นๆ ถูกเก็บไว้ ฉันเดาว่าผู้ดูแลชุดข้อมูลหรือไซต์โฮสต์รูปภาพต้นฉบับใช้มันเป็นแฮ็คด่วนเพื่อจัดการกับข้อกังวลด้านประชาสัมพันธ์ อย่างไรก็ตาม ฉันเพิ่งนำชุดข้อมูลเก่าและใหม่มารวมกันเพื่อให้ได้รูปภาพประมาณ 2 ล้านภาพเพื่อฝึกฝน นอกจากนี้ ฉันได้สุ่มตัวอย่างภาพ 800k ที่มีความละเอียด ≥ 786x768 จากภาพเหล่านั้น เพื่อปรับแต่งโมเดลที่มีความละเอียดสูงในภายหลัง

ขยายชุดแท็ก

ส่วนนี้เป็นเรื่องไม่สำคัญ ณ จุดที่มีการสร้างชุดข้อมูลใหม่ โมเดลได้รับการฝึกฝนมาระยะหนึ่งแล้ว โดยมีหม้อแปลงคอนดิชั่นเนอร์ที่หลอมรวมเข้าด้วยกันอย่างดี รับการแจ้งเตือนจากแท็กที่มียอดสูงสุด 2.5k เป็นอินพุต สำหรับเวอร์ชันที่ใหม่กว่า ฉันตัดสินใจใช้แท็กที่มียอดสูงสุด 12k แทน จะเพิ่มลงในโมเดลได้อย่างไร?

สิ่งที่ต้องอัพเกรดคือตารางการฝังของหม้อแปลง (จาก 2500x1024 เป็น 12000x1024) วิธีการที่ไร้เดียงสาคือการสุ่มเริ่มต้นการฝังใหม่ และฝึกโมเดลเป็นระยะเวลาหนึ่งด้วย UNet ที่แช่แข็ง โดยอัปเดตเฉพาะหม้อแปลง แต่นี่คือ (1) สิ้นเปลืองในแง่ของเวลาและการคำนวณ (2) น่าเบื่อ เราสามารถเริ่มต้นให้ดีขึ้นได้หรือไม่?

มาดูกันดีกว่าว่าเรามีข้อมูลอะไรบ้าง เราได้ฝึกการฝัง 2.5k แล้ว และการฝังสำหรับแท็กใหม่ควรจะค่อนข้างคล้ายกับพวกเขา แต่สำหรับคนไหน? แนวคิดที่ไร้เดียงสาคือการใช้การฝังแท็กที่มีความหมายคล้ายกัน แต่เราจะได้รับความคล้ายคลึงกันทางความหมายได้อย่างไร word2vecเก่าที่ดีนั้นดีมากดังนั้นเราจึงสามารถนำชุดแท็กและฝึกการฝัง word2vec ลงไปได้ ด้านล่างนี้คือการ แสดงภาพ t-SNEของผลลัพธ์ (จุดมืดสอดคล้องกับแท็ก NSFW เพื่อให้ง่ายต่อการข้ามไปสำหรับผู้ที่ไม่ต้องการดู) ลิงก์แบบโต้ตอบ

มาดูการแสดงภาพเดียวกันสำหรับการฝังที่ได้รับการฝึกฝน 2.5k จาก Transformer: ลิงก์แบบโต้ตอบ

ดังนั้นมันจึงไม่เหมือนกันจริงๆ และเน้นไปที่รูปลักษณ์ภายนอกมากกว่าความหมาย อย่างไรก็ตาม ควรใกล้เคียงพอ เราจึงสามารถคำนวณการฝังเริ่มต้นสำหรับแท็กใหม่ได้ดังนี้: หาเพื่อนบ้านที่ใกล้ที่สุดในพื้นที่ word2vec จากแท็กบนสุด 2.5k และรวมการฝังหม้อแปลง อันที่จริง เราสามารถปรับปรุงได้เล็กน้อย: ฝึก NN ขนาดเล็กซึ่งแปลง word2vec เพื่อให้การรวมเพื่อนบ้านที่ใกล้ที่สุดตรงกับการฝังจริงในแท็ก 2.5k แรก และนำไปใช้กับแท็กที่เหลือ

ด้วยวิธีนี้ เราได้รับการเริ่มต้นที่สมเหตุสมผลสำหรับการฝังใหม่ ปรับเปลี่ยนจุดตรวจสอบล่าสุด และดำเนินการฝึกอบรมข้อมูลใหม่ต่อตามที่เป็นอยู่

การฝึกอบรมความละเอียดสูง

Stable Diffusion 2 มีเวอร์ชันหนึ่งซึ่งสร้างภาพขนาด 768x768 (เช่น ใหญ่กว่า 512x512 ถึง 2.25 เท่า) ซึ่งมีคุณสมบัติที่น่าสนใจบางอย่าง (เช่น ดูเหมือนว่าจะจัดการกับนิ้วที่วาดได้ดีกว่าเวอร์ชันที่มีความละเอียดต่ำกว่า) ดังนั้นเราจึงตัดสินใจทำเช่นเดียวกันกับโมเดลของเรา เรามีการฝึกอบรมสองขั้นตอน:

  • ความละเอียดต่ำ: การฝึกบนภาพขนาด 512x512 (พื้นที่แฝง 64x64x4) ด้วยชุดขนาด 11 อัตราการเรียนรู้ 5e-6 สำหรับ 1 ล้านก้าว
  • ความละเอียดสูง: ดำเนินการต่อจากเฟสก่อนหน้า ฝึกบนภาพขนาด 768x768 (พื้นที่แฝง 96x96x4) ด้วยชุดขนาด 5 อัตราการเรียนรู้ 5e-6 80k ขั้น

การเปลี่ยนแปลงตัวอย่าง

ในAnifusionการเสริมด้วยโมเดลที่แยกจากกันทำให้ผลลัพธ์ดีขึ้นอย่างมาก โดยสังหรณ์ใจแล้ว การสุ่มตัวอย่างสิ่งต่างๆ ในพื้นที่แนวคิดแบบแยกส่วนจะง่ายกว่า ซึ่งตรงข้ามกับพื้นที่ต่อเนื่องโดยนัยภายในกระบวนการแพร่

ในที่นี้ เราใช้เทคนิคเดียวกันนี้ในการฝึกหม้อแปลงการเสริมกำลังแบบทันทีในชุดการฝึกใหม่ เราสังเกตเห็นผลแบบเดียวกัน — คุณภาพและความหลากหลายของตัวอย่างเพิ่มขึ้นอย่างมากด้วยการเพิ่มขึ้นอย่างรวดเร็ว โดยเฉพาะอย่างยิ่งสำหรับข้อความแจ้งสั้นๆ

ผล

ปรากฏว่ารุ่น 768x768 ให้ภาพที่ดีกว่ารุ่น 512x512 และไม่ใช่เพียงเพราะความละเอียดเท่านั้น ความสอดคล้องโดยรวมของภาพและ (โดยเฉพาะ) รายละเอียดทางกายวิภาคของตัวละครจะดีกว่า อย่างไรก็ตาม ดูเหมือนว่าความเที่ยงตรงในทันทีจะแย่กว่าเล็กน้อย (แต่ฉันไม่มีหน่วยวัดที่เหมาะสมใดๆ แค่ความประทับใจของฉัน)

สิ่งหนึ่งที่ควรทราบก็คือเมื่อเทียบกับ Anifusion แล้ว โมเดลดูเหมือนจะมีอคติต่อภาพ NSFW/racy มากกว่า บางส่วนสามารถนำมาประกอบกับการเพิ่มขึ้นอย่างรวดเร็ว แต่ส่วนของ UNet ก็มีส่วนรับผิดชอบเช่นกัน ฉันไม่แน่ใจว่าทำไมมันถึงเกิดขึ้น (การเปลี่ยนแปลงชุดการฝึกค่อนข้างน้อย อาจเป็นเพราะขนาด/การเริ่มจาก Stable Diffusion ทำให้เกิดสิ่งนี้)

มาดูภาพประเภทต่างๆ ทีละขั้นตอนกัน

ภาพบุคคล

นี่เป็นกรณีการใช้งานที่ง่ายที่สุด และสร้างภาพบุคคลอนิเมะได้สำเร็จแม้ในยุค GAN ไม่น่าแปลกใจเลยที่โมเดลไม่มีปัญหากับสิ่งนี้ (ตัวอย่างบางส่วนด้านล่าง)

อักขระตัวเดียว แท็กยอดนิยม

นี่เป็นการทดสอบที่ยากกว่า และอย่างที่คาดไว้ คนๆ หนึ่งอาจได้ภาพที่ไม่ดีเป็นครั้งคราว (ซึ่งน้อยครั้ง) โหมดความล้มเหลวทั่วไปคือลักษณะทางกายวิภาคที่ไม่ดี — แขนหรือขาเพิ่มเติม และแน่นอนว่านิ้วเป็นสิ่งที่ท้าทายมากสำหรับนางแบบ

อักขระตัวเดียว แท็กท้าย

ที่นี่ เรากำลังทดสอบแท็กที่ได้รับความนิยมน้อย โดยเฉพาะแท็กที่ถูกเพิ่มเข้ามาในช่วงหลัง ๆ ของการฝึกอบรม (ดูรายละเอียดเพิ่มเติมด้านบน) ดูเหมือนว่าจะทำงานได้ค่อนข้างดีแม้ว่าจะไม่สมบูรณ์แบบก็ตาม ตัวอย่างบางส่วนอยู่ด้านล่าง โดยทั่วไป ดูเหมือนว่าแท็กอักขระจะง่ายกว่าสำหรับโมเดลมากกว่าแท็กแนวคิด

แท็กที่เพิ่มใหม่ เรียงจากซ้ายไปขวา: “สิงโต” (ไม่ชัดเจน บางทีเธออาจจะกำลังขี่มันอยู่), “เฟซปาล์ม” (ไม่ทำงาน), “venti_(genshin_impact)” (ใช้งานได้)

ปฏิสัมพันธ์ของตัวละคร

ในที่สุดเราก็ไปถึงสิ่งที่น่าสนใจ อนิฟิวชันต้นฉบับทำได้ไม่ดีนักเมื่อตัวละครโต้ตอบกัน รุ่นใหม่ดีกว่าไหม?

ตัวละครหลายตัวที่ยืนติดกันดูเหมือนจะโอเค:

การกระทำง่าย ๆ ยังใช้งานได้:

ซ้ายไปขวา: “จูบ”, “ถือ_มือ”, “กอด”

การโต้ตอบกับวัตถุก็ดีขึ้นหรือน้อยลงเช่นกัน:

จากซ้ายไปขวา: “holding_gun”, “ขี่”, “holding_food”

อย่างไรก็ตาม หากเราพยายามระบุการโต้ตอบที่ซับซ้อน มันมักจะสร้างความสยดสยองต่อร่างกายได้บ่อยกว่าปกติ (ฉันจะไม่โพสต์รูปภาพเหล่านี้ที่นี่ เพราะอาจทำให้รู้สึกไม่สบายใจได้) ทำไมสิ่งนี้ถึงเกิดขึ้น? ฉันเดาว่าเป็นเพราะข้อความแจ้งเป็นเพียงชุดแท็ก และไม่ได้ระบุการโต้ตอบที่แม่นยำเพียงพอ สิ่งที่ทำให้แบบจำลองการแพร่กระจายสร้างภาพที่ดีในตอนแรกคือคำแนะนำที่ปราศจากตัวแยกประเภท: การเน้นย้ำมากเกินไปจะทำให้คุณภาพดีขึ้นอย่างมากเมื่อเทียบกับการสุ่มตัวอย่างแบบทันทีทันใด เนื่องจากการสุ่มตัวอย่างแนวคิดที่ซับซ้อนภายในการแพร่กระจายนั้นยาก ดังนั้นเราจึงสามารถคาดหวังได้ว่าสิ่งใดก็ตามที่ระบุอย่างชัดเจนในพรอมต์จะถูกสร้างขึ้นอย่างสวยงาม แต่ความกำกวมจะได้รับการแก้ไขด้วยวิธีที่ไม่ค่อยดีนัก การกระตุ้นด้วยภาษาธรรมชาติจะดีกว่าในแง่นี้

FWIW ในความคิดเห็นต่อโพสต์ Anifusion ดั้งเดิมบน reddit Gwernแนะนำให้ใช้BLIPเพื่อสร้างข้อความแจ้งภาษาธรรมชาติจากรูปภาพ ฉันได้ลองใช้จริง ๆ แล้ว และคุณภาพของข้อความแจ้งก็ต่ำมาก ดังนั้นจึงไม่ง่ายอย่างนั้น

สไตล์

ใน Stable Diffusion ดั้งเดิม ผู้คนพบวิธีมากมายในการระบุสไตล์ให้กับโมเดล ส่วนใหญ่โดยการเพิ่มชื่อศิลปินบางคน ใช้งานได้กับโมเดลอนิเมะหรือไม่?

ลองใช้งาน — ใช้งานได้ดีมาก (นี่เป็นข้อได้เปรียบเมื่อเทียบกับ AnythingV3) ด้านล่างนี้เป็นตัวอย่างในการสุ่มรูปแบบต่างๆ

เปรียบเทียบกับโมเดลอะนิเมะอื่น ๆ

เราไม่ทำการเปรียบเทียบกับ AnythingV3 เนื่องจากมันไม่เคารพข้อความแจ้ง สร้างภาพที่คล้ายกันสำหรับทุกสิ่งที่สวยงาม (ตามชื่อที่แนะนำ) สิ่งนี้ทำให้ WaifuDiffusion และ NovelAI เราตัดสินใจที่จะไม่เปรียบเทียบกับ NovelAI เนื่องจากจะต้องใช้ด่านที่รั่วออกมา และเป็นการดีกว่าที่จะอยู่ห่างจากดราม่านั้น สิ่งนี้ทำให้เรามี WaifuDiffusion

สิ่งหนึ่งที่ควรทราบก็คือการเปรียบเทียบคำสั่งสั้น ๆ นั้นไม่ยุติธรรมกับ WaifuDiffusion เกินไป: มันไม่รวมถึงการเสริมคำสั่งทันที (ไม่เหมือนกับ Anifusion) ซึ่งให้ผลลัพธ์ที่แย่มากสำหรับคำสั่งสั้น ๆ ดังนั้นเราจึงทำการเปรียบเทียบสองแบบแทน ในหนึ่ง เราสุ่มตัวอย่างชุดแท็กจากชุดข้อมูลดั้งเดิม ลบการเสริมอย่างรวดเร็วออกจากการพิจารณาอย่างมีประสิทธิภาพ และเปรียบเทียบเฉพาะส่วนการแพร่กระจาย ในอันที่สอง เราสร้างพรอมต์ขนาดกลางบางส่วนด้วยตนเองและประเมินทั้งสองโมเดลบนพวกมัน (ซึ่งรวมถึงผลกระทบของการเสริมพรอมต์ด้วย)

ชุดแท็กจากชุดข้อมูล

เราสุ่มตัวอย่างชุดแท็ก 97 ชุดจากชุดข้อมูล (สม่ำเสมอ กรองเป็นรูปภาพที่ได้รับการจัดอันดับ "ปลอดภัย") สำหรับ Anifusion เราประมวลผลล่วงหน้าโดยเพิ่ม “rating_s, score_perc_100, modified_score_perc_100” ไปที่พรอมต์ สำหรับ WaifuDiffusion เราประมวลผลล่วงหน้าด้วยการแทนที่ขีดล่างด้วยช่องว่าง ในทั้งสองกรณี เราใช้การสุ่มตัวอย่าง DDIMด้วย 50 ขั้นตอนและสเกลคำแนะนำแบบไม่ใช้ตัวแยกประเภท 9

หลังจากได้รับการจัดอันดับโดยมนุษย์ (โดยสุ่มพลิกด้านเพื่อเปรียบเทียบ) เราได้ผลลัพธ์ต่อไปนี้เมื่อเปรียบเทียบกับ Waifu:

  • อะนิฟิวชั่นดีกว่า: 30%
  • Waifu ดีกว่า: 24%
  • ประมาณเดียวกัน: 46%

รูปแบบความล้มเหลวอย่างหนึ่งที่ฉันสังเกตเห็นใน Waifu: มันมักจะสร้างภาพย่อยแทนที่จะเป็นภาพเต็ม โดยตัดส่วนหัวของตัวละครออก รูปแบบความล้มเหลวของ Anifusion คือ NSFW ที่ไม่ได้รับการแจ้งเตือน (และที่เกี่ยวข้อง — กายวิภาคศาสตร์ที่ไม่ดี ด้วยเหตุผลบางประการ ยิ่งภาพเข้าใกล้ NSFW มากเท่าไหร่ โมเดลก็ยิ่งได้รับกายวิภาคศาสตร์ที่แย่ลงเท่านั้น)

หมายเหตุด้านข้าง: ที่นี่คุณจะพบผลลัพธ์ AnythingV3 สำหรับข้อความแจ้งเดียวกัน ผลลัพธ์ดูดี แต่ใคร ๆ ก็เข้าใจได้ว่าทำไมฉันถึงลังเลที่จะรวมมันไว้ในการเปรียบเทียบ: ภาพทั้งหมดดูมีสไตล์เดียวกันทุกประการ ขาดความหลากหลายอย่างมาก หมายความว่าโมเดลมีพื้นที่เอาต์พุตที่เล็กกว่ามาก

ดังนั้นด้วยการสุ่มตัวอย่างแบบกระจาย จึงไม่ได้ดีไปกว่านี้มากนัก แต่ถ้าเราใช้รุ่น highres ล่ะ?

  • อะนิฟิวชั่นดีกว่า: 41%
  • Waifu ดีกว่า: 13%
  • ประมาณเดียวกัน: 46%

เราสามารถสังเกตได้ว่ามีจำนวน "เท่ากัน" ที่ไม่สำคัญ ตัวอย่างเหล่านี้ส่วนใหญ่เป็นโมเดลทั้งสองที่ดีพอๆ กัน แต่ก็มีบางโมเดลที่ทั้งสองโมเดลแย่อย่างน่าใจหาย

พร้อมท์ขนาดกลางด้วยตนเอง

เราใช้การประมวลผลล่วงหน้าพร้อมท์แบบเดียวกับที่อธิบายไว้ในส่วนก่อนหน้า เราเตรียมพรอมต์ขนาดกลางที่เหมาะสม 33 รายการด้วยตนเอง (แน่นอนว่าเนื่องจากพวกเขาเตรียมโดยบุคคลคนเดียว จึงอาจไม่ได้เป็นตัวแทนของการแจกจ่ายโดยรวม)

ที่นี่ ผลลัพธ์แตกต่างกันมาก:

  • อะนิฟิวชั่นดีกว่า: 73%
  • Waifu ดีกว่า: 9%
  • ประมาณเดียวกัน: 18%

อย่างที่เราเห็น การเสริมอย่างรวดเร็วสร้างความแตกต่าง เกิดอะไรขึ้นเมื่อเราใช้โมเดลความละเอียดสูง ผลลัพธ์ค่อนข้างคล้ายกัน ( ข้อมูลดิบ ):

  • อะนิฟิวชั่นดีกว่า: 73%
  • Waifu ดีกว่า: 3%
  • ประมาณเดียวกัน: 24%

การเข้าถึงสำหรับฆราวาส

ข้อสังเกตที่น่าสนใจประการหนึ่งคือแม้หลังจากการฝึกอบรมมินิแบทช์หนึ่งล้านครั้ง โมเดลก็ยังคงปรับปรุงต่อไป ไม่ชัดเจนว่าโมเดลจำอะไรจากด่าน Stable Diffusion ดั้งเดิมหลังจากผ่านขั้นตอนมากมาย บางทีชุดข้อมูลอนิเมะนั้นง่ายพอที่จะฝึกโมเดลการแพร่กระจายขนาด SD ตั้งแต่เริ่มต้นบนฮาร์ดแวร์สินค้าโภคภัณฑ์ โดยไม่ต้องเริ่มร้อนจาก SD ที่มีอยู่ นี่เป็นแนวทางที่ควรตรวจสอบ หากเป็นกรณีนี้ การลองใช้สถาปัตยกรรมใหม่สำหรับแต่ละคนจะง่ายขึ้น โดยไม่จำเป็นต้องใช้เงินหลายล้านดอลลาร์ในการคำนวณ เช่นเดียวกับกรณีของการฝึกอบรมบนพื้นฐาน LAION

การปรับปรุงคุณภาพเพิ่มเติม

เป็นเรื่องน่าสนใจที่จะดูว่าเป็นไปได้มากน้อยเพียงใดกับโมเดลปัจจุบัน ดังนั้นฉันจึงต้องการปรับแต่งเพิ่มเติมอีกเล็กน้อย อาจใช้ชุดข้อมูลแบบเต็ม แทนที่จะเป็นชุดย่อย 2M แต่ฉันสงสัยว่าปัจจัยที่จำกัดคือคุณภาพของชุดข้อมูล ไม่ใช่ปริมาณของการปรับละเอียด (เช่น เพื่อปรับปรุงคุณภาพของโมเดล เราจะต้องป้อนเฉพาะรูปภาพที่มีคุณภาพสูงกว่า หรือเพิ่มตัวระบุพิเศษให้กับคอนดิชันเนอร์ซึ่งช่วยให้โมเดล เพื่อแยกแยะภาพที่ดีกว่าและแย่กว่า) ตามความรู้ของฉัน ไม่มีโมเดลที่น่าเชื่อถือเช่นนี้สำหรับอนิเมะ (สำหรับภาพทั่วไป ผู้คนใช้ส่วนย่อยของ "สุนทรียศาสตร์" ของ LAION) แม้ว่าจะมีบางโมเดลที่ให้ผลลัพธ์ที่ยอดเยี่ยมซึ่งดูแตกต่างจากโมเดลนี้หรือ WaifuDiffusion (เช่น โมเดลอนิเมะของ Midjorney ซึ่งมีให้ในรูปแบบภาพเชอร์รี่เท่านั้น) ดังนั้นจึงอาจเป็นไปได้

สิ่งสำคัญคือต้องทราบว่าการสร้างความละเอียดสูงช่วยปรับปรุงคุณภาพในด้านอื่นๆ นอกเหนือจากความละเอียด — เช่น “มือ AI” ที่น่าอับอายจะดีขึ้น ฉันสงสัยว่าการเพิ่มเป็น 1024x1024 จะทำให้มีการปรับปรุงมากขึ้นหรือไม่ สิ่งที่ควรลองใช้คือการใช้การแพร่กระจายแบบเรียงซ้อน (เช่นImagen ) ใน พื้นที่ แฝง (เช่น 64x64 -> 128x128 -> 256x256 ในพื้นที่แฝง ซึ่งให้ผล 2048x2048 ในพื้นที่ดั้งเดิม)

การใช้งาน

ข้อกังวลอย่างหนึ่งเกี่ยวกับสิ่งที่ฉันเผยแพร่คือมันเป็นการพิสูจน์แนวคิด รหัสสำหรับโมเดลนั้นแตกต่างจาก SD ดังนั้นจึงไม่รองรับเครื่องมือส่วนใหญ่ แม้ว่ารุ่นนี้จะดูดีกว่าโมเดลอนิเมะอื่นๆ วิธีแก้ปัญหาที่เป็นไปได้คือชุมชน (หรือฉัน ถ้าฉันมีเวลา) บูรณาการอย่างเหมาะสมกับเครื่องมือที่มีอยู่ หรือทำให้มันเข้ากันได้กับ SD ในระดับอินเทอร์เฟซ

อ้างอิง

  • การแพร่กระจายที่เสถียร2
  • การแพร่กระจายแฝง
  • ชุดข้อมูล Danbooru2021
  • คำแนะนำในการเปิด UI ของเว็บ
  • จุดตรวจสอบแบบจำลอง (ใบหน้ากอด): 512x512 , 768x768 , ตัวเพิ่มพรอมต์
  • SD Github repo ดัดแปลงสำหรับโมเดล
  • การสาธิต 768x768 —จำกัดไว้ที่ “เรต: ปลอดภัย” ฉันจะให้มันทำงานต่อไปสักระยะ แต่สุดท้ายฉันก็จะไม่รักษามัน