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ó cá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 mượn từ tính năng truyền phát NumPy.

Bạn có thể cần truyền phát cho các thao tác 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à ma trận (mảng hạng 2) và v là một vectơ (mảng hạng 1). Để thực hiện thêm phần tử, XLA cần "phát đi" vectơ v lên cùng thứ hạng với ma trận X, bằng cách sao chép v một 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 phát 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, việc này được gọi là broadcasting (truyền tin).

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 "kỳ diệu" ngầm ẩn. Các tính năng như vậy có thể giúp một số phép tính dễ xác định hơn một chút, nhưng đổi lại sẽ có nhiều giả định được đưa 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 truyền phát, XLA yêu cầu thông số kỹ thuật phát sóng rõ ràng cho các thao tác giữa các mảng có thứ hạng khác nhau. Điều này khác với NumPy vì NumPy dự đoán thông số kỹ thuật khi có thể.

Truyền một mảng có thứ hạng thấp hơn lên một mảng có thứ hạng cao hơn

Các đại lượng vô hướng luôn có thể được truyền tin trên các mảng mà không cần quy cách rõ ràng về kích thước truyền tin. Phép toán nhị phân theo phần tử giữa đại lượng vô hướng và 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 ma trận có nghĩa là tạo ra một ma trận, trong đó mỗi phần tử là một 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 kích thước cho thao tác nhị phân. Khi đầu vào cho thao tác có nhiều thứ hạng, bộ dữ liệu truyền tin 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ủa chiều (3) vào ma trận chiều (2,3). Nếu không chỉ định truyền tin, thì thao tác này sẽ không hợp lệ. Để yêu cầu thêm ma trận-vectơ 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 2D, nếu chiều 0 đại diện cho hàng và chiều 1 đại diện cho cột, thì điều này có nghĩa là 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|

Ví dụ phức tạp hơn, hãy cân nhắ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)). Ví dụ này có thể diễn ra theo 2 cách:

(1) Có thể sử dụng chiều phát sóng là 1. Mỗi phần tử vectơ trở thành một cột và vectơ được nhân bản 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 phát sóng bằng 0. Mỗi phần tử vectơ trở thành một hàng và vectơ được nhân bản 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 thông báo truyền tin có thể là một bộ dữ liệu mô tả cách một hình dạng thứ hạng nhỏ hơn được truyền tin thành một hình dạng thứ hạng lớn hơn. Ví dụ: với một hình hộp chữ nhật 2x3x4 và một ma trận 3x4, một bộ dữ liệu truyền tin (1,2) có nghĩa là khớp ma trận với kích thước 1 và 2 của hình hộp chữ nhật.

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 bạn cung cấp đối số broadcast_dimensions. Ví dụ: hãy xem XlaBuilder::Add. Trong mã nguồn XLA, kiểu 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 khớp một mảng hạng thấp hơn với mảng xếp hạng cao hơn bằng cách chỉ định kích thước của mảng xếp hạng 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 một 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 kích thước phù hợp của mảng cấp cao hơn. Sau đó, giá trị của vectơ sẽ được truyền từ thứ nguyên đã khớp đến tất cả các chiều khác.

Để khớp một ma trận TxV trên 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 kích thước trong bộ dữ liệu truyền tin phải là thứ tự mà kích thước của mảng xếp hạng thấp hơn dự kiến phải khớp với kích thước của mảng xếp hạng cao hơn. Phần tử đầu tiên trong bộ dữ liệu chỉ định phương diện trong mảng hạng cao hơn phải khớp với phương diện 0 trong mảng hạng thấp hơn. Phần tử thứ hai trong bộ dữ liệu chỉ định phương diện trong mảng hạng cao hơn phải khớp với phương diện 1 trong mảng hạng thấp hơn, v.v. Thứ tự của các kích thước truyền tin phải tăng dần. Ví dụ: trong ví dụ trước, việc 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 các mảng có thứ hạng tương tự có phương diện suy giảm

Một vấn đề liên quan đang truyền đi 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ư với NumPy, điều này chỉ có thể xảy ra khi các mảng tương thích. 2 mảng tương thích khi tất cả kích thước của các mảng đó đều tương thích. 2 phương diện 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 "suy giảm")

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

Ví dụ:

  1. (2,1) và (2,3) truyền tin đế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 sóng.

Ngoài ra cũng có một trường hợp đặc biệt được hỗ trợ, trong đó mỗi mảng đầu vào có một chiều suy giảm ở một chỉ mục khác nhau. Trong trường hợp này, kết quả là một "hoạt động 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ề tính năng truyền tin.

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

Việc truyền phát một mảng bậc thấp hơn lên một mảng xếp hạng cao hơn việc truyền phát bằng cách sử dụng các chiều suy giảm đều có thể được thực hiện trong cùng một toán tử nhị phân. Ví dụ: có thể thêm một vectơ có kích thước 4 và ma trận có kích thước 1x2 bằng cách sử dụng các kích thước truyền tin của 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 tin lên đến hạng 2 (ma trận) bằng cách sử dụng các chiều truyền tin. Giá trị duy nhất (0) trong phương diện truyền tin cho biết rằng phương diện 0 của vectơ khớp với phương diện 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 đó, ma trận 4x2 được tạo ra:

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

Sau đó, tính năng "thoái truyền phát sóng phương diện" sẽ truyền phát 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|

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 truyền lên đến hạng 3 bằng cách sử dụng các kích thước truyền tin để tạo 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ó kích thước 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 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 sử dụng tính năng truyền tin của các chiều suy biến để tạo ra kết quả mảng 4x3x2.