Đại số tuyến tính nền tảng cho Machine learning và Deep learning

Đại số tuyến tính là gì?

Đại số tuyến tính là một nhánh của toán học được ứng dụng rộng rãi trong khoa học và kỹ thuật. Tuy nhiên, vì nó thuộc về toán học liên tục (continuous mathematics) thay vì toán học rời rạc (discrete mathematics), nhiều lập trình viên và nhà khoa học máy tính không có nhiều kinh nghiệm với nó.

Để hiểu và làm việc với các thuật toán học máy (machine learning), đặc biệt là deep learning, bạn cần nắm vững các khái niệm cơ bản của đại số tuyến tính. Vì vậy, trước khi đi sâu vào deep learning, chúng ta sẽ tìm hiểu những kiến thức nền tảng cần thiết về đại số tuyến tính.

Nếu bạn đã quen thuộc với đại số tuyến tính, bạn có thể bỏ qua chương này. Nếu bạn cần một tài liệu tham khảo về các công thức quan trọng, có thể tham khảo The Matrix Cookbook (Petersen và Pedersen, 2006). Nếu bạn chưa từng tiếp xúc với đại số tuyến tính, chương này sẽ cung cấp những kiến thức đủ để bạn hiểu nội dung về deep learning, nhưng tốt nhất bạn vẫn nên học thêm từ các tài liệu chuyên sâu khác, chẳng hạn như sách của Shilov (1977).

Các khái niệm quan trọng trong đại số tuyến tính

1. Vô hướng (Scalars)

Vô hướng là một số đơn lẻ. Trong đại số tuyến tính, hầu hết các đối tượng là mảng số (array), nhưng vô hướng chỉ là một số duy nhất. Chúng ta thường ký hiệu vô hướng bằng chữ cái in nghiêng, chẳng hạn như:

  • ( s \in \mathbb{R} ) là một số thực.
  • ( n \in \mathbb{N} ) là một số nguyên dương.

2. Véc-tơ (Vectors)

Véc-tơ là một dãy số có thứ tự. Mỗi phần tử trong véc-tơ được xác định bằng chỉ số của nó. Chúng ta thường ký hiệu véc-tơ bằng chữ cái in đậm, chẳng hạn như ( \mathbf{x} ), và các phần tử bên trong nó được ký hiệu bằng chữ in nghiêng với chỉ số:

  • Véc-tơ ( \mathbf{x} ) có các phần tử ( x_1, x_2, ..., x_n ).
  • Một véc-tơ có ( n ) phần tử thuộc tập hợp ( \mathbb{R}^n ).

Véc-tơ có thể được biểu diễn dưới dạng cột:
[
\mathbf{x} =
\begin{bmatrix}
x_1 \\
x_2 \\
\vdots \\
x_n
\end{bmatrix}
]
hoặc dưới dạng hàng nếu cần chuyển vị.

3. Ma trận (Matrices)

Ma trận là một mảng hai chiều gồm các số. Mỗi phần tử được xác định bởi hai chỉ số hàng và cột. Chúng ta ký hiệu ma trận bằng chữ in đậm và in hoa, ví dụ:

  • Ma trận ( \mathbf{A} \in \mathbb{R}^{m \times n} ) có kích thước ( m ) hàng và ( n ) cột.
  • Phần tử ( A_{i,j} ) là phần tử nằm ở hàng thứ ( i ) và cột thứ ( j ).

Một ma trận ví dụ:
[
\mathbf{A} =
\begin{bmatrix}
A_{1,1} & A_{1,2} \\
A_{2,1} & A_{2,2}
\end{bmatrix}
]

Chuyển vị ma trận (Transpose): Chuyển vị của ma trận ( \mathbf{A} ), ký hiệu ( \mathbf{A}^T ), là ma trận được lật qua đường chéo chính:
[
\mathbf{A}^T =
\begin{bmatrix}
A_{1,1} & A_{2,1} \\
A_{1,2} & A_{2,2}
\end{bmatrix}
]

4. Tensor

Tensor là một mảng số có nhiều chiều hơn ma trận. Trong deep learning, tensor đóng vai trò quan trọng vì dữ liệu thường có nhiều chiều hơn hai (ví dụ: hình ảnh có chiều cao, chiều rộng và số kênh màu). Tensor được ký hiệu bằng chữ cái in đậm, chẳng hạn như ( \mathbf{A} ), với phần tử ( A_{i,j,k} ) đại diện cho tọa độ (i, j, k).

Các phép toán quan trọng trong đại số tuyến tính

1. Cộng và nhân ma trận

  • Cộng hai ma trận cùng kích thước: ( \mathbf{C} = \mathbf{A} + \mathbf{B} ) với ( C_{i,j} = A_{i,j} + B_{i,j} ).
  • Nhân ma trận với một vô hướng: ( \mathbf{D} = a \cdot \mathbf{B} + c ), với mỗi phần tử ( D_{i,j} = a \cdot B_{i,j} + c ).

2. Phép cộng broadcasting

Trong deep learning, phép toán broadcasting được sử dụng để cộng một véc-tơ với từng hàng của một ma trận:
[
\mathbf{C} = \mathbf{A} + \mathbf{b}
]
Trong đó, véc-tơ ( \mathbf{b} ) được tự động mở rộng thành các hàng của ma trận ( \mathbf{A} ) trước khi thực hiện phép cộng.

Sự Phụ Thuộc Tuyến Tính và Không Gian Sinh

Để ma trận ( A^{-1} ) tồn tại, phương trình ( Ax = b ) phải có duy nhất một nghiệm cho mọi giá trị của ( b ). Tuy nhiên, cũng có trường hợp hệ phương trình có vô số nghiệm hoặc không có nghiệm nào cho một số giá trị của ( b ). Điều không thể xảy ra là tồn tại nhiều hơn một nghiệm nhưng ít hơn vô số nghiệm cho một giá trị cụ thể của ( b ). Nếu cả ( x ) và ( y ) đều là nghiệm của phương trình, thì mọi tổ hợp tuyến tính của chúng:

[
z = \alpha x + (1 - \alpha) y
]

cũng là một nghiệm với mọi số thực ( \alpha ).

Không Gian Cột của Ma Trận ( A )

Hãy hình dung các cột của ma trận ( A ) là những hướng khác nhau trong không gian mà ta có thể di chuyển từ gốc tọa độ (điểm có tất cả các phần tử bằng 0). Khi đó, bài toán giải phương trình ( Ax = b ) tương đương với việc xác định liệu ta có thể đến được điểm ( b ) bằng cách kết hợp các cột của ( A ) hay không. Cụ thể:

[
Ax = \sum_{i} x_i A_{:,i}
]

Biểu thức trên mô tả một tổ hợp tuyến tính, tức là tổng của các vector nhân với các hệ số vô hướng. Một tổ hợp tuyến tính của tập hợp các vector ( { v^{(1)}, v^{(2)}, ..., v^{(n)} } ) được định nghĩa như sau:

[
\sum_{i} c_i v^{(i)}
]

Trong đó, ( c_i ) là các hệ số vô hướng.

Kiểm Tra Tồn Tại Nghiệm của ( Ax = b )

Xác định xem phương trình ( Ax = b ) có nghiệm hay không thực chất là kiểm tra xem ( b ) có thuộc không gian cột của ( A ) hay không. Không gian cột (column space) của ( A ) là tập hợp tất cả các điểm có thể đạt được thông qua tổ hợp tuyến tính của các cột của ( A ). Nó còn được gọi là miền giá trị (range) của ma trận ( A ).

Nếu phương trình ( Ax = b ) có nghiệm với mọi giá trị ( b \in \mathbb{R}^m ), thì không gian cột của ( A ) phải bao phủ toàn bộ không gian ( \mathbb{R}^m ). Điều này có nghĩa là số cột của ( A ) phải ít nhất bằng số hàng, tức là ( n \geq m ). Nếu ( n < m ), không gian cột sẽ có số chiều nhỏ hơn ( m ), và sẽ có một số giá trị ( b ) không thể đạt được.

Ví dụ, xét ma trận ( A ) có kích thước ( 3 \times 2 ). Khi đó, ( b ) là một vector trong không gian 3 chiều ((\mathbb{R}^3)), nhưng ( x ) chỉ là một vector 2 chiều ((\mathbb{R}^2)). Vì vậy, tập hợp tất cả các giá trị của ( Ax ) chỉ có thể tạo thành một mặt phẳng 2D trong không gian 3D. Phương trình chỉ có nghiệm nếu ( b ) nằm trên mặt phẳng đó.

Sự Phụ Thuộc Tuyến Tính

Điều kiện ( n \geq m ) chỉ là điều kiện cần để có nghiệm, nhưng chưa đủ. Nếu một số cột của ( A ) là phụ thuộc tuyến tính, tức là có một cột có thể được biểu diễn dưới dạng tổ hợp tuyến tính của các cột khác, thì số chiều của không gian cột vẫn có thể nhỏ hơn ( m ).

Ví dụ, xét ma trận ( 2 \times 2 ) có hai cột giống hệt nhau. Khi đó, không gian cột của nó chỉ là một đường thẳng trong ( \mathbb{R}^2 ), thay vì phủ toàn bộ mặt phẳng 2D. Do đó, phương trình ( Ax = b ) sẽ không có nghiệm với mọi giá trị ( b ).

Một tập hợp vector gọi là độc lập tuyến tính nếu không có vector nào trong tập hợp có thể được biểu diễn dưới dạng tổ hợp tuyến tính của các vector khác. Nếu một ma trận có ít nhất một tập hợp gồm ( m ) cột độc lập tuyến tính, thì nó có thể tạo ra toàn bộ không gian ( \mathbb{R}^m ), và phương trình ( Ax = b ) sẽ luôn có nghiệm.

Điều Kiện Để Ma Trận Có Nghịch Đảo

Để phương trình ( Ax = b ) có nhiều nhất một nghiệm cho mỗi giá trị của ( b ), cần đảm bảo rằng số cột của ( A ) không lớn hơn số hàng, tức là ( n \leq m ). Kết hợp với điều kiện ( n \geq m ), ta suy ra rằng ( A ) phải là một ma trận vuông (( n = m )), và các cột của nó phải độc lập tuyến tính.

Một ma trận vuông có các cột phụ thuộc tuyến tính được gọi là ma trận suy biến (singular matrix). Nếu ma trận ( A ) không vuông hoặc vuông nhưng suy biến, thì phương trình vẫn có thể có nghiệm, nhưng ta không thể tìm nghiệm bằng phương pháp nghịch đảo ma trận.


Như vậy:

  • Sự phụ thuộc tuyến tính và không gian cột của ma trận: Xác định xem phương trình ( Ax = b ) có nghiệm hay không dựa trên không gian cột của ( A ).
  • Điều kiện để phương trình ( Ax = b ) có nghiệm: Ma trận phải có ít nhất ( m ) cột độc lập tuyến tính.
  • Sự độc lập tuyến tính của ma trận: Nếu các cột của ma trận phụ thuộc tuyến tính, phương trình có thể không có nghiệm hoặc có vô số nghiệm.
  • Điều kiện để ma trận có nghịch đảo: Ma trận phải là ma trận vuông với các cột độc lập tuyến tính.
  • Ứng dụng thực tế: Việc kiểm tra sự phụ thuộc tuyến tính giúp xác định khả năng giải hệ phương trình tuyến tính và tối ưu hóa các thuật toán trong AI, Machine Learning và khoa học dữ liệu.

Phân rã Eigen – Cách "tháo rời" ma trận để hiểu rõ hơn

Trong toán học, khi muốn hiểu một đối tượng phức tạp, ta thường tìm cách phân tách nó thành những phần nhỏ hơn hoặc tìm ra những đặc điểm không thay đổi của nó dù ta có biểu diễn theo cách nào đi nữa.

Ví dụ, số nguyên có thể được phân tích thành thừa số nguyên tố. Dù ta viết số 12 dưới dạng thập phân hay nhị phân, nó vẫn luôn có thể được phân tích thành:
[
12 = 2 \times 2 \times 3
]
Từ đây, ta có thể dễ dàng kết luận rằng 12 không chia hết cho 5, nhưng mọi bội số của 12 đều chia hết cho 3.

Tương tự như vậy, với ma trận, ta cũng có thể "tháo rời" nó để tìm ra những tính chất quan trọng mà không bị ảnh hưởng bởi cách biểu diễn thông thường (dưới dạng một bảng số). Cách phân tách phổ biến nhất chính là phân rã eigen (eigendecomposition), giúp ta chia ma trận thành hai phần:

  • Vector riêng (eigenvector): Những hướng đặc biệt mà ma trận chỉ làm thay đổi độ lớn nhưng không thay đổi hướng.
  • Giá trị riêng (eigenvalue): Hệ số thay đổi độ lớn khi nhân ma trận với vector riêng.

Vector riêng và giá trị riêng – "Hướng cố định" của ma trận

Hãy tưởng tượng một ma trận là một phép biến đổi không gian, giống như kéo giãn, quay, hoặc nén một hình nào đó. Có những hướng đặc biệt mà khi ta nhân ma trận với một vector theo hướng đó, vector chỉ bị co giãn hoặc phóng đại mà không thay đổi hướng. Những vector này gọi là vector riêng của ma trận.

Công thức toán học:
Một vector ( v ) khác 0 được gọi là vector riêng của ma trận ( A ) nếu:
[
A v = \lambda v
]
Trong đó:

  • ( A ) là ma trận vuông (có số hàng bằng số cột).
  • ( v ) là vector riêng.
  • ( \lambda ) là giá trị riêng tương ứng với ( v ).

Nói cách khác: Khi nhân ma trận ( A ) với ( v ), ta chỉ làm thay đổi độ lớn của ( v ) mà không thay đổi hướng.

Ví dụ trực quan:
Hãy tưởng tượng bạn đang kéo giãn một tấm vải. Một số đường trên vải có thể bị kéo dài ra nhưng vẫn giữ nguyên hướng ban đầu. Những đường này chính là vector riêng, và hệ số kéo giãn của chúng chính là giá trị riêng.


Phân rã eigen – Tách ma trận thành "hướng" và "độ lớn"

Nếu một ma trận ( A ) có đủ vector riêng độc lập tuyến tính ( v^{(1)}, v^{(2)}, ..., v^{(n)} ), ta có thể tập hợp chúng thành một ma trận ( V ):
[
V = [v^{(1)}, v^{(2)}, ..., v^{(n)}]
]
Tương tự, các giá trị riêng ( \lambda_1, \lambda_2, ..., \lambda_n ) được xếp thành một ma trận đường chéo ( \Lambda ):
[
\Lambda = \text{diag}(\lambda_1, \lambda_2, ..., \lambda_n)
]
Lúc này, ta có thể viết lại ma trận ( A ) dưới dạng:
[
A = V \Lambda V^{-1}
]
Ý nghĩa của công thức này:

  • ( V ) chứa các vector riêng – chúng chỉ ra các hướng đặc biệt trong không gian mà ma trận tác động lên.
  • ( \Lambda ) chứa các giá trị riêng – chỉ ra mức độ co giãn theo từng hướng đó.
  • ( V^{-1} ) giúp chuyển từ hệ tọa độ thông thường sang hệ tọa độ dựa trên vector riêng.

Ví dụ trực quan:
Hãy tưởng tượng bạn có một tờ giấy và bạn muốn bóp méo nó. Bạn có thể kéo dãn theo một số hướng nhất định mà vẫn giữ hình dạng tương đối. Những hướng này chính là vector riêng, và mức độ kéo dãn là giá trị riêng.


Điều kiện để ma trận có thể phân rã eigen

Không phải mọi ma trận đều có thể phân rã theo cách này. Một số ma trận có thể không có đủ vector riêng hoặc có giá trị riêng là số phức.

May mắn thay, một lớp ma trận đặc biệt gọi là ma trận đối xứng thực (real symmetric matrix) luôn có thể phân rã eigen:
[
A = Q \Lambda Q^T
]

  • ( Q ) là ma trận trực giao, chứa các vector riêng.
  • ( \Lambda ) là ma trận đường chéo, chứa các giá trị riêng.
  • Vì ( Q ) là trực giao, ta có thể coi ( A ) như một phép co giãn không gian theo từng hướng của vector riêng.

Ứng dụng của phân rã eigen

Phân rã eigen có rất nhiều ứng dụng quan trọng:

Xác định ma trận có bị suy biến không

Nếu một ma trận có ít nhất một giá trị riêng bằng 0, nó không thể nghịch đảo được. Điều này có nghĩa là nó sẽ làm mất thông tin khi nhân với vector nào đó.

Giải các bài toán tối ưu hóa

Nhiều bài toán tối ưu liên quan đến việc tìm cực đại hoặc cực tiểu của hàm bậc hai dạng:
[
f(x) = x^T A x
]
Khi ( x ) là vector riêng của ( A ), giá trị của ( f(x) ) chính là giá trị riêng tương ứng.

  • Giá trị lớn nhất của hàm chính là giá trị riêng lớn nhất của ( A ).
  • Giá trị nhỏ nhất của hàm chính là giá trị riêng nhỏ nhất của ( A ).

Kiểm tra tính xác định của ma trận

Dựa vào dấu của giá trị riêng, ta có thể phân loại ma trận:

  • Nếu tất cả giá trị riêng > 0 → ma trận xác định dương (positive definite).
  • Nếu tất cả giá trị riêng ≥ 0 → ma trận xác định nửa dương (positive semi-definite).
  • Nếu tất cả giá trị riêng < 0 → ma trận xác định âm (negative definite).
  • Nếu tất cả giá trị riêng ≤ 0 → ma trận xác định nửa âm (negative semi-definite).

Ý nghĩa:
Ma trận xác định dương rất quan trọng trong machine learning vì nó đảm bảo rằng:
[
\forall x, \quad x^T A x \geq 0
]
Tức là nó không bao giờ làm cho một giá trị bị đảo ngược dấu bất thường.


Phân rã eigen là một công cụ mạnh mẽ giúp chúng ta "tháo rời" ma trận để hiểu cách nó hoạt động. Nó giống như việc phân tích số nguyên thành thừa số nguyên tố, giúp ta hiểu được tính chất sâu hơn của ma trận. Phân rã eigen không chỉ là một khái niệm toán học, mà còn có nhiều ứng dụng thực tế trong khoa học dữ liệu, tối ưu hóa, xử lý ảnh, và machine learning.

Phân rã Eigen và Phân rã Giá trị Suy biến (SVD)

Phân rã Eigen

Phân rã eigen giúp ta biểu diễn một ma trận ( A ) thành:
[
A = V , \text{diag}(\lambda) , V^{-1}
]
Trong đó:

  • ( V ) chứa các vector riêng của ( A ).
  • ( \lambda ) chứa các giá trị riêng (eigenvalues) trên đường chéo.

Tuy nhiên, nếu ( A ) không phải là ma trận vuông, ta không thể áp dụng phân rã eigen. Khi đó, ta sử dụng phân rã giá trị suy biến (SVD).

Phân rã Giá trị Suy biến (SVD)

Phân rã SVD biểu diễn ma trận ( A ) thành tích của ba ma trận:
[
A = U D V^T
]
Với:

  • ( A ) là ma trận kích thước ( m \times n ).
  • ( U ) là ma trận trực giao kích thước ( m \times m ), chứa các vector riêng bên trái.
  • ( D ) là ma trận đường chéo kích thước ( m \times n ), chứa các giá trị suy biến (singular values).
  • ( V ) là ma trận trực giao kích thước ( n \times n ), chứa các vector riêng bên phải.

🔹 Liên hệ giữa SVD và phân rã Eigen:

  • Các vector riêng bên trái của ( A ) chính là vector riêng của ( AA^T ).
  • Các vector riêng bên phải của ( A ) chính là vector riêng của ( A^T A ).
  • Các giá trị suy biến của ( A ) là căn bậc hai của các giá trị riêng của ( A^T A ) hoặc ( AA^T ).

🔹 Ứng dụng quan trọng của SVD:
SVD giúp ta mở rộng khái niệm nghịch đảo ma trận cho ma trận không vuông, dẫn đến một khái niệm quan trọng khác: nghịch đảo giả Moore-Penrose.


Nghịch đảo giả Moore-Penrose

Vấn đề với nghịch đảo thông thường

Với một phương trình tuyến tính:
[
Ax = y
]
Ta thường tìm nghịch đảo của ( A ) để tính nghiệm:
[
x = A^{-1} y
]
Nhưng nếu ( A ) không phải là ma trận vuông, nghịch đảo ( A^{-1} ) không tồn tại!

Giải pháp: Dùng nghịch đảo giả Moore-Penrose

Nghịch đảo giả Moore-Penrose của ( A ) được định nghĩa là:
[
A^+ = \lim_{\alpha \to 0} (A^T A + \alpha I)^{-1} A^T
]
Trong thực tế, ta không tính nghịch đảo giả theo công thức trên, mà dựa vào phân rã SVD:
[
A^+ = V D^+ U^T
]
Trong đó:

  • ( D^+ ) là nghịch đảo của ma trận ( D ), được tính bằng cách lấy nghịch đảo các phần tử khác 0 trên đường chéo của ( D ), sau đó chuyển vị.

🔹 Cách dùng nghịch đảo giả Moore-Penrose:

  • Nếu ( A ) có nhiều hơn cột hơn hàng (( m < n )):

    • Hệ phương trình có nhiều nghiệm.
    • Nghịch đảo giả chọn nghiệm ( x = A^+ y ) có chuẩn Euclid nhỏ nhất.
  • Nếu ( A ) có nhiều hơn hàng hơn cột (( m > n )):

    • Hệ phương trình có thể không có nghiệm.
    • Dùng nghịch đảo giả, ta tìm được ( x ) sao cho ( Ax ) gần với ( y ) nhất theo chuẩn Euclid.

Toán tử Dấu Vết (Trace Operator)

Toán tử dấu vết (trace) của một ma trận là tổng các phần tử trên đường chéo chính:
[
\text{Tr}(A) = \sum_i A_{i,i}
]

Tính chất của toán tử dấu vết

  1. Liên hệ với chuẩn Frobenius
    Chuẩn Frobenius của một ma trận có thể được viết dưới dạng dấu vết:
    [
    ||A||_F = \sqrt{\text{Tr}(AA^T)}
    ]
    Điều này giúp biểu diễn toán học gọn gàng hơn khi làm việc với chuẩn của ma trận.

  2. Bất biến với phép chuyển vị
    [
    \text{Tr}(A) = \text{Tr}(A^T)
    ]
    Nghĩa là hoán đổi hàng và cột của ma trận không ảnh hưởng đến dấu vết.

  3. Hoán đổi vị trí trong tích ma trận
    Với ba ma trận ( A, B, C ), ta có:
    [
    \text{Tr}(ABC) = \text{Tr}(CAB) = \text{Tr}(BCA)
    ]
    Điều này có nghĩa là khi tính dấu vết, ta có thể đẩy ma trận cuối lên đầu mà không làm thay đổi kết quả, miễn là phép nhân vẫn hợp lệ.

  4. Định lý quan trọng: Dấu vết của tích hai ma trận có thể hoán đổi
    Với ( A \in \mathbb{R}^{m \times n} ) và ( B \in \mathbb{R}^{n \times m} ), ta luôn có:
    [
    \text{Tr}(AB) = \text{Tr}(BA)
    ]
    Ngay cả khi ( AB ) có kích thước khác ( BA ), tổng các phần tử đường chéo vẫn giống nhau.

  5. Mọi số vô hướng đều là dấu vết của chính nó
    [
    a = \text{Tr}(a)
    ]
    Điều này có nghĩa là với một số thực ( a ), ta có thể coi nó như một ma trận ( 1 \times 1 ), và dấu vết của nó chính là nó.


  1. Phân rã Eigen giúp biểu diễn ma trận vuông dưới dạng vector riêng và giá trị riêng.
  2. Phân rã Giá trị Suy biến (SVD) mở rộng phân rã Eigen cho ma trận không vuông, giúp hiểu sâu hơn về không gian tác động của ma trận.
  3. Nghịch đảo giả Moore-Penrose cho phép giải phương trình tuyến tính ngay cả khi không thể lấy nghịch đảo thông thường.
  4. Toán tử dấu vết (trace) giúp biểu diễn tổng các phần tử trên đường chéo và có nhiều ứng dụng trong tối ưu hóa ma trận.

Ứng dụng thực tế:

  • SVD được dùng trong giảm chiều dữ liệu (PCA).
  • Nghịch đảo giả Moore-Penrose dùng trong hồi quy tuyến tính.
  • Dấu vết ma trận quan trọng trong machine learningxử lý ảnh.

Hiểu những khái niệm này sẽ giúp bạn áp dụng đại số tuyến tính vào AI, machine learning và khoa học dữ liệu một cách hiệu quả hơn!

Read more