Khái niệm AI với Python

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ụ

Chạy code →
main.py
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ả.

  1. Đổi đầu vào hoặc trọng số và đoán kết quả trước khi chạy.
  2. In các giá trị trung gian để theo dõi từng bước tính toán.
  3. Giải các thử thách được liên kết bên dưới để tự cài đặt ý tưởng.
Chạy trong Python IDE →

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.

Tất cả thử thách