Phát sóng

Tài liệu này mô tả ngữ nghĩa truyền tin của XLA.

Phát sóng là gì?

Truyền phát là quá trình tạo các mảng có hình dạng khác nhau có hình dạng tương thích cho các phép tính số học. Thuật ngữ này được sử dụng từ phương thức phát sóng NumPy.

Bạn có thể cần truyền phát cho các phép toán giữa các mảng đa chiều có thứ hạng khác nhau hoặc giữa các mảng đa chiều có các hình dạng khác nhau nhưng tương thích. Hãy xem xét phép cộng X+v, trong đó X là một ma trận (mảng hạng 2) và v là một vectơ (mảng hạng 1). Để thực hiện việc bổ sung theo phần tử, XLA cần "phát đi" vectơ v đến cùng thứ hạng với ma trận X, bằng cách sao chép v với số lần nhất định. Độ dài của vectơ phải khớp với ít nhất một trong các kích thước của ma trận.

Ví dụ:

|1 2 3| + |7 8 9|
|4 5 6|

Kích thước của ma trận là (2,3) và chiều của vectơ là (3). Vectơ này được truyền đi bằng cách sao chép vectơ đó trên các hàng để có được:

|1 2 3| + |7 8 9| = |8  10 12|
|4 5 6|   |7 8 9|   |11 13 15|

Trong NumPy, thao tác này được gọi là broadcasting (thông báo).

Nguyên tắc

Ngôn ngữ XLA nghiêm ngặt và rõ ràng nhất có thể, tránh các tính năng "ma thuật" ngầm ẩn. Các tính năng như vậy có thể giúp xác định một số tính toán dễ dàng hơn một chút, nhưng với cái giá là nhiều giả định hơn được tích hợp vào mã người dùng sẽ khó thay đổi về lâu dài. Nếu cần, bạn có thể thêm các tính năng kỳ diệu ngầm ẩn vào trình bao bọc cấp ứng dụng.

Đối với việc phát sóng, XLA yêu cầu thông số kỹ thuật phát sóng rõ ràng đối với các hoạt động giữa các mảng có thứ hạng khác nhau. Điều này khác với NumPy vốn dự đoán thông số kỹ thuật khi có thể.

Truyền phát một mảng cấp thấp hơn lên một mảng cấp cao hơn

Đại lượng vô hướng luôn có thể được truyền phát trên các mảng mà không cần thông số kỹ thuật rõ ràng về kích thước truyền tin. Một phép toán nhị phân theo phần tử giữa đại lượng vô hướng và một mảng có nghĩa là áp dụng toán tử có đại lượng vô hướng cho từng phần tử trong mảng. Ví dụ: việc thêm đại lượng vô hướng vào một ma trận có nghĩa là tạo một ma trận, trong đó mỗi phần tử là tổng của đại lượng vô hướng và phần tử tương ứng của ma trận đầu vào.

|1 2 3| + 7 = |8  9  10|
|4 5 6|       |11 12 13|

Bạn có thể ghi lại hầu hết các nhu cầu truyền tin bằng cách sử dụng một bộ dữ liệu phương diện trong một toán tử nhị phân. Khi các dữ liệu đầu vào cho hoạt động có thứ hạng khác nhau, bộ dữ liệu phát đi thông báo này sẽ chỉ định(các) kích thước trong mảng thứ hạng cao hơn để khớp với mảng thứ hạng thấp hơn.

Hãy xem xét ví dụ trước. Thay vì thêm đại lượng vô hướng vào ma trận (2,3), hãy thêm vectơ có chiều (3) vào ma trận kích thước (2,3). Nếu không chỉ định thông báo thì thao tác này sẽ không hợp lệ. Để yêu cầu bổ sung vectơ-ma trận một cách chính xác, hãy chỉ định chiều phát sóng là (1), có nghĩa là chiều của vectơ được khớp với chiều 1 của ma trận. Trong chế độ 2D, nếu chiều 0 đại diện cho hàng và chiều 1 đại diện cho cột, thì mỗi phần tử của vectơ sẽ trở thành một cột có kích thước khớp với số hàng trong ma trận:

|7 8 9| ==> |7 8 9|
            |7 8 9|

Một ví dụ phức tạp hơn, hãy cân nhắc việc thêm vectơ 3 phần tử (kích thước (3)) vào ma trận 3x3 (kích thước (3,3)). Có 2 cách phát sóng trong ví dụ này:

(1) Có thể sử dụng chiều phát sóng là 1. Mỗi phần tử vectơ sẽ trở thành một cột và vectơ đó được sao chép cho mỗi hàng trong ma trận.

|7 8 9| ==> |7 8 9|
            |7 8 9|
            |7 8 9|

(2) Có thể sử dụng chiều truyền tin bằng 0. Mỗi phần tử vectơ sẽ trở thành một hàng và vectơ được sao chép cho mỗi cột trong ma trận.

 |7| ==> |7 7 7|
 |8|     |8 8 8|
 |9|     |9 9 9|

Kích thước truyền tin có thể là một bộ dữ liệu mô tả cách truyền hình hình dạng thứ hạng nhỏ hơn thành hình dạng thứ hạng lớn hơn. Ví dụ: có một hình khối 2x3x4 và một ma trận 3x4, một bộ dữ liệu truyền tin (1,2) có nghĩa là so khớp ma trận với kích thước 1 và 2 của hình khối.

Loại thông báo truyền tin này được dùng trong hoạt động nhị phân trong XlaBuilder, nếu đối số broadcast_dimensions được cung cấp. Ví dụ: hãy xem XlaBuilder::Add. Trong mã nguồn XLA, loại hình truyền tin này đôi khi được gọi là truyền tin "InDim".

Định nghĩa chính thức

Thuộc tính truyền tin cho phép so khớp một mảng cấp thấp hơn với mảng cấp cao hơn bằng cách chỉ định phương diện nào của mảng cấp cao hơn cần khớp. Ví dụ: đối với một mảng có kích thước MxNxPxQ, bạn có thể so khớp vectơ có kích thước T như sau:

          MxNxPxQ

dim 3:          T
dim 2:        T
dim 1:      T
dim 0:    T

Trong mỗi trường hợp, T phải bằng với chiều phù hợp của mảng cấp cao hơn. Sau đó, các giá trị của vectơ được truyền từ phương diện đã khớp đến tất cả các phương diện khác.

Để khớp một ma trận TxV với mảng MxNxPxQ, một cặp kích thước truyền tin sẽ được sử dụng:

          MxNxPxQ
dim 2,3:      T V
dim 1,2:    T V
dim 0,3:  T     V
etc...

Thứ tự của các kích thước trong bộ dữ liệu phát sóng phải là thứ tự mà các kích thước của mảng cấp thấp hơn dự kiến sẽ khớp với các kích thước của mảng cấp cao hơn. Phần tử đầu tiên trong bộ dữ liệu chỉ định phương diện trong mảng cấp cao hơn phải khớp với phương diện 0 trong mảng cấp thấp hơn. Phần tử thứ hai trong bộ dữ liệu chỉ định phương diện trong mảng bậc cao hơn phải khớp với phương diện 1 trong mảng cấp thấp hơn, v.v. Thứ tự của kích thước truyền phải tăng dần. Ví dụ: trong ví dụ trước, việc so khớp V với N và T với P là bất hợp pháp; việc so khớp V với cả P và N cũng là bất hợp pháp.

Truyền phát mảng thứ hạng tương tự có kích thước thoái hoá

Một vấn đề liên quan là truyền phát 2 mảng có cùng thứ hạng nhưng kích thước kích thước khác nhau. Tương tự như NumPy, điều này chỉ có thể xảy ra khi các mảng tương thích. Hai mảng tương thích khi tất cả các kích thước của các mảng đó đều tương thích. Hai phương diện sẽ tương thích nếu:

  • Các giá trị này bằng nhau, hoặc
  • Một trong số đó là 1 (phương diện "giảm cấp")

Khi gặp hai mảng tương thích, hình dạng kết quả sẽ có tối đa hai đầu vào ở mỗi chỉ mục kích thước.

Ví dụ:

  1. (2,1) và (2,3) truyền phát đến (2,3).
  2. (1,2,5) và (7,2,5) phát đến (7,2,5).
  3. (7,2,5) và (7,1,5) phát đến (7,2,5).
  4. (7,2,5) và (7,2,6) không tương thích và không thể phát đi thông báo.

Một trường hợp đặc biệt cũng được hỗ trợ, trong đó mỗi mảng đầu vào có một chiều suy giảm tại một chỉ mục khác nhau. Trong trường hợp này, kết quả là một "thao tác bên ngoài": (2,1) và (1,3) truyền tin đến (2,3). Để biết thêm ví dụ, hãy tham khảo tài liệu về NumPy về cách truyền tin.

Thành phần chương trình phát sóng

Việc truyền phát một mảng cấp thấp hơn lên một mảng cấp cao hơn truyền phát bằng cách sử dụng các kích thước thoái hoá đều có thể được thực hiện trong cùng một hoạt động nhị phân. Ví dụ: có thể cộng một vectơ có kích thước 4 và ma trận kích thước 1x2 bằng cách sử dụng kích thước truyền tin có giá trị (0):

|1 2 3 4| + [5 6]    // [5 6] is a 1x2 matrix, not a vector.

Trước tiên, vectơ được truyền phát lên đến cấp 2 (ma trận) bằng cách sử dụng kích thước truyền tin. Giá trị duy nhất (0) trong kích thước truyền tin cho biết rằng thứ nguyên 0 của vectơ khớp với chiều 0 của ma trận. Thao tác này sẽ tạo ra một ma trận có kích thước 4xM, trong đó giá trị M được chọn để khớp với kích thước phương diện tương ứng trong mảng 1x2. Do đó, một ma trận 4x2 được tạo:

|1 1| + [5 6]
|2 2|
|3 3|
|4 4|

Sau đó, tính năng "thoái biến truyền hình kích thước" sẽ truyền kích thước bằng 0 của ma trận 1x2 để khớp với kích thước kích thước tương ứng ở phía bên phải:

|1 1| + |5 6|     |6  7|
|2 2| + |5 6|  =  |7  8|
|3 3| + |5 6|     |8  9|
|4 4| + |5 6|     |9 10|

Một ví dụ phức tạp hơn là ma trận có kích thước 1x2 được thêm vào một mảng có kích thước 4x3x1 sử dụng kích thước truyền tin là (1, 2). Trước tiên, ma trận 1x2 được phát lên đến hạng 3 bằng cách sử dụng các kích thước truyền tin để tạo ra một mảng Mx1x2 trung gian, trong đó kích thước kích thước M được xác định theo kích thước của toán hạng lớn hơn (mảng 4x3x1) tạo ra một mảng trung gian 4x1x2. M có chiều 0 (kích thước ngoài cùng bên trái) vì kích thước 1 và 2 được ánh xạ tới các kích thước của ma trận 1x2 ban đầu giống như kích thước truyền tin là (1, 2). Bạn có thể thêm mảng trung gian này vào ma trận 4x3x1 bằng cách truyền phát các kích thước suy giảm để tạo ra kết quả mảng 4x3x2.