Machine Learning và Đại số Tuyến tính (Phần 2)

Tiếp tục với những kiến thức cơ sở về Đại số Tuyến tính, bài viết sau đây nói về ma trận và tensor.

Mục lục

0 chiều, 1 chiều, 2 chiều, và nhiều chiều (tiếp theo)

6. Ma trận (matrix)

7. Làm toán với ma trận

8. Tensor

9. 0 chiều, 1 chiều, 2 chiều, và nhiều chiều

Nguồn tham khảo

0 chiều, 1 chiều, 2 chiều, và nhiều chiều (tiếp theo)

6. Ma trận (matrix)

Ở bài viết trước, chúng ta đã biết vector là gì và các dữ liệu được mã hóa thông qua vector như thế nào. Trong thực tế, số lượng dữ liệu cần lưu trữ và xử lí là vô cùng lớn; sử dụng các thao tác lần lượt trên vector thì lại rườm rà. Vì thế, người ta mới nghĩ cách để sử dụng nhiều vector cùng một lúc: họ xếp tất cả các vector cột cùng độ dài cần xử lí cạnh nhau, tạo ra một bảng dữ liệu 2 chiều gọi là ma trận (matrix).

Tiếp tục với ví dụ ở phần 1 (scalar và vector), thay vì viết ra lần lượt 2 vector AB thể hiện tính chất của hai ngôi nhà, ta có thể viết chúng cùng một lúc với ma trận:

\begin{bmatrix} 100 & 200\\ 3 & 3\\ 5 & 5 \end{bmatrix} ,

trong đó, cột bên trái thể hiện số liệu cho căn nhà A, cột bên phải ứng với căn nhà B.

Cũng giống như ở vector, mỗi phần tử của một ma trận đều có địa chỉ và có thể được truy cập thông qua địa chỉ tương ứng.

\begin{bmatrix} a_{1,1} & \dots & a_{1,n}\\ \vdots & \ddots & \vdots\\ a_{m,1} & \dots & a_{m,n} \end{bmatrix}

Các địa chỉ của một ma trận bao gồm hai thành phần là dòng và cột. Cho phần tử a_{i,j} của một ma trận a nào đó, ta có thể biết là phần tử này nằm ở dòng i (từ trên xuống dưới), cột j (từ trái sang phải) của ma trận đó. Khi nói đến một ma trận kích thước m \times n, ta cũng biết rằng ma trận đó có m dòng và n cột. Ngoài ra, để có thể thao tác với ma trận, các phần tử của cùng một ma trận phải có chung kiểu dữ liệu (là int hoặc float). Một ma trận m \times n có kiểu dữ liệu float có thể được gọi là phần tử của \mathbb{R}^{m \times n}.

Một số loại ma trận đặc biệt

Vector

Ma trận có nhiều dòng, nhiều cột được thì cũng có thể có 1 dòng hay 1 cột. Vector cũng được coi là ma trận với kích thước 1 \times n (vector hàng) hoặc m \times 1 (vector cột).

Ma trận vuông

Hình ảnh trực quan của ma trận là bảng chữ nhật. Khi bảng chữ nhật này trở thành hình vuông, tức là chiều dài hai chiều của bảng bằng nhau, ta có được một ma trận vuông. Như vậy, những ma trận có số dòng bằng số cột (kích thước n \times n) thì được gọi là ma trận vuông.

\begin{bmatrix} 1 & 2 & 3\\ 4 & 5 & 6\\ 7 & 8 & 9 \end{bmatrix}.

Ma trận không

Vector không là vector chứa giá trị 0 tại tất cả vị trí. Cũng như vậy, ma trận không (hay ma trận null) \mathbf{0}_{m \times n} là ma trận kích thước m \times n trong đó tất cả phần tử mang giá trị 0.

\begin{bmatrix} 0 & \dots & 0\\ \vdots & \ddots & \vdots\\ 0 & \dots & 0 \end{bmatrix}.

Ma trận đơn vị

Có số 0 thì cũng có số 1. Có ma trận \mathbf{0} thì sẽ có ma trận 1 thôi!

Ma trận đơn vị là ma trận vuông thỏa mãn một tính chất đặc biệt: tại ma trận đơn vị \mathbf{A}_{n \times n}, ngoại trừ các phần tử trên đường chéo \mathbf{A}_{1,1} \rightarrow \mathbf{A}_{n,n} cùng mang giá trị 1, các phần tử còn lại đều mang giá trị 0.

\begin{bmatrix} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{bmatrix}.

Ma trận đơn vị kích thước n \times n được gọi là ma trận đơn vị bậc n và có kí hiệu là \mathbf{I}_n.

Ma trận đường chéo

Những con số 1 trong ma trận đơn vị thật đơn sắc. Nếu không phải số 1 mà là số 2, số 3 thì sao?

Ma trận vuông \mathbf{A} kích thước n \times n được gọi là ma trận đường chéo khi tất cả phần tử nằm ngoài đường chéo \mathbf{A}_{1,1} \rightarrow \mathbf{A}_{n,n} đều có giá trị là 0.

\begin{bmatrix} 1 & 0 & 0\\ 0 & 5 & 0\\ 0 & 0 & 9 \end{bmatrix}

7. Làm toán với ma trận

Ma trận chuyển vị

Phép chuyển vị cho phép “đổi dòng thành cột, đổi cột thành dòng”. Để thực hiện được điều này, phép chuyển vị biến phần tử ở dòng i, cột j của một ma trận m \times n thành phần tử ở dòng j, cột i ở ma trận n \times m mới, với mỗi cặp (i,j) khả thi. Phát biểu Toán học, ma trận \mathbf{B}_{m \times n} là ma trận chuyển vị của ma trận \mathbf{A}_{n \times m} khi và chỉ khi

\mathbf{B}_{i,j}=\mathbf{A}_{j,i},\forall (i,j).

Lúc này, \mathbf{B} được ký hiệu là \mathbf{A}^T.

Một số ví dụ:

trans.png

Phép cộng ma trận

Phép cộng ma trận lấy input là 2 ma trận cùng kích thước, và trả ra một ma trận khác cũng cùng kích thước. Ma trận output có giá trị tại vị trí bất kì bằng tổng giá trị của các phần tử cùng vị trí của hai ma trận input.

\mathbf{X} + \mathbf{Y} := \begin{bmatrix} x_{1,1}+y_{1,1} & \dots & x_{1,n}+y_{1,n}\\ \vdots & \ddots & \vdots\\ x_{m,1}+y_{m,1} & \dots & x_{m,n}+y_{m,n} \end{bmatrix},

với \mathbf{X} = \begin{bmatrix}  x_{1,1} & \dots & x_{1,n}\\  \vdots & \ddots & \vdots\\  x_{m,1} & \dots & x_{m,n}  \end{bmatrix} \in \mathbb{R}^{m \times n}\mathbf{Y} = \begin{bmatrix}  y_{1,1} & \dots & y_{1,n}\\  \vdots & \ddots & \vdots\\  y_{m,1} & \dots & y_{m,n}  \end{bmatrix} \in \mathbb{R}^{m \times n}.

Phép nhân ma trận với scalar

Tương tự như phép nhân vector với scalar, tại phép nhân ma trận với scalar, ta cũng nhân từng phần tử của ma trận với scalar ấy. Ví dụ:

unnamed.png

Phép nhân hai ma trận

Phép nhân hai ma trận được thực hiện theo nguyên tắc dòng và cột. Giả sử tích của hai ma trận \mathbf{A}\mathbf{B}\mathbf{C} thì giá trị của phần tử \mathbf{C}_{i,j} sẽ bằng với tích vô hướng của vector dòng i của \mathbf{A} và vector cột j của \mathbf{B}. Muốn thực hiện được, rõ ràng là dòng i bất kì của ma trận \mathbf{A} phải có cùng độ dài với cột j bất kì của \mathbf{B}. Nói cách khác, điều kiện để thực hiện phép nhân hai ma trận là số cột của ma trận đầu phải bằng số dòng của ma trận sau.

Gọi ma trận \mathbf{C}_{m \times p} là tích của 2 ma trận \mathbf{A}_{m \times n}\mathbf{B}_{n \times p} thì

\mathbf{C}_{i,j}=\mathbf{A}_{i,*} \cdot \mathbf{B}_{*,j} = \sum_{k=1}^n \mathbf{A}_{i,k} \times \mathbf{B}_{k,j}\forall (i,j).

Phép nhân Hadamard

Phép nhân Hadamard cùng với phép cộng ma trận là các phép toán được thực hiện theo từng cặp phần tử tương ứng của hai ma trận (element-wise). Phép nhân này lấy input là hai ma trận cùng kích thước và cũng trả ra một ma trận có cùng kích thước. Mỗi phần tử của ma trận output có giá trị là tích hai phần tử tương ứng từ hai ma trận input. Về mặt công thức thì

\mathbf{X} \circ \mathbf{Y} := \begin{bmatrix} x_{1,1}y_{1,1} & \dots & x_{1,n}y_{1,n}\\ \vdots & \ddots & \vdots\\ x_{m,1}y_{m,1} & \dots & x_{m,n}y_{m,n} \end{bmatrix},

với \mathbf{X} = \begin{bmatrix}  x_{1,1} & \dots & x_{1,n}\\  \vdots & \ddots & \vdots\\  x_{m,1} & \dots & x_{m,n}  \end{bmatrix} \in \mathbb{R}^{m \times n}\mathbf{Y} = \begin{bmatrix}  y_{1,1} & \dots & y_{1,n}\\  \vdots & \ddots & \vdots\\  y_{m,1} & \dots & y_{m,n}  \end{bmatrix} \in \mathbb{R}^{m \times n}.

Ma trận nghịch đảo

Trong Toán sơ cấp, nghịch đảo của số a là một số a^{-1} sao cho a \times a^{-1} = 1.

Trong ngôn ngữ của ma trận, số 1 ở trên được thay bằng ma trận đơn vị; phép nhân scalar cũng được thay thế bằng phép nhân 2 ma trận.

Với \mathbf{A} là một ma trận vuông, ta gọi \mathbf{A}^{-1} là ma trận nghịch đảo của \mathbf{A} nếu

\mathbf{A}^{-1} \mathbf{A} = \mathbf{I}

Có rất nhiều tính chất cho từng phép toán cho ma trận nói trên. Việc nắm được một số lượng nhất định trong số chúng sẽ giúp ích cho bạn trong quá trình tính toán và biến đổi với ma trận. Tuy nhiên việc liệt kê quá nhiều tính chất trong bài viết này là không cần thiết, do những tính chất ấy có thể dễ dàng tìm được trên nhiều nguồn tham khảo trực tuyến. Vì vậy, chúng mình sẽ chỉ đưa ra những nguồn tham khảo hữu ích cho bạn đọc.

Norm của ma trận

Khái niệm norm của ma trận có nhiều tương đồng với khái niệm norm của vector. Với \alpha là một scalar, \mathbf{A}\mathbf{B} là các ma trận cùng kích thước của kiểu dữ liệu scalar tương ứng thì công thức norm ma trận \| . \| phải thỏa mãn những tính chất sau:

  • \|\alpha \mathbf{A}\|=|\alpha| \|\mathbf{A}\|;
  • \|\mathbf{A}+B\| \le \|\mathbf{A}\|+\|\mathbf{B}\|;
  • \|\mathbf{A}\|\ge 0\;
  • \|\mathbf{A}\|= 0 khi và chỉ khi \displaystyle \mathbf{A}=\mathbf{0}_{m \times n}.

Tại đây mình đưa ra ví dụ công thức norm bậc 2 của ma trận, giống như công thức Euclidean norm của vector:

\|\mathbf{A}\|_2 := {\bigg (} \sum_{i}^{m} \sum_{j}^{n} A_{i,j}^2 {\bigg )} ^{1/2}

8. Tensor

Đã bao giờ bạn thắc mắc là làm thế nào mà những hình ảnh màu trên máy tính có thể tái hiện lại được chân thực những hình ảnh bạn quan sát được trong cuộc sống? Câu trả lời nằm ở điều kì diệu mang tên tensor.

Trước tiên hãy quay lại một chút về ma trận.

Mỗi tấm ảnh trắng đen đều mang thông tin dưới dạng một lưới các điểm ảnh nhỏ (pixel). Lưới pixel có thể được biểu diễn bởi một ma trận, trong đó mỗi phần tử mang dữ liệu về “độ trắng” (từ 0 đến 255) cho điểm ảnh ở vị trí tương ứng.

mnist.png

Ví dụ: 4 ảnh trắng đen phía trên được lấy từ bộ dữ liệu chữ số viết tay MNIST, mỗi ảnh có kích thước 28 * 28 pixel, tương ứng với ma trận chứa 28 * 28 con số trong khoảng từ 0 đến 255.

Nhưng bây giờ thì những bức ảnh trong cuộc sống hằng ngày của chúng ta đã mang nhiều màu sắc rực rỡ hơn chứ không chỉ gói gọn giữa trắng và đen! Để biểu diễn màu sắc, người ta dùng hệ thống gồm ba màu cơ bản là đỏ, lục, và lam. Mỗi màu sắc khác được tạo ra đều là tổ hợp của ba màu này với cường độ thích hợp. Ba màu sắc ứng với ba tấm màng lọc, mà trong đó mỗi tấm màng có nhiệm vụ không khác gì lưới pixel trong ảnh trắng đen: thể hiện “độ đỏ”, “độ lục”, hoặc “độ lam” bằng con số từ 0 đến 255 cho mỗi điểm ảnh.

a-brief-survey-of-tensors-5-638.jpg

Bạn đã biết rằng các vector xếp cạnh nhau tạo thành ma trận. Vậy thì việc xếp ba ma trận cạnh nhau để tạo thành một kiểu dữ liệu mới là chuyện hoàn toàn có thể. Người ta gọi tên kiểu dữ liệu ấy là tensor bậc 3. 3 chiều của dữ liệu bao gồm chiều sâu (sử dụng “màng lọc” nào), chiều dài (địa chỉ cột trong ma trận điểm ảnh), chiều rộng (địa chỉ dòng trong ma trận điểm ảnh). Bản thân các ma trận cũng là những tensor bậc 2, còn vector là tensor bậc 1.

Xếp những tensor bậc 3 cạnh nhau, ta được một tensor bậc 4. Lấy ví dụ, mỗi đoạn phim sẽ bao gồm nhiều khung ảnh chạy nối tiếp nhau. Mỗi khung ảnh màu là một tensor bậc 3, và ta sẽ có thêm địa chỉ thứ 4 để chỉ đến trình tự thời gian (khung ảnh nào đến trước, khung ảnh nào đến sau). Tương tự, ta có thể xây dựng nên các tensor bậc 5, bậc 6, … một cách đơn giản.

4ten.jpg

9. 0 chiều, 1 chiều, 2 chiều, và nhiều chiều

Đến thời điểm này, chúng mình đã điểm qua các khái niệm về scalar, vector, ma trận và tensor, cùng với một số phép toán được thực hiện trên những đối tượng này. Chặng đường chúng ta đã đi qua có tên gọi là “0 chiều, 1 chiều, 2 chiều, và nhiều chiều”. Từ những “con số” mang tên scalar, chúng ta đã đến với vector, đối tượng dữ liệu có phần tử được truy cập qua một chỉ số, và sau đó là ma trận, bảng hình chữ nhật có dòng và cột, và cuối cùng là tensor, kiểu dữ liệu tổng quát, bao trùm lên các đối tượng còn lại. Không phải trùng hợp khi trong lập trình, vector được gọi là “mảng một chiều”, ma trận là “mảng hai chiều”, và tensor có thể được coi là “mảng nhiều chiều”.

Phần tiếp theo của chuỗi bài “Machine Learning và Đại số Tuyến tính” nói về không gian vector sẽ sớm được hoàn thành. Hẹn gặp lại các bạn vào phần sau!

Nguồn tham khảo

Trong bài viết vừa rồi, những định nghĩa được đưa ra dựa trên nhiều nguồn tham khảo trên Internet và cả góc nhìn cá nhân của các tác giả, do đó có thể là không chuẩn xác. Bạn đọc có bất kì đóng góp nào xin vui lòng liên hệ Facebook page của blog hoặc tài khoản Facebook cá nhân của Minh.  

 

Leave a comment