Vector hóa và hàm tổng hợp theo trục (axis)

Bài 3/620 phút

Vector hóa là viết phép toán trên cả mảng thay vì vòng lặp for. Đây là kỹ năng số 1 khi làm AI: code ngắn hơn và nhanh hơn rất nhiều.

vector_hoa.py
x = np.random.default_rng(0).normal(size=1_000_000)

# Chậm: vòng lặp Python
out = [max(0, v) for v in x]

# Nhanh: vector hóa (ufunc chạy bằng C)
out = np.maximum(0, x)          # ReLU
sig = 1 / (1 + np.exp(-x))      # sigmoid
print(np.sqrt(x**2).mean())

Các hàm tổng hợp sum, mean, max, argmax, std nhận tham số axis — trục sẽ bị gộp lại:

  • axis=0: gộp theo hàng → kết quả cho mỗi cột
  • axis=1 (hoặc -1): gộp theo cột → kết quả cho mỗi hàng
axis.py
X = np.array([[1, 2, 3],
              [4, 5, 6]])
X.sum()            # 21
X.sum(axis=0)      # [5 7 9]   — mỗi cột
X.mean(axis=1)     # [2. 5.]   — mỗi hàng
X.argmax(axis=1)   # [2 2]     — chỉ số lớn nhất mỗi hàng (dự đoán của mô hình!)
X.max(axis=1, keepdims=True)   # [[3] [6]] — giữ chiều để broadcast tiếp

Mẹo nhớ: axis=k nghĩa là chiều thứ k biến mất khỏi shape. X có shape (2, 3) → X.sum(axis=0) có shape (3,).

?X có shape (32, 10) là logits của 32 mẫu, 10 lớp. Lấy lớp dự đoán cho mỗi mẫu bằng cách nào?