ออโตเอนโคดเดอร์แบบแปรผัน (VAE)
ฟังก์ชันสูญเสีย ELBO เคล็ดลับการกำหนดพารามิเตอร์ใหม่ การสำรวจปริภูมิแฝง และการสร้างภาพด้วย VAE
ออโตเอนโคดเดอร์แบบแปรผัน (VAE) เป็นบทเรียน Learn AI with Python ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn AI with Python และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn AI with Python มีบทเรียนทั้งหมด 4 บทเรียน
จากตัวเข้ารหัสอัตโนมัติสู่ VAE
ตัวเข้ารหัสอัตโนมัติทั่วไปเรียนรู้จุดที่กระจัดกระจาย ดังนั้นเมื่อสุ่มจุดใหม่จึงได้ข้อมูลที่ไร้ความหมาย ตัวเข้ารหัสอัตโนมัติแบบแปรผัน (VAE) เรียนรู้พื้นที่แฝงที่ราบรื่นและต่อเนื่อง ซึ่งสามารถสุ่มตัวอย่างได้ ทำให้กลายเป็นแบบจำลองเชิงกำเนิดอย่างแท้จริง
การเข้ารหัสเป็นการแจกแจง
แทนที่จะให้ผลลัพธ์เป็นจุดเดียว ตัวเข้ารหัสของ VAE จะให้ การแจกแจง สำหรับข้อมูลนำเข้าแต่ละรายการ ได้แก่ ค่าเฉลี่ย mu และลอการิทึมของความแปรปรวน log_var ข้อมูลนำเข้าแต่ละรายการจะถูกจับคู่กับบริเวณเล็ก ๆ ที่คลุมเครือในพื้นที่แฝง ไม่ใช่จุดเดียว
class Encoder(nn.Module):
def __init__(self):
super().__init__()
self.fc = nn.Linear(784, 256)
self.fc_mu = nn.Linear(256, 64)
self.fc_logvar = nn.Linear(256, 64)เหตุใดจึงใช้ mu และ log_var
เราทำนาย log_var แทนการทำนายความแปรปรวนโดยตรง เพราะ log_var สามารถเป็นจำนวนจริงใด ๆ ก็ได้ โดยไม่ต้องมีเงื่อนไขว่าต้องเป็นบวก และยังมีเสถียรภาพทางตัวเลขมากกว่า เมื่อจำเป็นต้องใช้ความแปรปรวน เราสามารถยกกำลังเพื่อกู้คืนค่าได้
def forward(self, x):
h = torch.relu(self.fc(x))
return self.fc_mu(h), self.fc_logvar(h)การสุ่มตัวอย่าง z ในพื้นที่แฝง
ในการถอดรหัส เราต้องสุ่มตัวอย่าง z จากการแจกแจงที่ทำนายไว้ การสุ่มโดยตรงไม่สามารถหาอนุพันธ์ได้ จึงไม่สามารถส่งการแพร่ย้อนกลับผ่านขั้นตอนนี้ได้ เทคนิคการกำหนดพารามิเตอร์ใหม่ช่วยแก้ปัญหานี้
เทคนิคการกำหนดพารามิเตอร์ใหม่
เขียนการสุ่มตัวอย่างใหม่เป็น z = mu + eps * exp(0.5 * log_var) โดยที่ eps คือสัญญาณรบกวนแบบสุ่ม ตอนนี้ความสุ่มอยู่ใน eps ซึ่งไม่จำเป็นต้องใช้การไล่ระดับ และการไล่ระดับสามารถไหลผ่าน mu และ log_var ได้
def reparameterize(mu, log_var):
std = torch.exp(0.5 * log_var)
eps = torch.randn_like(std)
return mu + eps * stdตัวถอดรหัส
ตัวถอดรหัสรับ z ที่สุ่มตัวอย่างมา แล้วสร้างภาพคืนเช่นเดียวกับตัวถอดรหัสของตัวเข้ารหัสอัตโนมัติทั่วไป โดยขยายข้อมูล 64 มิติกลับเป็นพิกเซล 784 ค่า พร้อมผลลัพธ์จาก Sigmoid
decoder = nn.Sequential(
nn.Linear(64, 256),
nn.ReLU(),
nn.Linear(256, 784),
nn.Sigmoid()
)พจน์ค่าความสูญเสียจากการสร้างคืน
ครึ่งแรกของค่าความสูญเสียของ VAE คือการสร้างคืน ซึ่งวัดว่าภาพที่ถอดรหัสแล้วตรงกับข้อมูลนำเข้ามากเพียงใด โดยใช้ค่าความสูญเสียเอนโทรปีไขว้แบบทวิภาค (หรือ MSE) กับพิกเซลต่าง ๆ
recon_loss = nn.functional.binary_cross_entropy(
recon, x, reduction="sum"
)พจน์ความแตกต่างแบบ KL
ครึ่งที่สองคือ ความแตกต่างแบบ KL ซึ่งดึงการแจกแจงที่เข้ารหัสไว้แต่ละรายการให้เข้าใกล้การแจกแจงปกติมาตรฐาน วิธีนี้ช่วยทำให้พื้นที่แฝงมีความราบรื่นและต่อเนื่อง จึงสามารถใช้สร้างข้อมูลใหม่ได้
kl = -0.5 * torch.sum(1 + log_var - mu.pow(2) - log_var.exp())ฟังก์ชันวัตถุประสงค์ ELBO
VAE เพิ่มค่า ELBO (ขอบเขตล่างของหลักฐาน) ซึ่งเทียบเท่ากับการลดค่า reconstruction + KL การสร้างคืนทำให้ผลลัพธ์ยังคงเหมือนข้อมูลต้นฉบับ ส่วน KL ช่วยรักษารูปร่างของพื้นที่ให้เหมาะสม การสร้างสมดุลระหว่างสองส่วนนี้คือหัวใจสำคัญทั้งหมด
loss = recon_loss + kl
loss.backward()การสร้างภาพใหม่
เนื่องจากพื้นที่แฝงสอดคล้องกับการแจกแจงปกติมาตรฐาน คุณจึงสามารถ สร้าง ภาพใหม่เอี่ยมได้ด้วยการสุ่มตัวอย่าง z จาก N(0,1) แล้วถอดรหัส โดยไม่จำเป็นต้องมีภาพนำเข้า
with torch.no_grad():
z = torch.randn(16, 64)
new_images = decoder(z) # 16 generated samplesเหตุใด VAE จึงสำคัญ
VAE มอบพื้นที่แฝงที่มีหลักการ มีความราบรื่น และสามารถหาค่าระหว่างจุดหรือสุ่มตัวอย่างได้ VAE เป็นพื้นฐานของเทคนิคเชิงกำเนิดมากมาย และสอนแนวคิดสำคัญของการเรียนรู้การแจกแจง ไม่ใช่เพียงการเรียนรู้จุดต่าง ๆ
ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับ VAE
สรุป: ตัวเข้ารหัสอัตโนมัติแบบแปรผัน
คุณได้เรียนรู้ VAE โดยตัวเข้ารหัสจะให้ค่า mu และ log_var เทคนิคการกำหนดพารามิเตอร์ใหม่ z = mu + eps * exp(0.5 * log_var) ทำให้การสุ่มตัวอย่างยังคงหาอนุพันธ์ได้ และค่าความสูญเสียคือ ELBO = reconstruction + KL การสุ่มตัวอย่าง z จาก N(0,1) แล้วถอดรหัสจะสร้างภาพใหม่ได้
คำถามที่พบบ่อย
บทเรียน “ออโตเอนโคดเดอร์แบบแปรผัน (VAE)” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ออโตเอนโคดเดอร์แบบแปรผัน (VAE)” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn AI with Python ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn AI with Python มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ออโตเอนโคดเดอร์แบบแปรผัน (VAE)”
ฟังก์ชันสูญเสีย ELBO เคล็ดลับการกำหนดพารามิเตอร์ใหม่ การสำรวจปริภูมิแฝง และการสร้างภาพด้วย VAE คุณปฏิบัติ Learn AI with Python ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn AI with Python หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn AI with Python บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “ออโตเอนโคดเดอร์แบบแปรผัน (VAE)” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Learn AI with Python นี้ได้ไหม
ได้ บทเรียน Learn AI with Python ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ออโตเอนโคดเดอร์สำหรับการเรียนรู้การแทนค่า
- ออโตเอนโคดเดอร์แบบแปรผัน (VAE)
- GAN: ตัวสร้างและตัวจำแนก
- GAN แบบมีเงื่อนไขและการถ่ายโอนสไตล์