Tất cả thử thách
Trung bình 0 đã giải Tỷ lệ chấp nhận 0%

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.

Bạn sẽ học được gì

  • Giữ k token ứng viên hàng đầu
  • Điều khiển độ ngẫu nhiên bằng temperature
  • Lấy mẫu từ một phân phối xác suất

Đề bài

Xem bản gốc (English)

Mô hình ngôn ngữ chọn token tiếp theo từ một phân phối xác suất. Hai thiết lập định hình phân phối đó:

  • Top-k: chỉ giữ k token có logit cao nhất (nếu logit bằng nhau, chỉ số nhỏ hơn xếp trên).
  • Temperature T: chia các logit được giữ cho T trước khi tính softmax. T thấp làm lựa chọn dễ đoán hơn; T cao làm nó ngẫu nhiên hơn.

Để có thể kiểm thử, số ngẫu nhiên được cho sẵn:

  1. Giữ k token đứng đầu, rồi liệt kê chúng theo chỉ số ban đầu (tăng dần).
  2. Tính softmax(logit / T) trên các token được giữ (trừ giá trị lớn nhất trước khi tính e^x).
  3. Đi qua danh sách và cộng dồn xác suất; trả về chỉ số của token đầu tiên làm tổng cộng dồn lớn hơn random_value. Nếu không có token nào (do làm tròn), trả về token được giữ cuối cùng.

Với k = 1, đây là giải mã tham lam: luôn chọn token khả năng cao nhất.

Hãy cài đặt sample_token(logits, temperature, k, random_value).

Đầu vào

logits: Mỗi token trong từ vựng một điểm.

temperature: T, lớn hơn 0.

k: Số token đứng đầu cần giữ.

random_value: Một số ngẫu nhiên trong [0, 1).

Đầu ra

Trả về chỉ số của token được chọn.

Ràng buộc

1 ≤ k ≤ số logit ≤ 1.000

0 < temperature ≤ 100, 0 ≤ random_value < 1

-100 ≤ mỗi logit ≤ 100

Ví dụ

Ví dụ 1
Đầu vào:
k = 1
logits = [1.0, 3.0, 2.0, 0.5]
temperature = 1.0
random_value = 0.99

Kết quả mong đợi:
expected = 1
Đầu vào:
long long k = 1;
std::vector<double> logits = {1.0, 3.0, 2.0, 0.5};
double temperature = 1.0;
double random_value = 0.99;

Kết quả mong đợi:
long long expected = 1;
Đầu vào:
long k = 1;
double[] logits = new double[] {1.0, 3.0, 2.0, 0.5};
double temperature = 1.0;
double random_value = 0.99;

Kết quả mong đợi:
long expected = 1;

Giải thích

k = 1 chỉ giữ logit cao nhất, 3.0 ở chỉ số 1. Xác suất của nó là 1, nên nó được chọn bất kể số ngẫu nhiên: đây là giải mã tham lam.

Ví dụ 2
Đầu vào:
k = 2
logits = [2.0, 1.0, 0.0]
temperature = 1.0
random_value = 0.8

Kết quả mong đợi:
expected = 1
Đầu vào:
long long k = 2;
std::vector<double> logits = {2.0, 1.0, 0.0};
double temperature = 1.0;
double random_value = 0.8;

Kết quả mong đợi:
long long expected = 1;
Đầu vào:
long k = 2;
double[] logits = new double[] {2.0, 1.0, 0.0};
double temperature = 1.0;
double random_value = 0.8;

Kết quả mong đợi:
long expected = 1;

Giải thích

Top-2 giữ chỉ số 0 và 1 (logit 2 và 1). softmax cho khoảng 0.731 và 0.269. Tổng cộng dồn là 0.731 sau chỉ số 0 (chưa vượt 0.8) và 1 sau chỉ số 1, nên chọn chỉ số 1.

Tham khảo

Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.

Học hỏi từ người khác

Giải pháp cộng đồng

Chưa có giải pháp nào được chia sẻ. Hãy giải thử thách này để đăng giải pháp đầu tiên.