Deep Generative models – part 2: GSN, GAN and Ladder nets

Trong bài trước, ta đã nói vắn tắt về bài toán Generative Modeling trong Deep Learning. Bài này sẽ nói tiếp chuyện này một cách formal hơn, đồng thời điểm qua một số phương pháp đang “thịnh hành” trong cộng đồng gần đây. Lưu ý rằng Generative Modeling vẫn là một bài toán chưa được giải quyết trọn vẹn, thành ra có thể có vài cách tiếp cận khác không được điểm danh ở đây, và đa số các cách tiếp cận nói đến trong bài này đều vẫn còn đang ở trong tình trạng đang được nghiên cứu.

Bài toán ultimate trong học máy thống kê có lẽ là bài toán này: cho một tập mẫu \left\{x_i \right\}_{i=1}^N được lấy từ phân phối xác suất P\left(X\right) chưa biết. Xây dựng mô hình để “bắt chước” phân phối P\left(X\right) này.

Bài toán này khó vì ta giả sử rằng ta không biết gì về P\left(X\right), ngoại trừ một tập mẫu hữu hạn của nó. Hơn nữa, trong nhiều trường hợp, P\left(X\right) có thể rất phức tạp, chẳng hạn như mô hình sinh ra tất cả các ảnh RGB chụp phong cảnh tự nhiên, hay là ảnh X-quang chụp phổi bị ung thư, mô hình phái sinh ra thơ Shakespeare, v.v…. Trong những trường hợp như vậy, mô hình hoá trực tiếp P\left(X\right) có thể rất khó.

Mô hình mà mình nghĩ là “đơn giản” nhất trong Deep Learning để giải quyết bài toán này có lẽ là Sum-Product Networks (SPN). Ý tưởng chính của SPN là thiết kế mạng sao cho nó tractable sẵn, vì vậy huấn luyện SPN không cần phải quan tâm đến partition fuction, vì tính partition fuction trong SPN lúc nào cũng tractable (by construction). Mặc dù ý tưởng này rất tốt, nhưng một vài kết quả thực nghiệm cho thấy chính vì ràng buộc này mà có thể lớp hàm SPN có thể xấp xỉ không đủ lớn để mô hình hoá các phân phối phức tạp trong thực tế.

Ngoài SPN, một mô hình khác có vẻ hứa hẹn sẽ giải quyết được vấn đề này là Autoencoders, nhất là thể loại Denoising Autoencoder (DAE). DAE là mô hình rất đơn giản với chỉ một hidden layer. Đầu tiên ta chọn một phân phối nhiễu \mathcal{C}\left(\tilde{X}\vert X\right). Với mỗi mẫu “sạch” X từ phân phối P\left(X\right), ta áp dụng mô hình nhiễu, chẳng hạn nếu X là ảnh thì ta có thể thêm nhiễu Gaussian vào để tạo thành bản “lỗi” \tilde{X}. Sau đó ta đưa \tilde{X} vào cho DAE và huấn luyện để nó làm sạch nhiễu cho ta mẫu X ban đầu.

Nói theo ngôn ngữ function approximation thì DAE thực chất được huấn luyện để xấp xỉ phân phối có điều kiện P\left(X \vert \tilde{X}\right) (gọi là reconstruction function, vì đây là hàm sẽ cho ta phiên bản sạch X từ bản nhiễu \tilde{X}). Người ta cho rằng xấp xỉ P\left(X \vert \tilde{X}\right) dễ hơn nhiều so với xấp xỉ P\left(X\right), vì về cơ bản P\left(X \vert \tilde{X}\right) sẽ gồm ít mode hơn so với P\left(X\right).

Bây giờ ma thuật là ở đây. Lí luận rằng nếu ta biết tất cả mọi thứ về P\left(X\right), thì với mỗi phân phối nhiễu \mathcal{C}\left(\tilde{X}\vert X\right) mà ta chọn, hàm reconstruction có thể được tính chính xác bằng công thức Bayes: P\left(X \vert \tilde{X}\right) = \frac{1}{Z}\mathcal{C}\left(\tilde{X}\vert X\right)P\left(X\right), với Z không phụ thuộc vào X. Ngược lại, với hàm \mathcal{C}\left(\tilde{X}\vert X\right) chọn sẵn, nếu ta có thể mô hình hoá P\left(X \vert \tilde{X}\right) thì ta có đủ gia vị để mô hình hoá P\left(X\right), vốn là việc mà ta muốn làm ngay từ đầu.

Tuy nhiên đời không như là mơ. Ta nói rằng P\left(X\right) khó mô hình hoá hơn P\left(X \vert \tilde{X}\right), và \mathcal{C}\left(\tilde{X}\vert X\right) là một phân phối nhiễu đơn giản mà ta chọn. Giờ ta muốn mô hình hoá phân phối phức tạp P\left(X\right) bằng 2 phân phối “đơn giản” là P\left(X \vert \tilde{X}\right)\mathcal{C}\left(\tilde{X}\vert X\right)? Nếu giả sử việc này là có lí, thì sự phức tạp của P\left(X\right) đã biến đi đâu?

1. Generative Stochastic Nets

Trong paper này, Yoshua Bengio lí luận rằng mặc dù P\left(X \vert \tilde{X}\right) đơn giản, nhưng hàm này phụ thuộc vào giá trị của X, nên khi kết hợp với \mathcal{C}\left(\tilde{X}\vert X\right), nó vẫn có khả năng biểu diễn sự phức tạp trong P\left(X\right). Cụ thể paper viết như sau:

P\left(X\vert \tilde{X}\right) has fewer modes than P\left(X\right), but the location of these modes depends on the value of \tilde{X}. It is precisely this mapping from \tilde{X} \rightarrow mode location that allows us to trade a difficult density modeling problem for a supervised function approximation problem that admits application of many of the usual supervised learning tricks.

Thật vậy, trong một paper khác, Bengio chứng minh rằng P\left(X\vert \tilde{X}\right) là điều kiện đủ (sufficient) để mô hình P\left(X\right). Không những vậy, nếu ta tạo một chuỗi Markov bằng cách thay phiên áp dụng phân phối nhiễu \mathcal{C}\left(\tilde{X}\vert X\right) và phân phối P_\theta \left(X\vert \tilde{X}\right) (phân phối này được huấn luyện để xấp xỉ P \left(X\vert \tilde{X}\right)), nếu P_\theta \left(X\vert \tilde{X}\right) hội tụ về P\left(X\vert \tilde{X}\right), thì với một vài điều kiện không quá chặt, phân phối stationary \pi\left(X\right) của chuỗi Markov nói trên sẽ hội tụ về P\left(X\right).

Voila! Ta có thể huấn luyện một DAE để học P_\theta \left(X\vert \tilde{X}\right), sau đó chạy chuỗi Markov trên thì sẽ có được phân phối P\left(X\right) mà ta muốn. Đây chính là là ý tưởng chủ đạo của Generative Stochastic Networks.

GSN là một trong những mô hình Generative được phát triển sớm nhất, ngay từ khi supervised learning vẫn còn đang tung hoành trên giang hồ. Mặc dù vẫn hạn chế ở chỗ phải chạy một chuỗi Markov (và Markov chain nói chung là khó chơi), mình vẫn có cảm tình với GSN vì nó có nền tảng lí thuyết khá vững vàng, không giống như rất nhiều mô hình Deep Learning khác, vốn chủ yếu được phát triển từ thực nghiệm.

Tất nhiên nói như vậy không có ý bỉ bai các mô hình thực nghiệm khác. Sự phát triển của khoa học thông thường là sự kết hợp cả thực nghiệm và lí thuyết, hơn nữa nhiều khi công cụ lí thuyết của con người chưa đủ trình độ để nắm bắt được các hiện tượng thực nghiệm.

2. Ladder nets

Nhớ rằng DAE chỉ có 1 hidden layer, và theo “giáo lí” môn Deep Learning thì tốt hơn là nên có vài hidden layers (bạn nào vẫn chưa cảm thấy thuyết phục với điểm này thì đi chỗ khác chơi). Cách đơn giản nhất để xây dựng mô hình deep từ DAE là stack vài cái DAE lên, nhưng fix các lớp ở dưới khi train các lớp ở trên. Cách làm này cũng ổn, nhưng về lí thuyết thì nó sẽ hạn chế không gian các hàm mà mô hình deep có thể xấp xỉ được.

Một cách khác trực tiếp hơn là train toàn bộ các layer cùng một lúc. Đây là ý tưởng ban đầu của Ladder networks. Ý tưởng chính của Ladder networks cho unsupervised learning là huấn luyện một mô hình deep mà tại mỗi layer đều có khả năng reconstruct the data representation tại layer đó. Cụ thể, hàm cost function của ladder nets là tổng có trọng số của các hàm lỗi của các layer. Hàm lỗi của mỗi layer là sự khác nhau giữa bản reconstruction của layer đó, với ground truth, được tính bằng giá trị của layer đó trong bước forward với input là dữ liệu sạch.

Một cách hình thức, với một mẫu sạch x, ta sẽ tính mẫu nhiễu \tilde{x}, sau đó tính cả bản sạch và bản nhiễu của hidden layer: h^{(1)} = f^{(1)}\left(x\right),\;\tilde{h}^{(1)} = f^{(1)}\left(\tilde{x}\right). Lưu ý là ta dùng cùng một hàm f^{(1)} cho cả hai. Bản reconstruction tại layer 1 sẽ là \hat{h}^{(1)} = g^{(1)}\left(\tilde{h}^{(1)}\right), và bản reconstruction tại lớp input sẽ là \hat{x} = g^{(0)}\left(\hat{h}^{(1)}\right).

Hàm cost để optimize sẽ là tổng có trọng số của hàm cost tại mỗi layer: C = C^{(0)} + \alpha_1 C^{(1)} = \parallel x - \hat{x}\parallel^2 + \alpha_1 \parallel h^{(1)} - \hat{h}^{(1)}\parallel^2.

Nghĩa là ta có một liên kết “bắc cầu” tại lớp hidden layer 1 để “nối” h^{(1)} với \hat{h}^{(1)}. Có thể tưởng tượng ta dễ dàng thêm nhiều hidden layers cùng bằng cách như trên, và tại mỗi layer đều có một liên kết bắc cầu như vậy. Đây là lí do mạng này có tên là cái thang (ladder networks).

Mặc dù ban đầu được phát triển cho unsupervised learning, nhưng bằng cách kết hợp tín hiệu supervised vào mô hình, ta có thể làm cả semi-supervised learning, như trong paper này. Đặc biệt với tập labeled dataset rất nhỏ (chỉ 100 labeled examples), mô hình này có khả năng đạt state-of-the-art trên MNIST. Tuy nhiên vì MNIST khá nhỏ nên kết quả này cũng khó nói lên nhiều.

3. Generative Adversarial Nets (GAN)

Mô hình “triển vọng” nhất trong đám này hiện nay chắc là GAN. Thậm chí Yann LeCun cho rằng GAN sẽ là lĩnh vực có nhiều tiềm năng nhất trong vài năm tới.

Ý tưởng của GAN hết sức “điên rồ”. Ta sẽ huấn luyện một hàm generator G\left(z; \theta_z\right), biến đổi vector ngẫu nhiên z vào miền dữ liệu, đồng thời một hàm discriminator D\left(x; \theta_D\right) biến đổi vector x thuộc miền dữ liệu thành một số thực biểu diễn xác suất mà x thuộc tập huấn luyện. Phần thú vị là khi ta “buộc” 2 hàm này lại với nhau, trong đó ta tối đa hoá xác suất D\left(x; \theta_D\right) khi x thuộc tập huấn luyện, và đồng thời tối thiểu hoá \log\left(1 - D\left(G\left(z\right)\right)\right).

Lưu ý rằng z là mẫu lấy từ phân phối ngẫu nhiên bất kì nào đó. Toàn bộ quá trình huấn luyện GAN vì vậy có thể được hiểu là cố gắng huấn luyện G(z) để nó biến 1 thứ “trên trời rơi xuống” là z thành G(z), và G cố gắng “lừa” D sao cho D tưởng G(z) cũng là một mẫu đến từ tập dữ liệu. Nói cách khác đây là 1 trò chơi minimax game giữa D và G. Nếu cả 2 đạt Nash equilibrium thì đó chính là global optimum của mô hình, khi đó G là mô hình generative, có thể biến môt thứ trên trời rơi xuống thành một mẫu rất giống với dữ liệu huấn luyện.

Hiển nhiên vì deep net có khả năng xấp xỉ hàm số tốt nên nó sẽ được dùng cho cả G và D. Toàn bộ mô hình được huấn luyện bằng Gradient Descent, và không cần phải chạy Markov Chain như trong trường hợp của GSN.

Ý tưởng là vậy, nhưng trên thực tế thì huấn luyện GAN khá tricky. Vấn đề cơ bản là Gradient Descent không đảm bảo sẽ dẫn tới Nash equilibrium, vì cả 2 mô hình G và D có thể vẫn cứ cập nhật qua lại mãi mãi mà không bao giờ tới được trạng thái cân bằng.

Tuy nhiên giang hồ vẫn cứ tu luyện môn này, với nhiều phiên bản mở rộng như DCGAN – dùng convolutional nets thay vì feedforward, Conditional GAN, InfoGAN, và cái này chưa đặt tên.

Ngoài ra, một mô hình khác cho Generative Modeling là Variational Autoencoder.

Advertisements

2 comments

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s