ブロードキャスト

このドキュメントでは、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 つの入力があります。

例:

  1. (2,1) と (2,3) を(2,3)にブロードキャストする。
  2. (1,2,5) および (7,2,5) が (7,2,5) にブロードキャストされます。
  3. (7,2,5) および (7,1,5) が(7,2,5)にブロードキャストされる。
  4. (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 配列の結果を生成します。