ai-233Đọc toàn bộ đề miễn phí

Tự xây dựng tầng nhúng Embedding Lookup Table từ ma trận trọng số và Index Slicing

Trong các mô hình ngôn ngữ lớn (LLM), tầng Embedding (nn.Embedding) thực chất là một bảng tra cứu (lookup table) ma trận trọng số W ∈ RV × D, trong đó V là kích…

AICơ bản30 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ủ đề

embeddinglookup-tableautogradindex-slicing

Kiến thức tiên quyết: tensor-reshaping-flattening-squeeze.

Nội dung đề bài

Mô tả bài toán

Trong các mô hình ngôn ngữ lớn (LLM), tầng Embedding (nn.Embedding) thực chất là một bảng tra cứu (lookup table) ma trận trọng số W ∈ RV × D, trong đó V là kích thước từ điển (vocab_size) và D là số chiều vector nhúng (embedding_dim).

Mỗi token ID nguyên i ∈ [0, V-1] được chuyển đổi thành vector hàng thứ i của ma trận W.

Yêu cầu kỹ thuật:

Xây dựng lớp EmbeddingLayer:

  • __init__(self, vocab_size: int, embedding_dim: int, weights: np.ndarray | None = None):
  • Khởi tạo ma trận self.weight shape (V, D). Nếu weights được truyền vào, gán trực tiếp (sao chép weights.copy()). Nếu không, khởi tạo bằng phân phối chuẩn tắc N(0, 0.02).
  • forward(self, indices: np.ndarray) -> np.ndarray:
  • Nhận mảng indices kiểu số nguyên 1D (L,) hoặc 2D (B, L).
  • Kiểm tra tính hợp lệ: nếu có bất kỳ chỉ số nào < 0 hoặc ≥ V, ném ngoại lệ ValueError("Token index out of vocabulary bounds").
  • Trả về tensor embeddings tương ứng: shape (L, D) nếu đầu vào 1D, shape (B, L, D) nếu đầu vào 2D.
  • backward(self, grad_output: np.ndarray, indices: np.ndarray) -> np.ndarray:
  • Nhận grad_output có cùng shape với kết quả forward.
  • Tính đạo hàm đối với ma trận trọng số ∂ L∂ W có shape (V, D).
  • Lưu ý then chốt: Nếu trong indices có các token trùng lặp (ví dụ token 5 xuất hiện 3 lần trong batch), gradient tương ứng phải được cộng dồn (accumulated) chứ không được ghi đè! Sử dụng np.add.at. Các hàng không được tra cứu có gradient bằng 0.

Input

  • Lớp EmbeddingLayer(vocab_size, embedding_dim, weights): 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 EmbeddingLayer: 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

weights = np.array([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]], dtype=np.float64)
emb = EmbeddingLayer(vocab_size=3, embedding_dim=2, weights=weights)
indices = np.array([0, 2, 1])
emb.forward(indices)

Output

[[1., 2.],
 [5., 6.],
 [3., 4.]]

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

weights = np.arange(12, dtype=np.float64).reshape(4, 3)
emb = EmbeddingLayer(vocab_size=4, embedding_dim=3, weights=weights)
batch_indices = np.array([[0, 3], [2, 1]])
emb.forward(batch_indices)

Output

[[[ 0.,  1.,  2.],
  [ 9., 10., 11.]],

 [[ 6.,  7.,  8.],
  [ 3.,  4.,  5.]]]

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ế.

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.