Kiến trúc transformer là một thiết kế mạng nơ-ron được xây dựng xoay quanh self-attention. Thay vì chủ yếu dựa vào xử lý từng bước một, nó cho phép mỗi token thu thập thông tin từ các token liên quan khác trong chuỗi.

Đó là lý do transformer hoạt động tốt cho ngôn ngữ và các bài toán chuỗi khác. Nếu một từ phụ thuộc vào một từ khác ở rất xa, attention tạo cho mô hình một đường kết nối trực tiếp giữa chúng.

Kiến trúc transformer có nghĩa là gì

Một khối transformer không chỉ áp dụng một công thức duy nhất, nhưng self-attention là ý tưởng trung tâm. Trong self-attention, mỗi token tạo ra ba vector:

  • query, biểu diễn điều mà token này đang tìm kiếm
  • key, biểu diễn điều mà token này cung cấp để đối sánh
  • value, là thông tin có thể được truyền đi

Nếu các biểu diễn token được sắp xếp trong một ma trận XX, một head attention thường tạo thành

Q=XWQ,K=XWK,V=XWVQ = XW_Q, \qquad K = XW_K, \qquad V = XW_V

trong đó WQW_Q, WKW_KWVW_V là các ma trận được học.

Công thức attention tích vô hướng có chia tỷ lệ tiêu chuẩn là

Attention(Q,K,V)=softmax ⁣(QKTdk)V\operatorname{Attention}(Q, K, V) = \operatorname{softmax}\!\left(\frac{QK^T}{\sqrt{d_k}}\right)V

Ở đây dkd_k là số chiều của key. Việc chia tỷ lệ theo dk\sqrt{d_k} giúp giữ cho các điểm tích vô hướng thô không trở nên quá lớn khi số chiều tăng lên.

Softmax được áp dụng theo từng hàng. Mỗi hàng trả lời câu hỏi của một token: "Tôi nên chú ý đến các token khác ở mức nào?"

Self-attention hoạt động thế nào theo cách dễ hiểu

Self-attention thường không chọn một token rồi bỏ qua tất cả phần còn lại. Nó xây dựng một trung bình có trọng số của các vector value.

Nếu một token khớp mạnh với key của token khác, token đó sẽ nhận trọng số lớn hơn. Nếu mức khớp yếu, trọng số sẽ nhỏ hơn. Vì vậy, đầu ra cho một token là một hỗn hợp thông tin có xét ngữ cảnh từ toàn bộ chuỗi.

Điều này giúp xử lý sự hòa hợp chủ ngữ - động từ, tham chiếu đại từ và các quan hệ xa khác. Mô hình không cần thông tin phải đi qua nhiều bước trung gian trước khi có thể sử dụng được.

Ví dụ self-attention có lời giải

Xét một query và hai token ứng viên trong một attention head. Để phép tính đơn giản, dùng dk=1d_k = 1.

Giả sử token hiện tại có query

q=[2]q = [2]

và hai token ứng viên có

k1=[2],k2=[1]k_1 = [2], \qquad k_2 = [1]

với các value

v1=[10],v2=[4].v_1 = [10], \qquad v_2 = [4].

Các điểm attention thô là các tích vô hướng:

qk1T=4,qk2T=2.qk_1^T = 4, \qquad qk_2^T = 2.

dk=1d_k = 1, hệ số chia tỷ lệ là 1=1\sqrt{1} = 1, nên các điểm đã chia tỷ lệ vẫn là 4422.

Bây giờ áp dụng softmax cho hai điểm đó:

α1=e4e4+e20.881,α2=e2e4+e20.119.\alpha_1 = \frac{e^4}{e^4 + e^2} \approx 0.881, \qquad \alpha_2 = \frac{e^2}{e^4 + e^2} \approx 0.119.

Đầu ra attention là tổ hợp có trọng số

α1v1+α2v2=0.881(10)+0.119(4)9.29.\alpha_1 v_1 + \alpha_2 v_2 = 0.881(10) + 0.119(4) \approx 9.29.

Ý chính rất đơn giản: đầu ra nằm gần v1v_1 hơn vì query khớp với k1k_1 mạnh hơn so với k2k_2.

Đây là mẫu cơ bản bên trong một mô hình lớn hơn nhiều. Transformer thực tế làm điều này trong không gian nhiều chiều hơn và trên nhiều token cùng lúc, nhưng ý tưởng tính toán vẫn giống nhau.

Còn gì khác bên trong một khối transformer

Transformer không chỉ là một công thức attention. Một khối tiêu chuẩn thường chứa:

  • multi-head attention, để mô hình có thể học nhiều kiểu quan hệ cùng lúc
  • một mạng feedforward theo từng vị trí, biến đổi biểu diễn của mỗi token sau attention
  • các kết nối residual, giúp bảo toàn và tinh chỉnh thông tin qua các tầng
  • layer normalization, giúp quá trình huấn luyện ổn định hơn

Trong kiến trúc transformer gốc cho các bài toán sequence-to-sequence, mô hình có một chồng encoder và một chồng decoder.

  • Encoder dùng self-attention trên chuỗi đầu vào.
  • Decoder dùng masked self-attention để một vị trí không thể nhìn trước các token đầu ra trong tương lai.
  • Decoder cũng có thể dùng cross-attention, trong đó query đến từ decoder còn key và value đến từ đầu ra của encoder.

Nhiều mô hình ngôn ngữ hiện đại chỉ dùng phía decoder. Ý tưởng attention cốt lõi vẫn còn đó, nhưng kiến trúc tổng thể được chuyên biệt hóa cho dự đoán token tiếp theo.

Vì sao transformer cần thông tin vị trí

Chỉ riêng attention là permutation-equivariant đối với các token đầu vào. Nói đơn giản, nếu bạn chỉ áp dụng attention lên cùng một tập vector token mà không thêm vị trí, mô hình vốn dĩ không biết token nào đến trước.

Đó là lý do transformer thêm thông tin vị trí, chẳng hạn như position embedding được học hoặc positional encoding. Nếu không có tín hiệu bổ sung đó, các bài toán nhạy với thứ tự như ngôn ngữ sẽ khó được mô hình hóa chính xác hơn nhiều.

Những hiểu lầm thường gặp về kiến trúc transformer

Nghĩ rằng attention là toàn bộ transformer

Đó là ý tưởng trung tâm, nhưng kiến trúc còn phụ thuộc vào các tầng feedforward, đường residual, chuẩn hóa và thông tin vị trí.

Nhầm lẫn giữa self-attention và cross-attention

Trong self-attention, QQ, KKVV đến từ cùng một chuỗi. Trong cross-attention, chúng không phải tất cả đều đến từ cùng một nguồn.

Quên vai trò của masking

Các mô hình ngôn ngữ chỉ dùng decoder cần causal masking trong cả huấn luyện lẫn suy luận để một token không thể attention tới các token tương lai.

Coi trọng số attention là lời giải thích đầy đủ

Trọng số attention có thể cung cấp thông tin, nhưng chúng không phải bằng chứng đầy đủ về cách mô hình suy luận. Hành vi cuối cùng còn phụ thuộc vào các vector value, các tầng phía sau và các phép biến đổi phi tuyến.

Khi nào các mô hình transformer được sử dụng

Transformer được dùng rộng rãi trong mô hình ngôn ngữ, dịch máy, tóm tắt văn bản, sinh mã, tiếng nói và nhiều bài toán thị giác. Chúng đặc biệt hiệu quả khi các mối quan hệ trong một chuỗi hoặc một tập hợp quan trọng hơn các mẫu cục bộ thuần túy.

Chúng không phải phép màu cho mọi tình huống. Với tập dữ liệu rất nhỏ, ràng buộc thời gian thực nghiêm ngặt hoặc các bài toán mà cấu trúc quy nạp cục bộ là quan trọng nhất, một kiến trúc khác vẫn có thể phù hợp hơn.

Hãy thử một bài tương tự

Lấy một cụm gồm ba từ và tập trung vào một từ. Quyết định xem từ nào trong các từ còn lại nên nhận trọng số attention cao và vì sao, rồi phác thảo một ví dụ query-key-value nhỏ để khớp với trực giác đó.

Nếu muốn đi thêm một bước, hãy tự tính bằng tay một đầu ra attention nhỏ. Đó thường là con đường nhanh nhất để đi từ "Tôi biết công thức" đến "Tôi hiểu kiến trúc đang làm gì."

Cần trợ giúp giải bài?

Tải câu hỏi lên và nhận lời giải từng bước đã được xác minh trong vài giây.

Mở GPAI Solver →