2.3. Đại Số Tuyến Tính - Đắm Mình Vào Học Sâu

2.3.6. Rút gọn¶

Một phép toán hữu ích mà ta có thể thực hiện trên bất kỳ tensor nào là phép tính tổng các phần tử của nó. Ký hiệu toán học của phép tính tổng là \(\sum\). Ta biểu diễn phép tính tổng các phần tử của một vector \(\mathbf{x}\) với độ dài \(d\) dưới dạng \(\sum_{i=1}^d x_i\). Trong mã nguồn, ta chỉ cần gọi hàm sum.

x = np.arange(4) x, x.sum() (array([0., 1., 2., 3.]), array(6.))

Ta có thể biểu diễn phép tính tổng các phần tử của tensor có kích thước tùy ý. Ví dụ, tổng các phần tử của một ma trận \(m \times n\) có thể được viết là \(\sum_{i=1}^{m} \sum_{j=1}^{n} a_{ij}\).

A.shape, A.sum() ((5, 4), array(190.))

Theo mặc định, hàm sum sẽ rút gọn tensor dọc theo tất cả các trục của nó và trả về kết quả là một số vô hướng. Ta cũng có thể chỉ định các trục được rút gọn bằng phép tổng. Lấy ma trận làm ví dụ, để rút gọn theo chiều hàng (trục \(0\)) bằng việc tính tổng tất cả các hàng, ta đặt axis=0 khi gọi hàm sum.

A_sum_axis0 = A.sum(axis=0) A_sum_axis0, A_sum_axis0.shape (array([40., 45., 50., 55.]), (4,))

Việc đặt axis=1 sẽ rút gọn theo cột (trục \(1\)) bằng việc tính tổng tất cả các cột. Do đó, kích thước trục \(1\) của đầu vào sẽ không còn trong kích thước của đầu ra.

A_sum_axis1 = A.sum(axis=1) A_sum_axis1, A_sum_axis1.shape (array([ 6., 22., 38., 54., 70.]), (5,))

Việc rút gọn ma trận dọc theo cả hàng và cột bằng phép tổng tương đương với việc cộng tất cả các phần tử trong ma trận đó lại.

A.sum(axis=[0, 1]) # Same as A.sum() array(190.)

Một đại lượng liên quan là trung bình cộng. Ta tính trung bình cộng bằng cách chia tổng các phần tử cho số lượng phần tử. Trong mã nguồn, ta chỉ cần gọi hàm mean với đầu vào là các tensor có kích thước tùy ý.

A.mean(), A.sum() / A.size (array(9.5), array(9.5))

Giống như sum, hàm mean cũng có thể rút gọn tensor dọc theo các trục được chỉ định.

A.mean(axis=0), A.sum(axis=0) / A.shape[0] (array([ 8., 9., 10., 11.]), array([ 8., 9., 10., 11.]))

2.3.6.1. Tổng không rút gọn¶

Tuy nhiên, việc giữ lại số các trục đôi khi là cần thiết khi gọi hàm sum hoặc mean, bằng cách đặt keepdims=True.

sum_A = A.sum(axis=1, keepdims=True) sum_A array([[ 6.], [22.], [38.], [54.], [70.]])

Ví dụ, vì sum_A vẫn giữ lại \(2\) trục sau khi tính tổng của mỗi hàng, chúng ta có thể chia A cho sum_A thông qua cơ chế lan truyền.

A / sum_A array([[0. , 0.16666667, 0.33333334, 0.5 ], [0.18181819, 0.22727273, 0.27272728, 0.3181818 ], [0.21052632, 0.23684211, 0.2631579 , 0.28947368], [0.22222222, 0.24074075, 0.25925925, 0.2777778 ], [0.22857143, 0.24285714, 0.25714287, 0.27142859]])

Nếu chúng ta muốn tính tổng tích lũy các phần tử của A dọc theo các trục, giả sử axis=0 (từng hàng một), ta có thể gọi hàm cumsum. Hàm này không rút gọn chiều của tensor đầu vào theo bất cứ trục nào.

A.cumsum(axis=0) array([[ 0., 1., 2., 3.], [ 4., 6., 8., 10.], [12., 15., 18., 21.], [24., 28., 32., 36.], [40., 45., 50., 55.]])

Từ khóa » Chuẩn Vô Cùng Là Gì