本文件會說明 XLA 的廣播語意。
什麼是廣播?
廣播是指建立不同形狀的陣列 以及相容形狀的算術運算本術語借用於 NumPy 廣播。
多維度陣列之間的作業可能需要廣播。
或含有不同但
相容的形狀。假設增加的 X+v
,其中 X
是矩陣 (陣列)
排名 2) 而 v
是向量 (排名 1 的陣列)。為了依元素執行
另外,XLA 也必須「播送」向量 v
排名與
矩陣 X
,方法是複製 v
特定次數。向量的長度
至少必須符合矩陣的其中一個維度。
例如:
|1 2 3| + |7 8 9|
|4 5 6|
矩陣的維度為 (2,3),向量的維度則是 (3)。向量 會複製到資料列來播送,藉此取得:
|1 2 3| + |7 8 9| = |8 10 12|
|4 5 6| |7 8 9| |11 13 15|
在 NumPy 中,這稱為 廣播。
原則
XLA 語言會盡可能嚴格且明確,避免隱含隱含 「magical」接著介紹網際網路通訊層 包括兩項主要的安全防護功能這類特徵可能會讓部分運算變得更加簡單 但為了定義程式碼,增加對使用者程式碼所做的假設,可能會增加 長遠來看待做出改進必要時,暗示性的神奇功能 (如有需要) 已新增至用戶端層級的包裝函式。
針對廣播, XLA 需要明確的廣播規格 處理不同排名陣列之間的作業。這與 NumPy 程式碼不同 其中會盡可能推斷規格
向排名較低的陣列播送排名較低的陣列
Scalars一律可以在沒有明確規格的情況下透過陣列播送 廣播維度純量之間的元素二進位作業 而陣列是指以純量模式將運算套用至 陣列。舉例來說,在矩陣中加入純量意味著 每個元素是純量與相應的 輸入矩陣
|1 2 3| + 7 = |8 9 10|
|4 5 6| |11 12 13|
只要使用 二進位運算的組合。如果作業的輸入內容排名不同 廣播元組可指定 higher-rank 陣列中的哪個維度 與 lower-rank 陣列相符。
請參考上一個範例。請不要在 2,3 矩陣中加入純量,而是將 維度向量 (3) 到維度矩陣 (2,3)。未指定 廣播,此作業無效。如何正確要求矩陣向量 此外,請將廣播維度指定為 (1),代表向量的 維度與矩陣的維度 1 相符。在 2D 中,如果維度為 0 代表列,維度 1 則代表資料欄,也就是說每個元素 的向量會變成資料欄大小的欄 矩陣:
|7 8 9| ==> |7 8 9|
|7 8 9|
如要進行更複雜的範例,您可以考慮加入 3 個元素向量 (維度 (3)), 一個 3x3 矩陣 (維度 (3,3))。廣播訊息的方式有兩種 範例:
(1) 可使用 1 的播送尺寸。每個向量元素都會成為 矩陣中的每一列都會複製向量。
|7 8 9| ==> |7 8 9|
|7 8 9|
|7 8 9|
(2) 可使用 0 的播送尺寸。每個向量元素都會變成一列 矩陣中每個資料欄的向量就會重複
|7| ==> |7 7 7|
|8| |8 8 8|
|9| |9 9 9|
播送維度是一個元組,用來說明較小排名 則會調整為較大排名形狀。例如,假設是 2x3x4 立方體 和 3x4 矩陣,廣播元組 (1,2) 意味著將矩陣配對至 方塊的尺寸 1 和 2
這類廣播會用於 XlaBuilder
的二進位檔作業中 (如果
已提供 broadcast_dimensions
引數。舉例來說,請參閱
XlaBuilder::Add。
在 XLA 原始碼中,這類廣播有時稱為「InDim」
廣播。
正式定義
廣播屬性可將排名較低的陣列與較高排名的陣列配對 陣列,方法是指定要比對的較高排名陣列維度。適用對象 舉例來說,如果是尺寸為 MxNxPxQ 的陣列,尺寸為 T 的向量可 比對項目如下:
MxNxPxQ
dim 3: T
dim 2: T
dim 1: T
dim 0: T
在此範例中,T 都必須等於排名較高的相符維度 陣列。接著,向量的值會從相符的維度播送到所有 另一個維度
如要將 TxV 矩陣與 MxNxPxQ 陣列進行比對,請使用一組廣播維度 :
MxNxPxQ
dim 2,3: T V
dim 1,2: T V
dim 0,3: T V
etc...
廣播元組中的維度順序必須與 較低排名陣列的維度必須與 較高排名陣列元組中的第一個元素會指定 排名較高的陣列必須與較低排名陣列中的維度 0 相符。 元組的第二個元素可指定較高排名陣列中的維度。 必須與較低排名陣列中的維度 1 相符,以此類推。請注意, 廣播尺寸必須嚴格增加舉例來說,在前一個 例如將 V 與 N 比對,並將 T 對應到 P 是違法行為;「V」也算不合法 同時用於 P 和 N
使用去生成尺寸播送相似排名陣列
相關問題是播送兩個排名相同但 不同的尺寸和 NumPy 一樣,只有陣列 相容。當兩個陣列的尺寸都相同時 相容。在下列情況下,這兩個維度相容:
- 兩者相等或
- 其中一個是 1 (「產生」維度)
遇到兩個相容的陣列時,結果形狀的最大值為 會為每個維度索引提供兩項輸入內容
範例:
- (2,1) 和 (2,3) 播送到 (2,3)。
- (1、2、5) 和 (7、2、5) 播送至 (7、2、5)。
- (7、2、5) 和 (7、1、5) 播送至 (7、2、5)。
- (7、2、5) 和 (7、2、6) 不相容,因此無法播送。
發生特殊情況時,系統也支援所有輸入陣列 另一個索引的重新生成維度在這種情況下,結果是 「外部作業」:(2,1) 和 (1,3) 播送到 (2,3)。如需更多範例 請參閱 有關廣播的 NumPy 說明文件。
廣播樂曲
播送較低排名的陣列到較高排名的陣列「並」播送 都會在相同的二進位作業中執行 舉例來說,大小為 4 的向量和大小為 1x2 的矩陣即可相加 使用值為 (0) 的廣播維度:
|1 2 3 4| + [5 6] // [5 6] is a 1x2 matrix, not a vector.
首先,使用廣播,最高等級為 2 (矩陣) 維度。廣播維度中的單一值 (0) 會指出 向量的維度 0 會與矩陣的維度零相符這會產生 大小為 4xM 的矩陣,其中選擇 M 值來和 也就是 1x2 陣列的尺寸因此會產生 4x2 矩陣:
|1 1| + [5 6]
|2 2|
|3 3|
|4 4|
然後「撤銷尺寸廣播」廣播維度是 1x2 的 0 來比對右側對應維度的大小:
|1 1| + |5 6| |6 7|
|2 2| + |5 6| = |7 8|
|3 3| + |5 6| |8 9|
|4 4| + |5 6| |9 10|
較複雜的範例是在陣列大小陣列中加入 1x2 大小的矩陣 4x3x1,使用 1、2 的廣播尺寸。首先,1x2 矩陣 使用廣播尺寸產生中繼 Mx1x2 陣列,將排名 3 其中維度大小 M 取決於較大運算元 ( 4x3x1 陣列),產生一個 4x1x2 中間陣列。M 達到維度 0 ( 最左側的維度),因為維度 1 和 2 已對應至該維度 原始 1x2 矩陣與廣播維度大小為 (1, 2)。這個 如要加入 4x3x1 矩陣 解碼尺寸以產生 4x3x2 陣列結果。