このドキュメントでは、XLA のブロードキャスト セマンティクスについて説明します。
ブロードキャストとは
ブロードキャストは、さまざまな形状を持つ配列を 算術演算で互換性のある図形。この用語は NumPy のブロードキャスト。
多次元配列間の処理には、ブロードキャストが必要になる場合があります。
階数が異なる多次元配列間でもかまいませんが、
使用できます。X
が行列(配列)の場合の X+v
の加算について考えてみましょう。
v
はベクトル(ランク 1 の配列)です。要素ごとに実行する
XLA には「ブロードキャスト」する必要があるベクトル v
を、
v
を一定回数複製することによって、行列 X
を作成します。ベクトルの長さ
行列の次元の少なくとも 1 つに一致する必要があります。
例:
|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 言語は可能な限り厳格かつ明示的であり、暗黙的な 「魔法」説明します。このような特徴により、一部の計算が若干簡単になる可能性があります。 ただし、ユーザーコードに組み込まれている前提条件が増え、 長期的に変えるのは困難です必要に応じて、暗黙的な魔法の機能を クライアントレベルのラッパーで指定できます。
ブロードキャストに関して、XLA では明示的なブロードキャスト仕様が必要 異なるランクの配列間の演算に対しても有効です。これは NumPy とは異なります。 可能な場合に仕様を推測します。
下位配列を上位配列にブロードキャストする
明示的に指定しなくても、Scalarsを常に配列でブロードキャストできる サポートしていますスカラー間の要素ごとの 2 項演算 配列は、各要素にスカラーによる演算を適用することを あります。たとえば、行列にスカラーを追加すると、行列は 各要素は、スカラーとそれに対応する 表します。
|1 2 3| + 7 = |8 9 10|
|4 5 6| |11 12 13|
ほとんどのブロードキャストのニーズは、属性のディメンションのタプルを使用して バイナリ演算です演算の入力ランクが異なる場合、この演算は ブロードキャスト タプルは、上位配列のどのディメンションに 下位配列と照合します。
前の例で考えてみましょう。(2,3) 行列にスカラーを加算する代わりに、 次元 (3) のベクトルを次元 (2,3) の行列に変換する このオペレーションは無効です。行列ベクトルを正しくリクエストするには さらに、ブロードキャストの次元を(1)に指定します。つまり、 次元は行列の次元 1 と照合されます。2D では、次元 0 が ディメンション 1 は行を表し、ディメンション 1 は列を表します。つまり、各要素は ベクトルは、指定された行数に一致するサイズの列になります。 マトリックス:
|7 8 9| ==> |7 8 9|
|7 8 9|
より複雑な例として、3 要素ベクトル(次元(3))を 3x3 の行列(次元(3,3))になる。ブロードキャストする方法は 2 つあります。 この例では:
(1)1 のブロードキャスト次元を使用できる。各ベクトル要素は ベクトルが行列ごとに複製されます。
|7 8 9| ==> |7 8 9|
|7 8 9|
|7 8 9|
(2)0 のブロードキャスト次元を使用できる。各ベクトル要素は 1 つの行になる ベクトルは行列の各列で複製されます。
|7| ==> |7 7 7|
|8| |8 8 8|
|9| |9 9 9|
ブロードキャスト ディメンションは、より小さなランクの 大きなランク形状にブロードキャストされます。たとえば、2x3x4 の立方体があるとします。 ブロードキャスト タプル(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 と一致する必要があります。「 タプルの 2 番目の要素は、上位階層の配列のどのディメンションか 配列の次元 1 と一致する必要があります(以下同様)。データの ブロードキャストのディメンションは厳密に増加する必要があります。前の例では、 たとえば、V を N に、T を P にマッチングすることは違法です。V と一致するのも違法です。 P と N の両方に適用されます。
縮退ディメンションを使用して類似ランクの配列をブロードキャストする
関連する問題として、同じランクを持つ 2 つの配列をブロードキャストするというものがあります。 異なるディメンションサイズですNumPy と同様、これは配列が 互換性があることを確認します。すべてのディメンションが同じ場合、2 つの配列は互換性がある 対応しています。次の場合、2 つのディメンションは互換性があります。
- これらは等しい
- そのうちの 1 つは 1(「縮退」ディメンション)
互換性のある配列が 2 つ検出された場合、結果の形状の最大値は次の値になります。 2 つの入力があります。
例:
- (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 は行列の次元 0 と一致します。これにより、 サイズ 4 x M の行列。ここで値 M は、対応する値と一致するように 1x2 配列の次元のサイズです。したがって、4 行 2 の行列が生成されます。
|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|
より複雑な例として、size の配列にサイズ 1x2 の行列を追加する場合があります。 (1, 2) のブロードキャスト ディメンションを使用して 4x3x1。最初に 1x2 マトリックスがブロードキャストされる ブロードキャスト次元を使用してランク 3 の中間の Mx1x2 配列を生成 ここで、次元サイズ M は、より大きい方のオペランドのサイズ( 4x1x2 の中間配列を生成します。M は次元 0( 左端のディメンション)にマッピングされます。これは、ディメンション 1 と 2 がディメンションにマッピングされるためです。 ブロードキャストの次元は (1, 2) であるため、元の 1x2 マトリックスのこの 中間配列は、次のブロードキャストを使用して 4x3x1 行列に追加できます。 次元を縮退して 4x3x2 配列の結果を生成します。