Kiến trúc mạng học sâu: từ nền tảng đến LLM·Chương 10 — GAN: học sinh dữ liệu bằng đối kháng

Chế độ xem

Huấn luyện GAN: ổn định, lỗi thường gặp và đánh giá

Một lưới ảnh vừa sinh trông như một khuôn lặp lại: cùng một chữ số, hoặc cùng một khuôn mặt. Chúng không vỡ thành nhiễu. Chúng hết đa dạng. Đó là mode collapse: mạng sinh kẹt ở vài mẫu đánh lừa được mạng phân biệt, thay vì phủ các kiểu của dữ liệu thật. Mạng phân biệt cũng có thể thắng tuyệt đối, chấm thật gần 1 và giả gần 0, nên mạng sinh hết hướng để sửa.

Bài hỏi cách đọc các tín hiệu ấy, và cách đánh giá mẫu khi độ chính xác của mạng phân biệt không đủ làm thước. Bài không dựng lại phép sinh từ nhiễu, cũng không chọn họ kiến trúc. Trò chơi là: mạng sinh, gọi là Generator, ký hiệu GG, tạo mẫu từ nhiễu; mạng phân biệt, gọi là Discriminator, ký hiệu DD, tách thật khỏi giả; hai bên cùng đổi, nên điểm bên này phụ thuộc bên kia.

Đường đọc nhanh. Đọc mục 1 đến mục 4, rồi mục 6. Mục Đào sâu về khoảng cách Wasserstein nằm ngoài đường đó. Bảng chẩn đoán và phần mang đi vẫn thuộc đường đọc nhanh.

1. Vì sao mặt mất mát không đứng yên

Với bộ phân loại thông thường, hàm mục tiêu đứng yên. Tham số θ\theta bước theo gradient của loss L\mathcal{L}, với tốc độ học η\eta. Gradient là hướng đổi tham số làm loss thay đổi nhanh nhất:

θt+1=θt−η∇θL(θt)\theta_{t+1}=\theta_t-\eta\nabla_{\theta}\mathcal{L}(\theta_t)

Trong GAN, khi Generator cập nhật, hàm đang chấm nó chính là Discriminator, và Discriminator cũng vừa đổi. Có thể hình dung ta đi xuống một sườn đồi trong lúc mặt đồi liên tục biến dạng. Sơ đồ một vòng của sự phụ thuộc ấy:

Quỹ đạo có thể tới gần cân bằng, quay vòng, hoặc để một mạng bỏ xa mạng kia. Loss giảm chưa chứng minh mẫu đang khá hơn.

2. Bốn cách tín hiệu học bị hỏng

Mode collapse

Generator tạo ảnh trông ổn nhưng các ảnh rất giống nhau. Với chữ số viết tay, một lưới trăm ảnh có thể gần như chỉ còn số 1 và số 7. Generator lặp vài mẹo qua mặt Discriminator, thay vì phủ phân phối dữ liệu, tức quy luật mật độ của tập thật.

Dấu hiệu đi cùng: nhiều nhiễu zz cho ra gần như một khuôn; nội suy trong không gian tiềm ẩn, không gian các véctơ nhiễu, đổi rất ít hoặc nhảy giữa vài mẫu; recall thấp. Recall, định nghĩa ở mục 6, đo mức phủ dữ liệu thật. FID, cũng ở mục đó, có thể chưa phản ánh hết mức collapse.

Discriminator quá mạnh

Ngay từ đầu, điểm trên mẫu thật đã gần 1 và điểm trên mẫu giả đã gần 0:

D(x)≈1,D(G(z))≈0D(x) \approx 1, \qquad D(G(z)) \approx 0

Discriminator phân loại quá dễ. Với mục tiêu minimax gốc, số hạng log⁡(1−D(G(z)))\log(1-D(G(z))) rất phẳng, nên gradient cho Generator yếu. Đó là một lý do loss không bão hòa, dạng âm logarit điểm D(G(z))D(G(z)), được dùng rộng [1]. Ta cần mạng đủ mạnh để tín hiệu có nghĩa, nhưng không thắng tuyệt đối suốt quá trình và không học vẹt tập huấn luyện.

Generator lấn át Discriminator

Chiều kia cũng hỏng. Discriminator chưa học đặc trưng thật sự tách được thật khỏi giả, trong khi Generator đã khai thác đúng điểm mù của nó. Gradient gửi về Generator khi đó không còn đi cùng chất lượng ta nhìn thấy.

Dấu hiệu thường gặp: DD chấm cao cả ảnh thật lẫn ảnh giả; chất lượng mẫu dao động mạnh; loss của GG trông đẹp trong khi ảnh không khá hơn.

Discriminator học vẹt khi dữ liệu ít

Tập nhỏ khiến Discriminator có thể nhớ ảnh train thay vì học đặc điểm chung. Tín hiệu gửi cho Generator trở nên kém. StyleGAN2-ADA xử lý ca này bằng adaptive discriminator augmentation: tự chỉnh cường độ biến đổi ảnh, như cắt xén hay đổi màu nhẹ, để Discriminator ở lại vùng còn học được [8].

3. Đọc loss đối kháng khác loss phân loại

Giả sử ta dùng BCE không bão hòa. BCE, binary cross-entropy, phạt điểm khi nó lệch nhãn 0 hoặc 1. Loss của Discriminator kéo điểm mẫu thật lên và điểm mẫu giả xuống. Loss của Generator kéo điểm mẫu giả lên. Hai hàm đó là:

LD=−E[log⁡D(x)]−E[log⁡(1−D(G(z)))]\mathcal{L}_D = -\mathbb{E}[\log D(x)] -\mathbb{E}[\log(1-D(G(z)))] LG=−E[log⁡D(G(z))]\mathcal{L}_G = -\mathbb{E}[\log D(G(z))]

Kỳ vọng E\mathbb{E} là trung bình trên các mẫu đang lấy. Không có quy tắc loss càng gần 0 càng tốt cho cả hai. LD\mathcal{L}_D rất thấp có thể nghĩa Discriminator đang thắng quá dễ. LG\mathcal{L}_G tăng có thể xảy ra đúng lúc Discriminator vừa mạnh lên, trong khi mẫu sinh đang khá dần. Dao động ở mức vừa là việc bình thường của một trò chơi hai người.

Độ chính xác của Discriminator, tỉ lệ chấm đúng thật hoặc đúng giả, rơi vào cùng bẫy. Quanh 50% có thể là cân bằng đáng muốn, cũng có thể là cả hai mạng chưa học gì. Gần 100% kéo dài thường nghĩa người giám định thắng tuyệt đối và người làm giả hết gradient hữu ích. Accuracy vì vậy không đủ để kết luận phân phối đã được học. Mẫu và các thước ở mục 6 mới trả lời câu đó.

Trước khi tới các thước phân phối, hãy log cùng lúc các số còn đọc được bằng mắt:

  • điểm D(x)D(x) trên ảnh thật;
  • điểm D(G(z))D(G(z)) trước và sau bước cập nhật Generator;
  • LD\mathcal{L}_D và LG\mathcal{L}_G;
  • ảnh sinh từ một tập nhiễu cố định;
  • sau đó mới tới FID, KID, và precision/recall nếu pipeline có.

4. Nhiễu cố định: nhìn cùng một điểm trong không gian tiềm ẩn

Trước khi train, tạo một tập nhiễu không đổi:

fixed_z = torch.randn(64, latent_dim, device=device)

Cứ sau một số epoch, sinh ảnh từ đúng tập này. Epoch là một lượt đi qua tập huấn luyện. Cùng một tọa độ tiềm ẩn cho thấy vị trí đó tiến hóa ra sao. Nếu mỗi lần lại rút nhiễu mới, ta không tách được hai chuyện: model khá hơn, hay chỉ là mẫu mới tình cờ dễ nhìn hơn.

Khi mode collapse xảy ra, lưới fixed noise đứng yên hoặc chỉ nhảy giữa vài khuôn. Đó là kiểm tra rẻ, làm trước mọi chỉ số đặc trưng.

5. DCGAN: vài ràng buộc kiến trúc cho tín hiệu đỡ gãy

DCGAN đưa tích chập vào GAN và kèm vài ràng buộc giúp huấn luyện đỡ vỡ [2]. Tích chập, convolution, là phép trượt bộ lọc trên lưới ảnh. Gợi ý thường được nhắc: convolution có stride để đổi kích thước thay cho pooling, transposed convolution trong Generator, và Batch Normalization ở vị trí phù hợp. Pooling gộp một vùng ảnh bằng quy tắc cố định. Batch Normalization chuẩn hóa kích hoạt trong từng batch, nhóm mẫu của một bước.

Hình trích dưới đây, từ tài liệu tham khảo, vẽ Generator nở một véctơ nhiễu thành các khối không gian lớn dần tới ảnh đầu ra:

Generator DCGAN từ tài liệu tham khảo

Nguồn: Nguyễn Thanh Tuấn, Deep Learning Cơ Bản, v2 (2020), tr. 282.

Hình kế tiếp vẽ chiều ngược. Discriminator nhận ảnh, thu nhỏ không gian, tăng số kênh đặc trưng, rồi ra một điểm:

Discriminator DCGAN từ tài liệu tham khảo

Nguồn: Nguyễn Thanh Tuấn, Deep Learning Cơ Bản, v2 (2020), tr. 285.

Cấu hình kinh điển đi cùng các hình đó. Generator dùng ReLU, hàm giữ phần dương, ở phần lớn tầng ẩn, và tanh ở đầu ra. tanh nén đầu ra vào đoạn từ −1-1 đến 11, nên ảnh đầu vào cần được scale về đúng đoạn ấy. Discriminator dùng LeakyReLU, một ReLU vẫn để lọt dốc nhỏ khi đầu vào âm. Mạng tự học cách phóng và thu, thay vì dựa vào pooling. Đây là điểm khởi đầu thực dụng, không phải luật của mọi GAN sau này.

6. FID, KID, precision và recall

Accuracy của Discriminator đã không đủ, như mục 3. Mô hình sinh còn phải cân hai việc khác. Fidelity là từng mẫu gần dữ liệu thật. Diversity, hay coverage, là mức phủ các mode, tức các kiểu, của dữ liệu thật. Một khuôn mặt đẹp lặp mười nghìn lần có fidelity trên một mode và diversity gần như không còn. Đó là mode collapse nhìn từ phía thước đo.

FID

FID, Fréchet Inception Distance, so sánh đặc trưng ảnh thật và ảnh sinh trong một mạng Inception [5]. Mạng đó là bộ phân loại ảnh dùng như bộ trích đặc trưng cố định. Nếu đặc trưng gần phân phối Gaussian, hình chuông nhiều chiều, FID là khoảng cách giữa hai hình chuông: lệch trung bình μr,μg\mu_r,\mu_g cộng lệch hiệp phương sai Σr,Σg\Sigma_r,\Sigma_g. Vết Tr⁡\operatorname{Tr} là tổng đường chéo.

FID=∥μr−μg∥22+Tr⁡(Σr+Σg−2(ΣrΣg)1/2)FID = \lVert \mu_r-\mu_g\rVert_2^2 + \operatorname{Tr} \left( \Sigma_r+\Sigma_g -2(\Sigma_r\Sigma_g)^{1/2} \right)

FID thấp hơn thường tốt hơn. So sánh chỉ đứng khi protocol giống nhau: cùng tiền xử lý, cùng bộ trích đặc trưng, cùng cách lấy số mẫu.

KID

KID, Kernel Inception Distance, so sánh đặc trưng Inception bằng Maximum Mean Discrepancy, khoảng cách giữa hai trung bình trong một không gian có kernel. Estimator của KID không chệch. Với tập nhỏ, KID là thước bổ sung. StyleGAN2-ADA nhấn mạnh FID có bias đáng kể khi dữ liệu ít [8]. Bài này không gán một con số cho độ bias đó.

Precision và recall của mô hình sinh

Precision và recall ở đây không phải của một bộ phân loại. Manifold dữ liệu thật là tập mẫu hợp lệ nằm trên cấu trúc thấp chiều hơn không gian pixel.

Precision cao: mẫu sinh thường nằm gần manifold thật. Recall cao: model phủ nhiều vùng của manifold ấy. Cặp này bắt ca FID tương đối ổn nhưng vẫn thiếu diversity [7]. Mode collapse thường kéo recall xuống trong khi vài mẫu vẫn đẹp.

7. Protocol tối thiểu khi so hai lần chạy

Một protocol, quy trình đo giữ cố định, đủ để khỏi tự lừa mình:

  1. Cố định seed, hạt giống của số ngẫu nhiên, cho lúc đánh giá.
  2. Sinh đủ số mẫu, ví dụ 10.000 hoặc 50.000 tùy tập dữ liệu.
  3. Dùng cùng tiền xử lý cho ảnh thật và ảnh giả.
  4. Báo FID và KID.
  5. Báo precision và recall nếu bộ đo hỗ trợ.
  6. Hiện một lưới ảnh ngẫu nhiên, không chỉ ảnh đẹp nhất.
  7. Hiện tiến trình fixed noise qua các epoch.
  8. Kiểm tra láng giềng gần nhất giữa ảnh sinh và ảnh train, để phát hiện ghi nhớ.
  9. Nếu có điều kiện theo lớp, kiểm từng lớp, không chỉ một số gộp.
  10. Chạy nhiều seed nếu muốn kết luận về một cải tiến nhỏ.

Nghiên cứu quy mô lớn cho thấy kết luận GAN này tốt hơn GAN kia có thể đổi mạnh theo tuning và random restart [6]. Protocol, seed, tiền xử lý và ngân sách tính toán cần được giữ có kiểm soát.

8. Đào sâu: đo khoảng cách trước, phạt gradient sau

Một vấn đề của GAN gốc là khi phân phối thật và phân phối sinh nằm trên các manifold gần như không giao, divergence dùng trong trò chơi gốc có thể cho gradient kém. Divergence ở đây là một số đo độ khác nhau của hai phân phối. Wasserstein GAN đổi câu hỏi từ chấm đúng sai sang đo khoảng cách [3].

Khoảng cách Wasserstein-1, còn gọi Earth Mover, đo chi phí nhỏ nhất để chuyển khối xác suất từ phân phối này sang phân phối kia. Critic là mạng chấm của WGAN: đầu ra không còn bị buộc là xác suất trong khoảng mở từ 0 đến 1. Hàm 1-Lipschitz là hàm đổi không nhanh hơn đầu vào. Nói trước công thức: trong các hàm ấy, critic tốt nhất cho đúng khoảng cách; nó cố cho ảnh thật điểm cao hơn ảnh giả.

W(pdata,pg)=sup⁡∥f∥L≤1Ex∼pdata[f(x)]−Ex^∼pg[f(x^)]W(p_{data},p_g) = \sup_{\|f\|_L \le 1} \mathbb{E}_{x\sim p_{data}}[f(x)] - \mathbb{E}_{\hat{x}\sim p_g}[f(\hat{x})]

Generator cố thu hẹp chênh lệch đó. Loss của critic có ý nghĩa liên tục hơn đối với chất lượng phân phối, nên trong nhiều ca nó dễ debug hơn accuracy [3].

WGAN cần critic thỏa 1-Lipschitz. Bản đầu cắt từng trọng số vào một đoạn nhỏ. Cách này có thể bóp khả năng biểu diễn. WGAN-GP giữ việc đo khoảng cách, rồi thêm phạt gradient thay cho cắt trọng số [4]. Phạt kéo chuẩn gradient của critic về gần 1. Điểm x^\hat{x} thường nằm trên đoạn nối mẫu thật và mẫu giả. λ\lambda là trọng số dương của số hạng phạt:

λ Ex^(∥∇x^D(x^)∥2−1)2\lambda\,\mathbb{E}_{\hat{x}} \left(\lVert\nabla_{\hat{x}}D(\hat{x})\rVert_2-1\right)^2

Một câu đủ nhớ: WGAN đổi cách đo khoảng cách giữa hai phân phối; WGAN-GP thêm một cơ chế mềm để critic đổi đủ trơn.

9. Các kỹ thuật ổn định hay đi cùng

Mỗi dòng đổi động lực của trò chơi. Đổi từng yếu tố rồi đo lại bằng protocol ở mục 7.

Kỹ thuậtÝ tưởngKhi nào hữu ích
Non-saturating lossCho GG gradient mạnh hơn lúc đầuBaseline rất phổ biến
TTURTốc độ học khác nhau cho GG và DDKhi hai mạng học lệch nhịp [5]
Spectral normalizationKhống chế độ khuếch đại của tầng trong DDRegularize discriminator
Gradient penalty / R1Phạt độ lớn gradient của DDỔn định critic hoặc discriminator
EMA của GeneratorTrung bình trượt trọng số GG lúc suy diễnMẫu thường ổn định hơn
Data augmentationLàm DD khó nhớ ảnh trainTập hạn chế
ADATự chỉnh cường độ augmentationGAN với ít dữ liệu [8]
Hinge lossPhạt khi điểm chưa vượt một lềPhổ biến ở GAN lớn như BigGAN

10. Họa tiết bàn cờ khi phóng ảnh

Transposed convolution có thể tạo họa tiết bàn cờ khi kernel, cửa sổ bộ lọc, và stride, bước trượt, chồng nhau không đều. Các ô sáng tối lặp theo chu kỳ trên ảnh sinh.

Hai hướng xử lý thường gặp: chọn kernel và stride cho mức chồng đều hơn, hoặc tách tăng kích thước khỏi học bộ lọc:

Nearest/Bilinear Upsample → Conv2D

Nearest và bilinear phóng lưới bằng nội suy, rồi tới một tích chập thông thường.

11. Bảng chẩn đoán nhanh

Hiện tượngKhả năng nguyên nhânKiểm traHướng sửa đầu tiên
Ảnh giống nhauMode collapseLưới nhiều zz, recallGiảm lệch nhịp, thử ràng buộc hoặc objective khác
D(real)≈1D(real)\approx 1, D(fake)≈0D(fake)\approx 0 rất lâuDD quá mạnh hoặc học vẹtTrain so với val của DDGiảm tốc độ học hoặc số bước của DD, thêm augmentation
Ảnh nhiễu mãiGG không nhận gradient hữu íchChuẩn gradient, loss, miền đầu raKiểm tra detach, activation, normalization
Ảnh bàn cờArtifact lúc phóng ảnhPhóng textureUpsample rồi conv, hoặc sửa kernel và stride
Metric tốt nhưng ảnh lặpMetric chưa phản ánh coveragePrecision/recall, láng giềng gầnThêm thước diversity
Train đẹp, dữ liệu mới kémDD học vẹtThử augmentationADA hoặc thêm dữ liệu
Lúc tốt lúc hỏngNhạy tốc độ học và số bướcNhiều seedTTUR, phạt gradient hoặc spectral norm, EMA, log dày hơn

Trước khi kết luận GAN vốn không học được, soát thêm: ảnh đúng miền với hàm kích hoạt đầu ra; mẫu giả đã detach khi cập nhật DD; gradient đi qua DD nhưng optimizer của DD không step khi cập nhật GG; nhãn thật giả không đảo; BatchNorm đúng chế độ lúc chấm; nhiễu cố định lưu từ đầu; còn checkpoint, bản trọng số đã lưu, vì epoch trước có thể đẹp hơn epoch sau.

12. Những điều mang đi

  • Loss của GAN là một trò chơi động. Giảm loss không chứng minh mẫu đang khá hơn.
  • Mode collapse là ảnh na ná nhau vì Generator lặp vài mẹo. Discriminator thắng tuyệt đối thì Generator hết gradient hữu ích. Discriminator quá yếu thì gradient không đáng tin.
  • Độ chính xác của Discriminator, kể cả mức quanh một nửa, không đủ để kết luận. Sau nhận xét đó hãy đọc FID, KID, và precision/recall cùng với lưới ảnh.
  • WGAN đo khoảng cách Wasserstein bằng một critic. WGAN-GP thêm phạt gradient để giữ critic trơn, thay cho cắt trọng số.
  • Tập ít làm Discriminator dễ học vẹt. ADA là một cách tự chỉnh augmentation cho ca đó.
  • So hai mô hình thì giữ protocol, seed, tiền xử lý và ngân sách tính toán.

Bài sau xếp các họ mạng đối kháng theo câu hỏi chúng trả lời, từ cấu trúc ảnh và điều kiện đầu vào tới việc điều khiển style theo tầng.

Tài liệu tham khảo

[1] I. Goodfellow et al., “Generative Adversarial Nets,” NeurIPS, 2014. https://papers.nips.cc/paper_files/paper/2014/hash/f033ed80deb0234979a61f95710dbe25-Abstract.html

[2] A. Radford, L. Metz, and S. Chintala, “Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks,” 2015. https://arxiv.org/abs/1511.06434

[3] M. Arjovsky, S. Chintala, and L. Bottou, “Wasserstein Generative Adversarial Networks,” ICML, 2017. https://proceedings.mlr.press/v70/arjovsky17a.html

[4] I. Gulrajani et al., “Improved Training of Wasserstein GANs,” NeurIPS, 2017. https://papers.nips.cc/paper_files/paper/2017/hash/892c3b1c6dccd52936e27cbd0ff683d6-Abstract.html

[5] M. Heusel et al., “GANs Trained by a Two Time-Scale Update Rule Converge to a Local Nash Equilibrium,” NeurIPS, 2017. https://papers.nips.cc/paper_files/paper/2017/hash/8a1d694707eb0fefe65871369074926d-Abstract.html

[6] M. Lucic et al., “Are GANs Created Equal? A Large-Scale Study,” NeurIPS, 2018. https://papers.nips.cc/paper_files/paper/2018/hash/e46de7e1bcaaced9a54f1e9d0d2f800d-Abstract.html

[7] T. Kynkäänniemi et al., “Improved Precision and Recall Metric for Assessing Generative Models,” NeurIPS, 2019. https://papers.nips.cc/paper_files/paper/2019/hash/0234c510bc6d908b28c70ff313743079-Abstract.html

[8] T. Karras et al., “Training Generative Adversarial Networks with Limited Data,” NeurIPS, 2020. https://papers.nips.cc/paper_files/paper/2020/hash/8d30aa96e72440759f74bd2306c1fa3d-Abstract.html