โมเดลดิฟฟิวชันจากสแครตช์ในมุมมองเชิงทฤษฎีแบบใหม่
- โมเดลดิฟฟิวชันได้แสดงผลลัพธ์ที่น่าประทับใจในการสร้างแบบจำลองเชิงกำเนิดในช่วงหลังมานี้ โดยเฉพาะอย่างยิ่งมีความโดดเด่นในการสุ่มตัวอย่างจากการแจกแจงแบบหลายโหมด
- โมเดลดิฟฟิวชันไม่เพียงถูกใช้อย่างแพร่หลายในเครื่องมือสร้างข้อความเป็นภาพอย่าง Stable Diffusion เท่านั้น แต่ยังแสดงประสิทธิภาพยอดเยี่ยมในงานประยุกต์หลากหลาย เช่น การสร้างเสียง/วิดีโอ/3D การออกแบบโปรตีน และการวางแผนเส้นทางหุ่นยนต์
- บทสอนนี้แนะนำโมเดลดิฟฟิวชันจากมุมมองของการทำ optimization และครอบคลุมทั้งทฤษฎีและโค้ดเพื่ออธิบายวิธีนำโมเดลดิฟฟิวชันไปใช้งานจริงตั้งแต่เริ่มต้น
การฝึกโมเดลดิฟฟิวชัน
- โมเดลดิฟฟิวชันมีเป้าหมายเพื่อสร้างตัวอย่างจากเซตที่เรียนรู้จากตัวอย่างฝึก
- การฝึกโมเดลดิฟฟิวชันประกอบด้วยกระบวนการดังนี้:
- สุ่มตัวอย่าง x0 จาก K, สุ่มระดับ noise σ ระหว่าง σmin และ σmax และสุ่ม noise ϵ จาก N(0,I)
- สร้างข้อมูลที่มี noise เป็น xσ=x0+σϵ
- ทำนาย ϵ (ทิศทางของ noise) จาก xσ พร้อมลดค่า squared loss ให้ต่ำที่สุด
- การฝึกจริงดำเนินการผ่านฟังก์ชัน
training_loop ซึ่งวนซ้ำ x0 ของแต่ละ batch และใช้ generate_train_sample เพื่อสุ่มระดับ noise sigma และเวกเตอร์ noise eps
ตารางกำหนด noise
- ในทางปฏิบัติ σ ไม่ได้ถูกสุ่มแบบสม่ำเสมอจากช่วง [σmin,σmax] แต่ช่วงนี้จะถูกทำให้ไม่ต่อเนื่องเป็นค่า N ค่าแยกกันที่เรียกว่า ตาราง σ
- คลาส
Schedule ทำหน้าที่ห่อหุ้มลิสต์ของ sigmas ที่เป็นไปได้ และสุ่มจากลิสต์นี้ระหว่างการฝึก
- ใช้ตารางแบบ log-linear และมีกราฟเปรียบเทียบตารางนี้กับตารางแบบอื่นภายใต้พารามิเตอร์ตั้งต้น
ตัวอย่างของเล่น
- ในบทสอนนี้ใช้ชุดข้อมูลของเล่นที่ประกอบด้วยจุดซึ่งสุ่มมาจากรูปเกลียว
- สำหรับชุดข้อมูลง่าย ๆ นี้ มีการใช้งาน denoiser ด้วย multilayer perceptron (MLP)
- MLP รับอินพุตเป็นการเชื่อมกันของ x∈R2 และระดับ noise σ แล้วทำนาย noise ϵ∈R2
- เมื่อมีองค์ประกอบสำคัญครบทั้งหมดแล้ว ก็สามารถฝึกโมเดลดิฟฟิวชันได้
การตีความ denoising ว่าเป็นการฉายเชิงประมาณ
- กระบวนการฝึกดิฟฟิวชันเรียนรู้ denoiser ϵθ(x,σ) และในบทความได้ตีความ denoiser ที่เรียนรู้แล้วว่าเป็นการฉายเชิงประมาณไปยัง data manifold K
- สิ่งนี้เป็นแรงจูงใจให้มีการนำแบบจำลองการประมาณความคลาดเคลื่อนสัมพัทธ์มาใช้เพื่อวิเคราะห์การลู่เข้าของอัลกอริทึมการสุ่มตัวอย่างแบบดิฟฟิวชัน
ฟังก์ชันระยะทางและฟังก์ชันฉาย
- สำหรับเซต K⊆Rn, ฟังก์ชันระยะทาง ถูกนิยามเป็น distK(x) และ การฉาย ของ x∈Rn ถูกนิยามเป็นเซตของจุดที่ทำให้ได้ระยะทางนี้
- หาก projK(x) มีค่าเดียว gradient ของ distK(x) จะชี้ไปยังการฉายที่เป็นเอกลักษณ์นั้น
denoiser ในอุดมคติ
- denoiser ในอุดมคติหรือเหมาะสมที่สุด ϵ∗ สำหรับระดับ noise σ ที่กำหนด คือค่าที่ทำให้ฟังก์ชัน loss ของการฝึกลดลงต่ำสุดอย่างแท้จริง
- เมื่อข้อมูลเป็นการแจกแจงสม่ำเสมอแบบไม่ต่อเนื่องบนเซตจำกัดเหนือ K, denoiser ในอุดมคติจะมีรูปแบบ closed-form ที่แน่นอน
แบบจำลองความคลาดเคลื่อนสัมพัทธ์
- มีการนำแบบจำลองความคลาดเคลื่อนสัมพัทธ์มาใช้เพื่อวิเคราะห์การลู่เข้าของอัลกอริทึมการสุ่มตัวอย่างแบบดิฟฟิวชัน
- แบบจำลองนี้ตั้งสมมติฐานว่าการฉายที่ denoiser ทำนายไว้ x−σϵθ(x,σ) จะประมาณ projK(x) ได้ดี เมื่อ σ ประมาณค่า distK(x)/n ได้ดีสำหรับอินพุต x
การสุ่มตัวอย่างจากโมเดลดิฟฟิวชัน
- เพื่อให้ได้จุด x0 ที่อยู่ใน K โดยการสุ่มจาก denoiser ที่เรียนรู้แล้ว ϵθ(x,σ), denoiser ϵθ(xt,σt) ที่รับ noise xt และระดับ noise σt จะทำนาย x0
การตีความการสุ่มตัวอย่างแบบดิฟฟิวชันว่าเป็นการลดระยะทาง
- การวนซ้ำในการสุ่มตัวอย่างแบบดิฟฟิวชันสามารถตีความได้ว่าเป็น gradient descent บนฟังก์ชัน f(x)=12distK(x)2
- วิธีเลือกตาราง σt เป็นตัวกำหนดจำนวนและขนาดของขั้น gradient ที่ใช้ระหว่างการสุ่มตัวอย่าง
ตัวสุ่มตัวอย่างที่ปรับปรุงแล้วผ่านการประมาณ gradient
- มีการอนุมานตัวสุ่มตัวอย่างใหม่ที่มีประสิทธิภาพจากการประมาณ gradient
- ตัวสุ่มตัวอย่างนี้แสดงการลู่เข้าที่เร็วกว่า DDIM sampler เดิม
ตัวอย่างขนาดใหญ่
- โค้ดฝึกที่ให้ไว้ข้างต้นสามารถใช้ฝึกโมเดลดิฟฟิวชันภาพตั้งแต่สแครตช์ได้ ไม่ใช่แค่กับชุดข้อมูลของเล่นเท่านั้น
- โค้ดสำหรับการสุ่มตัวอย่างยังทำงานได้โดยไม่ต้องแก้ไขเมื่อใช้สุ่มจาก latent diffusion model ระดับแนวหน้าที่ฝึกไว้ล่วงหน้า
แหล่งข้อมูลอื่น ๆ
- ขอแนะนำบล็อกโพสต์ต่อไปนี้เกี่ยวกับโมเดลดิฟฟิวชันด้วย:
- What are diffusion models? แนะนำโมเดลดิฟฟิวชันจากมุมมองเวลาไม่ต่อเนื่องของการย้อนกลับกระบวนการมาร์คอฟ
- Generative modeling by estimating gradients of the data distribution แนะนำโมเดลดิฟฟิวชันจากมุมมองเวลาแบบต่อเนื่องของการย้อนกลับสมการเชิงอนุพันธ์สุ่ม
- The annotated diffusion model อธิบายการใช้งานโมเดลดิฟฟิวชันด้วย PyTorch อย่างละเอียด
ความเห็นของ GN⁺
- บทสอนนี้แนะนำโมเดลดิฟฟิวชันจากมุมมองของ optimization และอธิบายโดยเชื่อมพื้นฐานเชิงทฤษฎีกับการลงมือเขียนโค้ดจริง ทำให้วิศวกรซอฟต์แวร์ระดับเริ่มต้นเข้าถึงได้
- โมเดลดิฟฟิวชันสามารถประยุกต์ใช้กับข้อมูลหลายประเภท ซึ่งสะท้อนถึงความเหมาะสมสำหรับงานหลากหลายด้านที่การสุ่มตัวอย่างจากการแจกแจงแบบหลายโหมดมีความสำคัญ
- บทสอนอธิบายกระบวนการฝึกและการสุ่มตัวอย่างของโมเดลดิฟฟิวชันแบบทีละขั้น ช่วยให้เข้าใจหลักการทำงานและวิธีนำไปใช้งานได้อย่างลึกซึ้ง
- กระบวนการฝึกและการสุ่มตัวอย่างของโมเดลดิฟฟิวชันค่อนข้างซับซ้อน และการทำความเข้าใจรวมถึงการนำไปใช้งานจำเป็นต้องมีความรู้พื้นฐานด้าน machine learning และ deep learning
- เมื่อนำเทคโนโลยีนี้มาใช้ ควรพิจารณาปัจจัยอย่างต้นทุนการคำนวณ คุณภาพของข้อมูลฝึก และความซับซ้อนของโมเดล ซึ่งทั้งหมดนี้ส่งผลต่อศักยภาพในการสร้างตัวอย่างที่ประณีตและหลากหลายยิ่งขึ้น
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ผู้เขียนกล่าวว่า ระหว่างพยายามทำความเข้าใจ diffusion model พบว่าสามารถทำให้ทั้งโค้ดและคณิตศาสตร์เรียบง่ายลงได้มาก จึงได้เขียนทั้งบล็อกโพสต์และไลบรารี diffusion ขึ้นมา พร้อมยินดีตอบคำถาม
อีกบทความที่ยอดเยี่ยมคือ 'Diffusion Models From Scratch' ซึ่งลงรายละเอียดทางคณิตศาสตร์มากกว่า และมาพร้อม implementation ที่เข้าใจง่ายยาวไม่ถึง 500 บรรทัด
ชอบที่บทความนี้มีโค้ดรวมอยู่ด้วย งานวิจัยด้าน diffusion ขึ้นชื่อเรื่องสมการจำนวนมาก แต่สำหรับคนอย่างพวกเรา โค้ดชัดเจนและเข้าใจง่ายกว่า งานวิจัยเชิงทฤษฎีทุกชิ้นควรมีโค้ดอ้างอิงแนบมาด้วย
อยากเห็นการต่อยอดไปยัง diffusion transformer ซึ่งถูกใช้ขับเคลื่อน Sora และโมเดลสร้างวิดีโออื่น ๆ ถ้านำบทความนี้ไปรวมกับ 'GPT From Scratch' แล้วทำเป็นบทนำ 'Diffusion Transformer From Scratch' ก็น่าจะดี
เป็นบทความที่ดี แต่พลาดคุณสมบัติสำคัญไป คือ diffusion model ทำการจำลองอนุพันธ์ของ log probability หรือ score function และการสุ่มตัวอย่างแบบ diffusion มีความคล้ายกับ Langevin dynamics ซึ่งช่วยอธิบายว่าทำไมจึงฝึกได้ง่ายกว่า GAN
น่าสนใจมาก ทำให้นึกถึงงานวิจัย Iterative alpha-(de)Blending ซึ่งก็ตั้ง diffusion model ที่เรียบง่ายกว่าในเชิงแนวคิด และเขียนเป็นกระบวนการฉายภาพแบบวนซ้ำคร่าว ๆ วิธีนี้เปิดทางให้ทำการทดลองที่น่าสนใจยิ่งขึ้น เช่น การวิเคราะห์ข้อผิดพลาดของการลบ noise
หนึ่งในแนวคิดของ diffusion คือการได้มาซึ่งข้อมูลฝึกจำนวนมหาศาลใช่หรือไม่? กล่าวคือ นำภาพที่ถูกทำให้ diffusion แบบสุ่มมาเทียบกับภาพที่ยังไม่ถูก diffusion ใช่ไหม?
คำอธิบายทฤษฎีดีมาก ดูเหมือนจะไม่ขึ้นกับ dataset แต่อยากรู้เรื่องเฉพาะของการสร้างภาพ เช่น ทำไม image generator ถึงสร้างคีย์เปียโนได้ยาก ดูเหมือนว่าน่าจะต้องมีการแทนข้อจำกัดระยะกลางที่ดีกว่านี้
จำไว้ว่าโมเดล machine learning ทั้งหมดคือ convolution
มีสมาคมลับที่ใช้คอมเมนต์ในโพสต์นี้ส่งข้อความลับถึงกัน อย่าไปค้นใน Google ล่ะ