Cơ sở và đối ngẫu¶
Các cơ sở định nghĩa các hệ tọa độ của không gian vector, và đối ngẫu bộc lộ cách các hàm tuyến tính tác động lên các vector. File này bao quát độc lập tuyến tính, tập sinh, đổi cơ sở, không gian đối ngẫu, và covector — những khái niệm đứng sau PCA, biến đổi đặc trưng, và truy vấn chú ý trong ML.
-
Chúng ta đã thấy các vector cư ngụ trong những không gian với một số lượng chiều nhất định. Nhưng điều gì định nghĩa những chiều đó? Đây là lúc các vector cơ sở xuất hiện.
-
Một cơ sở (basis) là một tập hợp các vector có thể xây dựng mọi vector khác trong không gian thông qua co giãn và cộng (tổ hợp tuyến tính), không có sự dư thừa. Chúng là những khối xây dựng của không gian.
-
Một cơ sở phải thỏa mãn hai điều kiện:
- Độc lập tuyến tính: Không vector cơ sở nào có thể được xây dựng từ những vector khác. Mỗi vector đóng góp một hướng thực sự mới.
- Sinh (spanning): Mọi vector trong không gian có thể được biểu diễn dưới dạng tổ hợp của các vector cơ sở. Không có gì bị bỏ sót.
-
Số lượng vector trong một cơ sở bằng số chiều của không gian. Trong \(\mathbb{R}^2\) bạn cần 2, trong \(\mathbb{R}^3\) bạn cần 3, và cứ thế.
-
Cơ sở tự nhiên nhất là cơ sở chuẩn (standard basis), các vector đơn vị dọc theo mỗi trục:
- Trong \(\mathbb{R}^2\): \(\hat{\mathbf{i}} = (1, 0)\) và \(\hat{\mathbf{j}} = (0, 1)\)
- Trong \(\mathbb{R}^3\): \(\hat{\mathbf{i}} = (1, 0, 0)\), \(\hat{\mathbf{j}} = (0, 1, 0)\), \(\hat{\mathbf{k}} = (0, 0, 1)\)
-
Bất kỳ vector nào cũng chỉ là một tổng có trọng số của các vector cơ sở này. Vector \((3, 2)\) thực chất là \(3\hat{\mathbf{i}} + 2\hat{\mathbf{j}}\). Các trọng số (3 và 2) là tọa độ của vector trong cơ sở đó.
-
Nhưng cơ sở chuẩn không phải là cơ sở hợp lệ duy nhất. Trong \(\mathbb{R}^2\), các vector \((1, 1)\) và \((-1, 1)\) cũng tạo thành một cơ sở. Chúng độc lập tuyến tính và có thể đến được mọi điểm trong mặt phẳng. Cùng một vector sẽ chỉ có các tọa độ khác nhau trong cơ sở mới này.
-
Một đổi cơ sở (change of basis) biểu diễn lại cùng một vector dùng các cơ sở khác nhau. Vector chưa hề di chuyển, ta chỉ đang mô tả nó từ một góc nhìn khác.
-
Điều này được thực hiện bằng cách nhân với một ma trận đổi cơ sở \(P\), các cột của nó là các vector cơ sở mới được viết trong tọa độ cũ. Để quay lại, nhân với \(P^{-1}\).
-
Hãy tưởng tượng hai người bạn chỉ đường đến cùng một quán cà phê. Bạn điều hướng theo đường phố: \((3, 2)\) nghĩa là "3 dãy nhà về phía đông, 2 dãy nhà về phía bắc". Người bạn điều hướng theo đường chéo: hướng dẫn của họ là \(\mathbf{b}_1 = (1, 1)\) (đông bắc) và \(\mathbf{b}_2 = (-1, 1)\) (tây bắc), tức cơ sở mới từ trước. Cùng một quán cà phê, hai ngôn ngữ để mô tả cách đến đó.
-
Người bạn nói quán cà phê ở \((2.5, -0.5)\): "đi 2.5 bước dọc theo đường chéo đông bắc của tôi, rồi nửa bước lùi dọc theo đường chéo tây bắc của tôi". Để biết điều đó nghĩa là gì trong ngôn ngữ đường phố của bạn, bạn chỉ cần làm theo công thức của họ:
-
Đó là cùng quán cà phê mà bạn gọi là \((3, 2)\)!
-
Bước "làm theo công thức" đó chính xác là những gì nhân với \(P\) thực hiện. Xếp các vector cơ sở của người bạn thành các cột, và nhân với một vector các tọa độ của họ lấy 2.5 của cột đầu và -0.5 của cột thứ hai, lại là công thức đó, chỉ được viết gọn lại:
- Dịch theo chiều ngược lại, từ \((3, 2)\) của bạn sang ngôn ngữ của người bạn, nghĩa là hoàn tác công thức, và hoàn tác \(P\) chính xác là những gì \(P^{-1}\) làm:
-
Không có gì di chuyển cả. \((3, 2)\) và \((2.5, -0.5)\) là hai mô tả của một điểm, và \(P\) là từ điển để dịch giữa chúng.
-
Trong ML, đổi cơ sở xuất hiện thường xuyên. PCA, chẳng hạn, tìm một cơ sở mới (các thành phần chính) nơi dữ liệu dễ hiểu hơn, các trục căn chỉnh với những hướng biến thiên lớn nhất.
-
Tập hợp các khái niệm tiếp theo sẽ trừu tượng và khá thách thức để nắm bắt lúc này, cho đến khi ta áp dụng các khái niệm đó ở những chương sau, nên hãy chuẩn bị tinh thần cho sự tác động, xin lỗi.
-
Giờ, có một ý tưởng sâu hơn ẩn sau đây. Khi ta viết \(\mathbf{v} = (3, 2)\), các tọa độ 3 và 2 thực chất là kết quả của việc "đo" \(\mathbf{v}\) dọc theo mỗi hướng cơ sở. Tọa độ đầu tiên hỏi "có bao nhiêu phần của \(\hat{\mathbf{i}}\) nằm trong \(\mathbf{v}\)?", tọa độ thứ hai hỏi "có bao nhiêu phần của \(\hat{\mathbf{j}}\)?"
-
Trong câu chuyện quán cà phê, những phép đo này là những câu hỏi của người bạn: "bạn đã đi bao xa dọc theo đường chéo đông bắc của tôi?" và "bao xa dọc theo đường tây bắc của tôi?". Mọi cơ sở đi kèm với một tập hợp các câu hỏi riêng, một câu cho mỗi hướng.
-
Mỗi câu hỏi là một hàm tuyến tính (linear functional): một hàm nhận vào một vector và trả về một số duy nhất, tức kết quả đo.
-
Từ tuyến tính (linear) nghĩa là hàm tôn trọng hai phép toán không gian vector. Đo một tổng các vector và bạn nhận được tổng các kết quả đo; nhân đôi một vector và kết quả đo nhân đôi:
-
Nói cách khác, các hàm tuyến tính là những thước đo trung thực. Các vector là đối tượng, các hàm tuyến tính là những thước đo chúng, và tập hợp tất cả các thước đo có thể có tạo thành không gian đối ngẫu (dual space) \(V^\ast\).
-
Với mọi cơ sở \(\{\mathbf{e}_1, \mathbf{e}_2, \ldots, \mathbf{e}_n\}\) có một tập hợp các thước đo tương ứng, cơ sở đối ngẫu (dual basis) \(\{\mathbf{e}_1^\ast, \mathbf{e}_2^\ast, \ldots, \mathbf{e}_n^\ast\}\), trong đó \(\mathbf{e}_i^\ast\) trả lời đúng một câu hỏi: "bao nhiêu bước của \(\mathbf{e}_i\)?". Một thước đo được hiệu chuẩn tốt đọc 1 trên vector cơ sở của chính nó và hoàn toàn bỏ qua tất cả những vector khác, điều được viết gọn lại dùng ký hiệu Kronecker delta \(\delta_{ij}\):
- Quy tắc hiệu chuẩn bé nhỏ đó là tất cả những gì một thước đo cần, vì tính tuyến tính lo phần còn lại. Hãy xem \(\mathbf{e}_1^\ast\) đọc tọa độ đầu của \(\mathbf{v} = 3\mathbf{e}_1 + 2\mathbf{e}_2\):
-
Thước đo bỏ qua mọi hướng trừ chính nó và báo cáo tọa độ. Tọa độ chính là các kết quả đọc của cơ sở đối ngẫu.
-
Vậy một thước đo trông cụ thể ra sao? Trong \(\mathbb{R}^n\), mọi hàm tuyến tính chỉ là một hàng các số được áp dụng với tích vô hướng. Và với cơ sở của người bạn, chúng ta đã xây dựng những thước đo mà không nhận ra: dịch \((3, 2)\) sang ngôn ngữ của người bạn nghĩa là nhân với \(P^{-1}\), và mỗi hàng của \(P^{-1}\) sinh ra một tọa độ. Các hàng của \(P^{-1}\) chính là cơ sở đối ngẫu:
-
Hãy kiểm tra với chuyến đi quán cà phê: \(\mathbf{b}_1^\ast \cdot (3, 2) = 0.5 \cdot 3 + 0.5 \cdot 2 = 2.5\), chính xác là tọa độ đầu của người bạn. Hai nửa của file này là một ý tưởng: đổi cơ sở hoán đổi các khối xây dựng, và cơ sở đối ngẫu là tập hợp các thước đo tương ứng đọc ra các tọa độ mới.
-
Quy tắc hiệu chuẩn cũng ẩn ngay trước mắt: \(P^{-1}P = I\) phát biểu chính xác rằng thước đo thứ \(i\) đọc 1 trên vector cơ sở thứ \(i\) và 0 trên những vector còn lại. Ma trận đơn vị là ký hiệu Kronecker delta được viết ra thành một bảng.
-
Một lời cảnh báo. Rất dễ đoán rằng thước đo cho \(\mathbf{b}_1\) chính là \(\mathbf{b}_1\) nó, tức chỉ cần tự nhân với \((1, 1)\). Nhưng \((1, 1) \cdot (3, 2) = 5\), gấp đôi tọa độ thực 2.5. Tự nhân với một vector cơ sở chỉ đọc ra tọa độ của chính nó khi cơ sở đó là trực chuẩn (orthonormal) (vuông góc với nhau, mỗi vector có độ dài 1), như cơ sở chuẩn. Đó là lý do duy nhất mà \(\mathbf{e}_1^\ast\) trông giống hệt \(\mathbf{e}_1\). Với mọi cơ sở khác, các thước đo nằm trong các hàng của \(P^{-1}\).
-
Điều này cũng giải thích đời sống hai mặt của tích vô hướng. Mọi vector \(\mathbf{u}\) ngầm định nghĩa một thước đo (đo \(\mathbf{v}\) bằng cách tính \(\mathbf{u} \cdot \mathbf{v}\)), và mọi thước đo là một tích vô hướng với một vector nào đó. Trong các số chiều hữu hạn, không gian đối ngẫu về cơ bản là một hình ảnh phản chiếu của không gian gốc.
-
Đối ngẫu có vẻ trừu tượng lúc này, nhưng nó là nền tảng của nhiều ý tưởng thực tế: tọa độ là các đánh giá cơ sở đối ngẫu, tích vô hướng là một cặp đối ngẫu, và các phép biến đổi như sự chú ý trong mạng nơ-ron hoạt động bằng cách để một tập hợp các vector "truy vấn" một tập hợp khác, chính là đối ngẫu trong hành động.
Bài tập lập trình (dùng CoLab hoặc notebook)¶
-
Biểu diễn một vector trong hai cơ sở khác nhau và xác minh chúng biểu diễn cùng một điểm. Thử tạo cơ sở riêng của bạn và xem vector nhận được những tọa độ nào.
import jax.numpy as jnp v = jnp.array([3.0, 2.0]) # Standard basis: coordinates are just the components print(f"Standard basis coords: {v}") # New basis: (1,1) and (-1,1) P = jnp.array([[1.0, -1.0], [1.0, 1.0]]) new_coords = jnp.linalg.solve(P, v) print(f"New basis coords: {new_coords}") # Verify: reconstruct from new coords reconstructed = new_coords[0] * P[:, 0] + new_coords[1] * P[:, 1] print(f"Reconstructed: {reconstructed}") -
Xây dựng cơ sở đối ngẫu cho cơ sở của người bạn từ bài tập 1 (các hàng của P⁻¹) và xác minh mỗi thước đo đọc đúng một tọa độ. Sau đó xem tại sao tự nhân với chính vector cơ sở chỉ hoạt động cho các cơ sở trực chuẩn.
import jax.numpy as jnp v = jnp.array([3.0, 2.0]) # The friend's basis (1,1) and (-1,1), stacked as columns P = jnp.array([[1.0, -1.0], [1.0, 1.0]]) # The dual basis: the rows of P^{-1} P_inv = jnp.linalg.inv(P) b1_star, b2_star = P_inv[0], P_inv[1] print(f"b1* = {b1_star}, b2* = {b2_star}") # Each ruler reads one coordinate in the friend's basis (matches task 1!) print(f"b1*(v) = {jnp.dot(b1_star, v)}") # 2.5 print(f"b2*(v) = {jnp.dot(b2_star, v)}") # -0.5 # Calibration: 1 on its own basis vector, 0 on the other print(f"b1*(b1) = {jnp.dot(b1_star, P[:, 0])}, b1*(b2) = {jnp.dot(b1_star, P[:, 1])}") # The trap: dotting with b1 itself does NOT give the coordinate print(f"b1 . v = {jnp.dot(P[:, 0], v)} (5.0, not 2.5 -- b1 is not orthonormal)") # The standard basis IS orthonormal, so there the shortcut works e1 = jnp.array([1.0, 0.0]) print(f"e1 . v = {jnp.dot(e1, v)} (3.0, the first standard coordinate)")