Thuật toán Beam Search Decoding cho Ngôn ngữ Sinh
Greedy decoding chỉ nhìn thấy một bước tiếp theo nên dễ rơi vào cực tiểu cục bộ (chọn một từ có xác suất cao ở bước 1 nhưng dẫn tới toàn bộ các bước sau có xác suất cực thấp).
Tiến độ của tôi ở bài này
Điểm được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: next-token-probability-distribution.
Nội dung đề bài
Mô tả bài toán
Greedy decoding chỉ nhìn thấy một bước tiếp theo nên dễ rơi vào cực tiểu cục bộ (chọn một từ có xác suất cao ở bước 1 nhưng dẫn tới toàn bộ các bước sau có xác suất cực thấp).
Beam Search duy trì đồng thời B chuỗi giả thuyết (hypotheses / beams) có tổng log-xác suất cao nhất:
- Khởi tạo tập beams gồm chuỗi ban đầu x0 với điểm số S0 = 0.0.
- Tại mỗi bước:
- Với mỗi beam hiện tại, gọi hàm mô hình
step_fn(tokens) -> logitsđể lấy phân phối xác suất token tiếp theo: log p = log_softmax(z). - Mở rộng beam bằng cách cộng dồn log-xác suất: Snew = S + log pv cho mọi từ vựng v.
- Sắp xếp tất cả các chuỗi mở rộng trên toàn bộ các beams và chọn ra B chuỗi có điểm cao nhất.
- Nếu một beam sinh ra
eos_token_id, beam đó hoàn tất và được chuyển vào danh sách kết quảcompleted. - Dừng khi đạt
max_stepshoặc khi đã có đủ B chuỗi hoàn tất.
Hãy cài đặt lớp SimpleBeamSearch:
__init__(self, beam_width: int, eos_token_id: int, max_steps: int = 10)search(self, step_fn: Callable[[list[int]], np.ndarray], prompt_tokens: list[int]) -> list[tuple[list[int], float]]:- Trả về danh sách các beam tốt nhất kèm theo tổng log-xác suất, sắp xếp theo điểm giảm dần.
Input
- Lớp
SimpleBeamSearch(beam_width,eos_token_id,max_steps): Khởi tạo đối tượng với các tham số, trọng số hoặc cấu hình tương ứng.
Output
- Các phương thức của
SimpleBeamSearch: Trả về kết quả tính toán hoặc cập nhật trạng thái nội bộ của đối tượng.
Ràng buộc
- Thời gian chạy tối đa: 6000ms.
- Giới hạn bộ nhớ: 512MB.
- Dữ liệu đầu vào hợp lệ theo đúng kiểu dữ liệu và miền giá trị được mô tả.
Ví dụ 1
Input
def mock_model(tokens):
if len(tokens) == 0:
return np.array([2.9, 3.0, 0.0])
elif tokens == [1]:
return np.array([0.0, 0.0, 0.0, 0.0, 0.0])
elif tokens == [0]:
return np.array([-10.0, -10.0, 10.0])
return np.array([0.0, 0.0, 0.0])
bs = SimpleBeamSearch(beam_width=2, eos_token_id=2, max_steps=2)
results = bs.search(mock_model, prompt_tokens=[])
best_seq, best_score = results[0]Output
([0, 2], -0.770198)Giải thích
Hàm/lớp được gọi với các tham số mẫu trên và trả về kết quả số học / kích thước tensor tương ứng theo đúng thiết kế.
Ví dụ 2
Input
def mock_model(tokens):
logits = np.full(100, -10.0)
logits[99] = 5.0
return logits
bs = SimpleBeamSearch(beam_width=3, eos_token_id=99, max_steps=5)
results = bs.search(mock_model, prompt_tokens=[1])Output
[([1, 99], -3.0283871168679578e-05), ([1, 0, 99], -15.000060567742338), ([1, 1, 99], -15.000060567742338)]Giải thích
Hàm/lớp được gọi với các tham số mẫu trên và trả về kết quả số học / kích thước tensor tương ứng theo đúng thiết kế.
Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
