Dữ liệu đi vào mạng dưới dạng gì? Vector, tensor, token, embedding và graph
Ở chủ đề 1, ta chủ yếu nhìn dữ liệu như một vector feature rồi đưa vào MLP. Cách nhìn đó đủ để hiểu weight, activation, loss và training. Nhưng nó che đi một điều rất quan trọng:
Dữ liệu không chỉ mang giá trị; dữ liệu còn có cấu trúc.
Một ảnh có vị trí trên-dưới-trái-phải. Một câu có thứ tự trước-sau. Một mạng xã hội có node và edge. Nếu bỏ cấu trúc này quá sớm, model phải tự học lại từ đầu những quan hệ mà ta vốn đã biết.
Đó là lý do tồn tại CNN, RNN, Transformer và GNN.
Bài này chưa học từng architecture. Mục tiêu là học cách nhìn input trước khi chọn architecture.
Bốn mức hình dạng cơ bản: scalar, vector, matrix và tensor
Scalar: một số
Ví dụ:
Điểm giữa kỳ = 7.5
Đây là một scalar.
Ký hiệu có thể là:
Vector: một danh sách số có thứ tự
Ví dụ mô tả một sinh viên bằng ba feature:
Ta có thể đọc là:
[đi học, nộp bài, điểm giữa kỳ]
Vector này có 3 phần tử, nên shape có thể viết là:
(3,)
Matrix: bảng hai chiều
Giả sử một batch có bốn sinh viên, mỗi người ba feature:
Shape là:
(4, 3)
Có thể hiểu là:
4 samples × 3 features
Tensor: tên tổng quát cho mảng nhiều chiều
Trong Deep Learning, tensor thường là tên tổng quát cho một mảng số có một hoặc nhiều chiều.
Ví dụ:
- scalar: tensor 0 chiều;
- vector: tensor 1 chiều;
- matrix: tensor 2 chiều;
- ảnh màu: thường là tensor 3 chiều;
- batch ảnh màu: thường là tensor 4 chiều.
Không cần biến tensor thành một khái niệm bí ẩn. Có thể hiểu đơn giản:
Tensor là một khối số có shape.
Shape quan trọng hơn việc nhìn thấy một đống số
Giả sử có tensor:
(32, 3, 224, 224)
Nếu dùng quy ước phổ biến trong PyTorch, có thể đọc là:
32 ảnh × 3 kênh màu × cao 224 × rộng 224
Tức:
32: batch size;3: RGB;224: height;224: width.
Một số framework hoặc API dùng thứ tự khác, ví dụ (batch, height, width, channels). Vì vậy không nên đoán ý nghĩa dimension chỉ từ con số. Cần biết mỗi trục đại diện cho gì.
Batch dimension: model thường xử lý nhiều mẫu cùng lúc
Một sample đơn lẻ có thể có shape:
(3, 224, 224)
Khi gom 32 ảnh thành một batch:
(32, 3, 224, 224)
Batch dimension không phải một feature của ảnh. Nó chỉ nói rằng ta đang xử lý nhiều sample song song.
Đây là lỗi rất phổ biến của người mới: nhầm batch size với kích thước feature.
Ảnh là tensor, nhưng không phải một bảng số vô nghĩa
Một ảnh grayscale 28×28 có thể được lưu như matrix 28×28. Ảnh RGB 224×224 có thêm dimension channel.
Nhưng điều quan trọng hơn shape là quan hệ không gian:
- pixel ở
(50, 50)gần pixel(50, 51); - cạnh mắt thường được tạo từ các pixel gần nhau;
- hình dạng vật thể được tạo từ các pattern cục bộ ghép lại;
- cùng một pattern có thể xuất hiện ở nhiều vị trí khác nhau.
Nếu flatten ảnh 28×28 thành vector:
28 × 28 = 784 số
thì về mặt dữ liệu, model MLP chỉ nhận:
[x1, x2, x3, ..., x784]
Nó không được kiến trúc nói rõ rằng x1 và x2 là hai pixel hàng xóm trong ảnh.
Đây là động lực chính của CNN: khai thác tính cục bộ và lặp lại của pattern trong không gian.
Sequence: dữ liệu mà thứ tự có ý nghĩa
Xét hai câu:
Chó cắn người.
Người cắn chó.
Các từ gần như giống nhau, nhưng đổi thứ tự làm nghĩa thay đổi mạnh.
Với dữ liệu chuỗi, ta thường biểu diễn input thành:
trong đó là chiều dài chuỗi.
Ví dụ:
"hôm nay trời đẹp"
có thể tách thành các phần tử:
[hôm, nay, trời, đẹp]
Các phần tử có thứ tự. Model cần biết phần tử nào đứng trước, phần tử nào đứng sau, và đôi khi cần kết nối thông tin cách nhau rất xa.
Dữ liệu sequence không chỉ là văn bản. Nó còn có thể là:
- âm thanh theo thời gian;
- chuỗi giá cổ phiếu;
- tín hiệu cảm biến;
- log hệ thống;
- chuỗi sự kiện người dùng;
- video nếu xem mỗi frame như một bước thời gian.
Token: đơn vị mà model xử lý trong chuỗi
Trong NLP hiện đại, model thường không nhận trực tiếp ký tự tiếng Việt hay từ nguyên bản. Văn bản được tách thành các token.
Ví dụ minh họa:
"deep learning"
có thể trở thành:
["deep", " learning"]
hoặc một tokenizer khác có thể chia khác.
Điểm quan trọng:
Token không nhất thiết bằng một từ.
Nó có thể là:
- một từ;
- một phần từ;
- một ký tự;
- một byte hoặc nhóm byte, tùy tokenizer.
Sau tokenization, token thường được đổi thành token ID:
[1257, 4890, 91, ...]
Nhưng những ID này chỉ là mã số, không nên hiểu rằng ID 5000 “lớn hơn về nghĩa” ID 1000.
Embedding: biến một ID rời rạc thành vector học được
Model neural network cần làm việc với số liên tục. Vì vậy token ID thường được tra trong một embedding table.
Ví dụ:
token "mèo" → id 421 → vector [0.12, -0.37, 0.81, ...]
Viết gọn:
trong đó:
- : token ID;
- : embedding matrix;
- : vector embedding của token.
Embedding không chỉ dùng cho từ. Ta có thể có:
- user embedding;
- item embedding trong recommendation;
- node embedding trong graph;
- position embedding;
- patch embedding trong Vision Transformer.
Một cách hiểu an toàn:
Embedding là vector mà model dùng để biểu diễn một đối tượng rời rạc hoặc một đơn vị dữ liệu trong không gian số liên tục.
Shape của một sequence sau embedding
Giả sử:
- batch size = 32;
- mỗi sequence có tối đa 100 token;
- mỗi token embedding có 256 chiều.
Tensor có thể có shape:
(32, 100, 256)
Có thể đọc là:
32 samples × 100 positions × 256 features mỗi position
Đây là shape rất phổ biến khi học RNN và Transformer.
Chuỗi có độ dài khác nhau xử lý thế nào?
Trong một batch, câu A có thể dài 20 token, câu B dài 43 token. Tensor thông thường lại cần kích thước đều nhau.
Một cách phổ biến là padding:
A: [t1, t2, ..., t20, PAD, PAD, ..., PAD]
B: [t1, t2, ..., t43]
Sau đó dùng mask để model biết vị trí nào chỉ là padding và không nên được xem như nội dung thật.
Khái niệm mask sẽ quay lại rất nhiều ở attention và Transformer.
Graph: khi quan hệ không còn nằm trên một hàng hay lưới đều
Có những dữ liệu không tự nhiên là vector, ảnh hay sequence.
Ví dụ mạng xã hội:
- mỗi người là một node;
- quan hệ bạn bè là edge.
Ví dụ mạng giao thông:
- giao lộ là node;
- đường nối hai giao lộ là edge.
Ví dụ citation network:
- mỗi paper là node;
- một paper trích dẫn paper khác tạo edge.
Một graph thường viết:
trong đó:
- : tập node;
- : tập edge.
Node có thể có feature:
Edge cũng có thể có feature:
Ví dụ edge đường giao thông có:
- khoảng cách;
- tốc độ tối đa;
- thời gian di chuyển;
- loại đường.
Graph khác sequence ở điểm nào?
Sequence có cấu trúc như một đường thẳng:
x1 → x2 → x3 → x4
Graph có thể có cấu trúc bất kỳ:
Một node có thể có 1, 5, 100 hoặc 10.000 hàng xóm. Không có chiều dài cố định như một vector thông thường.
Đó là lý do GNN cần cơ chế aggregate thông tin từ neighborhood thay vì nối toàn bộ node vào một MLP cố định.
Cấu trúc dữ liệu dẫn tới “inductive bias”
Một architecture thường chứa những giả định có chủ đích về dữ liệu. Trong Machine Learning, loại ưu tiên cấu trúc này thường được gọi là inductive bias.
Ví dụ:
CNN
Giả định hữu ích:
- quan hệ cục bộ trong ảnh quan trọng;
- cùng một pattern có thể xuất hiện ở nhiều vị trí.
RNN
Giả định hữu ích:
- dữ liệu có thứ tự;
- trạng thái hiện tại nên phụ thuộc vào trạng thái trước.
Transformer
Cho phép mỗi phần tử liên hệ trực tiếp với nhiều phần tử khác bằng attention, nhưng cần bổ sung thông tin vị trí vì attention tự nó không biết thứ tự.
GNN
Giả định hữu ích:
- cấu trúc node-edge mang thông tin;
- biểu diễn node nên phụ thuộc một phần vào neighborhood.
Đây không phải bảng luật cứng. Transformer có thể xử lý ảnh; CNN có thể xử lý audio; graph có thể được tuyến tính hóa thành sequence. Nhưng architecture phù hợp thường giúp model dùng dữ liệu hiệu quả hơn.
Một cùng đối tượng có thể có nhiều cách biểu diễn
Giả sử ta có một đoạn audio 3 giây.
Có thể biểu diễn trực tiếp dưới dạng waveform:
[0.01, 0.03, -0.02, ...]
Hoặc đổi thành spectrogram - một cấu trúc gần giống ảnh 2D theo thời gian và tần số.
Khi representation thay đổi, architecture phù hợp cũng có thể thay đổi.
Tương tự, một molecule có thể biểu diễn bằng:
- chuỗi ký tự SMILES;
- graph atom-bond;
- vector descriptor thủ công.
Không có representation “đúng duy nhất” cho mọi bài toán.
Representation ban đầu và representation model học được là hai mức khác nhau
Có thể phân biệt:
Input representation
Cách ta đưa dữ liệu vào model:
ảnh → pixels
text → token IDs
node → feature vector
Learned representation
Các vector trung gian model tự học qua nhiều layer.
Ví dụ trong CNN:
pixels → cạnh → texture → bộ phận → biểu diễn vật thể
Đây là cách nói khái quát, không có nghĩa mỗi layer luôn tương ứng hoàn hảo với đúng một khái niệm con người đặt tên.
Trong Transformer:
token embedding → contextual representations
Tức cùng token có thể có representation khác nhau tùy ngữ cảnh sau khi đi qua các layer.
Feature, dimension và axis không nên dùng lẫn tùy tiện
Ví dụ tensor:
(batch, sequence_length, hidden_size)
hidden_size thường là số chiều feature của mỗi token representation.
sequence_length không phải số feature; nó là số vị trí trong sequence.
batch lại càng không phải feature.
Khi debug model, kỹ năng đọc đúng ý nghĩa từng axis quan trọng hơn việc nhớ tên API.
Một bài tập đọc shape
Trường hợp 1: ảnh
(64, 3, 128, 128)
Nếu theo NCHW:
- 64 ảnh;
- 3 channels;
- 128×128 pixels.
Trường hợp 2: text
(16, 256, 768)
Có thể là:
- 16 sequences;
- mỗi sequence 256 token positions;
- mỗi token represented bằng 768 chiều.
Trường hợp 3: graph
Graph thường khó ép vào một tensor duy nhất vì mỗi graph có số node/edge khác nhau. Framework có thể lưu riêng:
node_features: (num_nodes, feature_dim)
edge_index: (2, num_edges)
Chi tiết API sẽ học sau. Điều cần nhận ra là graph cần mô tả cả đối tượng và quan hệ.
Chọn architecture bắt đầu từ câu hỏi nào?
Trước khi hỏi:
“Dùng CNN hay Transformer?”
nên hỏi:
- Một sample của mình là gì?
- Input có những axis nào?
- Thứ tự có ý nghĩa không?
- Khoảng cách/cấu trúc không gian có ý nghĩa không?
- Có quan hệ node-edge rõ ràng không?
- Quan hệ nào ta muốn architecture ưu tiên học?
- Output là ở sample-level, position-level, node-level hay edge-level?
Những câu hỏi này giúp tránh chọn model chỉ vì tên đang phổ biến.
Nếu chỉ nhớ 10 ý
- Tensor là một mảng số có shape; không cần thần bí hóa khái niệm này.
- Mỗi axis cần có ý nghĩa rõ ràng: batch, channel, height, width, sequence length, hidden size…
- Batch dimension chỉ gom nhiều sample để xử lý cùng lúc.
- Ảnh có cấu trúc không gian; flatten làm mất biểu diễn rõ ràng của neighborhood.
- Sequence có thứ tự; đổi thứ tự có thể đổi nghĩa.
- Token là đơn vị tokenizer tạo ra, không nhất thiết bằng một từ.
- Token ID chỉ là mã; embedding mới là vector model dùng để xử lý.
- Padding giúp gom sequence khác độ dài; mask đánh dấu phần không phải dữ liệu thật.
- Graph gồm node và edge; quan hệ giữa node là một phần của input.
- CNN, RNN, Transformer và GNN khác nhau chủ yếu ở cách chúng khai thác cấu trúc dữ liệu và trao đổi thông tin.
Câu hỏi tự kiểm tra
- Tensor shape
(32, 3, 224, 224)có thể được đọc thế nào theo quy ước NCHW? - Vì sao token ID
1000và5000không nên được hiểu như hai giá trị số có khoảng cách ngữ nghĩa 4000? - Embedding làm nhiệm vụ gì?
- Vì sao một ảnh flatten thành vector vẫn còn pixel values nhưng đã mất đi một phần cấu trúc hữu ích đối với architecture?
- Padding và mask giải quyết vấn đề gì trong batch sequence?
- Graph khác sequence ở cấu trúc kết nối như thế nào?
- Inductive bias của CNN và GNN khác nhau ở đâu?
- Một đoạn audio có thể có nhiều representation đầu vào khác nhau không? Hệ quả là gì?
Tài liệu tham khảo và đọc thêm
- Goodfellow, Bengio, Courville, Deep Learning, Chapter 9 - Convolutional Networks: https://www.deeplearningbook.org/contents/convnets.html
- Dive into Deep Learning, Preliminaries và các chương về sequence/CNN: https://d2l.ai/
- PyTorch, Tensor Basics: https://docs.pytorch.org/tutorials/beginner/basics/tensorqs_tutorial.html
- Vaswani et al. (2017), Attention Is All You Need: https://arxiv.org/abs/1706.03762
- Kipf & Welling (2017), Semi-Supervised Classification with Graph Convolutional Networks: https://arxiv.org/abs/1609.02907