Giải tích (Calculus).
Updated Mar 12, 2026

Tags: machine learning data science math

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: calculus gradient-descent backpropagation optimization


🎯 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”

derivative

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?”

Đị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

neural network

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

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

chain rule

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

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:

         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?”


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.