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…
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: 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.weightshape (V, D). Nếuweightsđược truyền vào, gán trực tiếp (sao chépweights.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
indiceskiể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_outputcó 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
indicescó 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ụngnp.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ế.
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.
