Bài 5: GAN evaluation | Deep Learning cơ bản
 

Bài 5: GAN evaluation

| Posted in GAN

Từ đầu series đến giờ, mình dùng GAN train model xong rồi dùng Generator để sinh ảnh. Tuy nhiên mình chưa có cách nào để đánh giá xem chất lượng ảnh sinh ra đã tốt chưa, chủ yếu chỉ nhìn vào mắt thường để đánh giá. Cách đấy không khách quan cũng như không áp dụng một cách hệ thống trên dữ liệu lớn, nên cần phương pháp để đánh giá chất lượng ảnh GAN sinh ra chất lượng tốt hay không. Bài này sẽ giới thiệu một số cách để đánh giá chất lượng ảnh GAN sinh ra. Mình sẽ giới thiệu 2 chỉ số mà mọi người hay gặp trong GAN evaluation: Inception Score (IS) và Fréchet Inception Distance (FID).

Mọi người để ý là để đánh giá ảnh sinh ra mình cần dựa trên 2 yếu tố:

  • Chất lượng ảnh: Mình muốn chất lượng ảnh cao, giống với dataset
  • Độ đa dạng: Generator cần sinh ra được nhiều ảnh khác nhau khi mình random input z. Nếu Generator mãi chỉ sinh ra được một vài ảnh thì cũng không thực sự ý nghĩa lắm.

Inception Score (IS)

Inception Score (IS)

Mọi người thấy từ Inception quen quen không? Nó chính là mạng CNN về nhì trong cuộc thi ImageNetChallange 2015. IS được tính bằng cách sử dụng pre-trained model Inception trên dữ liệu ImageNet.

Input của mạng Inception là 1 ảnh và output với hàm softmax sẽ cho ra được xác suất ảnh đấy thuộc từng lớp tương ứng. Vì mình dùng pre-trained model nên ảnh dưới con chó khi đi qua inception sẽ cho xác suất ảnh thấy là con chó cao hơn các lớp khác.

Mạng inception dự đoán ảnh con chó, nguồn.

Tuy nhiên nếu ảnh không thuộc lớp nào cả thì xác xuất cho mỗi lớp khá giống nhau (uniform).

Mạng inception dự đoán ảnh giá sách, nguồn.

Nhận xét là khi đi qua Inception nếu ảnh rõ ràng thuộc một lớp nào đấy thì xác suất ảnh thuộc lớp đấy sẽ cao, còn không thì xác suất thuộc về từng lớp sẽ khá giống nhau.

Hmm, nghĩ ngay đến việc kiểm tra chất lượng ảnh sinh ra bởi Generator, mình có thể cho ảnh sinh ra qua mạng Inception nếu ảnh rõ, tốt thì mạng sẽ phân loại tốt (xác suất 1 lớp cao hơn hẳn) => kiểm tra được chất lượng ảnh.

Vậy làm thế nào để kiểm tra được độ đa dạng của ảnh sinh ra??? Ta cộng theo từng lớp các giá trị xác suất của tất cả các ảnh sinh ra trong generator lại. Nếu Generator có thể sinh ra đa dạng dữ liệu thì tổng xác suất sẽ dạng uniform, ngược lại nếu dữ liệu chỉ sinh ra dữ liệu ở 1 hay 2 lớp thì tổng xác suất sẽ chỉ cao hơn ở 1 hay 2 lớp.

Ví dụ như hình bên trái, cả 3 ảnh sinh ra đều là con chó thì tổng xác suất cho con chó sẽ cao hơn hẳn. Còn như hình bên phải thì tổng xác suất khá uniform.

Đánh giá độ đa dạng của ảnh sinh ra, nguồn.

Như vậy ta có thể đánh giá ảnh sinh ra:

  • chất lượng ảnh: qua xác suất của 1 ảnh
  • độ đa dạng: qua tổng xác suất của tất cả các ảnh

Tuy nhiên ta cần chuyển định nghĩa về con số để có thể so sánh và đánh giá.

Ta sẽ dùng Kullback–Leibler divergence (KLD) để đánh giá. Hiểu đơn giản thì Kullback–Leibler (KL) nhận input là 2 distribution và output ra độ tương đồng giữa hai distribution. Nếu 2 distribution giống nhau thì KL = 0, hai distribution càng khác nhau thì KL càng lớn.

\displaystyle D_{KL} (P \| Q) = \int P(x) \log \frac{P(x)}{Q(x)} dx

Gọi giá trị của 1 ảnh qua mạng Inception là label distribution (p(y|x)) và giá trị đã normalize tổng label distribution (p(y)) tất cả các ảnh là marginal distribution. Trong đó y là label hay các lớp tương ứng, x là ảnh.

Label distribution và marginal distribution

Để ảnh GAN sinh ra tốt: chất lượng ảnh tốt và đa dạng, thì ta muốn label distribution cao ở một lớp, thấp ở các lớp khác và marginal distribution sẽ dạng uniform như hình ngoài cùng bên trái, ta thấy giá trị KL divergence cao.

Như hình 2, nếu label distribution cao ở nhiều lớp và marginal distribution sẽ dạng uniform thì giá trị KL cũng chỉ vừa chứ không cao.

Còn như hình 3, nếu label distribution uniform và marginal distribution sẽ dạng uniform thì giá trị KL cũng thấp

Ví dụ về trường hợp KL, nguồn.

=> Giá trị KL cao khi ảnh chất lượng cao và ảnh đa dạng. Ta có thể tính giá trị KL cho mỗi ảnh sinh ra rồi lấy trung bình lại làm giá trị IS cho model.

\displaystyle IS(G) = \exp(\operatorname{\mathbb{E}}_{x\sim p_g(x)} D_{KL} (p(y) \| p(y|x)))

Trong đó p(y|x) là label distribution, p(y) là marginal distribution. Hàm exp để kết quả dễ so sánh hơn.

Hạn chế

IS score được sử dụng rất nhiều trong các bài báo về GAN để so sánh chất lượng ảnh sinh ra. Tuy nhiên nó cũng có các hạn chế:

  • Vì mình dùng Inception pre-trained model với Imagenet dataset, nên nếu ảnh Generator sinh ra không thuộc lớp trong Imagenet thì giá trị output của model sẽ không ý nghĩa lắm => KL thấp.
  • Nếu Generator chỉ sinh được một ảnh mỗi lớp thì chỉ số KL vẫn có thể cao => Chỉ đa dạng lớp nhưng không đa dạng ảnh trong mỗi lớp
  • Nếu Generator nhớ và sinh ra các ảnh trong dataset thì chỉ số KL cũng cao => Không tốt.

Fréchet Inception Distance (FID)

Distribution cho 1 bộ điểm dữ liệu

Giả sử mình có các điểm dữ liệu màu đỏ (2d), yêu cầu là tìm gaussian distribution fit những điểm dữ liệu nhất, ta tìm được normal distribution (mean = 0, std = 1)

Normal distribution

Tương tự nếu các điểm dữ liệu (3d) thì ta sẽ tìm được 2d multivariate gaussian distribution.

2d multivariate gaussian disitribution

=> Với n điểm dữ liệu m chiều ta sẽ tìm được một (m-1) dimension multivariate gaussian distribution fit nhất.

FID

Cách tính FID phụ thuộc vào Inception network

Mạng inception, nguồn.

Mình sẽ giữ đến lớp AvgPool còn bỏ phần sau của mạng đi. Như vậy mỗi ảnh qua mạng sẽ cho ra vector kích thước 2048 * 1 chứa các đặc trưng của ảnh.

Ta sẽ lấy tất cả ảnh trong dataset, mỗi ảnh cho qua Inception network sẽ được 1 vector 2048 * 1, ta sẽ tìm 1 multivariate gaussian distribution fit nhất tất cả vector này với mean = \mu_x, std = \Sigma_x

Ta sẽ lấy tất cả ảnh sinh ra bởi generator, mỗi ảnh cho qua Inception network sẽ được 1 vector 2048 * 1, ta sẽ tìm 1 multivariate gaussian distribution fit nhất tất cả vector này với mean = \mu_g, std = \Sigma_g

Để các ảnh generator sinh ra giống các ảnh trong dataset thì ta mong muốn 2 multivariate gaussian distribution giống nhau, hay mean và variance gần nhau. Do đó ta định nghĩa:

\displaystyle FID = \|\mu_x - \mu_g\|_2^2 + Tr(\Sigma_x + \Sigma_g - 2 (\Sigma_x\Sigma_g)^{\frac{1}{2}}

Ma trận A vuông kích thước n*n thì trace được định nghĩa:

\displaystyle Tr(A) = \sum_{i=1}^{n}a_{ii}

Nhận xét: FID không âm và FID càng thấp thì 2 distribution càng gần nhau => ảnh sinh ra càng giống ảnh gốc trong dataset.

Ta thấy IS thì đánh giá dựa trên xác suất của ảnh, còn FID dựa trên đặc trưng của ảnh, cả 2 cách này đều được sử dụng để đánh giá chất lượng ảnh sinh ra bởi GAN. Ví dụ trong bài BigGAN:


Deep Learning cơ bản ©2024. All Rights Reserved.
Powered by WordPress. Theme by Phoenix Web Solutions