python-037Đọc toàn bộ đề miễn phí

Cộng Dồn Gradient Không Bộ Đệm Bằng ufunc.at Trong Huấn Luyện AI

Trong quá trình lan truyền ngược (Backpropagation), một câu văn bản đầu vào có thể chứa nhiều từ giống nhau (ví dụ: ["học", "lập", "trình", "và", "học", "AI"] chứa 2 từ "học" cùng…

PythonTrung bình25 phút

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ủ đề

numpyufunc atscatter addembeddingdeep learning

Kiến thức tiên quyết: ufunc methods, advanced indexing, race conditions.

Nội dung đề bài

Mục tiêu kiến thức

  • Hiểu rõ cơ chế đệm (buffering) trong phép gán mảng nâng cao arr[indices] += values của NumPy và hiện tượng mất mát dữ liệu khi có chỉ số trùng lặp.
  • Sử dụng phương thức không bộ đệm np.add.at để thực hiện phép toán Scatter-Add chuẩn xác trong học sâu.
  • Cập nhật gradient cho ma trận nhúng từ (Embedding Matrix) trong mô hình ngôn ngữ lớn.

Mô tả bài toán

Trong quá trình lan truyền ngược (Backpropagation), một câu văn bản đầu vào có thể chứa nhiều từ giống nhau (ví dụ: ["học", "lập", "trình", "và", "học", "AI"] chứa 2 từ "học" cùng có mã vựng token_id = 42). Nếu lập trình viên thực hiện phép gán thông thường: grad_table[token_ids] += grads NumPy sẽ nạp giá trị cũ vào bộ đệm một lần duy nhất, dẫn đến việc gradient của từ "học" thứ hai ghi đè lên từ "học" thứ nhất thay vì cộng dồn cả hai!

Hãy viết hàm: scatter_accumulate_embeddings(vocab_size: int, embed_dim: int, token_ids: np.ndarray, token_grads: np.ndarray) -> np.ndarray

Yêu cầu:

  • Kiểm tra tham số:
  • Nếu vocab_size <= 0 hoặc embed_dim <= 0: ném ngoại lệ ValueError("vocab_size va embed_dim phai > 0").
  • Nếu len(token_ids) != len(token_grads): ném ngoại lệ ValueError("Kich thuoc token_ids va token_grads phai bang nhau").
  • Nếu có bất kỳ chỉ số nào trong token_ids nằm ngoài phạm vi [0, vocab_size - 1]: ném ngoại lệ IndexError("token_id vuot qua vocab_size").
  • Khởi tạo và tích lũy:
  • Khởi tạo ma trận gradient kích thước (vocab_size, embed_dim) toàn số 0 với cùng dtype của token_grads.
  • Sử dụng np.add.at để cộng dồn toàn bộ các gradient vào đúng vị trí dòng trong ma trận, bảo toàn 100% gradient của các token trùng lặp.
  • Kết quả trả về: Ma trận gradient hoàn chỉnh.

Input

  • Các tham số truyền vào hàm/lớp scatter_accumulate_embeddings hoặc dữ liệu đầu vào theo định dạng mô tả.

Output

  • Kết quả trả về của hàm/lớp scatter_accumulate_embeddings hoặc dữ liệu in ra màn hình theo đúng đặc tả.

Ràng buộc

  • 1 ≤ vocab_size ≤ 50000.
  • 1 ≤ embed_dim ≤ 1024.
  • Thời gian chạy tối đa: 1000ms.
  • Giới hạn bộ nhớ: 256MB.

Ví dụ 1

Input

scatter_accumulate_embeddings(vocab_size=5, embed_dim=2, token_ids=[1, 2, 1, 1], token_grads=[[1.0, 1.0], [5.0, 5.0], [2.0, 2.0], [3.0, 3.0]])

Output

[[0.0, 0.0], [6.0, 6.0], [5.0, 5.0], [0.0, 0.0], [0.0, 0.0]]

Giải thích

Hàm được gọi với các tham số mẫu trên và trả về kết quả chính xác theo yêu cầu.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

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.