[Old but gold] RBM 4: Contrastive Divergence in training RBM and practical applications

RBM 1: Hopfield nets and Boltzmann Machines
RBM 2: Model definition and training of RBMs
RBM 3: Contrastive Divergence
RBM 4: Contrastive Divergence in training RBMs and practical applications

Chuỗi bài về RBM viết cách đây hơn 3 năm nhưng chưa bao giờ viết được phần cuối, một phần vì lười, nhưng chủ yếu là do RBM không còn là đề tài quan trọng trong Machine Learning nữa (sẽ nói thêm ở phần cuối). Tuy nhiên vì hôm trước có bạn hỏi nên sẽ viết nốt phần này.

Chính vì RBM không còn là đề tài “hot”, nên nếu bạn nào ở VN đang muốn nghiên cứu về đề tài này thì nên cân nhắc kĩ. Có một số đề tài khác thú vị hơn, có nhiều ý tưởng để làm hơn, và dễ xuất bản hơn là RBM.

Tất nhiên nếu như bạn muốn học RBM để cho biết, hoặc là để đi dạy lại người khác, thì RBM vẫn là một mô hình thú vị và đáng học. “Lịch sử” ngành Deep Learning cho thấy có những thứ 20-30 năm sau lại trở nên thịnh hành, nên biết đâu 10-20 năm nữa RBM lại trở thành mainstream, nhất là khi RBM có lẽ là mô hình generative dễ hiểu nhất (nếu không tính tới GMM hay K-means).

Cuối cùng, nếu bạn đang phải làm luận văn tốt nghiệp và thầy của bạn muốn bạn làm về RBM, thì không cần suy nghĩ nhiều. Viết luận văn và tốt nghiệp là những lí do hoàn toàn chính đáng để học RBM, và tốt nghiệp xong thì không phải ai cũng muốn đi làm nghiên cứu về Machine Learning (nếu viết luận văn thì nhớ cite blog này là được  😉 ).

Nói như vậy rồi, thì đây là RBM.

Nhắc lại rằng các Energy-based model hoạt động bằng cách gán một giá trị vô hướng (gọi là năng lượng) cho mỗi cấu hình của model. Gọi \textbf{x} là toàn bộ các biến trong mô hình, thì năng lượng của mô hình là E\left(\textbf{x}\right). Huấn luyện energy-based model là tìm cách gán giá trị thấp cho cấu hình mà ta muốn (theo Vật lí thì cấu hình có năng lượng thấp sẽ bền vững hơn năng lượng cao). Có thể xem thêm giải thích ở đây.

Giờ khi xét các mô hình Energy-based model dưới góc nhìn xác suất, ta cần phải định nghĩa phân phối xác suất của \textbf{x}, dựa vào E\left(\textbf{x}\right). Một cách phổ biến là dùng hàm exponential:

\displaystyle p\left(\textbf{x}\right) = \frac{e^{-E(\textbf{x})}}{\sum_{\textbf{x}'}e^{-E(\textbf{x}')}} = \frac{e^{-E(\textbf{x})}}{Z}

Tại sao lại dùng hàm exponential của negative energy? Lí do là vì hàm luỹ thừa là hàm không âm, nên phù hợp để định nghĩa xác suất (xác suất lúc nào cũng không âm). Ngoài ra y = e^{-z} là hàm nghịch biến, khi z giảm thì e^{-z} tằng theo cấp luỹ thừa (có thể xem đồ thị hàm y = e^{-z}đây), nên rất phù hợp: ta muốn giảm năng lượng E(\textbf{x}), đồng nghĩa với việc tăng e^{-E(\textbf{x})}. Cuối cùng, vì tổng xác suất của các cấu hình phải bằng 1 nên ta phải chia e^{-E(\textbf{x})} cho Z như công thức trên.

RBM hơi phức tạp hơn một chút. Trong RBM ta chia các biến ra làm 2 nhóm là visible (kí hiệu \textbf{v}) và hidden (kí hiệu \textbf{h}). Hàm năng lượng của RBM định nghĩa là:

-E\left(\textbf{v}, \textbf{h}\right) = \sum_{i \in vis} v_i b_i + \sum_{j \in hid} h_j b_j + \sum_{i, j} v_i h_j W_{ij}

Do đó phân phối xác suất đồng thời của tất cả các biến trong mô hình là:

\displaystyle p\left(\textbf{v}, \textbf{h}\right) = \frac{e^{-E\left(\textbf{v},\textbf{h}\right)}}{\sum_{\textbf{u}, \textbf{g}}e^{-E\left(\textbf{u},\textbf{g}\right)}} =\frac{e^{-E\left(\textbf{v},\textbf{h}\right)}}{Z}

Tuy nhiên khi huấn luyện thì ta chỉ có dữ liệu của \textbf{v}, vì chỉ có v là quan sát được. Do đó ta muốn cực đại hoá p\left(\textbf{v}\right). Ta tính p\left(\textbf{v}\right) bằng cách marginalize \textbf{h} từ biểu thức trên:

\displaystyle p\left(\textbf{v}\right) = \sum_{\textbf{h}}p\left(\textbf{v}, \textbf{h}\right) =\sum_{\textbf{h}}\frac{e^{-E\left(\textbf{v},\textbf{h}\right)}}{Z}

Giờ để cho đơn giản, ta định nghĩa hàm sau đây gọi là free energy:

\displaystyle \mathcal{F}\left(\textbf{v}\right) = -\log \sum_{\textbf{h}}e^{-E\left(\textbf{v},\textbf{h}\right)}

Khi đó ta có thể viết lại p\left(\textbf{v}\right) là:

\displaystyle p\left(\textbf{v}\right) = \frac{e^{-\mathcal{F}\left(\textbf{v}\right)}}{\sum_{\textbf{v}'}e^{-\mathcal{F}\left(\textbf{v}'\right)}} = \frac{e^{-\mathcal{F}\left(\textbf{v}\right)}}{Z}

Tới đây thì mọi chuyện rõ ràng. Sau khi có p(\textbf{v}), chỉ có mỗi một việc ta biết làm là tìm cách cực đại hoá \log p(\textbf{v}) theo đường lối Max-Like (Maximum Likelihood).

Ta có:

\displaystyle \log p\left(\textbf{v}\right) = \log\frac{e^{-\mathcal{F}\left(\textbf{v}\right)}}{\sum_{\tilde{\textbf{v}}}e^{-\mathcal{F}\left(\tilde{\textbf{v}}\right)}} = -\mathcal{F}\left(v\right) - \log \sum_{\tilde{\textbf{v}}} e^{-\mathcal{F}\left(\tilde{\textbf{v}}\right)}

Theo đúng bài vở, ta cần tính đạo hàm của \log p\left(\textbf{v}\right). Phần thứ nhất của \log p\left(\textbf{v}\right) khá đơn giản, chỉ có phần thứ 2 là lằng nhằng. Tuy nhiên từ toán phổ thông, ta còn nhớ \left(\log u\right)' = \frac{u'}{u} và \left(e^u\right)' = u' e^u, nên có thể tính phần thứ 2 như sau:

\begin{array}{rl} \displaystyle \left[\log \sum_{\tilde{\textbf{v}}} e^{-\mathcal{F}\left(\tilde{\textbf{v}}\right)}\right]' & = \displaystyle \frac{\left[\sum_{\tilde{\textbf{v}}} e^{-\mathcal{F}\left(\tilde{\textbf{v}}\right)}\right]' }{\sum_{\dot{\textbf{v}}} e^{-\mathcal{F}\left(\dot{\textbf{v}}\right)}} \\ & = \displaystyle \sum_{\tilde{\textbf{v}}} \frac{\left[e^{-\mathcal{F}\left(\tilde{\textbf{v}}\right)}\right]' }{\sum_{\dot{\textbf{v}}} e^{-\mathcal{F}\left(\dot{\textbf{v}}\right)}} \\ & = \displaystyle - \sum_{\tilde{\textbf{v}}} \frac{e^{-\mathcal{F}\left(\tilde{\textbf{v}}\right)}\left[\mathcal{F}\left(\tilde{\textbf{v}}\right)\right]' }{\sum_{\dot{\textbf{v}}} e^{-\mathcal{F}\left(\dot{\textbf{v}}\right)}} \\ & = \displaystyle - \sum_{\tilde{\textbf{v}}} p\left(\tilde{\textbf{v}}\right)\left[\mathcal{F}\left(\tilde{\textbf{v}}\right)\right]' \end{array}

Như vậy đạo hàm của \log p\left(\textbf{v}\right) là:

\displaystyle \frac{\partial \log p\left(\textbf{v}\right)}{\partial \theta} = - \frac{\partial \mathcal{F}\left(\textbf{v}\right)}{\partial \theta} + \sum_{\tilde{\textbf{v}}} p\left(\tilde{\textbf{v}}\right)\frac{\partial \mathcal{F}\left(\tilde{\textbf{v}}\right)}{\partial \theta} (1)

Giờ cần phải tính tiếp đạo hàm của \mathcal{F}\left(\tilde{\textbf{v}}\right):

\begin{array}{rl} \displaystyle \left[\mathcal{F}\left(\textbf{v}\right)\right]' & \displaystyle = -\frac{\left[\sum_{\textbf{h}} e^{-E\left(\textbf{v}, \textbf{h}\right)}\right]'}{\sum_{\tilde{\textbf{h}}} e^{-E\left(\textbf{v}, \tilde{\textbf{h}}\right)}} \\ & \displaystyle = \sum_{\textbf{h}} \frac{e^{-E\left(\textbf{v}, \textbf{h}\right)}}{\sum_{\tilde{\textbf{h}}} e^{-E\left(\textbf{v}, \tilde{\textbf{h}}\right)}}\left[E\left(\textbf{v}, \textbf{h}\right)\right]' \\ & \displaystyle = \sum_{\textbf{h}} p\left(\textbf{h}\vert \textbf{v}\right)\left[E\left(\textbf{v}, \textbf{h}\right)\right]' \\ \end{array}

Gắn lại vào (1), ta có:

\begin{array}{rl} \displaystyle \frac{\partial - \log p\left(\textbf{v}\right)}{\partial \theta} & = \displaystyle \sum_{\textbf{h}} p\left(\textbf{h}\vert\textbf{v}\right)\frac{\partial E\left(\textbf{v}, \textbf{h}\right)}{\partial \theta} - \sum_{\tilde{\textbf{v}}, \textbf{h}} p\left(\tilde{\textbf{v}}, \textbf{h}\right)\frac{\partial E\left(\tilde{\textbf{v}}, \textbf{h}\right)}{\partial \theta} \\ & = \text{"positive phase"} - \text{"negative phase"} \end{array}   (2)

Lưu ý rằng ta tính đạo hàm của -\log p\left(\textbf{v}\right) vì đó là chiều đi của Gradient Descent, đồng thời để làm rõ 2 thành phần của phương trình này là “positive” và “negative” phase.

Ý tưởng của phương trình này thì ta đã nhắc tới trong các bài trước. Phần positive có nhiệm vụ giảm năng lượng của training data, phần negative tăng năng lượng của tất cả các cấu hình mà mô hình đang ghi nhớ. Ý tưởng chủ đạo là phương trình này khiến mô hình tin hơn vào dữ liệu huấn luyện, và bớt tin những gì mà mô hình đang tin.

Trong trường hợp của RBM thì phần positive khá đơn giản. Vì các hidden units của RBM độc lập đôi một với nhau nên ta chỉ cần clamp input vector \textbf{v} vào visible units, lấy mẫu \textbf{h} và tính đạo hàm tương ứng.

Phần negative thì lằng nhằng, vì nó đòi hỏi ta phải tính kì vọng của đạo hàm trên tất cả các cấu hình của \textbf{v, h}. Tính chính xác phần này là intractable.

Đây là lúc Contrastive Divergence được dùng đến (như đã nói ở bài trước). Trước tiên ta clamp input vector \textbf{v} vào visible units, sau đó lấy mẫu k bước:

\text{observed } \textbf{v} = \textbf{v}_0 \overset{p\left(\mathbf{h}\vert\mathbf{v_0}\right)}{\longrightarrow} \textbf{h}_0 \overset{p\left(\mathbf{v}\vert\mathbf{h_0}\right)}{\longrightarrow} \textbf{v}_1 \overset{p\left(\mathbf{h}\vert\mathbf{v_1}\right)}{\longrightarrow} \textbf{h}_1

Trong trường hợp CD-1, thì cặp \left(\mathbf{v_1}, \mathbf{h_1}\right) được dùng để tính kì vọng trong phương trình trên.

Trong thực tế, người ta dùng RBM với hàm sigmoid và phân phối Gaussian. Trong trường hợp đó, thông thường variance của các phân phối Gaussian sẽ được set bằng nhau.

Mặc dù là mô hình generative nhưng ứng dụng của RBM không được như mong đợi. Một ứng dụng quan trọng là dùng để pre-train mô hình sâu. Deep Neural Nets pre-train bằng RBM là một trong những breakthrough quan trọng nhất trong sự hồi sinh của neural nets cách đây 10 năm. Mặc dù vậy, tới khi ReLU và nhiều kĩ thuật initialization khác được phát minh thì người ta nhận ra không cần pre-train deep net nữa.

Ứng dụng nổi tiếng thứ 2 là movie recommendation. RBM là một giải pháp trong cuộc thi Netflix năm nào. Ý tưởng chính là RBM có thể chuyển biểu diễn của dữ liệu trong ma trận user-object thành dạng compact hơn.

Ứng dụng thứ 3 là ý tưởng này được mở rộng cho Deep Belief Networks (DBNs). Tuy nhiên trong trường hợp DBNs thì tính positive phase cũng phức tạp, nên người ta phải làm variational inference các kiểu.

Tóm lại, RBM có lẽ là mô hình generative đơn giản nhất. Tuy nhiên nhìn vào lí thuyết RBM, ta có thể nhận thấy rất rõ tinh thần của generative model, nhất là khi đối sánh với các mô hình gần đây như GANs, etc…

<Liên hệ giữa RBM và GANs?>

Advertisements

3 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