Self-Attention

Định nghĩa

Self-attention là cơ chế cho phép mỗi token trong cùng một sequence tính mức độ liên quan với các token còn lại, rồi dùng các mức liên quan đó để tạo biểu diễn mới giàu ngữ cảnh hơn cho chính token đó.

Cách hiểu bằng lời của tôi

Thay vì đọc câu từ trái sang phải và hy vọng hidden state giữ đủ thông tin, self-attention cho từng token quyền “nhìn” trực tiếp các token khác trong câu. Token nào quan trọng hơn với ngữ cảnh hiện tại thì nhận trọng số attention cao hơn.

Ví dụ trong câu có nhiều đại từ hoặc quan hệ xa, self-attention giúp model nối token hiện tại với từ mà nó đang tham chiếu, kể cả khi hai từ không đứng gần nhau.

Công thức trực giác

Thay vì dùng embedding cố định cho mỗi token, self-attention tạo embedding mới bằng cách lấy weighted average của toàn bộ sequence.

Nếu input là , output là , trong đó:

Các là attention weights và được chuẩn hóa để:

Cách đọc công thức: representation mới của token được tạo bằng cách trộn tất cả token embeddings , nhưng token nào quan trọng hơn thì có trọng số lớn hơn.

Ví dụ flies trong "time flies like an arrow" nên nhận nhiều thông tin từ timearrow, nên embedding mới của flies nghiêng về nghĩa động từ thay vì nghĩa côn trùng.

Cách tính attention weights

Self-attention thường dùng scaled dot-product attention:

Các bước chính:

  1. Từ mỗi token embedding, tạo ba projection: query, key và value.
  2. Tính dot product giữa query và key để ra attention scores.
  3. Chia scores cho để scale.
  4. Dùng softmax để biến scores thành attention weights.
  5. Lấy tổng có trọng số của value vectors để tạo representation mới.

Query có thể hiểu là “tôi đang tìm gì”, key là “tôi có tín hiệu gì để được chú ý”, value là “nội dung tôi đóng góp nếu được chú ý”.

Với sequence có tokens, attention scores là ma trận . Sau scaling và softmax, attention weights cũng là ma trận , nhưng các giá trị đã được chuẩn hóa thành phân phối trọng số.

Ở mức từng token, bước update dùng value vectors:

Nghĩa là representation mới của token là tổng có trọng số của các value vectors mà token đó chú ý tới.

Ví dụ trực quan

Giả sử câu rút gọn có 3 token:

time | flies | arrow

Ta đang cập nhật representation cho flies.

  • Query của flies hỏi: “Context nào giúp hiểu token này?”
  • Key của time, flies, arrow cạnh tranh để match với query đó.
  • Nếu timearrow liên quan mạnh hơn, attention weights sau softmax có thể là:
Token đóng góp valueAttention weight
time0.45
flies0.10
arrow0.45

Khi đó:

Các con số chỉ để minh họa. Ý nghĩa là embedding mới của flies được contextualize bằng cách lấy nhiều thông tin từ timearrow, nên token này dễ được hiểu là động từ trong "time flies like an arrow" thay vì danh từ “con ruồi”.

Cần biết

  • Self-attention hoạt động trong cùng một sequence; khác với cross-attention, nơi decoder chú ý sang output của encoder.
  • Self-attention tạo contextualized embeddings: cùng một token có thể có representation khác nhau tùy ngữ cảnh.
  • Mỗi token được biến thành ba vector chính: query, key và value.
  • Attention score đo mức phù hợp giữa query của token hiện tại và key của các token khác.
  • Attention Mask có thể được áp dụng trước softmax để che padding hoặc token tương lai.
  • Softmax biến attention score thành trọng số, sau đó model lấy tổng có trọng số của các value vector.
  • Scaling bằng giúp attention scores không quá lớn trước softmax.
  • Multi-Head Attention chạy nhiều attention head song song để học nhiều kiểu quan hệ khác nhau.
  • Self-attention giúp Transformer học quan hệ dài tốt hơn RNN, nhưng chi phí tính toán tăng mạnh theo độ dài sequence.
  • Trong encoder-only models, self-attention thường là Bidirectional Attention, nghĩa là token được nhìn cả context trái và phải.

Liên kết