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 tin là quá trình tạo ra các mảng có hình dạng khác nhau nhưng có hình dạng tương thích cho các phép toán số học. Thuật ngữ này được mượn từ phát sóng NumPy.
Có thể cần truyền tin 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ó 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 có 2 chiều) và v là một vectơ (mảng có 1 chiều). Để thực hiện phép cộng theo phần tử, XLA cần "truyền" vectơ v đến cùng số lượng phương diện như 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 phương diện của ma trận.
Ví dụ:
|1 2 3| + |7 8 9|
|4 5 6|
Ma trận có kích thước (2,3) và vectơ có kích thước (3). Vectơ được truyền bằng cách sao chép trên 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, thao tác này được gọi là truyền tin.
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 "kỳ diệu" ngầm. Những tính năng như vậy có thể giúp bạn xác định một số phép tính dễ dàng hơn một chút, nhưng phải trả giá bằng nhiều giả định hơn được đưa vào mã người dùng mà 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 ngầm định trong trình bao bọc cấp ứng dụng.
Đối với hoạt động phát sóng, XLA yêu cầu các thông số kỹ thuật phát sóng rõ ràng về 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ốn suy ra quy cách khi có thể.
Truyền một mảng có ít chiều hơn lên một mảng có nhiều chiều hơn
Các đại lượng vô hướng luôn có thể được truyền qua các mảng mà không cần chỉ định rõ ràng các phương diện truyền tin. Một thao tác nhị phân theo phần tử giữa một đại lượng vô hướng và một mảng có nghĩa là áp dụng thao tác với đại lượng vô hướng cho từng phần tử trong mảng. Ví dụ: thêm một đại lượng vô hướng vào một ma trận có nghĩa là tạo ra 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|
Hầu hết các 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ộ gồm các phương diện trong một thao tác nhị phân. Khi các đầu vào cho thao tác có thứ hạng khác nhau, bộ dữ liệu truyền tin này sẽ chỉ định(các) phương diện nào trong mảng nhiều chiều cần khớp với mảng ít chiều.
Hãy xem xét ví dụ trước. Thay vì thêm một đại lượng vô hướng vào ma trận (2,3), hãy thêm một vectơ có phương diện (3) vào ma trận có phương diện (2,3). Nếu không chỉ định hoạt động truyền tin, thì thao tác này sẽ không hợp lệ. Để yêu cầu phép cộng ma trận-vectơ một cách chính xác, hãy chỉ định chiều phát là (1), tức là chiều của vectơ được so khớp với chiều 1 của ma trận. Trong không gian 2D, nếu phương diện 0 đại diện cho hàng và phương diện 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 việc thêm một vectơ gồm 3 phần tử (phương diện (3)) vào ma trận 3x3 (phương diện (3,3)). Có 2 cách truyền tin có thể xảy ra đối với ví dụ này:
(1) Bạn có thể sử dụng một phương diện truyền tin có kích thước 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) Bạn có thể sử dụng phương diện truyền tin là 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|
Các phương diện truyền tin có thể là một bộ mô tả cách một hình dạng có ít phương diện hơn được truyền tin vào một hình dạng có nhiều phương diện hơn. Ví dụ: cho một hình hộp chữ nhật 2x3x4 và một ma trận 3x4, một bộ phát (1,2) có nghĩa là khớp ma trận với phương diện 1 và 2 của hình hộp chữ nhật.
Loại hoạt động phát sóng này được dùng trong các 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, loại 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ó ít chiều hơn với một mảng có nhiều chiều hơn bằng cách chỉ định chiều nào của mảng có nhiều chiều hơn cần so khớ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 với phương diện khớp của mảng nhiều chiều. Sau đó, các giá trị của vectơ sẽ được truyền từ phương diện được so khớp đến tất cả các phương diện khác.
Để so 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 phương diện trong bộ phát sóng phải là thứ tự mà các phương diện của mảng có ít phương diện hơn dự kiến sẽ khớp với các phương diện của mảng có nhiều phương diện hơn. Phần tử đầu tiên trong bộ giá trị chỉ định phương diện nào trong mảng nhiều chiều phải khớp với phương diện 0 trong mảng ít chiều. Phần tử thứ hai trong bộ dữ liệu chỉ định chiều nào trong mảng nhiều chiều phải khớp với chiều 1 trong mảng ít chiều, v.v. Thứ tự của các phương diện truyền tin phải tăng dần một cách nghiêm ngặt. Ví dụ: trong ví dụ trước, việc khớp V với N và T với P là không hợp lệ; việc khớp V với cả P và N cũng không hợp lệ.
Truyền mảng có kích thước tương tự với kích thước suy biến
Một vấn đề liên quan là truyền hai mảng có cùng số lượng phương diện nhưng kích thước phương diện khác nhau. Giống 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 phương diện của chúng đều tương thích. Hai phương diện tương thích nếu:
- Chúng bằng nhau, hoặc
- Một trong số đó là 1 (một phương diện "thoái hoá")
Khi gặp phải hai mảng tương thích, hình dạng kết quả sẽ có giá trị tối đa của hai đầu vào tại mọi chỉ mục chiều.
Ví dụ:
- (2,1) và (2,3) phát đến (2,3).
- (1,2,5) và (7,2,5) phát đến (7,2,5).
- (7,2,5) và (7,1,5) phát đến (7,2,5).
- (7,2,5) và (7,2,6) không tương thích và không thể truyền tin.
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ó một phương diện suy biến tại một chỉ mục khác. Trong trường hợp này, kết quả là một "phép toán bên ngoài": (2,1) và (1,3) truyền đến (2,3). Để biết thêm ví dụ, hãy tham khảo tài liệu NumPy về truyền tin.
Thành phần phát sóng
Bạn có thể thực hiện cả thao tác truyền mảng có thứ nguyên thấp hơn đến mảng có thứ nguyên cao hơn và thao tác truyền bằng cách sử dụng các thứ nguyên suy biến trong cùng một thao tác nhị phân. Ví dụ: bạn có thể cộng một vectơ có kích thước 4 và một ma trận có kích thước 1x2 với nhau 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 lên đến 2 chiều (ma trận) bằng cách sử dụng các phương diện truyền tin. Giá trị đơn (0) trong các phương diện truyền tin cho biết 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 tạo ra một ma trận có kích thước 4xM, trong đó giá trị M được chọn sao cho 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 ra:
|1 1| + [5 6]
|2 2|
|3 3|
|4 4|
Sau đó, "truyền tin phương diện suy biến" sẽ truyền tin phương diện 0 của ma trận 1x2 để khớp với kích thước phương diện 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 bằng cách sử dụng các phương diện truyền tin (1, 2). Trước tiên, ma trận 1x2 được truyền đến 3 chiều bằng cách sử dụng các chiều truyền để tạo ra một mảng Mx1x2 trung gian, trong đó kích thước chiều M được xác định bằng 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 nằm ở phương diện 0 (phương diện ngoài cùng bên trái) vì phương diện 1 và 2 được ánh xạ đến các phương diện của ma trận 1x2 ban đầu khi các phương diện 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 phương diện suy biến để tạo ra kết quả là mảng 4x3x2.