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

MLP: mở chiếc hộp neural network đơn giản nhất

MLP - Multilayer Perceptron - là nơi phù hợp để bắt đầu học kiến trúc mạng neural. Không phải vì MLP luôn là model tốt nhất, mà vì nó chứa gần như mọi “bộ phận cơ bản” sẽ xuất hiện lại ở các mạng sâu khác: layer, weight, bias, activation, representation và output.

CNN, RNN, Transformer hay GNN thay đổi cách các phần tử được kết nối và cách thông tin được trao đổi. Nhưng trước khi nhìn những thay đổi đó, cần có một mạng cơ sở đủ đơn giản để quan sát.

Bắt đầu từ một bài toán nhỏ

Tiếp tục ví dụ dự đoán sinh viên có nguy cơ trượt môn từ ba đặc trưng:

x=[x1,x2,x3]\mathbf{x}=[x_1,x_2,x_3]

với:

  • x1x_1: tỷ lệ đi học;
  • x2x_2: tỷ lệ nộp bài;
  • x3x_3: điểm giữa kỳ.

Một mô hình tuyến tính đơn giản có thể tính:

z=w1x1+w2x2+w3x3+bz=w_1x_1+w_2x_2+w_3x_3+b

Sau đó biến zz thành xác suất.

Vấn đề là nhiều quan hệ thực tế không tuyến tính. Chẳng hạn, ảnh hưởng của điểm giữa kỳ có thể khác nhau giữa nhóm đi học đầy đủ và nhóm nghỉ quá nhiều. Ta muốn model tự tạo ra các biểu diễn trung gian thay vì chỉ dùng một phép cộng có trọng số duy nhất.

Đó là vai trò của hidden layer.

Feedforward nghĩa là gì?

Trong một feedforward neural network, thông tin đi theo hướng từ input tới output trong quá trình dự đoán.

Không có vòng phản hồi đưa output của chính bước đó quay lại làm input cho một vòng lặp bên trong mạng.

Deep Learning Book mô tả feedforward network như một phép ánh xạ y=f(x;θ)y=f(x;\theta) mà thông tin đi từ input, qua các phép tính trung gian, tới output. MLP là ví dụ nền tảng của nhóm này.

MLP là gì?

Một MLP thường gồm:

  1. input vector;
  2. một hoặc nhiều hidden layer;
  3. output layer;
  4. các activation phi tuyến giữa những layer phù hợp.

Các hidden layer cổ điển của MLP thường là fully connected hay dense.

“Fully connected” nghĩa là mỗi neuron của layer sau nhận đầu vào từ toàn bộ đầu ra của layer trước.

Một neuron thực hiện phép tính gì?

Với một neuron:

z=w1x1+w2x2+⋯+wnxn+bz=w_1x_1+w_2x_2+\cdots+w_nx_n+b

Sau đó thường có activation:

a=ϕ(z)a=\phi(z)

Trong đó:

  • xix_i: đầu vào;
  • wiw_i: weight;
  • bb: bias;
  • zz: giá trị trước activation;
  • ϕ\phi: activation function;
  • aa: đầu ra của neuron.

Một cách diễn giải vừa đủ:

Neuron tạo một tổ hợp có trọng số của các giá trị đầu vào, rồi biến đổi kết quả qua một hàm phi tuyến.

Không nên hiểu mỗi weight như một “mức độ quan trọng” có ý nghĩa độc lập trong mọi trường hợp. Ở mạng nhiều tầng, ảnh hưởng cuối cùng của một weight phụ thuộc rất nhiều phép biến đổi khác.

Ví dụ tính tay qua một neuron

Lấy sinh viên A với dữ liệu từ bài trước:

x1=0.75x_1=0.75 (tỷ lệ đi học)

x2=0.60x_2=0.60 (tỷ lệ nộp bài)

x3=5.5x_3=5.5 (điểm giữa kỳ)

Giả sử một neuron trong hidden layer có bộ tham số:

w1=0.3,w2=0.5,w3=0.2,b=−0.4w_1=0.3,\quad w_2=0.5,\quad w_3=0.2,\quad b=-0.4

Bước 1 - tính tổ hợp có trọng số:

z=w1x1+w2x2+w3x3+bz = w_1x_1 + w_2x_2 + w_3x_3 + b

z=0.3×0.75  +  0.5×0.60  +  0.2×5.5  +  (−0.4)z = 0.3 \times 0.75 \;+\; 0.5 \times 0.60 \;+\; 0.2 \times 5.5 \;+\; (-0.4)

z=0.225  +  0.300  +  1.100  −  0.400=1.225z = 0.225 \;+\; 0.300 \;+\; 1.100 \;-\; 0.400 = 1.225

Ba feature không cùng thang đo: tỷ lệ đi học và nộp bài nằm trong [0,1][0,1], điểm giữa kỳ là 5.55.5. Thành phần w3x3=1.100w_3x_3=1.100 chiếm gần hết zz. Weight lớn hơn không có nghĩa feature đó “quan trọng hơn” nếu chưa chuẩn hóa. Bài 04 sẽ fit mean/std trên training set trước khi train.

Bước 2 - áp dụng ReLU:

a=ReLU⁡(1.225)=max⁡(0,  1.225)=1.225a = \operatorname{ReLU}(1.225) = \max(0,\; 1.225) = 1.225

Đến đây, neuron này trả về giá trị 1.225. Trong hidden layer thực tế có nhiều neuron, mỗi neuron có bộ weight riêng nên trả về giá trị riêng. Ví dụ 3 neuron trong cùng một hidden layer:

Neuron 1: z = 1.225  → a = 1.225
Neuron 2: z = -0.310 → a = 0.000  (ReLU cắt 0)
Neuron 3: z = 0.740  → a = 0.740

Output của layer: [1.225, 0.000, 0.740]

Vector [1.225, 0.000, 0.740] này trở thành input cho layer tiếp theo.

Viết cả layer bằng ma trận

Nếu input có 3 giá trị và hidden layer có 4 neuron:

x∈R3\mathbf{x}\in\mathbb{R}^{3}

Ta có thể gom toàn bộ weight vào ma trận:

W∈R4×3W\in\mathbb{R}^{4\times3}

và bias:

b∈R4\mathbf{b}\in\mathbb{R}^{4}

Layer tính:

z=Wx+b\mathbf{z}=W\mathbf{x}+\mathbf{b}

rồi:

h=ϕ(z)\mathbf{h}=\phi(\mathbf{z})

Đây chỉ là cách viết gọn cho việc bốn neuron cùng tính toán.

Nếu toán ma trận chưa quen, chỉ cần nhớ kích thước:

3 input → 4 neuron

tạo ra 4 giá trị mới.

Ví dụ matrix nhỏ để hiểu kích thước

Giả sử input có 2 giá trị và hidden layer có 3 neuron:

x=[0.75,  0.60]\mathbf{x}=[0.75,\;0.60]

Ma trận weight WW có kích thước 3×23\times2 (3 neuron, mỗi neuron nhận 2 input):

W=[0.30.50.10.80.60.2]b=[−0.40.1−0.2]W=\begin{bmatrix}0.3 & 0.5\\0.1 & 0.8\\0.6 & 0.2\end{bmatrix}\quad b=\begin{bmatrix}-0.4\\0.1\\-0.2\end{bmatrix}

Tính Wx+bW\mathbf{x}+b:

Neuron 1: 0.3×0.75 + 0.5×0.60 + (-0.4) = 0.225 + 0.300 - 0.400 = 0.125
Neuron 2: 0.1×0.75 + 0.8×0.60 + 0.1   = 0.075 + 0.480 + 0.100 = 0.655
Neuron 3: 0.6×0.75 + 0.2×0.60 + (-0.2)= 0.450 + 0.120 - 0.200 = 0.370

z = [0.125, 0.655, 0.370]

Sau khi áp dụng ReLU (tất cả dương nên giữ nguyên):

h = [0.125, 0.655, 0.370]

2 giá trị đầu vào được biến thành 3 giá trị mới — đó chính xác là representation mà model học được, không phải lập trình viên tự đặt ra.

Hidden layer đang tạo cái gì?

Giả sử input ban đầu có ba đặc trưng. Hidden layer 8 neuron sẽ biến ba giá trị đó thành một vector 8 chiều:

x∈R3→h∈R8\mathbf{x}\in\mathbb{R}^{3} \quad\rightarrow\quad \mathbf{h}\in\mathbb{R}^{8}

Có thể xem h\mathbf{h} là representation - biểu diễn trung gian do model học để phục vụ nhiệm vụ cuối.

Không cần đặt tên cho từng neuron rằng “neuron này là chăm học” hay “neuron kia là thông minh”. Trong đa số mạng sâu, biểu diễn hữu ích được phân tán qua nhiều chiều và không có diễn giải đơn giản như vậy.

Vì sao cần activation phi tuyến?

Đây là điểm bản chất nhất của MLP.

Giả sử hai layer liên tiếp không có activation:

h=W1x\mathbf{h}=W_1\mathbf{x} y=W2h\mathbf{y}=W_2\mathbf{h}

Thay h\mathbf{h} vào:

y=W2W1x\mathbf{y}=W_2W_1\mathbf{x}

Đặt:

W′=W2W1W'=W_2W_1

thì:

y=W′x\mathbf{y}=W'\mathbf{x}

Nghĩa là ghép hai phép biến đổi tuyến tính vẫn chỉ tạo thành một phép biến đổi tuyến tính lớn hơn. Thêm nhiều layer nhưng không có phi tuyến sẽ không tạo ra khả năng biểu diễn như ta mong muốn.

Activation phi tuyến phá vỡ sự rút gọn đó.

Ba activation nên nhận ra

ReLU

ReLU⁡(z)=max⁡(0,z)\operatorname{ReLU}(z)=\max(0,z)

Nếu z<0z<0, đầu ra bằng 0. Nếu z>0z>0, giữ nguyên zz.

ReLU đơn giản và rất phổ biến trong nhiều hidden layer của mạng neural cổ điển/hiện đại.

Sigmoid

σ(z)=11+e−z\sigma(z)=\frac{1}{1+e^{-z}}

Sigmoid đưa giá trị về khoảng (0,1)(0,1), vì vậy thường được dùng để biểu diễn xác suất trong cách trình bày binary classification.

Trong hidden layer sâu, sigmoid không còn là lựa chọn mặc định phổ biến vì gradient có thể rất nhỏ ở các vùng bão hòa.

Tanh

tanh⁡(z)∈(−1,1)\tanh(z)\in(-1,1)

Tanh xuất hiện nhiều trong các mạng neural cổ điển và sẽ gặp lại khi tìm hiểu RNN/LSTM.

Điểm cần nhớ không phải danh sách công thức, mà là:

Activation làm cho mạng có khả năng biểu diễn quan hệ phi tuyến.

Output layer phụ thuộc bài toán

Một MLP không có một dạng output duy nhất.

Regression

Ví dụ dự đoán điểm cuối kỳ:

y^∈R\hat{y}\in\mathbb{R}

Output có thể là một số thực.

Binary classification

Ví dụ dự đoán nguy cơ / không nguy cơ.

Model có thể tạo một logit zz, sau đó sigmoid biến nó thành xác suất:

p=σ(z)p=\sigma(z)

Multi-class classification

Ví dụ phân loại một mẫu thành 4 lớp.

Output layer tạo 4 logits:

z=[z1,z2,z3,z4]\mathbf{z}=[z_1,z_2,z_3,z_4]

Softmax biến chúng thành phân phối xác suất:

pi=ezi∑jezjp_i=\frac{e^{z_i}}{\sum_j e^{z_j}}

với:

∑ipi=1\sum_i p_i=1

Framework thường kết hợp logits và loss theo cách ổn định số học, nên khi code thực tế không nên máy móc thêm sigmoid/softmax mà không đọc đúng API. Series này chưa dùng code, nhưng hiểu logits từ sớm sẽ tránh rất nhiều lỗi sau này.

Logits là gì?

Logits là các giá trị thô model tạo ra trước khi chuyển thành xác suất.

Ví dụ:

[2.1,  0.3,  −1.2][2.1,\;0.3,\;-1.2]

Không phải xác suất vì có số âm và tổng không bằng 1.

Sau softmax, ta nhận một phân phối xác suất cho ba lớp.

Có thể nhớ theo chuỗi:

representation → output layer → logits → xác suất / quyết định

Một MLP hoàn chỉnh trông như thế nào?

Ví dụ:

  • input: 3;
  • hidden 1: 8 neuron + ReLU;
  • hidden 2: 4 neuron + ReLU;
  • output: 1 logit.

Toàn bộ quá trình đi từ input đến output gọi là forward pass.

Đếm parameter của fully-connected layer

Nếu layer có ninn_{in} input và noutn_{out} neuron:

Số weight:

nin×noutn_{in}\times n_{out}

Số bias:

noutn_{out}

Tổng:

(nin+1)nout(n_{in}+1)n_{out}

Ví dụ

Kiến trúc:

3 → 8 → 4 → 1

Layer 1:

3×8+8=323\times8+8=32

Layer 2:

8×4+4=368\times4+4=36

Layer 3:

4×1+1=54\times1+1=5

Tổng:

32+36+5=7332+36+5=73

parameter.

Đếm parameter giúp hiểu chi phí model trước khi cần đọc code.

Vì sao MLP không phải lựa chọn tự nhiên cho ảnh lớn?

Ảnh RGB 224×224224\times224 có:

224×224×3=150,528224\times224\times3=150{,}528

giá trị.

Nếu flatten ảnh thành vector rồi nối vào hidden layer 1.000 neuron, chỉ riêng weight của layer đầu đã khoảng 150,528×1,000≈150.5150{,}528\times1{,}000\approx150.5 triệu.

Chưa kể bias và các layer sau.

Nhưng vấn đề không chỉ là số parameter. Ảnh có cấu trúc không gian: pixel gần nhau thường có quan hệ đặc biệt. Sau khi flatten, MLP không có cơ chế kiến trúc rõ ràng để ưu tiên tính cục bộ và chia sẻ cùng một bộ phát hiện đặc trưng ở nhiều vị trí.

Đây là một trong các động lực quan trọng dẫn tới CNN.

Vì sao MLP không phải lựa chọn tự nhiên cho chuỗi?

Một câu gồm 10 token và một câu gồm 100 token có độ dài khác nhau. Thứ tự token cũng rất quan trọng.

MLP truyền thống thích input có kích thước cố định và không có cơ chế chuyên biệt để mang trạng thái qua thời gian hoặc mô hình hóa quan hệ giữa mọi vị trí trong chuỗi.

Đây là động lực để học RNN, rồi Attention/Transformer.

Vì sao MLP không phải lựa chọn tự nhiên cho graph?

Graph có node, edge và số lượng hàng xóm thay đổi theo node. Đổi thứ tự liệt kê node không nên làm thay đổi ý nghĩa của graph.

MLP thuần không tự có cơ chế tổng hợp thông tin từ neighborhood theo cấu trúc edge.

Đó là động lực cho GNN.

MLP phù hợp ở đâu?

MLP thường hợp lý khi input đã là một vector kích thước cố định, ví dụ:

  • feature vector;
  • embedding vector;
  • dữ liệu cảm biến đã tổng hợp;
  • một số bài toán tabular;
  • classification/regression đơn giản;
  • classification head phía trên representation do model khác tạo ra.

Tuy nhiên, “hợp lý” không có nghĩa “luôn tốt nhất”. Với tabular data, gradient-boosted trees vẫn là baseline rất mạnh trong nhiều tình huống.

Deep và wide khác nhau thế nào?

Một mạng có thể tăng capacity bằng cách:

  • deep hơn: thêm layer;
  • wide hơn: thêm neuron trong một layer.

Ví dụ:

3 → 128 → 1

là một hidden layer khá rộng.

3 → 16 → 16 → 16 → 16 → 1

sâu hơn.

Không có quy tắc “càng sâu càng tốt”. Kiến trúc phù hợp phụ thuộc dữ liệu, regularization, cách tối ưu và tài nguyên.

MLP có thể biểu diễn mọi hàm không?

Có các định lý universal approximation cho thấy feedforward network với điều kiện phù hợp có thể xấp xỉ một lớp rất rộng các hàm.

Nhưng điều này không có nghĩa:

  • một MLP nhỏ sẽ học được mọi bài toán;
  • optimizer chắc chắn tìm được nghiệm tốt;
  • dữ liệu thực tế đủ để học hàm mong muốn;
  • model sẽ generalize tốt trên dữ liệu mới;
  • không cần CNN/Transformer/GNN.

Khả năng biểu diễn về mặt lý thuyết và khả năng học hiệu quả trong thực tế là hai câu hỏi khác nhau.

Những phần MLP chưa trả lời

Đến đây ta biết model tính prediction như thế nào, nhưng chưa biết chính xác parameter được cập nhật ra sao.

Các câu hỏi còn lại:

  • Loss được tạo từ prediction thế nào?
  • Gradient là gì?
  • Backpropagation thực sự làm gì?
  • Optimizer khác backpropagation ở đâu?
  • Learning rate tác động như thế nào?

Đó là nội dung của bài tiếp theo.

Nếu chỉ nhớ 8 ý

  • MLP là feedforward neural network gồm các fully-connected layer.
  • Fully connected nghĩa là mỗi neuron nhận toàn bộ đầu ra của layer trước.
  • Một layer cơ bản tính Wx+bW\mathbf{x}+\mathbf{b} rồi thường qua activation.
  • Activation phi tuyến giúp nhiều layer không bị rút gọn thành một phép biến đổi tuyến tính duy nhất.
  • Hidden layer tạo representation trung gian.
  • Output layer phụ thuộc regression, binary hay multi-class classification.
  • Số parameter của dense layer tăng theo nin×noutn_{in}\times n_{out}.
  • MLP không khai thác cấu trúc ảnh, chuỗi hay graph hiệu quả bằng các kiến trúc chuyên biệt.

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

  1. Layer 10 → 5 có bao nhiêu weight và bao nhiêu bias?
  2. Vì sao hai linear layer liên tiếp không activation vẫn tương đương một linear transform?
  3. Hidden representation là gì?
  4. Logit có phải xác suất không?
  5. Với bài toán 5 lớp, output layer thường cần bao nhiêu logit?
  6. Vì sao flatten một ảnh lớn rồi đưa thẳng vào MLP có thể rất tốn parameter?
  7. Việc một kiến trúc có khả năng xấp xỉ nhiều hàm về lý thuyết có đảm bảo nó học tốt từ dataset thực tế không?

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