Mẹo Tái Tham Số Hóa Và Hàm Mất Mát KL Cho VAE (Kingma & Welling 2013)
Thao tác lấy mẫu ngẫu nhiên z sim N(mu, sigma2) là một nút ngẫu nhiên không thể truyền ngược đạo hàm (non-differentiable). Kingma & Welling tách sự ngẫu nhiên ra khỏi đồ thị
Tiến độ của tôi ở bài này
Điểm và code bạn nộp được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: gaussian-process-regression-rbf-kernel.
Nội dung đề bài
Mục tiêu kiến thức
- Trong Variational Autoencoder (VAE), mạng Encoder xuất ra kỳ vọng mu và log phương sai log sigma2 của phân phối tiên nghiệm ẩn qphi(z | x) = N(mu, diag(sigma2)).
- Mẹo tái tham số hóa (Reparameterization Trick):
Thao tác lấy mẫu ngẫu nhiên z sim N(mu, sigma2) là một nút ngẫu nhiên không thể truyền ngược đạo hàm (non-differentiable). Kingma & Welling tách sự ngẫu nhiên ra khỏi đồ thị tính toán: z = mu + sigma odot epsilon, với epsilon sim N(0, I) Trong đó sigma = exp(0.5 · log sigma2).
- Hàm mất mát phân kỳ KL dạng giải tích (Closed-form KL Divergence) giữa q(z | x) và phân phối chuẩn tắc N(0, I):
DKL(q(z | x) parallel N(0, I)) = -12 Σj=1D ( 1 + log sigmaj2 - muj2 - sigmaj2 )
Yêu cầu
Viết 2 hàm:
def reparameterize(mu: torch.Tensor, logvar: torch.Tensor, eps: torch.Tensor | None = None) -> torch.Tensor:
# Lấy mẫu z = mu + std * eps
pass
def compute_vae_loss(
recon_x: torch.Tensor,
x: torch.Tensor,
mu: torch.Tensor,
logvar: torch.Tensor,
beta: float = 1.0
) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]:
# Trả về: (total_loss, recon_loss, kl_loss)
pass- reparameterize: Nếu eps là None, tạo eps = torch.randn_like(mu).
- compute_vae_loss:
- recon_loss = F.mse_loss(recon_x, x, reduction='mean').
- kl_loss = -0.5 * torch.mean(torch.sum(1 + logvar - mu.pow(2) - logvar.exp(), dim=-1)).
- total_loss = recon_loss + beta * kl_loss.
Input
- Hàm reparameterize(mu, logvar, eps): Các tham số đầu vào chứa dữ liệu Tensor/mảng NumPy hoặc giá trị siêu tham số tương ứng.
- Hàm compute_vae_loss(recon_x, x, mu, logvar, beta): Các tham số đầu vào chứa dữ liệu Tensor/mảng NumPy hoặc giá trị siêu tham số tương ứng.
Output
- Hàm reparameterize: Trả về kết quả kiểu torch.Tensor theo đúng đặc tả kỹ thuật và kích thước quy định.
- Hàm compute_vae_loss: Trả về kết quả kiểu tuple[torch.Tensor, torch.Tensor, torch.Tensor] theo đúng đặc tả kỹ thuật và kích thước quy định.
Ràng buộc
- Thời gian chạy tối đa: 2000ms.
- Giới hạn bộ nhớ: 256MB.
- Dữ liệu đầu vào hợp lệ theo đúng kiểu dữ liệu và miền giá trị được mô tả.
Ví dụ 1
Input
mu = torch.tensor([[0.0, 0.0]])
logvar = torch.tensor([[2.0, 2.0]])
eps = torch.tensor([[1.0, 1.0]])
z = reparameterize(mu, logvar, eps=eps)
Output
[[2.7183, 2.7183]]
Giải thích
Hàm/lớp được gọi với các tham số mẫu trên và trả về kết quả số học / kích thước tensor tương ứng theo đúng thiết kế.
Ví dụ 2
Input
mu = torch.tensor([[1.0, 2.0]])
logvar = torch.tensor([[0.0, 0.0]])
eps = torch.tensor([[0.5, -1.0]])
z = reparameterize(mu, logvar, eps=eps)
Output
[[1.5, 1. ]]
Giải thích
Hàm/lớp được gọi với các tham số mẫu trên và trả về kết quả số học / kích thước tensor tương ứng theo đúng thiết kế.
Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
