Kiến trúc mạng học sâu: từ nền tảng đến LLM·Chương 1 — Nền tảng để hiểu kiến trúc học sâu

Chế độ xem

Mạng neural học như thế nào: từ dự đoán sai đến cập nhật weight

Bài MLP cho biết một neural network biến input thành output như thế nào. Nhưng nếu weight ban đầu chưa tốt, model lấy gì để sửa chúng?

Phần này tập trung vào cơ chế chung:

forward → loss → gradient → backpropagation → optimizer update

Đây là chuỗi quan trọng nhất cần nhận ra khi đọc bất kỳ training pipeline nào sau này.

Bắt đầu từ một dự đoán sai

Giả sử model dự đoán nguy cơ trượt của một sinh viên là:

y^=0.20\hat{y}=0.20

trong khi nhãn thật là:

y=1y=1

Chỉ biết model “sai” chưa đủ. Ta cần một con số mô tả mức độ sai theo mục tiêu huấn luyện.

Con số đó được tạo bởi loss function.

Forward pass: tính output từ parameter hiện tại

Với model:

y^=f(x;θ)\hat{y}=f(\mathbf{x};\theta)

Forward pass là quá trình đưa x\mathbf{x} qua các layer với parameter θ\theta hiện tại để tạo y^\hat{y}.

Trong MLP:

Forward chưa làm model học. Nó chỉ trả lời:

“Với bộ weight hiện tại, model dự đoán gì?”

Loss function biến sai lệch thành một mục tiêu tối ưu

Loss function ký hiệu:

L=L(y^,y)L=\mathcal{L}(\hat{y},y)

Một số ví dụ quen thuộc:

  • regression: Mean Squared Error (MSE), Mean Absolute Error (MAE);
  • classification: cross-entropy hoặc các biến thể phù hợp bài toán.

Không nên hiểu loss như “phần trăm sai”. Ví dụ loss = 0.7 không có nghĩa model sai 70%.

Giá trị loss phụ thuộc vào chính loss function, cách tổng hợp batch và dữ liệu. Thường ta quan tâm mạnh tới:

  • loss có giảm theo thời gian không;
  • train loss và validation loss khác nhau thế nào;
  • loss có dao động hoặc diverge không.

Một ví dụ đơn giản với squared error

Giả sử regression:

y^=3.0,y=5.0\hat{y}=3.0,\qquad y=5.0

Squared error cho một mẫu:

L=(y^−y)2L=(\hat{y}-y)^2

nên:

L=(3−5)2=4L=(3-5)^2=4

Nếu prediction đổi thành 4.5:

L=(4.5−5)2=0.25L=(4.5-5)^2=0.25

Loss thấp hơn cho thấy prediction gần target hơn theo tiêu chí này.

Trên một batch hoặc cả tập, Mean Squared Error (MSE) là trung bình các squared error:

MSE=1n∑i(yi−y^i)2\mathrm{MSE}=\frac{1}{n}\sum_i(y_i-\hat{y}_i)^2

Với n=1n=1, MSE trùng squared error. Bài 05 dùng đúng định nghĩa có 1/n1/n khi đánh giá regression.

Classification dùng loss khác, nhưng tư tưởng giống nhau: đưa chất lượng prediction về một đại lượng mà thuật toán có thể tối ưu.

Muốn giảm loss, cần biết parameter ảnh hưởng loss thế nào

Giả sử model chỉ có một parameter ww.

Loss là một hàm của ww:

L=L(w)L=L(w)

Nếu thay đổi ww một chút, loss có thể tăng hoặc giảm.

Đạo hàm:

dLdw\frac{dL}{dw}

cho biết độ dốc cục bộ của loss theo ww.

  • đạo hàm dương: tăng ww một chút có xu hướng làm loss tăng;
  • đạo hàm âm: tăng ww một chút có xu hướng làm loss giảm;
  • gần 0: loss thay đổi ít theo ww tại vùng đó.

Ví dụ đọc gradient

Giả sử đang xét weight w1w_1 và tính được:

dLdw1=+0.6\frac{dL}{dw_1} = +0.6

Đọc thành lời: “Theo xấp xỉ tuyến tính, nếu tăng w1w_1 thêm 1 đơn vị thì loss tăng khoảng 0.6.” Bước cập nhật thật nhỏ hơn: nhân với learning rate. Để giảm loss, ta cần giảm w1w_1.

Ngược lại nếu:

dLdw2=−0.3\frac{dL}{dw_2} = -0.3

Đọc thành lời: “Nếu tăng w2w_2 thêm 1 đơn vị, loss giảm khoảng 0.3 theo xấp xỉ tuyến tính.” Để giảm loss, ta nên tăng w2w_2.

Gradient descent dùng đúng logic này: luôn đi ngược dấu gradient.

Với hàng triệu parameter, ta gom tất cả đạo hàm riêng vào gradient:

∇θL\nabla_{\theta}L

Gradient không phải bản thân việc cập nhật weight

Đây là điểm dễ nhầm.

Gradient cho biết loss thay đổi như thế nào theo parameter.

Backpropagation là thuật toán tính gradient hiệu quả qua chuỗi phép tính của network.

Optimizer dùng gradient để quyết định cập nhật parameter.

Ba khái niệm liên quan nhưng không đồng nghĩa.

Vì sao phải “propagate backward”?

Một weight ở layer đầu không tác động trực tiếp tới loss. Nó ảnh hưởng hidden representation, hidden representation ảnh hưởng layer sau, rồi cuối cùng mới ảnh hưởng output và loss.

Để biết WW ảnh hưởng LL thế nào, cần đi qua chuỗi quan hệ này.

Backpropagation dùng chain rule để tính các đạo hàm từ loss ngược qua computational graph.

Tên “backpropagation” không có nghĩa dữ liệu được dự đoán theo chiều ngược. Forward vẫn tạo prediction; backward tính đạo hàm.

Chain rule ở mức toán tối thiểu

Giả sử:

z=wx+bz=wx+b a=ϕ(z)a=\phi(z) L=L(a,y)L=\mathcal{L}(a,y)

Ta muốn biết ww ảnh hưởng loss thế nào:

∂L∂w=∂L∂a∂a∂z∂z∂w\frac{\partial L}{\partial w} = \frac{\partial L}{\partial a} \frac{\partial a}{\partial z} \frac{\partial z}{\partial w}

Đây là chain rule.

Có thể đọc thành lời:

ww ảnh hưởng zz; zz ảnh hưởng aa; aa ảnh hưởng loss. Muốn biết ảnh hưởng từ ww tới loss, ta nối các ảnh hưởng cục bộ lại.

Framework hiện đại tự động tính phần lớn đạo hàm này. Nhưng hiểu chuỗi phụ thuộc giúp tránh xem gradient như một con số bí ẩn.

Gradient descent cập nhật parameter như thế nào?

Dạng đơn giản:

θ←θ−η∇θL\theta \leftarrow \theta-\eta\nabla_{\theta}L

Trong đó:

  • θ\theta: parameter hiện tại;
  • ∇θL\nabla_{\theta}L: gradient;
  • η\eta: learning rate.

Dấu trừ có ý nghĩa: gradient chỉ hướng loss tăng nhanh cục bộ, nên ta đi ngược hướng đó để cố giảm loss.

Ví dụ một parameter

Giả sử:

w=0.50w=0.50

Gradient:

dLdw=0.20\frac{dL}{dw}=0.20

Learning rate:

η=0.10\eta=0.10

Cập nhật:

wnew=0.50−0.10×0.20=0.48w_{new}=0.50-0.10\times0.20=0.48

Một bước update thường nhỏ. Model học bằng rất nhiều bước liên tiếp.

Learning rate quyết định độ lớn bước đi

Learning rate quá nhỏ:

  • mỗi update rất ít;
  • training chậm;
  • có thể cần nhiều bước.

Learning rate quá lớn:

  • update có thể vượt qua vùng tốt;
  • loss dao động mạnh;
  • thậm chí diverge.

Learning rate là một trong những hyperparameter quan trọng nhất của training.

Vì sao không dùng toàn bộ dataset cho mỗi update?

Nếu dataset có hàng triệu mẫu, tính gradient trên toàn bộ dữ liệu trước mỗi update rất tốn chi phí.

Ta thường chia training set thành mini-batch.

Ví dụ:

  • training set: 10.000 mẫu;
  • batch size: 100;
  • khoảng 100 batch tạo thành một lượt đi qua dataset.

Mỗi batch có thể tạo một update parameter.

Gradient của một mini-batch chỉ là ước lượng từ một phần dữ liệu, vì vậy loss theo từng batch có thể dao động.

Epoch là gì?

Một epoch thường nghĩa là model đã đi qua toàn bộ training set một lần.

Nếu training set có 10.000 mẫu và batch size = 100:

100 batch ≈ 1 epoch

Train 20 epoch nghĩa là model đã có khoảng 20 lượt đi qua toàn bộ training set, thường với thứ tự batch được shuffle giữa các epoch.

Epoch là đơn vị theo dõi tiện lợi, không phải một cơ chế học riêng.

SGD và Adam nằm ở đâu?

Stochastic Gradient Descent (SGD) và Adam là optimizer.

SGD cơ bản dùng gradient để update parameter. Adam bổ sung cơ chế theo dõi thống kê của gradient để điều chỉnh update theo từng parameter.

Ở mức nhập môn, không cần thuộc công thức Adam. Chỉ cần đặt đúng nó trong pipeline:

backpropagation → gradients → SGD/Adam → updated parameters

Không nên nói “Adam tính backpropagation”. Backpropagation tính gradient; Adam sử dụng gradient.

Một training step đầy đủ

Với một batch:

Sau đó batch tiếp theo đi qua model với parameter vừa cập nhật.

Đây chính là logic mà tài liệu PyTorch dùng để mô tả optimization loop: prediction, loss, derivatives/gradients và parameter update.

Tại sao loss không giảm đều ở từng batch?

Người mới thường mong đợi:

0.9 → 0.8 → 0.7 → 0.6 → ...

Nhưng log thật có thể:

0.91 → 0.84 → 0.88 → 0.76 → 0.79 → ...

Điều này không tự động là lỗi vì:

  • mỗi batch chứa các mẫu khác nhau;
  • một batch có thể khó hơn batch khác;
  • gradient mini-batch có nhiễu;
  • data augmentation có thể làm input thay đổi;
  • optimizer có momentum hoặc cơ chế update phức tạp hơn.

Thường nên xem xu hướng theo nhiều batch hoặc theo epoch, không kết luận từ một giá trị đơn lẻ.

Tại sao train loss giảm nhưng model vẫn có thể kém?

Optimizer chỉ biết mục tiêu mà ta đưa cho nó trên training data.

Nếu model quá linh hoạt, nó có thể giảm train loss bằng cách khớp rất sát dữ liệu đã thấy nhưng hoạt động kém trên dữ liệu mới. Đây là overfitting.

Vì vậy training luôn cần validation để theo dõi khả năng tổng quát hóa.

Bài 04 sẽ đặt training loop vào quy trình dữ liệu hoàn chỉnh.

Một vài vấn đề gradient ở mức nâng cao

Vanishing gradient

Khi gradient truyền qua nhiều layer, nó có thể trở nên rất nhỏ. Các layer đầu nhận tín hiệu cập nhật yếu và học chậm.

Exploding gradient

Gradient có thể tăng quá lớn, làm update thiếu ổn định.

Các kiến trúc, activation, normalization, initialization và optimizer hiện đại đều có nhiều kỹ thuật để giảm các vấn đề này.

Chưa cần giải quyết chi tiết ở chủ đề 1. Mục tiêu hiện tại là nhận ra rằng độ sâu của mạng không chỉ ảnh hưởng khả năng biểu diễn mà còn ảnh hưởng khả năng tối ưu.

Backpropagation không “giải” bài toán theo công thức đóng

Training neural network thường là tối ưu lặp.

Ta không tính một lần rồi thu được bộ weight hoàn hảo. Thay vào đó:

batch 1 → update
batch 2 → update
...
epoch 1
...
epoch N

Kết quả cuối cùng còn phụ thuộc:

  • initialization;
  • optimizer;
  • learning rate;
  • batch size;
  • dữ liệu;
  • số epoch;
  • regularization;
  • architecture.

Đó là lý do hai lần train cùng một architecture có thể không cho weight hoàn toàn giống nhau.

Một dòng log nên được đọc thế nào?

Ví dụ:

Epoch 8 | train_loss=0.42 | val_loss=0.51

Không thể kết luận model “tốt” chỉ từ một dòng. Nhưng có thể đặt đúng câu hỏi:

  1. train loss có giảm so với epoch trước không?
  2. val loss có giảm không?
  3. khoảng cách train–val có tăng không?
  4. metric nhiệm vụ có cải thiện không?
  5. learning rate hiện tại là bao nhiêu?

Đây chính là kỹ năng cần có trước khi bước sang quy trình training đầy đủ.

Nếu chỉ nhớ 9 ý

  • Forward tạo prediction bằng parameter hiện tại.
  • Loss biến sai lệch thành mục tiêu tối ưu.
  • Gradient mô tả loss thay đổi theo parameter.
  • Backpropagation tính gradient qua network bằng chain rule.
  • Optimizer dùng gradient để update parameter.
  • Learning rate điều khiển độ lớn update.
  • Mini-batch cho phép update từ một phần training set.
  • Epoch là một lượt đi qua toàn bộ training set.
  • Train loss giảm chưa đủ; cần xem validation để đánh giá generalization.

Câu hỏi tự kiểm tra

  1. Backpropagation và optimizer khác nhau ở đâu?
  2. Nếu gradient của một weight dương, gradient descent cơ bản sẽ có xu hướng tăng hay giảm weight đó?
  3. Learning rate quá lớn có thể gây hiện tượng gì?
  4. Vì sao loss theo từng batch không nhất thiết giảm đều?
  5. Một epoch có đồng nghĩa với một lần update parameter không?
  6. Train loss giảm liên tục nhưng val loss tăng gợi ý vấn đề gì?
  7. Chain rule giúp backpropagation giải quyết quan hệ giữa weight ở layer đầu và loss cuối mạng như thế nào?

Tài liệu tham khảo và đọc thêm