Attention và self-attention trong Python
Attention cho phép mỗi token nhìn sang các token khác và quyết định token nào quan trọng. Mỗi token có một query (thứ nó tìm), một key (thứ nó cung cấp) và một value (thông tin nó truyền đi).
Khái niệm bằng lời đơn giản
Attention cho phép mỗi token nhìn sang các token khác và quyết định token nào quan trọng. Mỗi token có một query (thứ nó tìm), một key (thứ nó cung cấp) và một value (thông tin nó truyền đi).
Tự tính scaled dot-product attention với query, key và value, rồi thêm causal mask như GPT.
Ý chính
- Trọng số attention đến từ softmax nên mỗi hàng cộng lại bằng 1.
- Chia cho √d giúp điểm số không quá lớn khi vector dài.
- Causal mask ngăn token nhìn vào các token tương lai khi sinh văn bản.
- Multi-head attention chạy nhiều attention song song, còn positional encoding thêm thông tin thứ tự từ.
Khi nào nên sử dụng?
- Hiểu điều gì diễn ra bên trong mạng nơ-ron và các thư viện AI.
- Nắm ý tưởng trước khi tự cài đặt nó trong các thử thách tương ứng.
- Chuẩn bị cho khóa học machine learning, phỏng vấn và dự án.
Xem trực quan
Nhấp vào một hàng của bản đồ nhiệt để xem token đó nhìn vào đâu. Bật causal mask để ẩn các token tương lai, và đổi độ sắc nét để attention tập trung hơn.
Code ví dụ
import math
def softmax(row):
exps = [math.exp(v - max(row)) for v in row]
return [e / sum(exps) for e in exps]
# Three tokens, each with a query, key and value vector of size 2.
Q = [[1, 0], [0, 1], [1, 1]]
K = [[1, 0], [0, 1], [1, 1]]
V = [[10, 0], [0, 10], [5, 5]]
d = len(K[0])
def attention(causal=False):
out = []
for i, q in enumerate(Q):
# Score: how well this query matches every key, scaled by sqrt(d).
scores = [sum(a * b for a, b in zip(q, k)) / math.sqrt(d) for k in K]
if causal: # a token may only look at itself and earlier tokens
scores = [s if j <= i else -1e9 for j, s in enumerate(scores)]
weights = softmax(scores)
out.append([round(sum(w * v[c] for w, v in zip(weights, V)), 2) for c in range(2)])
return out
print("attention:", attention())
print("causal attention:", attention(causal=True))
Kết quả dự kiến
attention: [[6.02, 3.98], [3.98, 6.02], [5.0, 5.0]]
causal attention: [[10.0, 0.0], [3.3, 6.7], [5.0, 5.0]]
Cách hoạt động
Với mỗi query, điểm số là tích vô hướng của nó với từng key, chia cho √d. Softmax biến điểm số thành trọng số, và đầu ra là trung bình có trọng số của các value. Với causal mask, token đầu tiên chỉ nhìn thấy chính nó, nên đầu ra đúng bằng value của nó là [10, 0].
Thay đổi giá trị và chạy chương trình bằng trình chạy Python online của CodeUtility mà không cần cài Python.
Bài tập mở rộng
Hãy sửa code theo các bài tập dưới đây để hiểu rõ cách hoạt động thay vì chỉ sao chép kết quả.
- Đổi đầu vào hoặc trọng số và đoán kết quả trước khi chạy.
- In các giá trị trung gian để theo dõi từng bước tính toán.
- Giải các thử thách được liên kết bên dưới để tự cài đặt ý tưởng.
Luyện tập với thử thách
Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.
- Mã hóa vị trí dạng sin Tính các vector vị trí dùng sin và cos mà Transformer cộng vào embedding của token. Trung bình
- Scaled dot-product attention Cài đặt phép attention, trái tim của Transformer và các mô hình ngôn ngữ lớn. Khó
- Self-attention nhân quả (có mask) Cài đặt attention có mask mà các mô hình GPT dùng, trong đó mỗi token chỉ được nhìn chính nó và các token trước. Trung bình
- Self-attention nhiều đầu (multi-head) Chiếu đầu vào thành query, key và value, chạy attention song song ở nhiều đầu, rồi kết hợp lại. Khó