0Pricing
Learn AI with Python · บทเรียน

ออโตเอนโคดเดอร์แบบแปรผัน (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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ออโตเอนโคดเดอร์สำหรับการเรียนรู้การแทนค่า
  2. ออโตเอนโคดเดอร์แบบแปรผัน (VAE)
  3. GAN: ตัวสร้างและตัวจำแนก
  4. GAN แบบมีเงื่อนไขและการถ่ายโอนสไตล์
← กลับไปที่ Learn AI with Python