aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
SAVED POSTS
aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
aedev.net
No Result
View All Result
Minh họa các khái niệm AI, mạng nơ-ron và lập trình trên máy tính

Top-k và top-p: lọc token thế nào trước khi lấy mẫu?

Suong Nguyen by Suong Nguyen
31/10/2026
in AI
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Bạn đổi top-k từ 50 xuống 10 rồi chờ câu trả lời ngắn hơn, nhưng độ dài vẫn gần như cũ. Nguyên nhân là tham số này liên quan tập token có thể được chọn tại một bước sinh. Nó không đặt số token tối đa của toàn bộ câu trả lời.

Bài viết dành cho developer đang đọc cấu hình sinh văn bản. Ví dụ dùng bảng xác suất tự tạo, không tải model và không đo chất lượng câu trả lời. Đối chiếu ngày 31/10/2026 với tài liệu Transformers 4.57.1 để cố định ngữ nghĩa; đây không phải tuyên bố phiên bản mới nhất.

1. Tách bước lọc và bước chọn

Giả sử sau một đoạn văn bản, model đưa ra bốn ứng viên A, B, C, D với xác suất lần lượt 0,45; 0,30; 0,15; 0,10. Các nhãn chỉ là ký hiệu cho token giả định, không phải bốn từ tiếng Việt thật.

Bộ lọc giữ một phần ứng viên. Nếu còn nhiều ứng viên, bước sampling vẫn chọn theo phân phối sau lọc. Giữ hai ứng viên không có nghĩa luôn chọn ứng viên đứng đầu. Khi đã bỏ một ứng viên, việc chuẩn hóa lại xác suất cũng không làm ứng viên đó xuất hiện trở lại.

Trong cấu hình Transformers được dẫn nguồn, do_sample điều khiển có sampling hay không. Đừng chỉ thay top-k/top-p rồi mặc định mọi chiến lược decoding đều dùng chúng theo cùng cách. Khi debug, ghi lại cả cấu hình thực tế của model và chế độ đang chạy.

2. Top-k giới hạn theo số ứng viên

Với bảng trên và k bằng 2, ta giữ A và B. Tổng xác suất còn lại là 0,75. Sau khi chia lại cho tổng này, xác suất là 0,60 và 0,40.

Đây là phép tính trên bảng ví dụ, không phải kết quả inference. Nếu phân phối ở bước tiếp theo thay đổi, hai ứng viên được giữ cũng có thể đổi. Số k cố định không đảm bảo mỗi bước đều loại cùng một lượng xác suất.

3. Top-p giới hạn theo xác suất tích lũy

Với p bằng 0,8, ta đi từ ứng viên có xác suất cao nhất: A đạt 0,45; thêm B đạt 0,75; thêm C đạt 0,90. Phải giữ đến C mới vượt ngưỡng. Phân phối sau chuẩn hóa là 0,50; khoảng 0,3333; khoảng 0,1667.

Với p bằng 0,7, A và B đã đủ. Vì vậy top-p có thể giữ số lượng ứng viên khác nhau khi phân phối thay đổi. Ngưỡng 0,8 không có nghĩa chọn ngẫu nhiên 80% số token trong vocabulary.

4. Tự kiểm tra bằng Python

Chạy đoạn sau bằng Python 3. Nó chỉ minh họa trường hợp xác suất dương, đã chuẩn hóa và không có hòa điểm. Không dùng nó làm bản thay thế đầy đủ cho logits processor của thư viện.

from math import isclose

candidates = [("A", 0.45), ("B", 0.30), ("C", 0.15), ("D", 0.10)]

def normalize(items):
    total = sum(prob for _, prob in items)
    return [(name, prob / total) for name, prob in items]

def top_k(items, k):
    if not 1 <= k <= len(items):
        raise ValueError("k ngoài phạm vi minh họa")
    return normalize(sorted(items, key=lambda pair: pair[1], reverse=True)[:k])

def top_p(items, p):
    if not 0 < p <= 1:
        raise ValueError("p phải thuộc (0, 1]")
    kept, cumulative = [], 0.0
    for item in sorted(items, key=lambda pair: pair[1], reverse=True):
        kept.append(item)
        cumulative += item[1]
        if cumulative >= p:
            break
    return normalize(kept)

k_result = top_k(candidates, 2)
p_result = top_p(candidates, 0.8)
assert [name for name, _ in k_result] == ["A", "B"]
assert [name for name, _ in p_result] == ["A", "B", "C"]
assert isclose(k_result[0][1], 0.6)
assert isclose(sum(prob for _, prob in p_result), 1.0)
print(k_result)
print(p_result)

Đoạn này đã chạy bằng Python 3.9.6. Assertions kiểm tra tập được giữ và phép chuẩn hóa, không kiểm tra GPU, tokenizer hay model. Đổi p thành 0,7 rồi kiểm tra hai nhãn được giữ là bài tập tiếp theo có thể đối chiếu bằng tay.

Lỗi thường gặp và giới hạn

max_new_tokens mới là một tham số giới hạn số token sinh thêm trong cấu hình đang tham chiếu. EOS và điều kiện dừng vẫn có thể kết thúc sớm. Không dùng top-k để thay giới hạn độ dài.

Nếu bật cả hai bộ lọc, cần đọc thứ tự xử lý của thư viện: bộ lọc sau có thể nhận phân phối đã bị thay đổi. Không lấy hai phép tính độc lập ở trên rồi suy ra mọi tổ hợp đều có kết quả tương tự. Hòa điểm, sai số số thực và số token tối thiểu cần giữ cũng là chi tiết triển khai cần kiểm tra.

Cuối cùng, thay sampling không chứng minh nội dung đúng hoặc có nguồn. Hãy giữ một tập câu hỏi đánh giá cố định, ghi cấu hình và xem lại output thực tế trước khi đổi cấu hình sản phẩm. Bảng bốn ứng viên giúp giải thích cơ chế, chưa phải bằng chứng một giá trị phù hợp với bài toán của bạn.

Nguồn tham khảo

  • Transformers 4.57.1: GenerationConfig
  • Transformers 4.57.1: TopK và TopP logits processors
  • Transformers 4.57.1: Generation strategies

Tags: LLMPythonSampling
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Minh họa các khái niệm AI, mạng nơ-ron và lập trình trên máy tính

Pass@k khi đánh giá code AI: đừng đọc như accuracy một lần chạy

by Suong Nguyen
01/11/2026
0

Tính pass@k trên số đếm giả lập để hiểu ngân sách lấy mẫu, điều kiện n ≥ k và cách đọc điểm đánh giá sinh code.

Minh họa các khái niệm AI, mạng nơ-ron và lập trình trên máy tính

Mean pooling embedding: đừng cộng token padding vào vector câu

by Suong Nguyen
30/10/2026
0

Dùng ma trận giả lập để kiểm tra mean pooling có attention mask và phân biệt lỗi pooling với cấu hình encoder.

Minh họa các khái niệm AI, mạng nơ-ron và lập trình trên máy tính

Zero-shot classification: multi_label thay đổi ý nghĩa score như thế nào?

by Suong Nguyen
29/10/2026
0

Phân biệt score cạnh tranh giữa các nhãn với score độc lập trong zero-shot NLI qua một phép tính Python có thể tự kiểm tra.

Minh họa các khái niệm AI, mạng nơ-ron và lập trình trên máy tính

Chấm câu trả lời AI tiếng Việt: kiểm tra Unicode NFC trước khi dùng exact match

by Suong Nguyen
28/10/2026
0

Phân biệt chuỗi nhìn giống nhau với chuỗi bằng nhau, xây metric NFC có phiên bản và giữ lại các khác biệt thực sự về dấu tiếng Việt.

Next Post
Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

SQLite: có FOREIGN KEY nhưng vẫn lọt dữ liệu mồ côi?

0 0 votes
Article Rating
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
AE Dev

AE Dev mang đến các bài viết về lập trình, mobile app, backend, frontend, WordPress và công nghệ, phù hợp cho developer muốn học hỏi và cập nhật kiến thức thực tế.

Recent Posts

  • React Native useColorScheme: đổi theme mà không cache màu từ module
  • Return trong finally có thể che cả return lẫn lỗi ban đầu
  • Android Intent extra: thiếu dữ liệu khác với giá trị 0

Categories

  • AI
  • Backend
  • Đánh giá
  • DevOps
  • Flutter
  • Hướng dẫn
  • Lập trình Mobile
  • Phỏng vấn
  • React Native
  • Uncategorized

Weekly Newsletter

  • Buy JNews
  • Support Forum
  • Pre-sale Question
  • Contact Us

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Trang chủ
  • AI
  • Mobile
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
  • Flutter

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

wpDiscuz
0
0
Would love your thoughts, please comment.x
()
x
| Reply