Forward Propagation
Lan truyền xuôi
Khi bạn gửi ảnh cho ChatGPT và nó nhận ra đó là con mèo, quá trình tính toán đi theo hướng nào trong mạng?
Hình minh họa
Hình minh họa
Phóng to một phép tính: W × x + b theo từng phần tử
Bên trong mỗi nơ-ron là một phép nhân ma trận đơn giản. Hãy xem nó diễn ra từng bước một, với đầu vào x = [0.50, 0.80] và trọng số đã được định nghĩa phía trên.
Ma trận trọng số W
Kích thước: 2×2
Vector đầu vào x
Kích thước: 2×1
Vector bias b
Kích thước: 2×1
Tính z₁ và z₂ từng phần tử:
Bước 1/6
z = W.T @ x + b. Hiểu rõ tích vô hướng là nền tảng để đọc bất kỳ công thức học sâu nào — xem lại tại đại số tuyến tính.Hình minh họa
Tín hiệu lan qua 4 lớp ẩn
Trong thực tế, mạng có hàng chục tới hàng trăm lớp. Hãy xem dữ liệu x ∈ ℝ³ lan truyền qua một mạng 5 lớp: input (3) → hidden (4, 4, 3) → output (2). Nhấn Phátđể theo dõi từng lớp "sáng lên" khi tín hiệu tới nó.
Đang ở lớp 1/5: Input — kích thước 3
Hình minh họa
Trọng số ngẫu nhiên vs đã huấn luyện
Forward propagation là phép tính GIỐNG NHAU dù trọng số tốt hay xấu — chỉ kết quả khác. Hãy cho cùng một đầu vào chạy qua 2 bộ trọng số: một bộ mới khởi tạo ngẫu nhiên (vô nghĩa), một bộ đã được huấn luyện (có kỹ năng phân loại).
Khởi tạo ngẫu nhiên
Epoch 0Trọng số W:
z = [0.17, -0.61]
a (ReLU) = [0.17, 0.00]
Đầu ra chỉ là "tiếng ồn" — mạng chưa học được gì nên không phân biệt được lớp.
Đã huấn luyện
Epoch 100Trọng số W:
z = [1.93, -0.51]
a (ReLU) = [1.93, 0.00]
Mạng "phát hiện" các đặc trưng có ý nghĩa. Cùng một công thức, chỉ số khác → kết quả hoàn toàn khác.
Thông điệp: forward pass = công thức cố định. Học nằm ở việc cập nhật W, b — công việc của backpropagation.
Forward Propagation chỉ là hai phép tính lặp đi lặp lại: (1) nhân trọng số + bias → z, (2) hàm kích hoạt → a. Quá trình này đi qua từng lớp của MLP để tạo ra dự đoán cuối cùng. Dù mạng có 3 lớp hay 300 lớp, công thức này vẫn đúng — chỉ lặp lại nhiều hơn.
Bạn đã thấy forward pass tính toán đầu ra. Nhưng kết quả chính xác chưa? Bước tiếp theo sau forward propagation là gì?
Sau forward propagation, mô hình dự đoán ŷ = 0.647 nhưng nhãn thực tế y = 1. Bước tiếp theo là gì?
Mạng có 3 lớp ẩn, mỗi lớp dùng sigmoid. Bạn nhận thấy đầu ra gần như không thay đổi dù x thay đổi mạnh. Lý do khả dĩ nhất?
Giải thích
Lan truyền tiến (Forward Propagation) là quá trình đưa dữ liệu qua mạng để tạo ra dự đoán. Tại mỗi lớp:
Bước 1 — Biến đổi tuyến tính (dựa trên đại số tuyến tính):
Bước 2 — Hàm kích hoạt:
Lặp lại cho mỗi lớp từ đến lớp cuối cùng. Đầu ra cuối là dự đoán của mạng.
Inference (suy luận): Chỉ cần đầu ra cuối, không lưu giá trị trung gian, không tính gradient → nhanh hơn nhiều.
import numpy as np
def forward(X, weights, biases):
"""Forward pass qua mạng nơ-ron — phiên bản gốc."""
a = X # đầu vào ban đầu, shape (batch, input_dim)
cache = [a] # lưu lại cho backprop
for W, b in zip(weights[:-1], biases[:-1]):
z = a @ W + b # biến đổi tuyến tính
a = np.maximum(0, z) # ReLU cho lớp ẩn
cache.append(a)
# Lớp cuối: sigmoid cho phân loại nhị phân
z = a @ weights[-1] + biases[-1]
y_hat = 1 / (1 + np.exp(-z))
cache.append(y_hat)
return y_hat, cachePhiên bản trên dùng NumPy, đơn giản cho mục đích học. Trong thực tế, các thư viện như PyTorch tự động tạo computation graph để backprop:
import torch
import torch.nn as nn
import torch.nn.functional as F
class MLP(nn.Module):
def __init__(self, in_dim=784, hidden=128, out_dim=10):
super().__init__()
self.fc1 = nn.Linear(in_dim, hidden)
self.fc2 = nn.Linear(hidden, hidden)
self.fc3 = nn.Linear(hidden, out_dim)
def forward(self, x):
# Mỗi lớp = Linear(W, b) + activation
h1 = F.relu(self.fc1(x)) # lớp ẩn 1
h2 = F.relu(self.fc2(h1)) # lớp ẩn 2
logits = self.fc3(h2) # đầu ra thô (chưa softmax)
return logits
model = MLP()
x = torch.randn(32, 784) # batch 32 ảnh MNIST
# Huấn luyện: cần gradient
logits = model(x) # computation graph được dựng
# Inference: tắt gradient, nhanh và tiết kiệm RAM
model.eval()
with torch.no_grad():
preds = model(x).argmax(dim=1)Dropout và BatchNorm hoạt động KHÁC giữa chế độ huấn luyện và inference. Quên gọi model.eval() có thể làm đầu ra không ổn định. Một bug thầm lặng nhưng rất phổ biến trong production.- Forward pass = lặp 2 phép tính tại mỗi lớp: z = W·a + b, rồi a = f(z).
- Dữ liệu đi MỘT CHIỀU từ đầu vào → lớp ẩn → đầu ra, không quay lại.
- Đầu ra cuối cùng (ŷ) được so sánh với nhãn thực (y) qua hàm loss.
- Khi huấn luyện: lưu giá trị trung gian cho backpropagation. Khi inference: bỏ qua → nhanh hơn.
- Trọng số W, b dùng chung cho mọi mẫu trong batch — đây là cơ sở để vector hoá trên GPU.
- Vòng lặp huấn luyện: forward → loss → backward → cập nhật trọng số → lặp lại.
Kiểm tra hiểu biết
Trong forward propagation, phép tính nào xảy ra ĐẦU TIÊN tại mỗi nơ-ron?