|
|
||
|---|---|---|
| .. | ||
| AutoEncodersPyTorch.ipynb | ||
| AutoencodersTF.ipynb | ||
| README.md | ||
README.md
ออโต้เอนโค้ดเดอร์ (Autoencoders)
เมื่อฝึกสอน CNNs หนึ่งในปัญหาคือเราต้องการข้อมูลที่มีการติดป้ายกำกับจำนวนมาก ในกรณีของการจำแนกภาพ เราจำเป็นต้องแยกภาพออกเป็นคลาสต่างๆ ซึ่งเป็นงานที่ต้องทำด้วยมือ
แบบทดสอบก่อนเรียน
อย่างไรก็ตาม เราอาจต้องการใช้ข้อมูลดิบ (ที่ไม่มีป้ายกำกับ) สำหรับการฝึกสอนตัวดึงคุณลักษณะของ CNN ซึ่งเรียกว่า การเรียนรู้แบบกึ่งควบคุมตนเอง (self-supervised learning) แทนที่จะใช้ป้ายกำกับ เราจะใช้ภาพฝึกสอนเป็นทั้งอินพุตและเอาต์พุตของเครือข่าย แนวคิดหลักของ ออโต้เอนโค้ดเดอร์ คือเราจะมี เครือข่ายเอนโค้ดเดอร์ ที่แปลงภาพอินพุตไปยัง พื้นที่แฝง (latent space) (โดยปกติจะเป็นเวกเตอร์ขนาดเล็กกว่า) จากนั้น เครือข่ายดีโค้ดเดอร์ จะมีเป้าหมายในการสร้างภาพต้นฉบับขึ้นมาใหม่
✅ ออโต้เอนโค้ดเดอร์ คือ "ประเภทของโครงข่ายประสาทเทียมที่ใช้ในการเรียนรู้การเข้ารหัสข้อมูลที่ไม่มีป้ายกำกับอย่างมีประสิทธิภาพ"
เนื่องจากเรากำลังฝึกสอนออโต้เอนโค้ดเดอร์เพื่อจับข้อมูลจากภาพต้นฉบับให้ได้มากที่สุดเพื่อการสร้างใหม่ที่แม่นยำ เครือข่ายจึงพยายามค้นหา การฝังตัว (embedding) ที่ดีที่สุดของภาพอินพุตเพื่อจับความหมายของภาพ
ภาพจาก บล็อก Keras
สถานการณ์ที่ใช้ออโต้เอนโค้ดเดอร์
แม้ว่าการสร้างภาพต้นฉบับขึ้นมาใหม่อาจดูเหมือนไม่มีประโยชน์ในตัวเอง แต่มีบางสถานการณ์ที่ออโต้เอนโค้ดเดอร์มีประโยชน์อย่างยิ่ง:
- ลดมิติของภาพเพื่อการแสดงผล หรือ ฝึกฝังตัวภาพ โดยปกติออโต้เอนโค้ดเดอร์จะให้ผลลัพธ์ที่ดีกว่า PCA เพราะมันคำนึงถึงลักษณะเชิงพื้นที่ของภาพและคุณลักษณะเชิงลำดับชั้น
- การลบสัญญาณรบกวน (Denoising) เช่น การลบสัญญาณรบกวนออกจากภาพ เนื่องจากสัญญาณรบกวนมีข้อมูลที่ไม่สำคัญจำนวนมาก ออโต้เอนโค้ดเดอร์ไม่สามารถใส่ข้อมูลทั้งหมดลงในพื้นที่แฝงที่ค่อนข้างเล็กได้ ดังนั้นมันจึงจับเฉพาะส่วนที่สำคัญของภาพ เมื่อฝึกสอนตัวลบสัญญาณรบกวน เราเริ่มต้นด้วยภาพต้นฉบับและใช้ภาพที่เพิ่มสัญญาณรบกวนเทียมเป็นอินพุตสำหรับออโต้เอนโค้ดเดอร์
- การเพิ่มความละเอียด (Super-resolution) เพิ่มความละเอียดของภาพ เราเริ่มต้นด้วยภาพความละเอียดสูงและใช้ภาพที่มีความละเอียดต่ำกว่าเป็นอินพุตของออโต้เอนโค้ดเดอร์
- โมเดลสร้างสรรค์ (Generative models) เมื่อเราฝึกสอนออโต้เอนโค้ดเดอร์แล้ว ส่วนดีโค้ดเดอร์สามารถใช้สร้างวัตถุใหม่โดยเริ่มจากเวกเตอร์แฝงแบบสุ่ม
ออโต้เอนโค้ดเดอร์เชิงแปรผัน (Variational Autoencoders - VAE)
ออโต้เอนโค้ดเดอร์แบบดั้งเดิมลดมิติของข้อมูลอินพุตโดยการค้นหาคุณลักษณะที่สำคัญของภาพอินพุต อย่างไรก็ตาม เวกเตอร์แฝงมักไม่มีความหมายมากนัก กล่าวอีกนัยหนึ่ง หากใช้ชุดข้อมูล MNIST เป็นตัวอย่าง การค้นหาว่าตัวเลขใดสอดคล้องกับเวกเตอร์แฝงต่างๆ ไม่ใช่เรื่องง่าย เพราะเวกเตอร์แฝงที่ใกล้กันอาจไม่ได้สอดคล้องกับตัวเลขเดียวกันเสมอไป
ในทางกลับกัน หากต้องการฝึกโมเดล สร้างสรรค์ จะดีกว่าหากมีความเข้าใจเกี่ยวกับพื้นที่แฝง แนวคิดนี้นำเราไปสู่ ออโต้เอนโค้ดเดอร์เชิงแปรผัน (VAE)
VAE คือออโต้เอนโค้ดเดอร์ที่เรียนรู้การทำนาย การแจกแจงทางสถิติ ของพารามิเตอร์แฝง หรือที่เรียกว่า การแจกแจงแฝง (latent distribution) ตัวอย่างเช่น เราอาจต้องการให้เวกเตอร์แฝงมีการแจกแจงแบบปกติที่มีค่าเฉลี่ย zmean และส่วนเบี่ยงเบนมาตรฐาน zsigma (ทั้งค่าเฉลี่ยและส่วนเบี่ยงเบนมาตรฐานเป็นเวกเตอร์ที่มีมิติ d) เอนโค้ดเดอร์ใน VAE จะเรียนรู้การทำนายพารามิเตอร์เหล่านี้ และดีโค้ดเดอร์จะใช้เวกเตอร์สุ่มจากการแจกแจงนี้เพื่อสร้างวัตถุขึ้นมาใหม่
สรุปได้ว่า:
- จากเวกเตอร์อินพุต เราทำนาย
z_meanและz_log_sigma(แทนที่จะทำนายส่วนเบี่ยงเบนมาตรฐานโดยตรง เราทำนายลอการิทึมของมัน) - เราสุ่มตัวอย่างเวกเตอร์
sampleจากการแจกแจง N(zmean,exp(zlog_sigma)) - ดีโค้ดเดอร์พยายามถอดรหัสภาพต้นฉบับโดยใช้
sampleเป็นเวกเตอร์อินพุต
ภาพจาก บล็อกโพสต์นี้ โดย Isaak Dykeman
ออโต้เอนโค้ดเดอร์เชิงแปรผันใช้ฟังก์ชันการสูญเสียที่ซับซ้อนซึ่งประกอบด้วยสองส่วน:
- การสูญเสียจากการสร้างใหม่ (Reconstruction loss) เป็นฟังก์ชันการสูญเสียที่แสดงให้เห็นว่าภาพที่สร้างใหม่ใกล้เคียงกับเป้าหมายเพียงใด (อาจเป็น Mean Squared Error หรือ MSE) ซึ่งเป็นฟังก์ชันการสูญเสียเดียวกับในออโต้เอนโค้ดเดอร์ปกติ
- การสูญเสีย KL (KL loss) ซึ่งทำให้มั่นใจว่าการแจกแจงตัวแปรแฝงยังคงใกล้เคียงกับการแจกแจงแบบปกติ โดยอิงตามแนวคิดของ Kullback-Leibler divergence ซึ่งเป็นเมตริกที่ใช้ประเมินความคล้ายคลึงกันระหว่างการแจกแจงทางสถิติสองแบบ
ข้อได้เปรียบสำคัญของ VAE คือช่วยให้เราสร้างภาพใหม่ได้ง่ายขึ้น เพราะเรารู้ว่าควรสุ่มตัวอย่างเวกเตอร์แฝงจากการแจกแจงใด ตัวอย่างเช่น หากเราฝึก VAE ด้วยเวกเตอร์แฝง 2 มิติบน MNIST เราสามารถปรับเปลี่ยนองค์ประกอบของเวกเตอร์แฝงเพื่อสร้างตัวเลขต่างๆ:
ภาพโดย Dmitry Soshnikov
สังเกตว่าภาพค่อยๆ ผสมกันเมื่อเราเริ่มได้เวกเตอร์แฝงจากส่วนต่างๆ ของพื้นที่พารามิเตอร์แฝง นอกจากนี้ เรายังสามารถแสดงภาพพื้นที่นี้ใน 2 มิติ:
ภาพโดย Dmitry Soshnikov
✍️ แบบฝึกหัด: ออโต้เอนโค้ดเดอร์
เรียนรู้เพิ่มเติมเกี่ยวกับออโต้เอนโค้ดเดอร์ในสมุดบันทึกต่อไปนี้:
คุณสมบัติของออโต้เอนโค้ดเดอร์
- เฉพาะข้อมูล - ทำงานได้ดีเฉพาะกับประเภทของภาพที่ได้รับการฝึกสอนมา ตัวอย่างเช่น หากเราฝึกเครือข่ายเพิ่มความละเอียดบนดอกไม้ มันจะทำงานได้ไม่ดีบนภาพบุคคล เพราะเครือข่ายสามารถสร้างภาพความละเอียดสูงขึ้นได้โดยใช้รายละเอียดที่ได้จากชุดข้อมูลฝึกสอน
- สูญเสียข้อมูลบางส่วน - ภาพที่สร้างใหม่ไม่เหมือนกับภาพต้นฉบับ ลักษณะของการสูญเสียถูกกำหนดโดย ฟังก์ชันการสูญเสีย ที่ใช้ระหว่างการฝึกสอน
- ทำงานกับ ข้อมูลที่ไม่มีป้ายกำกับ
แบบทดสอบหลังเรียน
สรุป
ในบทเรียนนี้ คุณได้เรียนรู้เกี่ยวกับประเภทต่างๆ ของออโต้เอนโค้ดเดอร์ที่นักวิทยาศาสตร์ AI สามารถใช้ได้ คุณได้เรียนรู้วิธีสร้างและใช้งานเพื่อสร้างภาพขึ้นมาใหม่ นอกจากนี้ คุณยังได้เรียนรู้เกี่ยวกับ VAE และวิธีใช้มันเพื่อสร้างภาพใหม่
🚀 ความท้าทาย
ในบทเรียนนี้ คุณได้เรียนรู้เกี่ยวกับการใช้ออโต้เอนโค้ดเดอร์สำหรับภาพ แต่พวกมันยังสามารถใช้กับดนตรีได้ด้วย! ลองดูโครงการ MusicVAE ของ Magenta MusicVAE ซึ่งใช้ออโต้เอนโค้ดเดอร์เพื่อเรียนรู้การสร้างดนตรีขึ้นมาใหม่ ลองทำ การทดลอง กับไลบรารีนี้เพื่อดูว่าคุณสามารถสร้างอะไรได้บ้าง
แบบทดสอบหลังเรียน
การทบทวนและการศึกษาด้วยตนเอง
สำหรับการอ้างอิง อ่านเพิ่มเติมเกี่ยวกับออโต้เอนโค้ดเดอร์ในแหล่งข้อมูลเหล่านี้:
- การสร้างออโต้เอนโค้ดเดอร์ใน Keras
- บล็อกโพสต์บน NeuroHive
- การอธิบายออโต้เอนโค้ดเดอร์เชิงแปรผัน
- ออโต้เอนโค้ดเดอร์เชิงแปรผันแบบมีเงื่อนไข
การบ้าน
ในตอนท้ายของ สมุดบันทึกนี้ที่ใช้ TensorFlow คุณจะพบ 'งาน' - ใช้สิ่งนี้เป็นการบ้านของคุณ
ข้อจำกัดความรับผิดชอบ:
เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI Co-op Translator แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้
