|
|
||
|---|---|---|
| .. | ||
| GANPyTorch.ipynb | ||
| GANTF.ipynb | ||
| README.md | ||
| StyleTransfer.ipynb | ||
| StyleTransfer_Keras.ipynb | ||
README.md
เครือข่าย Generative Adversarial Networks
ในส่วนก่อนหน้า เราได้เรียนรู้เกี่ยวกับ โมเดลการสร้างภาพ: โมเดลที่สามารถสร้างภาพใหม่ที่คล้ายกับภาพในชุดข้อมูลการฝึกฝน VAE เป็นตัวอย่างที่ดีของโมเดลการสร้างภาพ
แบบทดสอบก่อนเรียน
อย่างไรก็ตาม หากเราพยายามสร้างสิ่งที่มีความหมายจริง ๆ เช่น ภาพวาดที่มีความละเอียดเหมาะสม ด้วย VAE เราจะพบว่าการฝึกฝนไม่สามารถบรรลุผลได้ดีนัก สำหรับกรณีนี้ เราควรเรียนรู้เกี่ยวกับสถาปัตยกรรมอีกแบบหนึ่งที่มุ่งเน้นไปที่โมเดลการสร้างภาพโดยเฉพาะ - Generative Adversarial Networks หรือ GANs
แนวคิดหลักของ GAN คือการมีเครือข่ายประสาทสองชุดที่ถูกฝึกฝนแข่งกัน:
ภาพโดย Dmitry Soshnikov
✅ คำศัพท์เล็กน้อย:
- Generator คือเครือข่ายที่รับเวกเตอร์สุ่ม และสร้างภาพเป็นผลลัพธ์
- Discriminator คือเครือข่ายที่รับภาพ และต้องบอกได้ว่าภาพนั้นเป็นภาพจริง (จากชุดข้อมูลการฝึกฝน) หรือเป็นภาพที่ถูกสร้างโดย Generator ซึ่งเป็นตัวจำแนกภาพโดยพื้นฐาน
Discriminator
สถาปัตยกรรมของ Discriminator ไม่แตกต่างจากเครือข่ายการจำแนกภาพทั่วไป ในกรณีที่ง่ายที่สุด มันสามารถเป็นตัวจำแนกแบบ fully-connected แต่ส่วนใหญ่จะเป็น เครือข่ายคอนโวลูชัน
✅ GAN ที่ใช้เครือข่ายคอนโวลูชันเรียกว่า DCGAN
Discriminator แบบ CNN ประกอบด้วยชั้นต่าง ๆ เช่น คอนโวลูชัน+การลดขนาด (พร้อมกับการลดขนาดเชิงพื้นที่) และชั้น fully-connected หนึ่งหรือมากกว่าเพื่อสร้าง "เวกเตอร์คุณลักษณะ" และตัวจำแนกแบบไบนารีสุดท้าย
✅ 'Pooling' ในบริบทนี้คือเทคนิคที่ลดขนาดของภาพ "Pooling layers ลดมิติของข้อมูลโดยการรวมผลลัพธ์ของกลุ่มนิวรอนในชั้นหนึ่งเป็นนิวรอนเดียวในชั้นถัดไป" - แหล่งข้อมูล
Generator
Generator มีความซับซ้อนมากกว่าเล็กน้อย คุณสามารถมองว่ามันเป็น Discriminator ที่กลับด้าน โดยเริ่มจากเวกเตอร์แฝง (แทนเวกเตอร์คุณลักษณะ) มันมีชั้น fully-connected เพื่อแปลงเป็นขนาด/รูปร่างที่ต้องการ ตามด้วย deconvolutions+การเพิ่มขนาด ซึ่งคล้ายกับส่วน decoder ของ autoencoder
✅ เนื่องจากชั้นคอนโวลูชันถูกนำมาใช้เป็นตัวกรองเชิงเส้นที่เคลื่อนผ่านภาพ การ deconvolution จึงคล้ายกับคอนโวลูชัน และสามารถนำมาใช้ด้วยตรรกะชั้นเดียวกัน
ภาพโดย Dmitry Soshnikov
การฝึกฝน GAN
GAN ถูกเรียกว่า adversarial เพราะมีการแข่งขันอย่างต่อเนื่องระหว่าง Generator และ Discriminator ในระหว่างการแข่งขันนี้ ทั้ง Generator และ Discriminator จะพัฒนาขึ้น ทำให้เครือข่ายเรียนรู้ที่จะสร้างภาพที่ดีขึ้นเรื่อย ๆ
การฝึกฝนเกิดขึ้นในสองขั้นตอน:
- การฝึกฝน Discriminator งานนี้ค่อนข้างตรงไปตรงมา: เราสร้างชุดภาพโดย Generator และติดป้ายกำกับว่า 0 ซึ่งหมายถึงภาพปลอม และนำชุดภาพจากชุดข้อมูลการป้อนเข้า (พร้อมป้ายกำกับ 1 ซึ่งหมายถึงภาพจริง) เราได้ discriminator loss และทำ backprop
- การฝึกฝน Generator ขั้นตอนนี้ซับซ้อนกว่าเล็กน้อย เพราะเราไม่ทราบผลลัพธ์ที่คาดหวังสำหรับ Generator โดยตรง เรานำเครือข่าย GAN ทั้งหมดที่ประกอบด้วย Generator ตามด้วย Discriminator ป้อนเวกเตอร์สุ่ม และคาดหวังผลลัพธ์เป็น 1 (ซึ่งสอดคล้องกับภาพจริง) จากนั้นเราจะตรึงพารามิเตอร์ของ Discriminator (เราไม่ต้องการให้มันถูกฝึกฝนในขั้นตอนนี้) และทำ backprop
ในกระบวนการนี้ ทั้ง Generator และ Discriminator loss จะไม่ลดลงอย่างมีนัยสำคัญ ในสถานการณ์ที่เหมาะสม พวกมันควรแกว่งไปมา ซึ่งแสดงถึงการปรับปรุงประสิทธิภาพของทั้งสองเครือข่าย
✍️ แบบฝึกหัด: GANs
ปัญหาในการฝึกฝน GAN
GAN เป็นที่รู้กันว่าฝึกฝนได้ยากเป็นพิเศษ นี่คือปัญหาบางประการ:
- Mode Collapse หมายถึง Generator เรียนรู้ที่จะสร้างภาพหนึ่งภาพที่ประสบความสำเร็จในการหลอก Discriminator แต่ไม่สร้างภาพที่หลากหลาย
- ความไวต่อ hyperparameters บ่อยครั้งที่ GAN ไม่สามารถบรรลุผลได้เลย และจากนั้นการลดอัตราการเรียนรู้ก็ทำให้เกิดการบรรลุผล
- การรักษา สมดุล ระหว่าง Generator และ Discriminator ในหลายกรณี Discriminator loss อาจลดลงจนถึงศูนย์อย่างรวดเร็ว ซึ่งทำให้ Generator ไม่สามารถฝึกฝนต่อไปได้ เพื่อแก้ไขปัญหานี้ เราสามารถลองตั้งค่าอัตราการเรียนรู้ที่แตกต่างกันสำหรับ Generator และ Discriminator หรือข้ามการฝึกฝน Discriminator หาก loss ต่ำเกินไปแล้ว
- การฝึกฝนสำหรับ ความละเอียดสูง สะท้อนปัญหาเดียวกันกับ autoencoders ปัญหานี้เกิดขึ้นเพราะการสร้างชั้นคอนโวลูชันจำนวนมากเกินไปนำไปสู่สิ่งประดิษฐ์ ปัญหานี้มักถูกแก้ไขด้วย progressive growing โดยเริ่มจากการฝึกฝนชั้นไม่กี่ชั้นบนภาพความละเอียดต่ำ และจากนั้น "ปลดล็อก" หรือเพิ่มชั้น หรืออีกวิธีหนึ่งคือการเพิ่มการเชื่อมต่อระหว่างชั้นและฝึกฝนหลายความละเอียดพร้อมกัน - ดู Multi-Scale Gradient GANs paper สำหรับรายละเอียด
การถ่ายโอนสไตล์
GAN เป็นวิธีที่ยอดเยี่ยมในการสร้างภาพศิลปะ อีกเทคนิคที่น่าสนใจคือ การถ่ายโอนสไตล์ ซึ่งใช้ภาพ content image หนึ่งภาพ และวาดใหม่ในสไตล์ที่แตกต่าง โดยใช้ฟิลเตอร์จาก style image
วิธีการทำงานคือ:
- เราเริ่มต้นด้วยภาพสุ่ม (หรือภาพ content image แต่เพื่อความเข้าใจง่ายขึ้น เราเริ่มจากภาพสุ่ม)
- เป้าหมายของเราคือการสร้างภาพที่ใกล้เคียงกับทั้ง content image และ style image ซึ่งจะถูกกำหนดโดยฟังก์ชัน loss สองตัว:
- Content loss คำนวณจากคุณลักษณะที่ถูกดึงออกโดย CNN ที่บางชั้นจากภาพปัจจุบันและ content image
- Style loss คำนวณระหว่างภาพปัจจุบันและ style image ด้วยวิธีที่ชาญฉลาดโดยใช้ Gram matrices (รายละเอียดเพิ่มเติมใน สมุดบันทึกตัวอย่าง)
- เพื่อทำให้ภาพเรียบเนียนและลดเสียงรบกวน เราแนะนำ Variation loss ซึ่งคำนวณระยะทางเฉลี่ยระหว่างพิกเซลที่อยู่ติดกัน
- วงจรการปรับแต่งหลักปรับภาพปัจจุบันโดยใช้ gradient descent (หรืออัลกอริทึมการปรับแต่งอื่น ๆ) เพื่อลด total loss ซึ่งเป็นผลรวมแบบถ่วงน้ำหนักของ loss ทั้งสามตัว
✍️ ตัวอย่าง: การถ่ายโอนสไตล์
แบบทดสอบหลังเรียน
สรุป
ในบทเรียนนี้ คุณได้เรียนรู้เกี่ยวกับ GAN และวิธีการฝึกฝน นอกจากนี้คุณยังได้เรียนรู้เกี่ยวกับความท้าทายพิเศษที่เครือข่ายประสาทประเภทนี้อาจเผชิญ และกลยุทธ์บางอย่างในการแก้ไขปัญหาเหล่านั้น
🚀 ความท้าทาย
ลองทำ สมุดบันทึกการถ่ายโอนสไตล์ โดยใช้ภาพของคุณเอง
การทบทวนและการศึกษาด้วยตนเอง
สำหรับการอ้างอิง อ่านเพิ่มเติมเกี่ยวกับ GAN จากแหล่งข้อมูลเหล่านี้:
- Marco Pasini, 10 บทเรียนที่ฉันได้เรียนรู้จากการฝึกฝน GAN เป็นเวลาหนึ่งปี
- StyleGAN สถาปัตยกรรม GAN ที่ควรพิจารณา
- การสร้างศิลปะเชิงสร้างสรรค์โดยใช้ GAN บน Azure ML
งานที่ได้รับมอบหมาย
กลับไปที่หนึ่งในสองสมุดบันทึกที่เกี่ยวข้องกับบทเรียนนี้ และฝึกฝน GAN ด้วยภาพของคุณเอง คุณสามารถสร้างอะไรได้บ้าง?