GNN: từ dữ liệu đồ thị đến message passing và GCN
Bài này trả lời: khi dữ liệu gồm thực thể và mối quan hệ, làm sao một mạng neural dùng được mối quan hệ đó, thay vì chỉ vector của từng thực thể. Thực thể là nút (node). Mối quan hệ là cạnh (edge). Họ mạng này là mạng nơ-ron đồ thị, GNN. Bạn chỉ cần biết vector, một dãy số, và láng giềng: nút nối trực tiếp bằng một cạnh. Bài không giả định bạn đã gặp GCN. Bài không chứng minh phổ Laplacian, không so hết GraphSAGE, GAT hay GIN, và không hướng dẫn cài thư viện.
Đường đọc nhanh: mục 1, 2, 6, 7, 9 và 16. Bỏ qua mục Đào sâu (mục 11, tích chập phổ) cho đến sau mục 16.
1. Tại sao cần một họ mạng riêng cho graph?
Lân cận là phần tử được phép ảnh hưởng tới phần tử đang tính. MLP chỉ nhận vector, không có láng giềng cố định. CNN lấy ô ảnh quanh pixel. RNN đi theo chuỗi. Transformer cho token chú ý lẫn nhau. GNN lấy lân cận từ cạnh.
| Kiến trúc | Cấu trúc dữ liệu | Lân cận được xác định như thế nào? |
|---|---|---|
| MLP | vector/bảng | không có quan hệ lân cận cố định |
| CNN | lưới ảnh | pixel xung quanh theo vị trí không gian |
| RNN/LSTM/GRU | chuỗi | phần tử trước/sau theo thứ tự |
| Transformer | tập/chuỗi token | attention có thể nối mọi token với nhau |
| GNN | graph | lân cận do edge trong dữ liệu định nghĩa |
Graph xuất hiện khi quan hệ giữa các thực thể là một phần của dữ liệu, không chỉ là metadata phụ.
Ví dụ:
| Bài toán | Node | Edge | Feature ví dụ | Dự đoán |
|---|---|---|---|---|
| Mạng trích dẫn | bài báo | A trích dẫn B | embedding tiêu đề/abstract | chủ đề bài báo |
| Mạng xã hội | tài khoản | follow/kết bạn | hồ sơ, hành vi | fraud, community |
| Hệ gợi ý | user, item | click/mua/rating | hồ sơ + thuộc tính item | tương tác tiếp theo |
| Phân tử | nguyên tử | liên kết hóa học | loại nguyên tử, điện tích | độc tính/tính chất phân tử |
| Giao thông | nút giao/đoạn đường | kết nối đường | lưu lượng, tốc độ | dự báo congestion |
| Knowledge graph | thực thể | quan hệ có kiểu | embedding thực thể/quan hệ | link prediction |
Một test đơn giản:
Nếu xóa toàn bộ edge mà bài toán vẫn gần như không đổi, có thể bạn không cần GNN. Nếu xóa edge làm mất thông tin cốt lõi, graph learning đáng để cân nhắc.
2. Graph trong máy tính: từ khái niệm đến tensor
Một đồ thị là một tập nút cùng một tập cạnh. Ký hiệu gói hai tập đó lại:
trong đó:
- : tập node, ;
- : tập edge, .
Node feature là vector số của từng nút. Edge feature là vector của cạnh, khi quan hệ có thuộc tính riêng. Ma trận kề là bảng vuông: ô bằng 1 nếu có cạnh, bằng 0 nếu không.
- : node feature;
- : edge feature nếu có;
- : adjacency matrix;
- : nhãn ở mức node, edge hoặc graph.
GNN không học thuộc bảng kề. Nó viết lại vector mỗi nút bằng chính nút đó và các nút có cạnh nối với nó.
Ví dụ graph 4 node:
Nếu đánh số nút theo thứ tự , bảng kề của đồ thị bốn nút trên là:
Điểm cần chú ý: thứ tự đánh số node do ta chọn. Graph không thay đổi ý nghĩa chỉ vì đổi tên A thành node 17.
2.1 Có hướng và vô hướng
- Vô hướng: quan hệ hai chiều, ví dụ “là bạn”.
- Có hướng: quan hệ có chiều, ví dụ “A trích dẫn B”.

Edge vô hướng và có hướng. Nguồn: Sanchez-Lengeling et al., Distill (2021), CC-BY 4.0.
Trong code, graph vô hướng thường được lưu thành hai edge có hướng ngược nhau để message có thể truyền cả hai chiều.
2.2 Homogeneous và heterogeneous graph
- Homogeneous graph: một kiểu node/edge chính. Ví dụ citation graph: node đều là paper.
- Heterogeneous graph: nhiều kiểu node/edge. Ví dụ recommender:
- node type:
user,movie; - edge type:
user --rates--> movie,user --follows--> user.
- node type:
Đây không chỉ là khác biệt cách lưu dữ liệu. Với heterogeneous graph, từng loại quan hệ có thể cần tham số và phép biến đổi riêng.
3. Ba mức dự đoán cơ bản
3.1 Node-level
Ở mức nút, mô hình trả một dự đoán riêng cho từng nút:
Ví dụ: dự đoán chủ đề của từng paper trong Cora.
3.2 Edge-level / link prediction
Ở mức cạnh, mô hình chấm một cặp nút, dù cạnh đó đã có hay đang được hỏi có nên có:
Ví dụ: liệu user có mua item không.
3.3 Graph-level
Ở mức đồ thị, mọi vector nút được gộp thành một dự đoán cho cả đồ thị:
Ví dụ: một phân tử có độc tính hay không.
Sai lầm phổ biến: chọn model trước rồi mới nghĩ task. Với graph, hãy xác định đơn vị cần dự đoán trước: node, edge hay toàn graph.
4. Vì sao MLP thông thường chưa đủ?
Nếu mỗi nút chỉ được biến đổi từ vector của chính nó, một MLP độc lập cho:
Nếu hai graph có cùng node feature nhưng edge khác nhau, MLP này cho output giống hệt. Nó không nhìn thấy topology.
Một cách thô là flatten adjacency matrix rồi nối vào feature, nhưng có ba vấn đề:
- Kích thước thay đổi: graph 10 node và 10.000 node không có cùng kích thước .
- Đánh số node là tùy ý: đổi thứ tự node làm vector flatten thay đổi mạnh dù graph vẫn là graph đó.
- Graph thường thưa: có ô nhưng chỉ edge; lưu dày gây lãng phí.
Ta cần kiến trúc biết tôn trọng cấu trúc graph.
5. Hai tính chất nền tảng: permutation invariance và equivariance
Đổi thứ tự đánh số nút là nhân với một ma trận hoán vị . Feature và bảng kề đổi theo, nhưng đồ thị vẫn là đồ thị đó:
Với dự đoán theo từng nút, đầu ra phải bị xáo cùng cách với đầu vào. Đó là permutation equivariance, đồng biến theo hoán vị:
Với một số cho cả đồ thị, xáo nút không được đổi kết quả. Đó là permutation invariance, bất biến theo hoán vị:
sum, mean và max gộp láng giềng vì chúng không phụ thuộc thứ tự:
6. Message passing: khuôn mẫu trung tâm của GNN
Message passing là khuôn mẫu chung. Thông điệp là gói số một nút gửi cho nút kề. Gộp là biến nhiều gói thành một tóm tắt, không phụ thuộc thứ tự gói. Rồi nút viết lại vector của mình.
Tại lớp thứ , nút đang giữ một embedding, tức vector biểu diễn đã được biến đổi:
Trước khi học, embedding đó thường chính là feature ban đầu của nút:
Bước 1 — tạo message
Nút đóng gói từ trạng thái hai đầu và từ cạnh, nếu cạnh có feature:
Bước 2 — aggregate
Nút gộp các gói từ láng giềng , các nút nối trực tiếp với :
Bước 3 — update
Vector mới là hàm của vector cũ và của bản tóm tắt vừa gộp:
Có thể nhớ ba động từ: gửi, gộp, cập nhật.

Sơ đồ một message-passing layer. Nguồn: Sanchez-Lengeling et al., Distill (2021), CC-BY 4.0.
6.1 Vì sao khuôn mẫu này linh hoạt?
Ta có thể thay đổi:
- message có dùng edge feature hay không;
AGGlà sum, mean, max hay attention;- có sample hàng xóm hay dùng toàn bộ;
- update bằng linear layer, MLP, GRU hay residual block.
GCN, GraphSAGE, GAT, GIN… chủ yếu là các lựa chọn khác nhau trong khung này.
7. Ví dụ số: tự tính một vòng message passing
Lấy nút với feature hai chiều:
Hai láng giềng của mang feature:
Giả sử:
- message = embedding của hàng xóm;
- aggregate = mean;
- update = cộng embedding cũ với mean rồi chia 2.
Gộp bằng trung bình cộng hai vector láng giềng cho bản tóm tắt đến :
Cập nhật bằng cách cộng vector cũ của với bản tóm tắt đó rồi chia hai:
Sau một layer, không còn chỉ chứa thông tin của riêng nó.
7.1 Sum và mean khác nhau thế nào?
Bậc (degree) của một nút là số cạnh chạm vào nút đó. Nếu mọi láng giềng đều có feature :
- node có 2 neighbors:
sum = [2,0],mean = [1,0]; - node có 20 neighbors:
sum = [20,0],mean = [1,0].
sum giữ lại phần nào thông tin về số lượng; mean chuẩn hóa theo degree. Không có phép nào luôn tốt nhất.
8. Từ message passing sang phép nhân ma trận
Khi thông điệp chỉ là feature của láng giềng và phép gộp là cộng, nút nhận đúng tổng feature các nút kề:
Làm phép cộng đó cho mọi nút cùng lúc chính là nhân ma trận kề với ma trận feature:
Hàng của chỉ giữ các nút nối với , nên nhân ma trận chính là chọn láng giềng.
Với bảng kề và cột feature dưới đây, nút đầu có hai láng giềng mang số 2 và số 4:
Nhân hai ma trận đó ra tổng theo từng hàng, và ô đầu đúng bằng :
9. GCN: từ cộng hàng xóm tới convolution trên graph
Graph Convolutional Network (GCN) của Kipf và Welling là baseline kinh điển: một lớp tuyến tính dùng chung, cộng láng giềng đã cân theo bậc, rồi qua hàm phi tuyến.
Self-loop là một cạnh từ nút tới chính nó. Thêm self-loop vào bảng kề để nút không bị mất feature của mình:
là ma trận bậc của : đường chéo ghi bậc sau khi đã cộng self-loop.
9.1 Thêm self-loop:
Nếu chỉ dùng , node nhận neighbor nhưng có thể mất thông tin chính nó. Thêm nghĩa là node cũng gửi message cho chính mình.
9.2 Chuẩn hóa theo degree
Nếu một nút hub có 10.000 láng giềng và nút khác có 3 láng giềng, cộng thẳng tạo hai thang số rất khác nhau.
GCN nhân mỗi cạnh với một hệ số nhỏ khi bậc hai đầu lớn:
Viết lại cho từng nút, tổng đó chạy trên láng giềng và trên chính nút:
9.3 là phần học được
Phần học được là ma trận trọng số dùng chung cho mọi nút, như lớp tuyến tính của MLP:
9.4 tạo phi tuyến
Hàm phi tuyến phá tính thẳng: ReLU giữ phần dương và xóa phần âm.
Nếu stack nhiều layer mà không có phi tuyến, cả mạng dễ quy về một phép biến đổi tuyến tính lớn.

Sơ đồ GCN cập nhật node từ neighborhood. Nguồn: Sanchez-Lengeling et al., Distill (2021), CC-BY 4.0.
10. Receptive field: một layer nhìn được bao xa?
Một hop là một bước đi dọc đúng một cạnh. Receptive field của một nút là vùng các nút mà thông tin còn tới được nút đó.
Nếu mỗi lớp chỉ truyền tin qua cạnh trực tiếp, vùng nhìn lớn dần theo số lớp:
- 1 layer: 1-hop;
- 2 layers: tối đa 2-hop;
- layers: tối đa -hop.
Stack nhiều lớp làm vùng nhìn tăng, giống CNN. Degree của nút không cố định, nên số nút trong vùng hop có thể tăng rất nhanh.
Ví dụ degree trung bình khoảng 10:
- 1-hop: cỡ 10 node;
- 2-hop: có thể cỡ 100;
- 3-hop: có thể cỡ 1.000.
Trong thực tế có overlap nên không đúng chính xác , nhưng hiện tượng neighborhood explosion vẫn là vấn đề quan trọng khi scale.
11. Đào sâu: vì sao gọi là “convolution” trên graph?
Phần này giải thích vì sao người ta gọi GCN là convolution. Bạn vẫn chạy được GCN chuẩn nếu bỏ qua mục này.
Trong xử lý tín hiệu trên đồ thị, bậc của từng nút được ghi trên đường chéo:
Laplacian chuẩn hóa lấy phần “lệch khỏi láng giềng” của một tín hiệu trên đồ thị:
Ma trận này tách được thành các phương riêng, giống một hệ trục tần số:
Các vector riêng trong giống cơ sở Fourier. Tín hiệu trên nút, một số gắn với mỗi nút, đổi sang miền tần số đó bằng:
Tích chập phổ là nhân tín hiệu, trong miền tần số, với một bộ lọc rồi đổi về miền nút:
Phân tích riêng tốn kém, và bộ lọc có thể không còn cục bộ. GCN của Kipf và Welling rút xấp xỉ bậc thấp đó thành phép lan truyền trên láng giềng:
Điều quan trọng về mặt thực hành:
Bạn không cần tính eigenvector để chạy GCN chuẩn. Công thức cuối cùng được thực hiện bằng sparse neighborhood aggregation.
12. Transductive và inductive: một phân biệt rất hay bị bỏ qua
Transductive: lúc train, đồ thị đã chứa nút sẽ bị chấm, chỉ nhãn bị giấu. Inductive: lúc dự đoán có nút hoặc đồ thị chưa thấy lúc train. Data leakage là tin của phần cần chấm lọt vào train trái protocol.
12.1 Transductive setting
Cora theo split cổ điển thường là ví dụ transductive.
Điều này không đồng nghĩa với data leakage nếu protocol cho phép dùng connectivity và feature của test nodes.
12.2 Inductive setting
Khi inference có node hoặc graph chưa từng xuất hiện khi train.
Ví dụ:
- train trên một số protein graph, test trên protein graph mới;
- social network có user mới;
- hệ recommender liên tục nhận item mới.
Model inductive cần học hàm tạo embedding từ feature + neighborhood, thay vì chỉ lưu embedding riêng cho từng node ID.
GraphSAGE học hàm gộp, nên vẫn mã hóa được nút mới nếu nút đó có feature và láng giềng.
13. Quy trình huấn luyện một GCN node classifier
Giả sử:
- node;
- class;
- model output logits .
Lớp đầu trộn rồi qua ReLU. Lớp sau cho logit, điểm thô trước softmax, của từng nút:
Ma trận ở cả hai lớp là bảng kề đã thêm self-loop và đã chuẩn hóa đối xứng theo bậc:
Nếu chỉ một phần nút có nhãn huấn luyện, loss là cross-entropy trung bình trên đúng các nút đó:
Điểm đặc biệt: forward có thể tạo representation cho mọi node, nhưng loss chỉ tính trên train_mask.
14. Chi phí tính toán: GNN không nhất thiết dùng ma trận
Graph thực tế thường sparse. Ta không cần materialize adjacency matrix dày.
Một lớp đi qua mỗi cạnh tốn số phép tính tỷ lệ với số cạnh nhân số chiều ẩn :
Phép mọi cặp nút thì tỷ lệ với bình phương số nút:
nếu làm dense pairwise computation.
Đây là lý do thư viện như PyTorch Geometric lưu graph bằng edge_index dạng COO:
edge_index.shape = [2, num_edges]
mỗi cột là (source, target).
Ví dụ:
edge_index = [
[0, 0, 1, 2], # source
[1, 2, 3, 3], # target
]
15. GNN đang “học” cái gì?
Một cách hiểu sai là: “GNN chỉ làm trung bình feature của hàng xóm”.
Đúng hơn:
- topology quyết định ai có thể truyền thông tin cho ai;
- layer học phép biến đổi / MLP;
- qua nhiều layer, node embedding mã hóa pattern local quanh node;
- supervision ép embedding hữu ích cho task.
Do đó hai node có feature ban đầu giống nhau vẫn có thể có embedding khác nếu neighborhood khác nhau.
Hai nút có láng giềng đối xứng có thể không phân biệt được bằng message passing cơ bản. Expressive power là khả năng phân biệt hai cấu trúc khác nhau.
16. Những giả định ngầm cần kiểm tra trước khi dùng GNN
16.1 Edge có thật sự mang ý nghĩa không?
Không phải graph nào được tạo ra cũng hữu ích. K-NN graph tạo từ dữ liệu bảng là một thiết kế của người làm mô hình, không phải quan hệ tự nhiên. Kết quả phụ thuộc mạnh vào cách xây edge.
16.2 Neighbor có xu hướng cung cấp thông tin hữu ích không?
Nhiều mô hình kiểu GCN hoạt động rất tốt khi đồ thị có homophily: các nút nối với nhau thường giống nhau về feature hoặc về nhãn.
Đồ thị gian lận có thể ngược lại: tài khoản gian nối với người thường. Đó là heterophily, láng giềng khác nhãn. Trộn mù lúc ấy có thể làm xấu biểu diễn.
16.3 Hướng edge có quan trọng không?
Citation A -> B và B -> A không giống nhau. Tự chuyển mọi graph thành undirected có thể làm mất semantics.
16.4 Edge feature có quan trọng không?
Trong molecule, loại bond rất quan trọng. Dùng GCN chỉ đọc connectivity mà bỏ bond type có thể là một baseline quá yếu.
17. Liên hệ với CNN và Transformer
17.1 GNN với CNN
Giống nhau:
- đều aggregate thông tin từ neighborhood;
- chia sẻ parameter trên nhiều vị trí/node;
- stack layer để tăng receptive field.
Khác nhau:
- CNN có neighborhood cố định trên grid;
- GNN có neighborhood thay đổi theo topology;
- degree của node không cố định;
- graph phải xử lý permutation symmetry.
17.2 GNN với Transformer
Self-attention chuẩn có thể xem như cho mọi token “kết nối” với mọi token khác.
GNN message passing thường giới hạn truyền thông tin theo edge thật.
GAT học trọng số trên cạnh thật. Graph Transformer cho nút nhìn rộng hơn một cạnh, và cần mã hóa cấu trúc để khỏi quên topology.
18. Những ý mang đi
Đồ thị là nút cộng cạnh. Đổi cách đánh số không được đổi kết quả, vì gộp bằng tổng, trung bình hoặc max không phụ thuộc thứ tự.
Một lớp gửi một gói số, gộp láng giềng, rồi viết lại vector. Một lớp nhìn một hop, một bước dọc một cạnh. Hai lớp nhìn tối đa hai hop.
GCN thêm self-loop, cạnh từ nút tới chính nó, và nhân cạnh với để nút bậc cao không át nút khác. Loss chỉ tính trên nút có nhãn train. Đồ thị thưa lưu bằng danh sách cạnh.
Dự đoán là một đầu ra mỗi nút, mỗi cặp, hoặc cả đồ thị. Transductive giấu nhãn nhưng vẫn thấy nút kiểm tra. Inductive mã hóa nút mới. Xóa hết cạnh mà bài toán không đổi thì có thể không cần GNN. Homophily, láng giềng giống nhau, giúp việc trộn. Heterophily, láng giềng khác nhau, có thể làm hại.
Bài sau tách GCN, GraphSAGE, GAT và GIN theo chỗ chúng đổi bước gửi, gộp và cập nhật.
19. Bài tập theo ba mức
Mức A — phải làm được
Cho graph:
Feature của bốn nút là bốn số vô hướng:
- Tính neighbor mean của A.
- Thêm self-loop rồi tính mean mới.
- Sau 2 layer message passing, thông tin từ D có thể tới C không? Giải thích đường đi.
Mức B — hiểu công thức
Với adjacency matrix cho trước:
- tính ;
- tính degree matrix ;
- tính từng hệ số chuẩn hóa ;
- so sánh output của
sum,meanvà GCN normalization.
Mức C — nếu bạn muốn chứng minh
Hàm một lớp dưới đây đồng biến theo hoán vị nút, miễn là chuẩn hóa bậc cũng bị hoán vị cùng cách. Nếu
và hoán vị nút bằng , thì:
20. Tài liệu tham khảo và đọc thêm
- T. N. Kipf, M. Welling, Semi-Supervised Classification with Graph Convolutional Networks, ICLR 2017. https://arxiv.org/abs/1609.02907
- J. Gilmer et al., Neural Message Passing for Quantum Chemistry, ICML 2017. https://arxiv.org/abs/1704.01212
- B. Sanchez-Lengeling et al., A Gentle Introduction to Graph Neural Networks, Distill, 2021. https://distill.pub/2021/gnn-intro/
- M. M. Bronstein et al., Geometric Deep Learning: Grids, Groups, Graphs, Geodesics, and Gauges, 2021. https://arxiv.org/abs/2104.13478
- PyTorch Geometric documentation, hiện tại dòng 2.9.x: https://pytorch-geometric.readthedocs.io/
Các hình Distill dùng trong bài được phát hành theo CC-BY 4.0 trừ khi caption của hình gốc ghi khác; cần giữ attribution khi tái sử dụng.