このページは Cloud Translation API によって翻訳されました。
Switch to English

放送セマンティクス

このドキュメントでは、XLAのブロードキャストセマンティクスがどのように機能するかについて説明します。

放送とは?

ブロードキャストとは、さまざまな形状の配列に算術演算に互換性のある形状を持たせるプロセスです。用語はNumpy 放送から借用したものです。

異なるランクの多次元配列間、または異なるが互換性のある形状の多次元配列間の操作には、ブロードキャストが必要になる場合があります。加算X+vについて考えますXは行列(ランク2の配列)、 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言語は可能な限り厳密かつ明示的であり、暗黙的で「魔法の」機能を回避します。このような機能により、一部の計算を少し簡単に定義できますが、長期的に変更するのが難しいユーザーコードに組み込まれたより多くの仮定が犠牲になります。必要に応じて、暗黙的で魔法のような機能をクライアントレベルのラッパーに追加できます。

ブロードキャストに関しては、異なるランクの配列間の操作に関する明示的なブロードキャスト仕様が必要です。これは、可能な場合に仕様を推測するNumpyとは異なります。

ランクの低いアレイをランクの高いアレイにブロードキャストする

スカラーは、ブロードキャストの次元を明示的に指定しなくても、常に配列を介してブロードキャストできます。スカラーと配列の間の要素ごとのバイナリ演算とは、配列内の各要素にスカラーを使用して演算を適用することを意味します。たとえば、行列にスカラーを追加することは、各要素がスカラーと対応する入力行列の要素の合計である行列を生成することを意味します。

 |1 2 3| + 7 = |8  9  10|
|4 5 6|       |11 12 13|
 

ほとんどのブロードキャストのニーズは、バイナリ演算で次元のタプルを使用することによってキャプチャできます。操作への入力が異なるランクを有する場合、 上位アレイにおけるこの放送タプル指定寸法(S)は、 下位配列と一致します。

前の例を考えてみましょう。スカラーを(2,3)行列に追加する代わりに、次元(3)のベクトルを次元(2,3)の行列に追加します。 ブロードキャストを指定しない場合、この操作は無効です。行列とベクトルの加算を正しく要求するには、ブロードキャストの次元を(1)に指定します。これは、ベクトルの次元が行列の次元1に一致することを意味します。 2Dでは、次元0を行と見なし、次元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を使用できます。各ベクトル要素は行になり、ベクトルは行列の列ごとに複製されます。

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

ブロードキャストの次元は、小さいランク形状が大きいランク形状にどのようにブロードキャストされるかを記述するタプルにすることができます。たとえば、2x3x4の直方体と3x4の行列がある場合、ブロードキャストタプル(1,2)は、行列を直方体の次元1と2に一致させることを意味します。

このタイプのブロードキャストは、 broadcast_dimensions引数が指定broadcast_dimensionsいる場合、 XlaBuilderのバイナリ演算で使用されます。たとえば、 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の2番目の要素、以下同様。ブロードキャストディメンションの順序は厳密に増加する必要があります。たとえば、前の例では、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に一致することを示します。これにより、サイズ4xMの行列が生成されます。値Mは、1x2配列の対応する次元サイズと一致するように選択されます。したがって、4x2マトリックスが生成されます。

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

次に、「縮退次元ブロードキャスト」は、1x2マトリックスの次元ゼロをブロードキャストして、右側の対応する次元サイズと一致させます。

 |1 1| + |5 6|     |6  7|
|2 2| + |5 6|  =  |7  8|
|3 3| + |5 6|     |8  9|
|4 4| + |5 6|     |9 10|
 

より複雑な例は、(1、2)のブロードキャスト次元を使用して、サイズ4x3x1の配列にサイズ1x2の行列を追加したものです。最初に、ブロードキャスト次元を使用して1x2マトリックスがランク3までブロードキャストされ、中間Mx1x2配列が生成されます。ここで、次元サイズMは、大きいオペランド(4x3x1配列)のサイズによって決定され、4x1x2中間配列を生成します。ブロードキャストディメンションは(1、2)であるため、ディメンション1および2は元の1x2マトリックスのディメンションにマップされるため、Mはディメンション0(左端のディメンション)にあります。この中間配列は、縮退次元のブロードキャストを使用して4x3x1マトリックスに追加し、4x3x2配列の結果を生成できます。