Chương 0·Bài 0.5

Vector và ma trận

Mỗi học sinh trong bảng điểm được mô tả bằng ba con số: giờ tự học mỗi tuần, điểm học kỳ 1 và số buổi vắng. Bốn trăm học sinh là một bảng 400 dòng, 3 cột. Một model tuyến tính dự đoán điểm cuối kỳ cho cả 400 học sinh bằng một phép nhân, viết trong NumPy là X @ w; một lớp của mạng neural cũng là một phép nhân như thế. Bài 0.2 đã dùng @; bài này giải thích nó tính gì: vector là gì, tích vô hướng đo gì, và vì sao số cột của ma trận bên trái phải bằng số hàng của ma trận bên phải.

Vector: một dãy số có thứ tự

Một vector là một dãy số có thứ tự. Học sinh A tự học 6 giờ, điểm học kỳ 1 là 7.5, vắng 1 buổi, nên được mô tả bằng vector a=(6,7.5,1)\mathbf{a} = (6, 7.5, 1). Thứ tự quan trọng: (7.5,6,1)(7.5, 6, 1) là một học sinh khác. Số phần tử của vector gọi là số chiều. Mỗi con số mô tả một mẫu dữ liệu, như giờ tự học hay số buổi vắng, gọi là một đặc trưng (feature); mỗi đặc trưng là một chiều.

Vector hai chiều vẽ được thành một mũi tên từ gốc tọa độ tới điểm (x,y)(x, y). Hai phép tính cơ bản đều làm từng phần tử:

a+b=(a1+b1, a2+b2),c a=(ca1, ca2).\mathbf{a} + \mathbf{b} = (a_1 + b_1,\ a_2 + b_2), \qquad c\,\mathbf{a} = (c a_1,\ c a_2).

Cộng hai vector là nối mũi tên này vào đầu mũi tên kia. Nhân với số cc là kéo dài mũi tên cc lần, hoặc đảo chiều khi c<0c < 0.

Cộng hai vector là nối đuôi chúng; nhân với 2 kéo dài mũi tên gấp đôi.a = (3, 1)b = (1, 2)a + b = (4, 3)a2a = (6, 2)
Cộng hai vector là nối đuôi chúng; nhân với 2 kéo dài mũi tên gấp đôi.
Python
import numpy as np

a = np.array([3.0, 1.0])
b = np.array([1.0, 2.0])
print(a + b, 2 * a, a - b)

Phép trừ a−b\mathbf{a} - \mathbf{b} cho mũi tên đi từ đầu b\mathbf{b} tới đầu a\mathbf{a}. Mục sau dùng nó để đo khoảng cách.

Hỏi nhanh

a=(2,−1)\mathbf{a} = (2, -1) và b=(0,3)\mathbf{b} = (0, 3). 2a+b2\mathbf{a} + \mathbf{b} bằng bao nhiêu?

Độ dài và khoảng cách

Độ dài của vector (3,4)(3, 4) là cạnh huyền của tam giác vuông có hai cạnh 3 và 4, bằng 5 theo định lý Pythagoras. Tổng quát cho dd chiều, độ dài, hay chuẩn L2 (L2 norm), là

∥a∥=a12+a22+⋯+ad2.\lVert \mathbf{a} \rVert = \sqrt{a_1^2 + a_2^2 + \dots + a_d^2}.

Khoảng cách giữa hai điểm là độ dài của hiệu: ∥a−b∥\lVert \mathbf{a} - \mathbf{b} \rVert. Đây là khoảng cách Euclid, cách đo mà kNN ở bài 2.4 dùng để tìm hàng xóm gần nhất.

Còn một cách đo khác: cộng trị tuyệt đối từng thành phần, ∣a1∣+∣a2∣+…|a_1| + |a_2| + \dots, gọi là chuẩn L1. Trên bàn cờ, xe đi theo hàng và cột, nên quãng đường của nó là khoảng cách L1, còn quãng đường chim bay là khoảng cách L2.

Python
p = np.array([1.0, 2.0])
q = np.array([4.0, 6.0])
d = q - p
print(d, np.linalg.norm(d), np.sqrt((d ** 2).sum()), np.abs(d).sum())

Từ pp tới qq phải đi 3 theo trục ngang và 4 theo trục dọc. Đường thẳng dài 5, đường đi theo ô dài 7. np.linalg.norm mặc định tính chuẩn L2, đúng bằng công thức viết tay.

Hỏi nhanh

Vector (1,2,2)(1, 2, 2) có độ dài L2 bằng bao nhiêu?

Tích vô hướng

Tích vô hướng (dot product) của hai vector cùng số chiều là tổng các tích từng cặp:

a⋅b=a1b1+a2b2+⋯+adbd.\mathbf{a} \cdot \mathbf{b} = a_1 b_1 + a_2 b_2 + \dots + a_d b_d.

Kết quả là một số, không phải vector. Ý nghĩa đầu tiên là tổng có trọng số. Ở bài 0.4, hàm bậc nhất y=wx+by = wx + b chỉ có một đầu vào. Với ba đặc trưng, model tuyến tính tính

y^=w1x1+w2x2+w3x3+b=w⋅x+b.\hat{y} = w_1 x_1 + w_2 x_2 + w_3 x_3 + b = \mathbf{w} \cdot \mathbf{x} + b.

Mỗi trọng số wjw_j nói đặc trưng thứ jj đóng góp bao nhiêu. Trọng số âm cho số buổi vắng nghĩa là vắng càng nhiều thì điểm dự đoán càng thấp.

Ý nghĩa thứ hai là hình học. Gọi θ\theta là góc giữa hai mũi tên, khi đó

a⋅b=∥a∥ ∥b∥cos⁡θ.\mathbf{a} \cdot \mathbf{b} = \lVert \mathbf{a} \rVert\, \lVert \mathbf{b} \rVert \cos\theta.

Không cần nhớ lượng giác để đọc công thức này. cos⁡θ\cos\theta bằng 1 khi hai mũi tên cùng hướng, bằng 0 khi chúng vuông góc, bằng −1-1 khi ngược hướng. Vì vậy dấu của tích vô hướng cho biết hai vector “cùng phía” hay “ngược phía”.

a · b dương khi cùng hướng, bằng 0 khi vuông góc, âm khi ngược hướng.abcùng hướnga · b = 8abvuông góca · b = 0abngược hướnga · b = −7
a · b dương khi cùng hướng, bằng 0 khi vuông góc, âm khi ngược hướng.

Chia tích vô hướng cho hai độ dài, ta còn lại đúng cos⁡θ\cos\theta, gọi là cosine similarity. Nó chỉ đo hướng, không đo độ dài, nên nằm trong khoảng từ −1-1 đến 1. Các chương sau biểu diễn một từ hay một ảnh bằng vector, gọi là embedding, rồi dùng cosine similarity để tìm từ hay ảnh giống nhau.

Python
w = np.array([0.1, 0.8, -0.3])          # giờ tự học, điểm HK1, số buổi vắng
x = np.array([6.0, 7.5, 1.0])           # học sinh A
print(w @ x, (w * x).sum(), w @ x + 1.0)

def cosine(u, v):
    return u @ v / (np.linalg.norm(u) * np.linalg.norm(v))

meo = np.array([0.9, 0.8, 0.1])
cho = np.array([0.8, 0.9, 0.2])
oto = np.array([0.1, 0.2, 0.9])
print(round(cosine(meo, cho), 3), round(cosine(meo, oto), 3))

Dòng đầu: tích vô hướng bằng tổng các tích từng cặp, 0.6+6.0−0.3=6.30.6 + 6.0 - 0.3 = 6.3; cộng thêm b=1b = 1 được điểm dự đoán 7.3. Dòng hai dùng ba vector đồ chơi cho ba từ: “mèo” và “chó” gần cùng hướng nên cosine gần 1, “mèo” và “ô tô” lệch hướng nhiều nên cosine chỉ 0.3.

Hỏi nhanh

a=(2,1)\mathbf{a} = (2, 1) và b=(−1,2)\mathbf{b} = (-1, 2). Tích vô hướng a⋅b\mathbf{a} \cdot \mathbf{b} bằng bao nhiêu, và hai vector nằm thế nào với nhau?

Ma trận: một bảng số

Xếp vector của bốn học sinh thành bốn hàng, ta được một ma trận 4 hàng, 3 cột, viết là ma trận 4×34 \times 3 hay shape (4, 3). Quy ước của học máy: mỗi hàng là một mẫu, mỗi cột là một đặc trưng. Ma trận dữ liệu thường ký hiệu XX, shape (n,d)(n, d) với nn mẫu và dd đặc trưng.

Nhân ma trận XX với vector trọng số w\mathbf{w} là làm tích vô hướng của từng hàng với w\mathbf{w}:

Xw=(x1⋅wx2⋅w⋮xn⋅w).X\mathbf{w} = \begin{pmatrix} \mathbf{x}_1 \cdot \mathbf{w} \\ \mathbf{x}_2 \cdot \mathbf{w} \\ \vdots \\ \mathbf{x}_n \cdot \mathbf{w} \end{pmatrix}.

Một phép nhân cho dự đoán của cả nn học sinh. Mỗi hàng có 3 số và w\mathbf{w} có 3 số, nên số cột của XX phải bằng độ dài của w\mathbf{w}. Kết quả có nn số, một số cho mỗi hàng.

Python
X = np.array([[6.0, 7.5, 1.0],
              [2.0, 6.0, 4.0],
              [10.0, 8.5, 0.0],
              [4.0, 5.5, 2.0]])
b = 1.0
print(X.shape, w.shape, (X @ w).shape)
print(X @ w + b)
print([round(float(row @ w + b), 1) for row in X])

Dòng cuối tính lại bằng vòng lặp qua từng hàng và ra đúng bốn số. Phép X @ w làm cùng việc ấy, chỉ nhanh hơn nhiều khi bảng có hàng triệu dòng. Số b được cộng vào cả bốn dự đoán nhờ broadcasting của bài 0.2.

Hỏi nhanh

Bảng dữ liệu có 500 học sinh, mỗi học sinh 8 đặc trưng. Vector trọng số w\mathbf{w} phải có shape gì, và X @ w có shape gì?

Nhân hai ma trận

Giờ muốn hai dự đoán cho mỗi học sinh, chẳng hạn điểm Toán và điểm Văn. Mỗi môn có một vector trọng số riêng. Xếp hai vector ấy thành hai cột của ma trận WW shape (3,2)(3, 2). Khi đó XWXW có shape (4,2)(4, 2): ô ở hàng ii, cột jj là tích vô hướng của hàng ii của XX với cột jj của WW.

Quy tắc shape:

(m,k) @ (k,n)→(m,n).(m, k) \,@\, (k, n) \to (m, n).

Hai số kk ở giữa phải bằng nhau, vì đó là độ dài của hai vector đem nhân vô hướng. Hai số ở ngoài cho shape kết quả. Một lớp của mạng neural làm đúng phép này: XX là (n,d)(n, d), WW là (d,h)(d, h), kết quả (n,h)(n, h) là hh đặc trưng mới cho mỗi mẫu. Mỗi cột của WW là một nơ-ron.

(4, 3) @ (3, 2) → (4, 2): ô tô đậm là tích của hàng tô đậm với cột tô đậm.X (4, 3)67.51264108.5045.52@W (3, 2)0.1−0.20.80.5−0.30.4=H (4, 2)6.32.953.84.27.82.254.22.75←2·(−0.2) + 6·0.5+ 4·0.4= 4.2
(4, 3) @ (3, 2) → (4, 2): ô tô đậm là tích của hàng tô đậm với cột tô đậm.

Chuyển vị X⊤X^\top (trong NumPy là X.T) đổi hàng thành cột, nên shape (m,n)(m, n) thành (n,m)(n, m). Thứ tự nhân quan trọng: ABAB và BABA nói chung khác nhau, và nhiều khi một trong hai còn không nhân được vì shape không khớp. Ma trận đơn vị II có 1 trên đường chéo, 0 ở mọi ô khác; nhân với II không đổi gì, như nhân một số với 1.

Python
W = np.array([[0.1, -0.2],
              [0.8, 0.5],
              [-0.3, 0.4]])
H = X @ W
print(H.shape)
print(np.round(H, 2))
print(X.T.shape, W.T.shape)
try:
    W @ X
except ValueError as e:
    print("W @ X lỗi:", e)
I = np.eye(3)
print(np.allclose(X @ I, X))

Cột đầu của H là X @ w ở mục trước, chưa cộng bb, vì cột đầu của W chính là w. W @ X là (3,2)@(4,3)(3, 2) @ (4, 3): số 2 và số 4 ở giữa không bằng nhau, nên NumPy báo lỗi. Thông báo lỗi dài nhưng đọc được ý chính ở cuối: kích thước 4 khác 2.

Hỏi nhanh

Nhân ma trận 3×23 \times 2 với ma trận 2×42 \times 4 cho kết quả gì?

Đề thiNOAI 2026 Singapore · Vòng sơ loại · Câu 12

Ma trận như một phép biến đổi

Một ma trận 2×22 \times 2 nhân với mọi điểm của mặt phẳng là một cách biến đổi mặt phẳng. (2001)\begin{pmatrix} 2 & 0 \\ 0 & 1 \end{pmatrix} kéo giãn trục ngang gấp đôi. (0−110)\begin{pmatrix} 0 & -1 \\ 1 & 0 \end{pmatrix} xoay mọi điểm 90 độ ngược chiều kim đồng hồ. Cột đầu của ma trận là nơi điểm (1,0)(1, 0) đi tới, cột sau là nơi điểm (0,1)(0, 1) đi tới.

Cột của M là nơi (1, 0) và (0, 1) đi tới.(2, 0)(1, 1)(0, 1)(1, 0)M = [[2, 1], [0, 1]]
Cột của M là nơi (1, 0) và (0, 1) đi tới.

Một lớp của mạng neural cũng làm việc này: nó biến đổi dữ liệu sang một hệ tọa độ mới, nơi các lớp dễ tách nhau hơn.

Trong toán, điểm được viết thành cột và nhân bên phải ma trận: MvM\mathbf{v}. Trong code, mỗi điểm là một hàng của bảng XX, nên cùng phép biến đổi ấy viết là X @ M.T.

Python
square = np.array([[0, 0], [1, 0], [1, 1], [0, 1]], dtype=float)   # mỗi hàng một đỉnh
M = np.array([[2.0, 1.0],
              [0.0, 1.0]])
print(square @ M.T)

Đỉnh (1,0)(1, 0) đi tới (2,0)(2, 0), đúng cột đầu của MM; đỉnh (0,1)(0, 1) đi tới (1,1)(1, 1), đúng cột sau. Hình vuông thành hình bình hành.

Hỏi nhanh

Ma trận M=(0−110)M = \begin{pmatrix} 0 & -1 \\ 1 & 0 \end{pmatrix} xoay điểm 90 độ. Điểm (1,0)(1, 0) đi tới đâu?

Khi đi thi

  • Ghi shape cạnh mỗi biến trước khi nhân. Nhân không được thì xem hai số ở giữa.
  • @ là nhân ma trận, * là nhân từng phần tử.
  • Kiểm X @ w bằng một hàng: tính X[0] @ w rồi so với phần tử đầu.

Tóm tắt

  • Vector là dãy số có thứ tự; cộng và nhân với số làm từng phần tử.
  • Độ dài L2 ∑ai2\sqrt{\sum a_i^2}, L1 ∑∣ai∣\sum |a_i|; khoảng cách là độ dài của hiệu.
  • Tích vô hướng ∑aibi\sum a_i b_i là một số: tổng có trọng số, và ∥a∥∥b∥cos⁡θ\lVert \mathbf{a} \rVert \lVert \mathbf{b} \rVert \cos\theta; cosine similarity chỉ đo hướng.
  • Ma trận dữ liệu (n,d)(n, d): hàng là mẫu, cột là đặc trưng; XwX\mathbf{w} là tích vô hướng từng hàng với w\mathbf{w}.
  • (m,k)@(k,n)→(m,n)(m, k) @ (k, n) \to (m, n); chuyển vị đổi (m,n)(m, n) thành (n,m)(n, m); AB≠BAAB \ne BA nói chung; nhân với II không đổi gì.
  • Ma trận 2×22 \times 2 biến đổi mặt phẳng; cột của nó là ảnh của hai vector đơn vị.

Kiểm tra cuối bài

Mười câu dưới đây bao quát cả bài. Làm hết rồi xem điểm; câu nào sai thì đọc lại mục tương ứng.

Câu 1

Vector v=(3,4)\mathbf{v} = (3, 4) có độ dài Euclid (chuẩn L2) bằng bao nhiêu?

Đề thiNOAI 2026 Singapore · Vòng sơ loại · Câu 13

Câu 2

AA và BB là hai ma trận 3×33 \times 3. Phép nào không phải phép toán ma trận thông thường?

Đề thiNOAI 2026 Singapore · Vòng sơ loại · Câu 14

Câu 3

Ma trận đơn vị II có đặc điểm gì?

Phỏng theoNOAI 2026 Singapore · Vòng sơ loại · Câu 15

Câu 4

Ma trận AA có shape 2×32 \times 3. A⊤A^\top có shape gì?

Đề thiNOAI 2026 Singapore · Vòng sơ loại · Câu 16

Câu 5

Trong phép nhân ma trận ABAB, kích thước nào phải bằng nhau?

Đề thiNOAI 2026 Singapore · Vòng sơ loại · Câu 20

Câu 6

Ma trận nào dưới đây đối xứng, tức là bằng chuyển vị của chính nó?

Đề thiNOAI 2026 Singapore · Vòng sơ loại · Câu 18

Câu 7

Một lớp của mạng neural nhận batch X shape (32, 784) và cho ra (32, 128). Ma trận trọng số W trong X @ W có shape gì?

Câu 8

Hai embedding u\mathbf{u} và v\mathbf{v} có cosine similarity bằng −0.9-0.9. Nhân đôi u\mathbf{u} thì cosine similarity bằng bao nhiêu?

Câu 9

Bảng có hai cột: tuổi (từ 10 đến 18) và thu nhập gia đình (từ 5 triệu đến 80 triệu đồng mỗi tháng). Dùng khoảng cách Euclid trên dữ liệu thô để tìm học sinh giống nhau thì chuyện gì xảy ra?

Câu 10

A shape (5, 3) và B shape (5, 3). Lệnh nào chạy được?

Đọc thêm

  • 3Blue1Brown - Essence of linear algebra, tập 1-4 và 9. Vector, tổ hợp tuyến tính, ma trận như phép biến đổi, tích vô hướng, bằng hình động.
  • Khan Academy - Vectors and spaces. Bài giảng và bài tập ngắn về vector, độ dài, tích vô hướng.
  • Deisenroth, Faisal, Ong - Mathematics for Machine Learning, chương 2 và 3. Sách miễn phí; đọc phần ma trận, chuẩn và tích vô hướng khi muốn chặt chẽ hơn.
  • NumPy - Linear algebra (numpy.linalg). Danh sách hàm norm, matmul, eye và các phép khác dùng trong bài.