Phát thanh ngữ nghĩa

Tài liệu này mô tả cách hoạt động của ngữ nghĩa truyền phát trong XLA.

Phát sóng là gì?

Phát là quá trình làm cho các mảng với các hình dạng khác nhau có hình dạng tương thích cho các phép toán số học. Thuật ngữ được vay mượn từ NumPy phát sóng .

Việc phát sóng có thể được yêu cầu đối với các hoạt động giữa các mảng nhiều chiều có cấp bậc khác nhau hoặc giữa các mảng nhiều chiều có hình dạng khác nhau nhưng tương thích. Hãy xem xét việc bổ sung X+v nơi X là một ma trận (một loạt các cấp bậc 2) và v là một vector (một mảng của bậc 1). Thực hiện bổ sung yếu tố khôn ngoan, XLA cần phải "phát sóng" vector v đến cấp bậc tương tự như ma trận X , bằng cách sao chép v một số lần nhất định. Chiều dài của vectơ phải phù hợ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), của vectơ là (3). Vectơ được phát bằng cách sao chép nó qua các hàng để nhận được:

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

Trong NumPy, điều này được gọi là phát sóng .

Nguyên tắc

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

Liên quan đến việc phát sóng, yêu cầu các thông số kỹ thuật phát sóng rõ ràng về hoạt động giữa các mảng có cấp bậc khác nhau. Điều này khác với Numpy, trong đó đưa ra 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

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

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

Hầu hết các nhu cầu phát sóng có thể được nắm bắt bằng cách sử dụng nhiều kích thước trên một hoạt động nhị phân. Khi đầu vào cho các hoạt động có cấp bậc khác nhau, phát thanh truyền hình này tuple quy định cụ thể mà kích thước (s) trong mảng cấp bậc cao hơn để phù hợ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 vô hướng vào ma trận (2,3), hãy thêm vectơ có chiều (3) vào ma trận có chiều (2,3). Nếu không chỉ định phát sóng, hoạt động này không hợp lệ. Để yêu cầu chính xác phép cộng vectơ-ma trận, hãy chỉ định kích thước phát sóng là (1), nghĩa là kích thước của vectơ được so khớp với kích thước 1 của ma trận. Trong 2D, nếu thứ nguyên 0 được coi là hàng và thứ nguyên 1 là cột, đ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 phù hợp với số hàng trong ma trận:

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

Là một ví dụ phức tạp hơn, hãy xem xét 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ó hai cách phát sóng có thể xảy ra cho ví dụ này:

(1) Có thể sử dụng thứ nguyên phát sóng bằng 1. Mỗi phần tử vectơ trở thành một cột và vectơ được nhân đôi 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 thứ nguyên 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 đôi cho mỗi cột trong ma trận.

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

Các kích thước phát sóng có thể là một bộ dữ liệu mô tả cách một hình dạng xếp hạng nhỏ hơn được phát thành một hình dạng xếp hạng lớn hơn. Ví dụ: cho một hình khối 2x3x4 và một ma trận 3x4, bộ phát sóng (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.

Đây là loại phát sóng được sử dụng trong các ops nhị phân trong XlaBuilder , nếu broadcast_dimensions lập luận được đưa ra. Ví dụ, xem XlaBuilder :: Add . Trong mã nguồn XLA, loại phát sóng này đôi khi được gọi là phát sóng "InDim".

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

Thuộc tính phát sóng cho phép khớp một mảng có thứ hạng thấp hơn với một mảng có thứ hạng cao hơn, bằng cách chỉ định thứ nguyên nào của mảng có thứ hạng cao hơn sẽ phù hợp. Ví dụ: đối với một mảng có kích thước MxNxPxQ, một vectơ có kích thước T có thể được so khớp 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 thứ nguyên phù hợp của mảng cấp cao hơn. Các giá trị của vectơ sau đó được phát từ thứ nguyên phù hợp tới tất cả các thứ nguyên khác.

Để khớp ma trận TxV với mảng MxNxPxQ, một cặp kích thước phát sóng đượ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 thứ nguyên trong bộ phát sóng phải là thứ tự trong đó các thứ nguyên của mảng có thứ hạng thấp hơn được mong đợi sẽ khớp với các thứ nguyên của mảng có thứ hạng cao hơn. Phần tử đầu tiên trong bộ tuple cho biết thứ nguyên nào trong mảng thứ hạng cao hơn phải khớp với thứ nguyên 0 trong mảng thứ hạng thấp hơn. Phần tử thứ hai cho thứ nguyên 1, v.v. Thứ tự các kích thước phát sóng phải tăng lên một cách nghiêm ngặt. Ví dụ, trong ví dụ trước, việc ghép V thành N và T thành P là bất hợp pháp; việc ghép V với cả P ​​và N. cũng là vi phạm pháp luật.

Phát các mảng có thứ hạng tương tự với các thứ nguyên giảm dần

Một vấn đề phát sóng liên quan là phát sóng hai mảng có cùng thứ hạng nhưng kích thước thứ nguyên khác nhau. Tương tự như vậy với các quy tắc NumPy, điều này chỉ có thể 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 chúng tương thích. Hai thứ nguyên tương thích nếu:

  • Chúng bằng nhau, hoặc
  • Một trong số chúng là 1 (thứ nguyên "suy biến")

Khi gặp hai mảng tương thích, hình dạng kết quả có giá trị lớn nhất trong số hai đầu vào ở mọi chỉ số thứ nguyên.

Ví dụ:

  1. (2,1) và (2,3) phát tới (2,3).
  2. (1,2,5) và (7,2,5) phát tới (7,2,5)
  3. (7,2,5) và (7,1,5) phát tới (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.

Một trường hợp đặc biệt phát sinh và cũng được hỗ trợ, trong đó mỗi mảng đầu vào có thứ nguyên 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) được phát tới (2,3). Để biết thêm ví dụ, tham khảo tài liệu hướng dẫn NumPy trên phát thanh truyền hình .

Thành phần phát sóng

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

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

Đầu tiên, vectơ được phát sóng lên xếp hạng 2 (ma trận) bằng cách sử dụng các kích thước phát sóng. Giá trị duy nhất (0) trong kích thước quảng bá cho biết thứ nguyên 0 của vectơ khớp với thứ nguyên 0 của ma trận. Điều này 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 thứ nguyên tương ứng trong mảng 1x2. Do đó, một ma trận 4x2 được tạo ra:

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

Sau đó, "phát sóng thứ nguyên suy giảm" phát sóng thứ nguyên 0 của ma trận 1x2 để khớp với kích thước thứ nguyên tương ứng của 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ảng có kích thước 4x3x1 bằng cách sử dụng kích thước quảng bá là (1, 2). Đầu tiên, ma trận 1x2 được phát sóng lên xếp hạng 3 bằng cách sử dụng kích thước quảng bá để tạo ra mảng Mx1x2 trung gian trong đó kích thước thứ nguyên M được xác định bởi kích thước của toán hạng lớn hơn (mảng 4x3x1) tạo ra mảng trung gian 4x1x2. M ở thứ nguyên 0 (thứ nguyên ngoài cùng bên trái) vì kích thước 1 và 2 được ánh xạ với kích thước của ma trận 1x2 ban đầu khi kích thước quảng bá là (1, 2). Mảng trung gian này có thể được thêm vào ma trận 4x3x1 bằng cách sử dụng phát các kích thước suy biến để tạo ra kết quả mảng 4x3x2.