Mục tiêu của mô hình sinh là học phân bố của dữ liệu . Cụ thể hơn, cho trước một họ các phân bố có thể học được , ta sẽ tìm phân bố có (log-)likelihood lớn nhất, hay hiểu một cách trực qua là phân bố tương thích nhất với tập dữ liệu cho trước. Việc này cũng tương đương với tìm phân bố có cross-entropy với dữ liệu nhỏ nhất. Tuy nhiên đại lượng này không phải lúc nào cũng tính được dễ dàng.
Ví dụ: Với VAE, ta có biến ngẫu nhiên ẩn , phân bố của dữ liệu được mô tả dưới dạng điều kiện . Để tính marginal likelihood , cũng như posterior khi huấn luyện và suy luận, ta cần lấy tích phân theo biến liên tục nhiều chiều . Mô hình VAE giải quyết điều này bằng cách xấp xỉ posterior bằng một phân bố khác.
Một cách tiếp cận khác là mô hình phân bố dưới dạng không chuẩn hóa. Cụ thể hơn, hàm mật độ của một phân bố dương bất kì với tham số có thể viết được dưới dạng
với được gọi là hàm năng lượng của , là hằng số chỉ phụ thuộc vào tham số nhằm bảo đảm là hàm mật độ xác suất. Log-likelihood của phân bố này sẽ là
Phương pháp Markov chain Monte Carlo với Langevin dynamics
Ta sẽ đi tìm hàm năng lượng thỏa mãn phân bố có log-likehood lớn nhất dựa vào gradient.
Gradient của hàm năng lượng có thể tính một cách dễ dàng. Với hằng số chuẩn hóa, sử dụng đạo hàm của hàm , chain-rule và tính tuyến tính của toán tử gradient, ta có khai triển sau
Lúc này gradient của log-likelihood được viết lại như sau
Giá trị kì vọng của gradient có thể xấp xỉ bằng cách lấy mẫu từ phân bố thông qua Markov chain Monte Carlo (MCMC). Với phân bố nhiều chiều, cách tiếp cận thường được sử dụng là Stochastic gradient Langevin dynamic (SGLD). Một cách trực quan, ta khởi tạo ngẫu nhiên, sau đó 'di chuyển' x để sao cho mô phỏng phân bố tốt nhất. Việc thay đổi này được thực hiện bằng cách tính gradient tại của xác suất. Ở bước này, ta có thể tận dụng cách mô hình của EBM để bỏ qua hằng số chuẩn hóa (lưu ý trong quá trình lấy mẫu không đổi)
Phương pháp SGLD thêm vào gradient một giá trị ngẫu nhiên để đảm bảo là phân bố thực sự chứ không chỉ hội tụ để giá trị MAP. Cụ thể hơn, với tỉ lệ (có thể hiểu như learning rate khi học tham số), ta có
Ví dụ minh họa cho phân bố chuẩn 2 chiều
import matplotlib.pyplot as plt
import numpy as np
mus = np.random.rand(2)
sigmas = np.array([[2, 1], [1, 2]], dtype = float)
pre = np.linalg.inv(sigmas)
def grad(point, mean, pre):
#gradient hàm năng lượng của phân bố chuẩn
return - np.matmul(point - mean, pre) / 2
x = np.random.rand(2)
lr = 0.3
arr = [np.copy(x)]
step = 1000
for i in range(step):
x_grad = grad(x, mus, pre)
noise = np.random.normal(0, 1, size = 2)
x += lr * x_grad + noise * np.sqrt(2 * lr) # bỏ nhiễu để thấy sự khác nhau giữa nghiệm MAP và SGLD
arr.append(np.copy(x))
plt.scatter(*zip(*arr))
plt.show()
Cách làm này có thể xem như xấp xỉ của phương trình vi phân ngẫu nhiên Langevin
với là chuyển động Brownian, vi phân của nó được mô hình thông qua phân bố chuẩn. Phương trình này có nghiệm duy nhất là phân bố .
Bên cạnh việc sử dụng để huấn luyện mô hình, việc lấy mẫu trực tiếp từ còn được áp dụng để sinh dữ liệu từ phân bố đã được học.
Adversarial training
Như ta đã thấy ở trên, vấn đề của việc học và suy luận với EBM là tính toán cho hằng số chuẩn hóa . Phương pháp MCMC giải quyết điều này bằng việc tìm cách lấy mẫu từ phân bố . Một cách tiếp cận khác là dùng một phân bố biến phân để xấp xỉ đại lượng này (trong các phân bố hàm mũ, phân bố còn được gọi là đối ngẫu Fenchel của ). Từ bất đẳng thức Jensen ta có
Để -likelihood đạt giá trị lớn nhất, ta cần cực tiểu , và từ công thức trên ta có chặn dưới của . Như vậy một mặt ta cần tìm sao cho nhỏ nhất, mặt khác ta muốn tối ưu sao cho phân bố biến phân xấp xỉ tốt nhất. Tổng hợp lại ta có muốn hàm mục tiêu sau
Cách tiếp cận này gần giống như adversarial training trong GAN, ở đây tham số của phân bố đóng vai trò như tham số của mô hình sinh (không phải mô hình sinh của EBM mà ta cần), tham số đóng vai trò như discriminator khi kiểm tra phân bố của mô hình sinh thông qua log-likelihood.
Một vấn đề của phương pháp này nằm ở việc tính entropy của , do ta cần phải biết chính xác giá trị của hàm mật độ. Có một vài cách tiếp cận bằng việc dùng một phân bố biến phân nữa để xấp xỉ.
Một cách giải quyết khác là mô tả quá trình lấy mẫu dưới dạng flow, lúc này hàm mật độ sẽ được tính thông qua hàm mật độ tại thời điểm trước. Ví dụ với phương pháp SGLD bên trên, giả sử cần lấy mẫu, ta sẽ thêm biến ngẫu nhiên ẩn đại diện cho sự thay đổi của giữa mỗi bước, lúc này ta có phân bố sau
Likelihood lúc này là của phân bố trên cả và , tuy nhiên do và độc lập nên tối ưu đại lượng này tương đương với cực đại -likelihood của phân bố marginal trên . Hàm mục tiêu lúc này trở thành
Kí hiệu phân bố của và là , là phân bố của nhiễu thêm vào. Do nhiễu tại mỗi bước độc lập với và , ta có
Ở mỗi bước thứ , được tính từ gradient hàm năng lượng tại như sau
Do đó
trong đó là ma trận Jacobian của ánh xạ . Ma trận này có định thức bằng , suy ra
Sau đó được tính từ và . Tương tự ta cũng có . Như vậy ta có thể tính được hàm mật độ thông qua hàm mật độ của các phân bố khởi tạo. Tuy nhiên phương pháp này có nhược điểm khi dùng số bước lớn, sẽ gần với .