Đại số tuyến tính: matmul, chuyển vị, einsum

Bài 5/620 phút

Mạng nơ-ron về bản chất là chuỗi phép nhân ma trận xen kẽ hàm phi tuyến. Toán tử @ (hay np.matmul) nhân ma trận; * là nhân từng phần tử — đừng nhầm hai phép này.

matmul.py
X = np.random.rand(32, 784)     # 32 ảnh, mỗi ảnh 784 pixel
W = np.random.rand(784, 128)    # trọng số lớp ẩn
b = np.zeros(128)
H = X @ W + b                   # (32,784) @ (784,128) → (32,128)

# Nhân theo lô: chiều đầu là batch
A = np.random.rand(8, 16, 32); B = np.random.rand(8, 32, 4)
(A @ B).shape                    # (8, 16, 4)

# einsum: viết phép toán bằng chỉ số
np.einsum('bij,bjk->bik', A, B)  # giống A @ B
np.einsum('id,jd->ij', X, X)     # X @ X.T — ma trận tích vô hướng

Quy tắc shape của @: (…, n, k) @ (…, k, m) → (…, n, m) — chiều trong (k) phải khớp. Các hàm hay dùng khác: np.linalg.norm (độ dài vector), np.linalg.solve / lstsq (giải hệ, hồi quy tuyến tính), np.linalg.inv.

?Q có shape (10, 64), K có shape (12, 64). Ma trận điểm attention Q Kᵀ có shape gì?