Bài 1: Giải tích (Calculus) — Bộ não của Quá trình Học
Series: Toán học trong AI/ML & Deep Learning
Topics:
calculusgradient-descentbackpropagationoptimization
🎯 Tại sao Giải tích lại quan trọng?
Hãy tưởng tượng bạn bị bịt mắt và thả vào giữa một vùng đồi núi. Nhiệm vụ: tìm điểm thấp nhất (thung lũng).
Chiến lược tốt nhất? Mỗi bước, dùng bàn chân cảm nhận xem hướng nào dốc xuống — rồi bước về phía đó.
Đó chính xác là cách một mô hình AI học: nó dùng Giải tích để “cảm nhận” độ dốc của hàm sai số, rồi điều chỉnh tham số về hướng giảm sai số nhanh nhất.
Loss (sai số)
▲
│
│ ● ← tham số khởi tạo random
│ ↘
│ ● ← sau vài bước GD
│ ↘
│ ★ ← minimum
│
└──────────────── W. (tham số)
1. Đạo hàm — “Tốc độ thay đổi tại một điểm”

Intuition
Đạo hàm $f’(x)$ trả lời câu hỏi: “Nếu tôi tăng $x$ thêm một chút, $f(x)$ thay đổi như thế nào?”
- $f’(x) > 0$: hàm đang tăng tại $x$
- $f’(x) < 0$: hàm đang giảm tại $x$
- $f’(x) = 0$: hàm đứng yên → có thể là cực trị (min/max)
Định nghĩa
\[f'(x) = \lim_{h \to 0} \frac{f(x + h) - f(x)}{h}\]Ví dụ thực tế trong AI
Hàm mất mát đơn giản (MSE cho 1 điểm dữ liệu):
\[L(w) = (y - wx)^2\]Đạo hàm theo $w$:
\[\frac{dL}{dw} = -2x(y - wx)\]import numpy as np
def loss(w, x=2.0, y=4.0):
"""MSE loss: L(w) = (y - w*x)^2"""
return (y - w * x) ** 2
def grad(w, x=2.0, y=4.0):
"""Đạo hàm phân tích: dL/dw = -2x(y - wx)"""
return -2 * x * (y - w * x)
# Kiểm tra bằng numerical gradient (xấp xỉ số)
def numerical_grad(w, eps=1e-5):
return (loss(w + eps) - loss(w - eps)) / (2 * eps)
w = 1.0
print(f"Analytic gradient: {grad(w):.6f}") # → 8.000000
print(f"Numerical gradient: {numerical_grad(w):.6f}") # → 8.000000 ✓
💡 Tip thực chiến: Luôn dùng numerical gradient để kiểm tra khi implement backprop tự tay. Nếu 2 giá trị khác nhau > 1e-4 → có bug.
2. Đạo hàm Riêng — Khi nhiều biến cùng xuất hiện

Mô hình thực tế không có 1 tham số — mà có hàng triệu. Đạo hàm riêng giúp ta đo “ảnh hưởng của từng tham số” khi giữ các tham số còn lại cố định.
\[\frac{\partial L}{\partial w_j} = \text{"L thay đổi thế nào nếu chỉ } w_j \text{ thay đổi?"}\]Ví dụ: Linear regression 2 biến
\[L(w_1, w_2) = (y - w_1 x_1 - w_2 x_2)^2\] \[\frac{\partial L}{\partial w_1} = -2x_1(y - w_1 x_1 - w_2 x_2)\] \[\frac{\partial L}{\partial w_2} = -2x_2(y - w_1 x_1 - w_2 x_2)\]import torch
# PyTorch tự tính đạo hàm riêng qua autograd
x = torch.tensor([2.0, 3.0])
y = torch.tensor(10.0)
w = torch.tensor([1.0, 1.0], requires_grad=True)
loss = (y - (w * x).sum()) ** 2
loss.backward()
print(f"∂L/∂w1 = {w.grad[0]:.2f}") # → -20.00
print(f"∂L/∂w2 = {w.grad[1]:.2f}") # → -30.00
3. Gradient — Vector của tất cả đạo hàm riêng

Gradient $\nabla L$ là vector chứa toàn bộ đạo hàm riêng:
\[\nabla L = \begin{bmatrix} \frac{\partial L}{\partial w_1} \\ \frac{\partial L}{\partial w_2} \\ \vdots \\ \frac{\partial L}{\partial w_n} \end{bmatrix}\]Gradient chỉ hướng tăng nhanh nhất của hàm. Để giảm loss, ta đi ngược chiều gradient.
Gradient Descent — Thuật toán cốt lõi
\[w \leftarrow w - \eta \cdot \nabla_w L\]Trong đó $\eta$ (eta) là learning rate — bước nhảy mỗi lần cập nhật.
import numpy as np
import matplotlib.pyplot as plt
# Gradient Descent đơn giản
def gradient_descent(w_init=5.0, lr=0.1, n_steps=50):
"""
Bài toán: minimize L(w) = w^2
Gradient: dL/dw = 2w
Optimal: w* = 0
"""
w = w_init
history = [w]
for step in range(n_steps):
grad = 2 * w # đạo hàm L(w) = w²
w = w - lr * grad # cập nhật tham số
history.append(w)
if step % 10 == 0:
print(f"Step {step:3d}: w={w:.4f}, L={w**2:.4f}")
return history
history = gradient_descent()
# Step 0: w=4.0000, L=16.0000
# Step 10: w=0.4295, L=0.1845
# Step 20: w=0.0461, L=0.0021
# Step 30: w=0.0049, L=0.0000
# Step 40: w=0.0005, L=0.0000 → hội tụ về 0 ✓
Learning rate quá lớn (lr=0.9): Learning rate tốt (lr=0.1):
Loss │ ● Loss │ ●
│ ● │ ●
│ ● ← diverge! │ ●
│ ● │ ●●●___
└──────────────── Steps └──────────────── Steps
4. Chain Rule — Xương sống của Backpropagation

Intuition
Chain rule trả lời: “Nếu A ảnh hưởng đến B, và B ảnh hưởng đến C, thì A ảnh hưởng đến C như thế nào?”
\[\frac{dC}{dA} = \frac{dC}{dB} \cdot \frac{dB}{dA}\]Trong Neural Network
Mạng nơ-ron là chuỗi hàm lồng nhau:
Input x → [Layer 1: z₁ = Wx] → [ReLU: a₁ = max(0,z₁)] → [Layer 2: z₂ = Wa₁] → Loss L
Chain rule cho phép ta tính gradient của Loss ngược từ output về input (Backpropagation):
\[\frac{\partial L}{\partial W_1} = \frac{\partial L}{\partial z_2} \cdot \frac{\partial z_2}{\partial a_1} \cdot \frac{\partial a_1}{\partial z_1} \cdot \frac{\partial z_1}{\partial W_1}\]Ví dụ mini: 2-layer network tự viết
import numpy as np
class TinyNet:
"""2-layer network với chain rule viết tay"""
def __init__(self):
np.random.seed(42)
self.W1 = np.random.randn(3, 4) * 0.1 # (input=3, hidden=4)
self.W2 = np.random.randn(4, 1) * 0.1 # (hidden=4, output=1)
def relu(self, z):
return np.maximum(0, z)
def relu_grad(self, z):
return (z > 0).astype(float)
def forward(self, x):
"""x: shape (batch, 3)"""
self.x = x
self.z1 = x @ self.W1 # (batch, 4)
self.a1 = self.relu(self.z1) # (batch, 4)
self.z2 = self.a1 @ self.W2 # (batch, 1)
return self.z2
def backward(self, y):
"""MSE loss backward — chain rule viết tay"""
batch = self.x.shape[0]
# dL/dz2 = 2/N * (z2 - y)
dz2 = 2 / batch * (self.z2 - y) # (batch, 1)
# dL/dW2 = a1.T @ dz2 [chain rule: ∂L/∂W2 = ∂L/∂z2 · ∂z2/∂W2]
dW2 = self.a1.T @ dz2 # (4, 1)
# dL/da1 = dz2 @ W2.T [chain rule: ∂L/∂a1 = ∂L/∂z2 · ∂z2/∂a1]
da1 = dz2 @ self.W2.T # (batch, 4)
# dL/dz1 = da1 * relu'(z1) [chain rule qua ReLU]
dz1 = da1 * self.relu_grad(self.z1) # (batch, 4)
# dL/dW1 = x.T @ dz1
dW1 = self.x.T @ dz1 # (3, 4)
return dW1, dW2
# Demo
X = np.random.randn(10, 3)
y = np.random.randn(10, 1)
net = TinyNet()
pred = net.forward(X)
dW1, dW2 = net.backward(y)
print(f"dW1 shape: {dW1.shape}") # (3, 4)
print(f"dW2 shape: {dW2.shape}") # (4, 1)
print(f"Gradients computed via chain rule ✓")
5. Jacobian & Hessian — Gradient ở chiều cao hơn

Jacobian — Gradient của vector output
Khi output là vector (không phải scalar), ta cần ma trận Jacobian:
\[J = \begin{bmatrix} \frac{\partial f_1}{\partial x_1} & \cdots & \frac{\partial f_1}{\partial x_n} \\ \vdots & \ddots & \vdots \\ \frac{\partial f_m}{\partial x_1} & \cdots & \frac{\partial f_m}{\partial x_n} \end{bmatrix}\]Trong DL: Jacobian của softmax layer được dùng khi tính backward qua cross-entropy.
Hessian — Đạo hàm bậc 2
\[H_{ij} = \frac{\partial^2 L}{\partial w_i \partial w_j}\]Hessian đo độ cong của loss surface:
- $H > 0$ (positive definite) → cực tiểu cục bộ
- $H < 0$ (negative definite) → cực đại cục bộ
- $H$ có cả eigenvalue dương lẫn âm → saddle point ← phổ biến trong DL!
Loss surface non-convex (neural network):
Loss │
│ local min saddle point
│ ↓ ↓
│ ▲ ___ ∩
│ / \ / \ / \
│ / \__/ X \____
│ / ↑ ← global min (khó tìm!)
└───────────────────────── W
local min
6. Ứng dụng Deep Learning thực tế
6.1 Vanishing Gradient — Kẻ thù của mạng sâu
Khi chain rule nhân nhiều số nhỏ (< 1), gradient về layer đầu gần bằng 0 → weight không cập nhật → mạng không học được.
# Minh họa vanishing gradient
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_grad(x):
s = sigmoid(x)
return s * (1 - s) # max = 0.25 tại x=0!
# Chain rule qua 10 layer sigmoid
gradient = 1.0
for layer in range(10):
x = 0.0 # giả sử input = 0
local_grad = sigmoid_grad(x) # = 0.25
gradient *= local_grad
print(f"Layer {layer+1:2d}: gradient = {gradient:.2e}")
# Layer 1: gradient = 2.50e-01
# Layer 2: gradient = 6.25e-02
# Layer 5: gradient = 9.77e-04
# Layer 10: gradient = 9.54e-07 ← gần như = 0!
Giải pháp: ReLU activation, Residual connections (ResNet), Gradient clipping.
6.2 Adam Optimizer — Gradient Descent nâng cao
Adam kết hợp momentum + adaptive learning rate:
\(m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t \quad \text{(1st moment — mean)}\) \(v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 \quad \text{(2nd moment — variance)}\) \(w_t = w_{t-1} - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t\)
# Adam viết tay để hiểu cơ chế
def adam_step(grad, m, v, t, lr=1e-3, beta1=0.9, beta2=0.999, eps=1e-8):
m = beta1 * m + (1 - beta1) * grad # update 1st moment
v = beta2 * v + (1 - beta2) * grad ** 2 # update 2nd moment
m_hat = m / (1 - beta1 ** t) # bias correction
v_hat = v / (1 - beta2 ** t) # bias correction
update = lr * m_hat / (np.sqrt(v_hat) + eps)
return update, m, v
# Demo
w, m, v = 5.0, 0.0, 0.0
for t in range(1, 101):
grad = 2 * w # gradient của L = w²
update, m, v = adam_step(grad, m, v, t)
w -= update
if t % 20 == 0:
print(f"Step {t:3d}: w={w:.4f}, L={w**2:.6f}")
# Step 20: w=4.9413, L=24.4165 ← Adam chậm hơn GD thuần ở đầu
# Step 40: w=4.6134, L=21.2835
# Step 60: w=3.9476, L=15.5836
# Step 80: w=2.9068, L=8.4495
# Step 100: w=1.6014, L=2.5645
7. Lỗi Phổ biến & Cách Phòng tránh
| Lỗi | Nguyên nhân | Giải pháp |
|---|---|---|
| Exploding gradient | Chain rule nhân nhiều số > 1 | torch.nn.utils.clip_grad_norm_() |
| Vanishing gradient | Chain rule nhân nhiều số < 1 | ReLU, BatchNorm, Residual connections |
Quên zero_grad() | Gradient PyTorch cộng dồn | optimizer.zero_grad() trước backward() |
| Learning rate sai | Không tune lr | Dùng learning rate finder (fastai) hoặc cosine schedule |
| Sai shape trong backprop | Nhầm transpose | Kiểm tra shape từng bước, dùng assert |
8. Checklist “Đã hiểu Giải tích cho AI/ML chưa?”
- Giải thích được đạo hàm là gì mà không dùng công thức
- Tính được đạo hàm của hàm đơn giản (polynomial, sigmoid, ReLU)
- Viết được gradient descent từ đầu bằng NumPy
- Giải thích chain rule và tại sao nó cho phép backprop
- Debug được vanishing gradient bằng cách in gradient norm từng layer
- Biết khi nào dùng Adam vs SGD (hint: Adam default cho Transformer, SGD+momentum cho ConvNet image)
Bảng các đạo hàm thường gặp
Các quy tắc đạo hàm quan trọng
| Rule | Formula |
|---|---|
| Chain rule | $\frac{df}{dx} = \frac{df}{du}\frac{du}{dx}$ |
| Matrix chain rule | $\nabla_X f = \nabla_Y f \cdot \frac{dY}{dX}$ |
| Product rule | $\frac{d}{dx}(uv) = u’v + uv’$ |
| Trace trick | $x^T A x = tr(Axx^T)$ |
| Frobenius norm | $|X|_F^2 = tr(X^TX)$ |
Công thức rất hay gặp trong Deep Learning
| Expression | Gradient |
|---|---|
| $y = Wx + b$ | $\frac{\partial y}{\partial W} = x^T$ |
| $L = |y - \hat{y}|^2$ | $\nabla_W L = 2(y-\hat{y})x^T$ |
| Softmax | $\frac{\partial s_i}{\partial z_j} = s_i(\delta_{ij} - s_j)$ |
| Cross entropy | $\nabla_z L = softmax(z) - y$ |
Cho vector
| Function | Gradient |
|---|---|
| $f(x) = a^T x$ | $\nabla_x f = a$ |
| $f(x) = x^T a$ | $\nabla_x f = a$ |
| $f(x) = x^T x$ | $\nabla_x f = 2x$ |
| $f(x) = |x|_2^2$ | $\nabla_x f = 2x$ |
| $f(x) = x^T A x$ | $\nabla_x f = (A + A^T)x$ |
| $f(x) = x^T A^T x$ | $\nabla_x f = (A + A^T)x$ |
| $f(x) = b^T A x$ | $\nabla_x f = A^T b$ |
| $f(x) = a^T x b$ | $\nabla_x f = ab$ |
| $f(x) = |Ax - b|_2^2$ | $\nabla_x f = 2A^T(Ax - b)$ |
| $f(x) = (Ax)^T(Ax)$ | $\nabla_x f = 2A^T A x$ |
Cho ma trận
| Function | Gradient |
|---|---|
| $f(X) = a^T X b$ | $\nabla_X f = ab^T$ |
| $f(X) = b^T X^T a$ | $\nabla_X f = ab^T$ |
| $f(X) = a^T X^T X b$ | $\nabla_X f = X(ab^T + ba^T)$ |
| $f(X) = a^T X X^T b$ | $\nabla_X f = (ab^T + ba^T)X$ |
| $f(X) = tr(A^T X)$ | $\nabla_X f = A$ |
| $f(X) = tr(X)$ | $\nabla_X f = I$ |
| $f(X) = tr(AXB)$ | $\nabla_X f = A^T B^T$ |
| $f(X) = tr(X^T A X)$ | $\nabla_X f = (A + A^T)X$ |
| $f(X) = tr(A X B X^T)$ | $\nabla_X f = A^T X B^T + A X B$ |
| $f(X) = |X|_F^2$ | $\nabla_X f = 2X$ |
| $f(X) = |AX - B|_F^2$ | $\nabla_X f = 2A^T(AX - B)$ |
| $f(X) = |XA - B|_F^2$ | $\nabla_X f = 2(XA - B)A^T$ |
Đạo hàm log-likelihood và loss
| Function | Gradient |
|---|---|
| $f(x) = \log(x)$ | $\nabla_x f = 1/x$ |
| $f(x) = \log \det(X)$ | $\nabla_X f = (X^{-1})^T$ |
| $f(x) = x^T A^{-1} x$ | $\nabla_x f = 2A^{-1}x$ |
| $f(X) = tr(X^{-1})$ | $\nabla_X f = -X^{-T}$ |
| $f(x) = \sigma(x)$ | $\sigma(x)(1-\sigma(x))$ |
| $f(x) = \log(1 + e^x)$ | $\frac{e^x}{1+e^x}$ |
📚 Tài nguyên tiếp theo
| Tài nguyên | Loại | Ghi chú |
|---|---|---|
| 3Blue1Brown — Neural Networks | Video | Visualization tốt nhất về backprop |
| Deep Learning Book — Ch. 4 (Goodfellow) | Sách | Nền tảng lý thuyết, free online |
| CS231n — Backprop Notes | Bài viết | Stanford, rất rõ ràng |
| fast.ai — Practical DL | Khóa học | Đi từ code → lý thuyết |
🔗 Series tiếp theo
Bài 2: Đại số Tuyến tính — Ngôn ngữ của Dữ liệu
Bài 3: Xác suất — Khi AI Không Chắc Chắn
Nếu bài này hữu ích, hãy chia sẻ cho người đang học AI/ML. Mọi góp ý về lỗi kỹ thuật rất được hoan nghênh.