Thứ Ba, 19 tháng 2, 2019

[Deep Learning] Cơ chế Attention trong Deep Learning

    Vào năm 2015, Attention mechanism xuất hiện và thu hút rất nhiều sự quan tâm, tuy nhiên số models sử dụng attention mechanism được công bố tới nay là rất ít. Bài viết này nhằm mục đích giải thích ở mức high-level về cơ chế Attention được sử dụng trong DL.

Attention  
    Trong thế giới tự nhiên, khi ta muốn nhận biết một vật, ta sẽ tập trung vào các đặc tính của vật đó thay vì tập trung vào toàn bộ hình dáng của vật. Ví dụ như để phân biệt con mèo và con vịt ta sẽ nghĩ ngay trong đầu sự khác biệt đó là vịt có cánh còn mèo thì không.

Ý tưởng tương tự cũng được áp dụng vào Deep Learning khi ta chỉ tập trung vào những phần nhất định của dữ liệu đầu vào tại 1 thời điểm nhất định cho các bài toán như nhận diện giọng nói, dịch máy hay phân loại vật thể.

 Attention trong mô tả ảnh
    Ta lấy một ví dụ để giải thích về cơ chế attetion đó là bài toán sinh ra mô tả cho 1 bức ảnh. Hệ thống sinh mô tả cho ảnh cổ điển sẽ mã hóa (encode) bức ảnh sử dụng một mô hình CNN có sẵn (pretrained) để sinh ra hidden state h. Sau đó, hệ thống sẽ giải mã (decode) hidden state này bằng một RNN và sinh ra các từ lần lượt cho đến một đoạn mô tả hoàn chỉnh. Mô hình như sau:
    

                Vấn đề của phương pháp này đó là trong khi hệ thống muốn sinh ra từ tiếp theo của caption thì từ tiếp theo này thường chỉ mô tả một phần nhất định của bức ảnh. Trong khi đó, ta lại sử dụng cả hidden state h chỉ để mô tả một phần nhỏ của bức ảnh và việc này sẽ không hiệu quả. Lúc này ta cần sử dụng attention.

                Trong cơ chế attention, bức ảnh đầu tiên được chia thành n phần và ta tính toán từng phần tử h1,...hn (h = hidden state) tương ứng với n phần bằng CNN. Khi RNN hoạt động, RNN sẽ chỉ tập trung vào phần tương ứng của bức ảnh. Trong ảnh dưới đây, ta có thể thấy mỗi từ sẽ tương ứng với phần có độ sáng lớn hơn những phần còn lại trong bức ảnh.

Ta cũng có thể hiểu như hệ thống sẽ học để attend một cách chính xác vào những phần của bức ảnh chứ không chỉ attend một cách tuần tự từ trái qua phải.
 Attention trong dịch máy
                Ta muốn dịch một câu từ tiếng Pháp qua Tiếng Anh, trong hình dưới đây, y là các từ được dịch bởi bộ giải mã, và x là câu ứng với input của ta.
Mô hình trên sử dụng bidirectional RNN nhưng quan trọng hơn ta thấy bộ giải mã không chỉ phụ thuộc vào state trước đó st-1 mà còn phụ thuộc vào trọng số là combination của tất cả các dữ trạng thái đầu vào. Các giá trị a là trọng số định nghĩa mức độ quan trọng của từng trạng thái đầu vào đến trạng thái đầu ra. Ví dụ a3,2 lớn, khi này bộ giải mã sẽ tập trung vào trạng thái số 2 trong câu tiếng Pháp, các giá trị a này thường được chuẩn hóa và có tổng là 1 (phân bố trên toàn dữ liệu đầu vào).

Ta cũng có thể visualize để thấy được attention hoạt động như thế nào
Ta thấy rằng khi dịch từ French qua English, hệ thống sẽ tập trung một cách tuần tự từ đầu tới cuối câu vào câu đầu vào, nhưng đôi khi sẽ tập trung vào 2 từ tại cùng 1 thời điểm để dịch ra 1 từ mới, ví dụ như dịch từ "la Syrie" thành "Syria".
 Mô hình Attention là gì?
                Trước tiên ta sẽ cần hiểu rõ hơn ý tưởng của cơ chế attention. Hầu hết phần dưới giải thích về attention được dịch từ đây (https://stackoverflow.com/questions/35549588/soft-attention-vs-hard-attention).
                Attention là gì? Để hiểu khái niệm này, ta sẽ thử trả lời 1 câu hỏi khác đó là Tại sao lại sử dụng attention? Giả sử bạn bị bịt mặt và dẫn đến một bữa tiệc sinh nhật, đây là thứ bạn sẽ nhìn thấy sau khi mở mắt ra.

                Đầu tiên ta sẽ nhìn khung cảnh mọi thứ xung quanh và thu thập thông tin tổng thể, tất nhiên ta chỉ nhìn lướt qua thôi chứ không để ý từng chi tiết bao giờ cả, và ta đã có câu trả lời cho mình. Ta nhìn thấy chú Bin hay dì Sâm và ta đặc biệt chú ý đến họ vì họ rất đỗi quen thuộc với ta và có lẽ là chi tiết quan trọng nhất sau khi mở mắt để biết đây là đâu và tôi là ai? Vậy tại sao lại như vậy, bởi vì bộ não chúng ta có khả năng tập trung vào những phần nhất định của một bức ảnh tại 1 thời gian và sau đó tổng hợp lại thông tin. Ta sẽ chú ý cao độ vào những chi tiết quan trọng nhất của bức ảnh và lờ đi những chi tiết còn lại.
                Giờ ta cũng muốn máy tính của ta có khả năng như vậy. Nếu giờ ta đã hiểu về attention, vậy còn tính differentiability(khác biệt) của cơ chế attetion là như thế nào. Ta sẽ tìm hiểu làm sao mà ta có thể biết mà nhìn vào những điểm đặc biệt của bức ảnh và lờ đi những điểm không đặc biệt. Ta có thể lựa chọn. Ví dụ như dựa vào cả bức ảnh và những phần của bức ảnh ta đã tập trung trước đó, ta sẽ chọn phần mà ta sẽ tập trung tiếp theo. Cũng như vậy, ta có thể có một train một mang neuron để có thể chỉ ra phần cần tập trung tiếp theo trong một bức ảnh, nhưng có muôn vàn kết quả, làm sao ta biết phần nào tập trung tiếp theo là chính xác hay không. Trong khi đó, việc train một mạng neuron sẽ phụ thuộc vào loss function, làm sao để ta xây dựng được loss function cho việc training? Ta có một số giải pháp, ta có thể sử dụng Reinforcement Learning (đọc thêm) hoặc còn cách khác đó là sử dụng soft hoặc hard attention.
                Để giải thích hai khái niệm này, ta giả sử đang làm bài toán sinh caption cho một bức ảnh, ta sẽ phải lựa chọn phần nào của bức ảnh quan trọng hơn phần còn lại. Để biết phần nào quan trọng hơn, ta có thể so sánh sự giống và khác nhau giữa query và các phần trong bức ảnh. Ví dụ bức ảnh có hình người đàn ông, khi này query mà hệ thống tự sinh ra có thể là: Người đàn ông này đang làm gì? Từ query này, ta ánh xạ để lấy được phần mà ta cần tập trung tiếp sau đó. Vậy tính differentiability ta nhắc đến ở trước nghĩa là gì? Đó nghĩa là hàm attention của ta không phụ thuộc vào ảnh đầu vào và gradient nữa.
                Sơ đồ tổng quát của 1 mô hình Attention như sau:
                Một mô hình attention sẽ nhận n đầu vào y1, y2 ... yn (chính là h1,h2...hn) và một context c, giá trị trả về là 1 vector z biểu diễn các đầu vào yi tương ứng với context c. Cụ thể, mô hình sẽ trả về một tập giá trị tương ứng yi và context c, giá trị weight này chỉ ra ta đang tập trung vào phần nào của ảnh. Ngoài ra, giá trị weight này có thể được visualize để ta có thể thấy bức ảnh đang được tập trung vào phần nào, một pixel sẽ trắng hơn nếu giá trị weight của pixel đó cao, nghĩa là ta đang tập trung vào pixel đó. Tiếp theo ta sẽ đi sâu hơn vào kiến trúc Attention.

                Đầu tiên ta nhận đầu với c là context và yi các phần của bức ảnh.

                Tiếp theo, mô hình tính toán m1, m2, ... mn bằng hàm tanh, hàm tanh này nhận đầu vào là context c và yi, và các giá trị mi này được tính toán một cách độc lập nghĩa là ta sẽ tính toán trên từng giá trị yi riêng rẽ.
                                                         m_i = \tanh\left(W_{cm}c + W_{ym}y_i\right)
                Với Wcm và Wym là các ma trận trọng số tương ứng của context c và đầu vào yi.
Sau đó ta tính toán từng weight sử dụng hàm softmax.
                                                         s_i \propto \exp\left(\left<w_m,m_i \right>\right)
                                                              \sum_i s_i = 1
wm là ma trận trọng số của mi.
                Ở đây ta thấy rằng giá trị weight của các phần sẽ thay đổi một cách tương ứng khi context c thay đổi, điều này phù hợp với việc ta dịch chuyển attention đến các phần khác nhau của ảnh.

Mô hình có thể được sửa đổi bằng cách thay hàm tanh bằng hàm khác miễn là giá trị đầu vào luôn giá context c và y, ví dụ ta có thể sử dụng dot product thay cho hàm tanh như sau:

 Soft Attention và Hard Attention
                Cơ chế được mô tả ở trên là soft-attention và có thể áp dụng vào bất kỳ một hệ thống nào, với giá trị gradient sẽ propagate qua attention mechanism. Hard attention là một quá trình ngẫy nhiên: Thay vì sử dụng tất cả hidden state yi là đầu vào cho việc giải mã, hệ thống lấy mẫu hidden state yi với một xác xuất là si. Để tính toán gradient, ta phải ước lượng bằng phương pháp lấy mẫu Monto Carlo.

Cả 2 cơ chế đều có ưu và nhược điểm riêng, nhưng ta thường tập trung vào soft attention do gradient có thể được tính toán trực tiếp thay vì phải ước lượng thông qua quá trình ngẫu nhiên như hard attention.

 Hệ thống mô tả ảnh sử dụng attention
                Cũng với hệ thống cổ điển, nhưng ta sẽ thêm 1 layer attention.

                Ở đây với context c là các hi và đầu vào là các phần của ảnh, attention model sẽ sinh ra đầu ra z1 là biểu diễn của ảnh mà chỉ 1 phần nhất định được focus vào, sau đó đưa biểu diễn này vào LSTM để ta có thể sinh từ.

 Attention cost
                Nếu ta nhìn vào công thức của attention mechanism, ta có thể thấy rằng ta cần tính toán một giá tri attention cho mỗi tổ hợp của dữ liệu đầu vào với một output. Nếu ta có 50 từ trong câu dữ liệu đầu vào và ta cần sinh ra 50 từ trong output, khi đó ta sẽ cần 50x50= 2500 giá trị attention. Đây là giá trị không quá lớn nhưng khi ta thực hiện ở mức kí tự (character-level), attention sẽ thực sự là một vấn đề. Ngoài ra, so với visual attention của con người hoặc động vật, attention trong DL là khá phản trực giác (counter-intuitive). Attention của con người sẽ chỉ tập trung vào 1 thứ và bỏ qua những thứ khác. Nhưng trong mô hình trên, ta cần xét tất cả đầu vào một cách chi tiết trước khi đưa ra quyết định nên tập trung vào phần nào. Rõ ràng vì ta đã xét tất cả dữ liệu đầu vào rồi mới quyết định, điều này giống với memory access hơn là attention. 
Intuitively that’s equivalent outputting a translated word, and then going back through all of your internal memory of the text in order to decide which word to produce next. That seems like a waste, and not at all what humans are doing. In fact, it’s more akin to memory access, not attention, which in my opinion is somewhat of a misnomer (more on that below). Still, that hasn’t stopped attention mechanisms from becoming quite popular and performing well on many tasks.