Cài đặt tầng tuyến tính Forward & Backward từ đầu bằng NumPy (Linear Layer)
Tầng tuyến tính (Linear Layer / Fully-Connected Layer) là khối kiến trúc cốt lõi nhất của mạng nơ-ron:
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: batched-matrix-multiplication-bmm, chain-rule-composite-scalar-functions.
Nội dung đề bài
Mô tả bài toán
Tầng tuyến tính (Linear Layer / Fully-Connected Layer) là khối kiến trúc cốt lõi nhất của mạng nơ-ron:
- Forward Pass: Cho đầu vào X ∈ RB × Din, ma trận trọng số W ∈ RDin × Dout, và bias b ∈ RDout:
Y = X W + b
- Backward Pass: Khi nhận được đạo hàm của hàm mất mát theo đầu ra dY = ∂ L∂ Y ∈ RB × Dout, tính các đạo hàm:
∂ L∂ X = dY , WT ∈ RB × Din ∂ L∂ W = XT , dY ∈ RDin × Dout ∂ L∂ b = ∑i=1B dYi ∈ RDout
Hãy viết lớp CustomLinear:
__init__(self, in_features: int, out_features: int): khởi tạo W và b với kiểunp.float64.forward(self, X: np.ndarray) -> np.ndarray: tính Y = X W + b, lưu lại X cho backward pass.backward(self, dY: np.ndarray) -> tuple[np.ndarray, np.ndarray, np.ndarray]: tính và trả về tuple(dX, dW, db)dạng NumPy float64.
Input
- Lớp
CustomLinear(in_features,out_features): 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
CustomLinear: 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
layer = CustomLinear(3, 2)
layer.W = np.array([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
layer.b = np.array([0.5, -0.5])
X = np.array([[1.0, 0.0, 1.0], [0.0, 1.0, 0.0]])
Y = layer.forward(X)
dY = np.ones((2, 2))
dX, dW, db = layer.backward(dY)Output
([[ 3., 7., 11.],
[ 3., 7., 11.]], [[1., 1.],
[1., 1.],
[1., 1.]], [2., 2.])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
B, Din, Dout = (4, 3, 2)
layer = CustomLinear(Din, Dout)
layer.W = np.random.randn(Din, Dout)
layer.b = np.random.randn(Dout)
X = np.random.randn(B, Din)
Y = layer.forward(X)
dY = np.random.randn(B, Dout)
dX, dW, db = layer.backward(dY)
h = 1e-06
for i in range(Din):
for j in range(Dout):
layer.W[i, j] += h
Y_plus = layer.forward(X)
layer.W[i, j] -= 2 * h
Y_minus = layer.forward(X)
layer.W[i, j] += h
num_grad = (np.sum(Y_plus * dY) - np.sum(Y_minus * dY)) / (2 * h)Output
()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.
