RBM 1: Hopfield networks and Boltzmann Machines

Chuỗi bài viết về RBMs:
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

Restricted Boltzmann Machines (RBMs) có thể xem là một trong những break-through quan trọng nhất của phong trào Deep Learning. Mặc dù được giới thiệu (lại) vào khoảng 2005, RBMs đã được Hinton nghĩ ra vào khoảng 20 năm trước. Tuy nhiên mãi đến gần đây thì Hinton mới nghĩ ra được thuật toán hiệu quả để huấn luyện mô hình này, và sử dụng nó trong một số kết quả quan trọng. Mô hình này có thể xem là mở đầu của một hướng đi mới mới cho unsupervised feature learning.

Giống như tên gọi, Restricted Boltzmann Machines (RBMs) là một dạng Boltzmann Machine. Boltzmann Machines, tới lượt mình, lại là một dạng mở rộng của Hopfield networks. Thật khó để viết về RBM mà không nhắc tới Hopfield net và Boltzmann Machine, do đó bài này sẽ bắt đầu từ Hopfield networks và Boltzmann Machine. Bài tiếp theo sẽ viết về RBM và thuật toán Contrastive Divergence.

1. Hopfield networks

Hopfield network, được giới thiệu lần đầu vào khoảng những năm 80 của thế kỉ trước, là một recurrent neural network với binary threshold unit.

Binary threshold unit, giống như tên gọi của nó, là một loại neuron đơn giản mà output của nó là nhị phân và được quyết định dựa trên một ngưỡng. Theo đó activation của unit i, kí hiệu s_i được tính bằng công thức:

s_{i}=\begin{cases} 1 & \text{if }\sum_{j}W_{ji}s_{j}>\theta_{i}\\ -1 & \text{otherwise} \end{cases}           (1)

trong đó W_{ji} là trọng số của liên kết từ unit j tới unit i, và \theta_i là ngưỡng của unit i. Lưu ý rằng ta dùng -1 và 1 để thể hiện giá trị nhị phân của các neuron. Tuy nhiên cũng có thể sử dụng 0 và 1, nhưng các công thức phía sau sẽ phải thay đổi cho phù hợp.

Recurrent neural networks (RNNs) nói chung là khó analyze vì các recurrent connections trong RNNs khiến chúng hoạt động rất phức tạp. RNNs có thể hoặc hội tụ về một cấu hình ổn định nào đó, hoặc liên tục oscillate, hoặc mô hình các quá trình dynamic phức tạp mà ta không thể dự đoán trước được. Đây chính là điểm mạnh (vì nó cho phép RNN mô hình hóa các mô hình phức tạp) và cũng là điểm yếu (không có phương pháp giải tốt) của RNNs. Hopfield net cũng là một loại RNN nên nó cũng mang đầy đủ đặc điểm “khó chịu” này.

May mắn thay Hopfield và một vài người khác đã chỉ ra rằng nếu các connection trong Hopfield net là đối xứng (W_{ij}=W_{ji}) thì toàn bộ hoạt động của Hopfield net có thể biểu diễn bằng một hàm năng lượng (energy function). Mỗi một cấu hình (configuration) của các unit trong Hopfield net mang một năng lượng nhất định và ta có thể thay đổi giá trị của các neuron để làm cho Hopfield net hội tụ về local minimum của hàm năng lượng.

Cụ thể hàm năng lượng của Hopfield net được viết như sau:

E = -\sum_{i}s_i b_i - \sum_{i<j}s_i s_j W_{ij}                       (2)

trong đó b_i là bias của unit i. Ý tưởng của hàm năng lượng này tương tự như trong Vật lí, theo đó năng lượng càng thấp thì hệ thống càng ổn định. Trọng số W_{ij} thể hiện mức độ “tương đầu ý hợp” của 2 neuron ij. Khi i và j có cùng giá trị, s_i s_j > 0, nên W_{ij} > 0 thể hiện ij tương đối đồng ý với nhau (thường có cùng giá trị) vì khi đó s_i s_j W_{ij} > 0, đóng góp 1 phần negative vào hàm năng lượng. Ngược lại cho trường hợp W_{ij} < 0.

Năm 1982, Hopfield đề xuất mạng này và nghĩ rằng có thể sử dụng nó để ghi nhớ các chuỗi bit bất kì. Ý tưởng là với mỗi pattern cần ghi nhớ, ta tinh chỉnh các trọng số sao cho hàm năng lượng E đạt cực tiểu. Công thức tinh chỉnh trọng số rất đơn giản:

  • Nếu sử dụng các unit có activation là -1 và 1 thì công thức là: \Delta W_{ij} = s_i s_j    (3a)
  • Nếu sử dụng các unit có activation là 0 và 1: \Delta W_{ij} = 4\left(s_i - \frac{1}{2}\right)\left(s_j - \frac{1}{2}\right)   (3b)

Các bias b_i có thể xem như là trọng số của neuron i kết nối với 1 neuron đặc biệt mà lúc nào cũng có giá trị bằng 1. Lưu ý rằng vì s_i, s_j chỉ có thể có giá trị là 1 hoặc -1 (hay 1 hoặc 0) nên \Delta W_{ij} chỉ có thể nhận giá trị là -1, 0 hoặc 1. Do đó nếu ban đầu, các trọng số W_{ij} là số nguyên thì nó sẽ luôn là số nguyên.

Vì hàm năng lượng của Hopfield net có thể có nhiều local minimum nên ý tưởng là ta tinh chỉnh các trọng số sao cho mỗi pattern cần ghi nhớ tương ứng với một local minimum. Sau đó chỉ cần biết 1 phần của pattern, Hopfield net có thể retrieve đầy đủ pattern mà nó đã ghi nhớ. Hopfield net thực hiện việc này bằng cách thay đổi giá trị của các unit còn lại (chưa biết) cho đến khi hàm năng lượng đạt cực tiểu. Để ý rằng hàm năng lượng được định nghĩa rất đẹp, nên tại một unit s_i, ta có thể biết được tác động của nó tới hàm năng lượng theo công thức sau (gọi là Energy gap):

\Delta E_i = E \left(s_i = 0\right) - E \left(s_i = 1 \right) = b_i + \sum_j s_jW_{ij}            (4)

Như vậy ta có thể thay đổi giá trị của các neuron chưa biết để tìm local optimum của Hopfield net.

Mặc dù ý tưởng rất đẹp và đơn giản, nhưng người ta chỉ ra rằng Hopfield net tỏ ra không hiệu quả để lưu trữ patterns. Cụ thể một fully-connected Hopfield net với N neuron chỉ có thể ghi nhớ khoảng 0.15 N pattern khác nhau. Lí do của sự thiếu hiệu quả này là vì hiện tượng spurious minima trong hàm năng lượng của Hopfield net. Mỗi lần ta ghi nhớ 1 pattern, ta hi vọng là Hopfield net sẽ tạo ra 1 local minima mới. Nhưng nếu 2 local minima quá gần nhau thì công thức cập nhật trọng số của Hopfield net có thể tạo ra 1 minima giả nằm ở giữa 2 local minima này, và rõ ràng khiến Hopfield net quên mất 2 pattern tương ứng. Hopfield và những người khác đã đề ra chiến lược unlearning để giải quyết hiện tượng này và tăng năng lực ghi nhớ của Hopfield net, nhưng không đưa ra được phân tích về mặt lí thuyết.

Một số cải tiến khác cho Hopfield net cũng đã được đề ra, tuy nhiên đến khoảng 1990 thì Hopfield net kết thúc vai trò lịch sử của nó. Người ta bắt đầu đưa ra các mô hình tốt hơn, mà Boltzmann Machine là một ví dụ.

2. Boltzmann Machines

Một Boltzmann Machine với 3 hidden units và 4 visible units.

Hình 1: Một Boltzmann Machine với 3 hidden units và 4 visible units (image taken from wikipedia)

Được Hinton và đồng nghiệp đề xuất năm 1983, Boltzmann Machine có thể xem là phiên bản mở rộng của Hopfield net, trong đó các neuron không còn là binary threshold unit nữa, mà được định nghĩa bằng một phân phối xác suất, theo đó xác suất để unit i có activation s_i = 1 là:

\displaystyle p\left(s_i = 1\right) = \sigma\left(\frac{-\Delta E_i}{T}\right) = \frac{1}{1+\exp\left(\frac{-\Delta E_i}{T}\right)}          (5)

Trong đó \Delta E_i là Energy gap giống như đã định nghĩa trong Hopfield net \Delta E_i = E \left(s_i = 0\right) - E \left(s_i = 1 \right) = b_i + \sum_j s_jW_{ij}, và T gọi là temperature của cả mô hình. Bằng cách thay đổi T, ta có thể điều khiển mức độ nhiễu trong activation của các neuron, từ đó khiến cho Boltzmann Machine hoạt động stochastically, thay vì deterministic như Hopfield net.

Bằng cách thêm vào phần nhiễu (điều khiển bằng tham số T), Boltzmann Machines được cho là tốt hơn Hopfield net. Lí do là vì trong Hopfield net, công thức cập nhật trọng số luôn buộc Hopfield net đi theo chiều giảm của hàm năng lượng, do đó không có cách nào để Hopfield net có thể thoát ra khỏi local minimum. Bằng cách thêm nhiễu vào quá trình này, Boltzmann Machines có thể vượt qua local minimum và giúp nó đạt thermal equilibrium…

Theo quy ước, thông thường các neuron trong Boltzmann Machines được chia thành 2 nhóm gồm visible units \textbf{V} và hidden units \textbf{H}. Khi đó hàm năng lượng của Boltzmann Machines có thể viết là:

\displaystyle -E\left(\textbf{v},\textbf{h}\right) = \sum_{i\in vis}v_i b_i + \sum_{k\in hid}h_k b_k + \sum_{i < j}v_i v_j W_{ij} + \sum_{i,k}v_i h_k W_{ik} + \sum_{k < l}h_k h_l W_{kl}            (6)

Công thức này hoàn toàn tương tự như công thức (2) của Hopfield net, nhưng ta viết rõ ràng để phân biệt hai nhóm neuron. E\left(\textbf{v},\textbf{h}\right) là năng lượng của cấu hình với giá trị \textbf{v} cho visible units và \textbf{h} cho hidden units. Với hàm năng lượng này, ta định nghĩa joint distribution của cả visible và hidden units như sau:

\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)}}            (7)

Trong đó phần mẫu số là tổng năng lượng của tất cả các cấu hình có thể cho các units, còn được gọi bằng cái tên quen thuộc là partition function. Đương nhiên phân phối xác suất của các visible units cũng có thể được viết như sau:

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

Công thức (7) là một dạng của phân phối Boltzmann (còn gọi là log-linear model trong cộng đồng ML), do đó mô hình này được đặt tên là Boltzmann Machine. Có lẽ tới đây ta đã thấy vài hương vị quen thuộc của graphical model. Thực tế Boltzmann Machine là một loại undirected graphical model, với các factor là các cạnh được đặc trưng bằng trọng số và các activations tương ứng (trong PGM gọi là features).

Với định nghĩa như thế này, Boltzmann Machine có thể được dùng để biểu diễn phân phối xác suất của dữ liệu huấn luyện, vì nó có khả năng biểu diễn joint distribution của tất cả các unit. Nói cách khác, Boltzmann Machine là một generative model, chứ không phải discriminative model như các thể loại neural net khác. Đây rõ ràng là tính chất rất mạnh của mô hình này, vì chẳng hạn nếu ta dùng Boltzmann machine để mô hình hóa 1 tập ảnh, thì về nguyên tắc Boltzmann Machine có thể biểu diễn distribution của các pixel trong ảnh, từ đó có thể dùng để giải quyết các bài toán như image completion, vốn không thể (hoặc rất khó) giải bằng các mô hình discriminative.

Dưới góc nhìn generative model, cần lưu ý rằng Boltzmann Machine không phải là causal generative model. Thay vào đó, tất cả thông tin mà Boltzmann machine ghi nhận đều được biểu diễn bằng hàm năng lượng. Phân phối xác suất của các neuron sau đó được biểu diễn giống như đã viết trong (7).

Nhưng làm thế nào để huấn luyện Boltzmann Machine mô hình hóa một tập dữ liệu cho trước? Vì đây là mô hình generative, ta có thể huấn luyện bằng cách dùng Maximum Likelihood Estimation (MLE). Hàm likelihood của mô hình này dĩ nhiên được viết là:

\displaystyle \mathcal{L}\left(W\vert X\right) = \prod_{\textbf{v}\in X}p\left(\textbf{v}\vert W\right)          (9)

trong đó X là tập dữ liệu huấn luyện, p\left(\textbf{v}\vert W\right) là xác suất mà visible units của Boltzmann Machine có giá trị bằng training sample \textbf{v}\in X, được tính như trong công thức (8). Đương nhiên trong thực tế ta sẽ tối thiểu hóa hàm negative log-likelihood. Chính vì lí do này mà dạng mô hình biểu diễn bằng công thức (7) được gọi là log-linear model, vì với định nghĩa đó, hàm năng lượng là tuyến tính (linear) trong logarithm domain.

Tuy nhiên tới đây thì khó khăn chính lại xuất hiện. Vì sự xuất hiện của partition function trong (7)(8), nói chung việc tính toán các statistic cần thiết trong thuật toán MLE trở nên khó khăn. Chẳng hạn để tính partition function, ta phải duyệt qua toàn bộ cấu hình có thể của tất cả các units. Số lượng cấu hình là exponential theo số lượng của unit, nên rõ ràng việc này không khả thi. Tương tự để lấy mẫu từ các hidden units, ta cũng phải dùng các phương pháp xấp xỉ như Markov Chain Monte Carlo, trong đó các bước di chuyển trong Gibbs sampling có thể thực hiện dựa trên energy gap của mỗi neuron. Mặc dù vậy, việc sử dụng MCMC cũng là khá tốn kém về thời gian, do đó việc huấn luyện các Boltzmann Machine tương đối lớn trở nên không khả thi.

3. Kết luận

Bài này viết về Hopfield net và phiên bản mở rộng của nó là Boltzmann Machine. Theo đó thì Hopfield net có hạn chế lớn ở khả năng ghi nhớ các pattern. Bằng cách sử dụng stochastic binary unit (thay vì binary threshold unit) Boltzmann Machines có thể vượt qua hạn chế này và có thể dùng để biểu diễn joint distribution của các unit (i.e. generative model). Tuy nhiên cũng giống như các undirected graphical model khác, Boltzmann Machine gặp khó khăn vì sự xuất hiện của partition function. Do đó ngay cả khi cho trước giá trị của các visible unit, việc lấy mẫu các hidden units (phân phối p\left(h\vert v\right)) cũng khá khó khăn.

Trong bài tới, ta sẽ thấy bằng cách giới hạn các connection của Boltzmann Machines, môt mô hình gọi là Restricted Boltzmann Machines vượt qua được khó khăn này và tỏ ra hiệu quả trong rất nhiều bài toán thực tế.

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