3 CƠ SỞ LÝ THUYẾT
3.3 Kiến trúc Transformer
Ngữ cảnh (Contextual) và vai trò của ngữ cảnh trong NLP
Trước khi tìm hiểu các kỹ thuật đã tạo ra ưu thế vượt trội cho mô hình BERT. Chúng ta hãy khám phá vai trò của ngữ cảnh trong NLP.
Bản chất của ngôn ngữ là để diễn giải dòng suy nghĩ của con người. Trong giao tiếp, các từ thường không đứng độc lập mà chúng sẽ đi kèm với các từ khác để liên kết mạch lạc thành một câu. Hiệu quả biểu thị nội dung và truyền đạt ý nghĩa sẽ lớn hơn so với từng từ đứng độc lập.
Ngữ cảnh trong câu có một sự ảnh hưởng rất lớn trong việc giải thích ý nghĩa của từ. Hiểu được vai trò mấu chốt đó, các thuật toán NLP SOTA đều cố gắng đưa ngữ cảnh vào mô hình nhằm tạo ra sự đột phá và cải tiến và mô hình BERT cũng như vậy.
Mô hình Recurrent Neural Networks (RNN)
Vào năm 1986, Rumelhart và các đồng nghiệp của ông đã xuất bản một bài báo nghiên cứu có tựa đề “Learning internal representations by error propagation” [20]. Trong nghiên cứu này, một kiến trúc mạng cổ điển để xử lý dữ liệu tuần tự được gọi là recurrent neural network. Về cơ bản, mạng recurrent neural network là một kiến trúc mạng nơ-ron trong đó trạng thái của mô hình ở bước trước được sử dụng làm đầu vào của bước hiện tại. Nói cách khác, mô hình recurrent neural network hoạt động theo cách ánh xạ dữ liệu đầu vào và trạng thái trước đó của mô hình với dữ liệu đầu ra, như thể hiện trong bên dưới. Với mạng nơ-ron truyền thống, dữ liệu chỉ được truyền qua một hướng, tính toán và kết quả đầu ra được gói gọn trong một pha và hoàn toàn dựa trên dữ liệu đầu vào (tức là không tồn tại vòng lặp). Chúng ta cần làm rõ rằng vòng lặp ở đây không tạo ra một chu trình tính toán lặp lại vô hạn, mà chỉ sử dụng dữ liệu từ giai đoạn tính toán trước làm đầu vào cho giai đoạn hiện tại. Cụ thể hơn, chúng ta có thể mở ra vòng lặp để cung cấp một kiến trúc tính toán cụ thể hơn khi truyền dữ liệu tuần tự vào mạng. Với recurrent neural network, thông tin từ lần truyền trước được lưu (ở trạng thái ẩn) cho tính toán hiện tại, tạo ra một vòng lặp trên đồ thị tính toán. Nói cách khác, trạng thái ẩn hoạt động như một bộ nhớ của lớp nơ-ron để nhớ lại. Điều này đặc biệt hữu ích khi xử lý dữ liệu chuỗi thời gian, trong đó logic tính toán giống nhau (cùng một phép tính và tập trọng số) có thể được áp dụng cho mỗi điểm dữ liệu trong chuỗi, bảo toàn thông tin từ các điểm trước đó trong khi vẫn bảo toàn thông tin trình tự. Recurrent Neural Network (RNN) là một biến thể rất quan trọng của mạng nơ-ron được sử dụng nhiều trong xử lý ngôn ngữ tự nhiên. Về mặt khái niệm, chúng khác với mạng nơ-ron thông thường vì đầu vào thông thường trong RNN là một từ thay vì toàn bộ văn bản trong trường hợp của mạng nơ-ron thông thường. Điều này mang lại sự linh hoạt cho mạng hoạt động với các độ dài khác nhau của các câu, điều không thể đạt được trong mạng nơ-ron thông thường do cấu trúc cố định của nó. Nó cũng cung cấp một lợi thế bổ sung là chia sẻ các đặc tính đã học qua các vị trí khác nhau của văn bản mà không thể có được trong
mạng nơ-ron thông thường.
Hình 10: Biểu diễn về Recurrent Neural Network
RNN xử lý mỗi từ của câu như một đầu vào riêng biệt xuất hiện tại thời điểm ‘t’ và cũng sử dụng giá trị active tại ‘t-1’, làm đầu vào bên cạnh đầu vào tại thời điểm ‘t’. Sơ đồ dưới đây cho thấy cấu trúc chi tiết của một kiến trúc RNN. Kiến trúc được mô tả ở trên còn được gọi là kiến trúc many to many với (Tx = Ty) tức là số đầu vào bằng số đầu ra. Cấu trúc như vậy khá hữu ích trong mô hình trình tự. Ngoài tất cả tính hữu ích của nó, RNN còn có một số hạn chế chính trong số đó là:
• Các ví dụ về kiến trúc RNN được nêu ở trên có khả năng nắm bắt các phụ thuộc chỉ theo một hướng của ngôn ngữ. Về cơ bản trong trường hợp xử lý ngôn ngữ tự nhiên, nó giả định rằng từ đến sau không ảnh hưởng đến nghĩa của từ đến trước. Nhưng với kinh nghiệm của chúng ta về các ngôn ngữ, chúng ta biết rằng điều đó chắc chắn không đúng.
• RNN cũng không tốt lắm trong việc nắm bắt các phụ thuộc dài hạn và vấn đề biến mất các gradient xuất hiện lại trong RNN.
• RNN là mạng học tuần tự nên sẽ mất thời gian xử lí với những câu dài và không tận dụng được xử lí song song.
Kiến trúc Transformer
Transformer trong NLP là một kiến trúc mới nhằm giải quyết các tác vụ theo trình tự trong khi xử lý các phụ thuộc phạm vi dài một cách dễ dàng. Nó hoàn toàn dựa vào cơ chế self-attention để tính toán các biểu diễn của đầu vào và đầu ra mà không sử dụng các RNN theo trình tự hoặc tích chập. Cơ chế self-attention còn giải quyết vấn đề xử lí tuần tự và xử lí ngôn ngữ theo 1 chiều của RNN.
Hình 11: Minh hoạ kiến trúc Transformer [21]
Trong kiến trúc Transformer gồm một encode và decode. Vai trò của encode là mã hóa các đầu vào (tức là câu) ở một trạng thái, thường chứa một số tensor. Sau đó trạng thái được chuyển vào decode để tạo ra các đầu ra. Trong dịch máy encode chuyển đổi một câu nguồn, ví dụ: “Hello world” ở một trạng thái, một vectơ, nắm bắt thông tin ngữ nghĩa của nó. Sau đó, decode sử dụng trạng thái này để tạo câu đích đã dịch, ví dụ: “Xin chào thế giới.”. Encode và decode có một số mô-đun con, nhưng có thể thấy cả hai đều sử dụng chủ yếu Multi-Head Attention và Feed Forward Network.
Encoder
Encoder bao gồm một bộ 6 layer giống nhau và chồng lên nhau mỗi lớp có sub- layer. Đầu tiên là cơ chế multi-head self-attention và thứ hai là fully connected feed- forward network đơn giản. Chúng ta sử dụng kết nối residual xung quanh mỗi trong số hai sub-layer, tiếp theo là normalization layer. Có nghĩa là đầu ra của mỗi sub- layer là LayerNorm (x + Sublayer(x)), trong đó Sublayer(x) là hàm được thực hiện bởi chính sub-layer đó. Để tạo điều kiện thuận lợi cho các kết nối residual này, tất cả các sub-layer trong mô hình, cũng như các embedding layer, tạo ra kết quả đầu ra của mô hình có kích thước chiều là 512.
Decoder
Decoder cũng được cấu tạo bởi một bộ 6 layer giống nhau. Ngoài hai sub-layer trong mỗi encoder layer, Decoder chèn thêm một sub-layer thứ ba, lớp này thực hiện multi-head attention vào đầu ra của encoder stack. Tương tự như encoder, chúng ta sử dụng các kết nối residual xung quanh mỗi sub-layer, tiếp theo là normalization layer. Chúng ta cũng sửa đổi self-attention sub-layer trong encoder stack để ngăn các vị trí phía trước tham gia xử lí các vị trí tiếp theo. Việc che dấu này đảm bảo rằng các dự đoán cho vị trí i có thể chỉ phụ thuộc vào các đầu ra đã biết ở các vị trí nhỏ hơn i.
Attention
Một hàm Attention có thể được mô tả là ánh xạ một truy vấn (query) và một tập hợp các cặp khóa-giá trị (key-value) tới một kết quả đầu ra, trong đó truy vấn, khóa, giá trị và kết quả đầu ra đều là vectơ. Kết quả đầu ra được tính dưới dạng tổng trọng số của các giá trị, trong đó trọng số được chỉ định cho mỗi giá trị được tính toán bởi một hàm tương thích của truy vấn với khóa tương ứng.
Scaled Dot-Product Attention
Chúng ta gọi attention đặc biệt này là "Scaled Dot-Product Attention". Đầu vào bao gồm các query và key của kích thức chiềudk và các value của kích thước chiều dv. Chúng ta tính toán các giá trị dot products của query với tất cả các key, chia mỗi key cho√
dk và áp dụng hàm softmax để thu được trọng số trên các value.
Trong thực tế, chúng ta tính toán hàm attention trên một tập hợp các query đồng thời, được đóng gói với nhau thành một ma trận Q. Các key và value cũng được đóng gói cùng nhau thành ma trận K và V. Chúng ta tính toán ma trận kết quả đầu ra như sau:
Attention(Q, K, V) =so f tmax(QK
T
√
Hình 12: Minh hoạ về Scaled Dot-Product Attention [21]
Hai hàm attention được sử dụng phổ biến nhất là additive attention và dot-product (multiplicative) attention. Dot-product attention giống hệt với thuật toán của chúng ta, ngoại trừ hệ số tỷ lệ √1
dk. Additive attention tính toán chức năng tương thích bằng cách sử dụng feed-forward network với một hidden layer duy nhất. Trong khi cả hai tương tự nhau về độ phức tạp lý thuyết, dot-product attention nhanh hơn nhiều và tiết kiệm không gian hơn trong thực tế, vì nó có thể được thực hiện bằng cách sử dụng kĩ thuật nhân ma trận được tối ưu hóa cao.
Trong khi đối với các giá trị nhỏ của dk, hai cơ chế hoạt động tương tự, additive attention tính tốt hơn attention dot product mà không mở rộng quy mô cho các giá trị lớn hơn của dk. Chúng ta nghi ngờ rằng đối với các giá trị lớn của dk, các dot products tăng về độ lớn đẩy hàm softmax vào các vùng mà nó có gradient cực kỳ nhỏ. Để giải quyết vấn đề này, chúng ta chia tỷ lệ các dot products bằng √1
dk.
Multi-Head Attention
Thay vì thực hiện một chức năng attention duy nhất với các key, value và query theo chiều mô hình, chúng ta thấy sẽ có lợi khi chiếu tuyến tính các query, key và value h lần khác nhau với các phép chiếu tuyến tính đã học lên các chiều dk, dv và dqtương ứng. Trên mỗi phiên bản này của query, key và value, sau đó, chúng ta thực hiện hàm attention song song, mang lại giá trị đầu radv-chiều. Chúng được concat với nhau và một lần nữa được chiếu, dẫn đến các giá trị cuối cùng. Công thức được
mô tả bên dưới.
Hình 13: Minh hoạ về Multi-Head Attention [21]
Multi-head attention cho phép mô hình cùng tham gia vào thông tin từ các không gian con biểu diễn khác nhau ở các vị trí khác nhau. Với một đầu chú ý duy nhất thì tính trung bình hạn chế điều này.
MultiHead(Q,K,V) =Concat(head1, . . . ,headh)WO
wherehead1= Attention(QWiQ,KWKi ,VWVi ) (2) Trong đó các phép chiếu là ma trận trọng sốWiQ∈Rdmodel k,WiK ∈Rdmodel k,WiV ∈Rdmodel v
và WiO∈Rhdvmodel.
Trong đề tài này, chúng ta sử dụng h = 8 head song song. Đối với mỗi head, chúng ra sử dụngdk =dv =dmodel/h = 64. Do kích thước của mỗi phần tử giảm xuống, tổng chi phí tính toán 8 head tương tự như chi phí tính toán một head.
Feed-Forward Networks
Ngoài các attention layer, mỗi layer trong encoder và decoder chứa một fully con- nected feed-forward network, được áp dụng cho từng vị trí riêng biệt và giống hệt nhau. Lớp này bao gồm hai phép biến đổi tuyến tính với kích hoạt ReLU ở giữa.
Trong khi các phép biến đổi tuyến tính giống nhau ở các vị trí khác nhau, chúng sử dụng các tham số khác nhau giữa các layer. Một cách khác để mô tả điều này là hai convolutions với kích thước kernel là 1. Chiều của đầu vào và đầu ra làdmodel = 512, và lớp bên trong có chiềudf f = 2048.
Embeddings và Softmax
Tương tự như các mô hình chuyển đổi trình tự khác, chúng ta sử dụng các phép embeddings đã học để chuyển đổi token đầu vào và token đầu ra thành vectơ. Chúng ta cũng sử dụng phép biến đổi tuyến tính đã học thông thường và hàm softmax để chuyển đổi đầu ra của decoder thành xác suất token tiếp theo được dự đoán.
Positional Encoding
Vì mô hình của chúng ta không chứa recurrence và không có convolution để mô hình sử dụng thứ tự của chuỗi, chúng ta phải đưa một số thông tin về vị trí tương đối hoặc tuyệt đối của token trong chuỗi. Để làm được điều này, chúng ta thêm "po- sitional encodings" vào các embedding đầu vào ở stack dưới cùng của encoder và decoder. Các positional encodings có kích thước chiều giống như các phép embed- ding, do đó, hai mã này có thể được tính tổng. Có nhiều sự lựa chọn về positional encodings đã được áp dụng. Trong tranformer sử dụng các hàm sin và cosin của các tần số khác nhau:
PE(pos,2i)= sin(pos/10002i/dmodel)
PE(pos,2i+1)= cos(pos/10002i/dmodel) (4) Trong đó pos là vị trí của token và i là chiều. Nghĩa là, mỗi chiều của positional encodings tương ứng với một hình sin. Các bước sóng tạo thành một cấp tiến hình học từ2π đến 10000·2π. Chúng ta chọn hàm này vì chúng ta đã giả thuyết rằng nó sẽ cho phép mô hình dễ dàng học cách tham dự theo các vị trí tương đối, vì đối với bất kỳ fixed offset k nào,PE(pos+k) có thể được biểu diễn dưới dạng một hàm tuyến tính củaPEpos.
Qua những kiến thức ở trên ta có thể thấy tranformer là một mô hình đã làm rất tốt trong việc xác định ngữ nghĩa của một từ không chỉ được biểu diễn bởi những từ liền trước mà còn được giải thích bởi toàn bộ các từ xung quanh. Luồng phân tích tuân theo đồng thời từ trái qua phải và từ phải qua trái cùng một lúc.
3.4 Mô hình Bidirectional Encoder Representation from Trans-former - BERT