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 ra các mảng có hình dạng khác nhau hình dạng tương thích cho các phép toán số học. Thuật ngữ này được vay từ Truyền phát NumPy.

Có thể cần truyền tin cho các thao tác giữa các mảng đa chiều của hoặc giữa các mảng đa chiều có các thứ hạng khác nhau hình dạ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ột mảng) của hạng 2) và v là một vectơ (một mảng hạng 1). Cách thực hiện tương tác giữa các phần tử Ngoài ra, XLA cần "phát sóng" vectơ v có cùng 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ơ được truyền lên bằng cách sao chép mã qua 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, hàm này được gọi là phát sóng.

Nguyên tắc

Ngôn từ của XLA nghiêm ngặt và rõ ràng nhất có thể, tránh ngụ ý "kỳ diệu" các tính năng AI mới. Các tính năng như vậy có thể giúp một số phép tính dễ dàng hơn một chút cần phải xác định, nhưng đổi lại nó sẽ có thêm nhiều giả định được đưa vào mã người dùng, khó thay đổi về lâu dài. Nếu cần, hãy ẩn những tính năng kỳ diệu có thể được thêm 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 về phép toán giữa các mảng có thứ hạng khác nhau. Tên này khác với NumPy, để suy ra thông số kỹ thuật khi có thể.

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

Scalars luôn có thể được truyền qua các mảng mà không có thông số kỹ thuật rõ ràng về kích thước truyền tin. Phép toán nhị phân chỉ định phần tử giữa một đại lượng vô hướng còn mảng nghĩa là áp dụng toán tử có đại lượng vô hướng cho từng phần tử trong . Ví dụ: thêm đại lượng vô hướng vào ma trận tức là tạo ra ma trận theo 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|

Hầu hết nhu cầu phát sóng đều có thể được nắm bắt bằng cách sử dụng một bộ dữ liệu kích thước trên phép toán nhị phân. Khi dữ liệu đầu vào cho thao tác có thứ hạng khác nhau, bộ dữ liệu truyền tin chỉ định(các) phương diện trong mảng thứ hạng cao hơn cầ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 cộng vectơ chiều (3) thành ma trận có chiều (2,3). Không chỉ định phát sóng, thì thao tác này không hợp lệ. Để yêu cầu vectơ ma trận một cách chính xác ngoài ra, chỉ định kích thước phát là (1), nghĩa là vectơ kích thước được khớp với chiều 1 của ma trận. Trong 2D, nếu phương diện 0 thể hiện các hàng và phương diện 1 đại diện cho các cột, điều này có nghĩa là mỗi phần tử của vectơ 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 xem xét việc thêm vectơ gồm 3 phần tử (chiều (3)) vào ma trận 3x3 (chiều (3,3)). Có hai cách phát sóng có thể xảy ra ví dụ sau:

(1) Có thể sử dụng kích thước phát sóng là 1. Mỗi phần tử vectơ trở thành một và vectơ được nhân bản cho từng hàng trong ma trận.

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

(2) Có thể sử dụng kích thước 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 từng 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 thứ hạng nhỏ hơn được truyền thành một hình dạng xếp hạng lớn hơn. Ví dụ: cho hình hộp chữ nhật có kích thước 2x3x4 và ma trận 3x4, bộ phát sóng (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 Đối số broadcast_dimensions đã được cung cấp. Ví dụ: hãy xem XlaBuilder::Thêm. Trong mã nguồn XLA, loại truyền phát này đôi khi được gọi là "InDim" đang phát sóng.

Định nghĩa trang trọng

Thuộc tính truyền tin cho phép so khớp một mảng thấp hơn với một mảng có thứ hạng cao hơn bằng cách chỉ định các kích thước của mảng có thứ hạng cao hơn cần khớp. Cho ví dụ: đối với mảng có kích thước MxNxPxQ, vectơ có chiều T có thể là 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 với thứ nguyên phù hợp của thứ hạng cao hơn . Sau đó, các giá trị của vectơ được truyền từ chiều phù hợp đến tất cả các phương diệ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 sẽ được 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 truyền tin phải là thứ tự mà kích thước của mảng có thứ hạng thấp hơn sẽ khớp với kích thước của mảng có thứ hạng cao hơn. Phần tử đầu tiên trong bộ dữ liệu chỉ định kích thước trong mảng có thứ hạng cao hơn phải khớp với phương diện 0 trong mảng thứ hạng thấp hơn. Chiến lược phát hành đĩa đơn phần tử thứ hai trong bộ dữ liệu chỉ định kích thước nào trong mảng có thứ hạng cao hơn phải khớp với phương diện 1 trong mảng thứ hạng thấp hơn, v.v. Thứ tự của kích thước phát sóng phải được tăng lên. Ví dụ: trong trước ví dụ: việc khớp V với N và T với P là bất hợp pháp; việc khớp V cũng là bất hợp pháp cho cả P và N.

Truyền phát các mảng thứ hạng tương tự có phương diện thoái hoá

Một sự cố liên quan đang 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. Giống như NumPy, điều này chỉ có thể xảy ra khi các mảng đều tương thích. Hai mảng tương thích với nhau khi tất cả các chiều của chúng đều là tương thích. Hai phương diện tương thích với nhau nếu:

  • Bằng nhau, hoặc
  • Một trong số đó là 1 (phương diện "thoái hoá")

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

Ví dụ:

  1. (2,1) và (2,3) phát ra tín hiệu đế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.

Một trường hợp đặc biệt sẽ phát sinh và cũng được hỗ trợ, trong đó mỗi mảng đầu vào phải một chiều suy biến ở chỉ mục khác. Trong trường hợp này, kết quả là “phép toán bên ngoài”: (2,1) và (1,3) phát đi tới (2,3). Để tham khảo thêm ví dụ, hãy tham khảo Tài liệu NumPy về tính năng truyền tin.

Bản sáng tác chương trình phát sóng

Truyền phát mảng có thứ hạng thấp hơn đến một mảng có thứ hạng cao hơn truyền tin bằng cách sử dụng các phương diện thoái hoá đều có thể được thực hiện trong cùng một toán tử nhị phân. Ví dụ: vectơ có kích thước 4 và ma trận có kích thước 1x2 có thể được cộng lại với nhau 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.

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

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

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