Kỹ thuật chia sẻ trọng số Weight Tying giữa Embedding và LM Head (Weight Tying)
Trong các mô hình sinh ngôn ngữ như GPT-2, việc chia sẻ cùng một ma trận trọng số W ∈ RV × D giữa tầng Input Embedding và Output Linear LM Head được gọi là Weigh…
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: embedding-lookup-as-linear-layer, linear-layer-forward-backward-numpy.
Nội dung đề bài
Mô tả bài toán
Trong các mô hình sinh ngôn ngữ như GPT-2, việc chia sẻ cùng một ma trận trọng số W ∈ RV × D giữa tầng Input Embedding và Output Linear LM Head được gọi là Weight Tying:
- Ở đầu vào: Token x được ánh xạ thành vector biểu diễn qua lookup: h0 = W[x].
- Ở đầu ra: Vector ngữ cảnh hL ∈ RB × S × D được chiếu thành phân phối logits từ vựng qua phép nhân chuyển vị:
logits = hL WT ∈ RB × S × V Khi lan truyền ngược, ma trận trọng số dùng chung W nhận gradient tích lũy từ CẢ HAI ĐẦU: dWtotal = dWlm_head + dWemb trong đó: dWlm_head = (dlogits)T hL ∈ RV × D dWemb[tid] += dh0[tid]
Hãy viết hàm weight_tying_forward_backward(tokens: np.ndarray, h_L: np.ndarray, W: np.ndarray, dlogits: np.ndarray, dh0: np.ndarray) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
- Nhận mảng 1D
tokenskích thước (N,), ma trận hL (N, D), ma trận trọng số W (V, D). - Gradient từ loss: dlogits (N, V), gradient lan truyền về h0: dh0 (N, D).
- Trả về tuple
(h0, logits, dW_total).
Input
- Hàm
weight_tying_forward_backward(tokens,hL,W,dlogits,dh0): Các tham số đầu vào chứa dữ liệu Tensor/mảng NumPy hoặc giá trị siêu tham số tương ứng.
Output
- Hàm
weight_tying_forward_backward: Trả về kết quả kiểuTuple[np.ndarray, np.ndarray, np.ndarray]theo đúng đặc tả kỹ thuật và kích thước quy định.
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
V, D, N = (10, 4, 3)
W = np.random.randn(V, D)
tokens = np.array([1, 4, 1])
h_L = np.random.randn(N, D)
dlogits = np.random.randn(N, V)
dh0 = np.random.randn(N, D)
h0, logits, dW = weight_tying_forward_backward(tokens, h_L, W, dlogits, dh0)Output
([[ 0.3073, 1.8344, 0.4153, 1.4215],
[-1.3128, -2.1874, 0.1754, 0.2405],
[ 0.3073, 1.8344, 0.4153, 1.4215]], [[ 3.796 , 1.0693, -3.5271, 1.7753, 0.8364, -1.5796, 0.9571, -4.1474,
-0.8826, 0.3889],
[-2.0783, -0.4614, 1.4661, -3.1417, 1.6045, 1.7153, 2.1516, 1.0574,
0.4223, -0.4802],
[ 1.9358, -2.0597, -2.6858, -0.1649, 4.9894, -0.6034, 4.1877, -5.669 ,
1.7716, 1.9246]], [[-6.7431, -1.6826, 0.9178, 1.4009],
[ 7.7856, -0.4064, -1.4938, 1.4715],
[ 7.6467, 0.704 , -0.311 , 0.2092],
[ 7.9092, -1.0197, -1.0144, 0.314 ],
[ 0.632 , 3.6403, -0.7768, -2.0762],
[-1.4414, 1.0282, -0.246 , -1.2008],
[ 2.2044, -0.3546, -0.2177, 0.2247],
[ 1.2482, -0.7251, 0.0343, 0.6804],
[-5.4594, 0.7765, 0.2615, -0.8911],
[ 0.8404, 1.4768, 0.1385, -0.6028]])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
V, D = (3, 2)
W = np.zeros((V, D))
tokens = np.array([0, 0])
h_L = np.zeros((2, D))
dlogits = np.zeros((2, V))
dh0 = np.array([[1.0, 2.0], [3.0, 4.0]])
h0, logits, dW = weight_tying_forward_backward(tokens, h_L, W, dlogits, dh0)Output
([[0., 0.],
[0., 0.]], [[0., 0., 0.],
[0., 0., 0.]], [[4., 6.],
[0., 0.],
[0., 0.]])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.
