Mô hình ngôn ngữ sinh văn bản thế nào: temperature và top-k trong Python
Mô hình ngôn ngữ đưa ra một điểm số (logit) cho mỗi token có thể đứng tiếp theo. Các thiết lập lấy mẫu quyết định cách biến điểm số thành lựa chọn; temperature điều khiển độ ngẫu nhiên và top-k chỉ giữ những ứng viên tốt nhất.
Khái niệm bằng lời đơn giản
Mô hình ngôn ngữ đưa ra một điểm số (logit) cho mỗi token có thể đứng tiếp theo. Các thiết lập lấy mẫu quyết định cách biến điểm số thành lựa chọn; temperature điều khiển độ ngẫu nhiên và top-k chỉ giữ những ứng viên tốt nhất.
Xem mô hình ngôn ngữ chọn token tiếp theo ra sao: layer normalization, temperature và lấy mẫu top-k bằng Python thuần.
Ý chính
- Temperature dưới 1 làm đầu ra dễ đoán hơn; trên 1 làm nó sáng tạo hơn.
- Lấy mẫu top-k loại bỏ các token khó xảy ra để văn bản không lạc đề.
- Văn bản được sinh từng token một, mỗi token mới lại được đưa vào làm đầu vào.
- Layer normalization giữ giá trị trong khoảng ổn định khi đi qua nhiều lớp.
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ấn nút xúc xắc để lấy mẫu từ tiếp theo. Giảm temperature hoặc top-k để lựa chọn dễ đoán hơn.
Code ví dụ
import math
import random
# Layer normalization rescales a vector to mean 0 and variance 1.
def layer_norm(x, eps=1e-5):
mean = sum(x) / len(x)
var = sum((v - mean) ** 2 for v in x) / len(x)
return [(v - mean) / math.sqrt(var + eps) for v in x]
print("layer norm:", [round(v, 3) for v in layer_norm([2.0, 4.0, 6.0, 8.0])])
# Next-token scores from a model; temperature and top-k shape the choice.
words = ["cat", "dog", "car", "sky"]
logits = [2.0, 1.5, 0.3, -1.0]
def probabilities(temperature=1.0, top_k=None):
scores = [l / temperature for l in logits]
if top_k: # keep only the k best scores
cutoff = sorted(scores, reverse=True)[top_k - 1]
scores = [s if s >= cutoff else -1e9 for s in scores]
exps = [math.exp(s - max(scores)) for s in scores]
return [e / sum(exps) for e in exps]
for t, k in [(1.0, None), (0.5, None), (1.0, 2)]:
print(f"temperature={t} top_k={k}:", [round(p, 2) for p in probabilities(t, k)])
random.seed(7)
print("sampled:", random.choices(words, weights=probabilities(0.8, 3), k=5))
Kết quả dự kiến
layer norm: [-1.342, -0.447, 0.447, 1.342]
temperature=1.0 top_k=None: [0.54, 0.33, 0.1, 0.03]
temperature=0.5 top_k=None: [0.71, 0.26, 0.02, 0.0]
temperature=1.0 top_k=2: [0.62, 0.38, 0.0, 0.0]
sampled: ['cat', 'cat', 'dog', 'cat', 'cat']
Cách hoạt động
layer_norm() co giãn một vector về trung bình 0 và phương sai 1, như Transformer làm trong mỗi khối. probabilities() chia logit cho temperature rồi áp dụng softmax, nên temperature thấp làm từ đứng đầu dễ được chọn hơn. Top-k đặt mọi điểm số ngoài k điểm tốt nhất gần bằng −∞ trước softmax.
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.
- Chuẩn hóa theo lớp (layer normalization) Chuẩn hóa mỗi hàng về trung bình 0 và phương sai 1, rồi co giãn và dịch chuyển, như mọi khối Transformer. Trung bình
- Lấy mẫu với temperature và top-k Chọn token tiếp theo như mô hình ngôn ngữ: giữ k logit cao nhất, áp dụng temperature rồi lấy mẫu. Trung bình