Bỏ qua

Tính chất của vector

Các tính chất của vector mô tả những đặc điểm hình học và đại số xác định cách các vector hoạt động. File này bao quát độ lớn, hướng, vector đơn vị, tính bằng nhau, tính song song, tính trực giao, và độc lập tuyến tính — những khối xây dựng của mọi không gian đặc trưng trong ML.

  • Độ lớn (hay độ dài) của một vector cho bạn biết nó "vươn xa" đến mức nào. Hãy tưởng tượng nó như độ dài của mũi tên. Với một vector \(\mathbf{a} = (a_1, a_2, a_3)\), độ lớn của nó là:
\[\|\mathbf{a}\| = \sqrt{a_1^2 + a_2^2 + a_3^2}\]
  • Đây chỉ đơn giản là định lý Pythagoras mở rộng lên các chiều cao hơn và đo khoảng cách đường thẳng từ gốc tọa độ đến điểm.

  • Hướng của một vector cho bạn biết nó "chỉ" về đâu; đơn giản là hãy hình dung một đường thẳng từ gốc tọa độ đến điểm có tọa độ đó.

  • Khi gốc tọa độ không được chỉ định rõ ràng, ta thường ngầm hiểu (0,0,...0), tức điểm trung tâm, ít nhất là cho mục đích trực quan hóa.

  • Vị trí không quan trọng, luôn là về sự dịch chuyển: một vector \((3, 2)\) vẽ từ gốc tọa độ và vector \((3, 2)\) tương tự vẽ từ một điểm khác vẫn là bằng nhau.

Tính bằng nhau của vector: cùng vector (3,2) được vẽ từ hai điểm xuất phát khác nhau

  • Hai vector có thể có cùng độ dài nhưng chỉ về những hướng hoàn toàn khác nhau, hoặc chỉ cùng hướng nhưng khác nhau về độ dài.

Cùng hướng, khác độ lớn (v và 2v) so với cùng độ lớn, khác hướng

  • Hai vector bằng nhau khi và chỉ khi tất cả các thành phần tương ứng khớp nhau; cùng độ dài, cùng hướng, cùng một mũi tên y hệt.
\[\mathbf{a} = \mathbf{b} \iff a_i = b_i \text{ for all } i\]
  • Hai vector song song nếu một vector là bội của vector kia theo một vô hướng. Chúng chỉ cùng một đường thẳng, hoặc cùng hướng hoặc hoàn toàn ngược lại.
\[\mathbf{a} \parallel \mathbf{b} \iff \mathbf{a} = k\mathbf{b} \text{ for some scalar } k \neq 0\]
  • Nếu \(k > 0\), chúng chỉ cùng một hướng. Nếu \(k < 0\), chúng chỉ về các hướng ngược nhau. Dù thế nào, chúng nằm trên cùng một đường thẳng đi qua gốc tọa độ.

  • Theo trực giác, các vector song song không mang thông tin hướng "mới" nào. Một vector chỉ là bản kéo giãn hoặc lật của vector kia.

  • Hai vector trực giao (vuông góc) nếu chúng chỉ theo những hướng hoàn toàn độc lập. Di chuyển dọc theo vector này cho bạn tiến triển bằng không dọc theo vector kia.

Các vector trực giao: u và v gặp nhau tại một góc vuông

  • Hãy tưởng tượng đi bộ về phía bắc rồi đi bộ về phía đông, đây là những hướng trực giao, không việc đi bộ hướng bắc nào sẽ đưa bạn sang phía đông. Chúng ta sẽ gặp tính trực giao rất thường xuyên.

  • Tính trực giao là trọng tâm của ML: những đặc trưng trực giao mang những thông tin hoàn toàn độc lập, điều lý tưởng cho việc biểu diễn.

  • Tổng quát hơn, bất kỳ hai vector nào cũng có một góc \(\theta\) giữa chúng, dao động từ \(0°\) đến \(180°\).

  • Góc này nắm bắt toàn bộ mối quan hệ giữa hai hướng: \(0°\) nghĩa là song song (cùng hướng), \(180°\) nghĩa là song song (ngược hướng), và \(90°\) nghĩa là trực giao. Mọi thứ ở giữa là một sự pha trộn.

  • Hầu hết các mối quan hệ vector trong ML nằm ở đâu đó trong phổ này. Sau này, ta sẽ thấy những công cụ chính xác (tích vô hướng, độ tương đồng cosine) để tính góc này.

  • Một tập hợp các vector là phụ thuộc tuyến tính nếu ít nhất một trong số chúng có thể được xây dựng từ những vector còn lại bằng cách co giãn và cộng. Nó không mang lại thông tin mới nào cho tập hợp.

  • Ví dụ, nếu \(\mathbf{c} = 2\mathbf{a} + 3\mathbf{b}\), thì \(\mathbf{c}\) là dư thừa, bạn đã có mọi thứ \(\mathbf{c}\) cung cấp thông qua \(\mathbf{a}\)\(\mathbf{b}\).

  • Các vector song song luôn phụ thuộc tuyến tính, vì một vector chỉ là bản sao được co giãn của vector kia. Mọi tập hợp chứa vector không cũng phụ thuộc tuyến tính.

  • Các vector độc lập tuyến tính nếu không vector nào trong số chúng 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. Các vector trực giao luôn độc lập tuyến tính.

  • Một chút trực giác: nếu bạn muốn nghiên cứu những con người khác nhau và biểu diễn họ dưới dạng vector, các vector (con người) phụ thuộc tuyến tính sẽ làm lệch kết quả quan sát về phía điểm dữ liệu bị lấy mẫu quá mức, một yếu tố quan trọng khi thiết kế tập dữ liệu để huấn luyện AI.

  • Trong 2D, hai vector độc lập tuyến tính có thể đến được mọi điểm trong mặt phẳng. Trong 3D, bạn cần ba vector. Ý tưởng về "bạn cần bao nhiêu vector độc lập" kết nối trực tiếp với số chiều.

  • Một vector là thưa (sparse) khi hầu hết các thành phần của nó bằng không. Trái lại, hầu hết các thành phần khác không, được gọi là dày đặc (dense).

\[\mathbf{s} = [0, 0, 3, 0, 0, 0, 1, 0, 0, 0]\]
  • Tính thưa quan trọng vì nó ảnh hưởng đến cả việc lưu trữ lẫn tính toán. Các vector thưa có thể được lưu trữ và xử lý hiệu quả hơn nhiều bằng cách chỉ theo dõi các phần tử khác không.

  • Một vector đơn vị là một vector có độ lớn đúng bằng 1. Nó thuần túy biểu diễn một hướng mà không có thông tin độ dài. Bạn có thể biến bất kỳ vector nào thành vector đơn vị bằng cách chia nó cho độ lớn của nó:

\[\hat{\mathbf{a}} = \frac{\mathbf{a}}{\|\mathbf{a}\|}\]
  • Quá trình này được gọi là chuẩn hóa (normalisation). Nó loại bỏ "xa đến đâu" và chỉ giữ lại "về hướng nào", đây là một yếu tố quan trọng trong học máy.

  • Các vector đơn vị chuẩn chỉ theo mỗi trục: \(\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 có thể được viết dưới dạng tổ hợp của những vector này, ví dụ \((3, 2, 4) = 3\hat{\mathbf{i}} + 2\hat{\mathbf{j}} + 4\hat{\mathbf{k}}\).

Bài tập lập trình (dùng CoLab hoặc notebook)

  1. Tính độ lớn của một vector và xác minh nó khớp với định lý Pythagoras, sau đó sửa đổi để tính vector đơn vị.

    import jax.numpy as jnp
    
    a = jnp.array([3.0, 4.0])
    
    magnitude = jnp.sqrt(jnp.sum(a ** 2))
    print(f"Magnitude of a: {magnitude}")
    

  2. Kiểm tra xem hai vector có song song không bằng cách thử xem một vector có là bội của vector kia theo một vô hướng hay không.

    import jax.numpy as jnp
    
    a = jnp.array([2, 4, 6])
    b = jnp.array([1, 2, 3])
    
    ratios = a / b
    print(f"Ratios: {ratios}")
    print(f"Parallel: {jnp.allclose(ratios, ratios[0])}")