방송 중

이 문서에서는 XLA의 브로드캐스팅 의미를 설명합니다.

방송이란 무엇인가요?

브로드캐스팅은 다양한 모양의 배열을 산술 연산과 호환되는 모양을 만드는 프로세스입니다. 이 용어는 NumPy 브로드캐스트에서 빌려온 것입니다.

순위가 다른 다차원 배열 또는 모양이 다르지만 호환되는 다차원 배열 간의 작업에는 브로드캐스트가 필요할 수 있습니다. 덧셈 X+v의 경우를 생각해 보겠습니다. 여기서 X는 행렬 (순위 2의 배열)이고 v는 벡터 (순위 1의 배열)입니다. 요소별로 덧셈을 실행하기 위해 XLA는 v를 특정 횟수만큼 복제하여 벡터 v를 행렬 X와 동일한 순위로 '브로드캐스트'해야 합니다. 벡터의 길이는 행렬의 차원 중 하나 이상과 일치해야 합니다.

예를 들면 다음과 같습니다.

|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와는 다릅니다.

낮은 순위의 배열을 높은 순위의 배열로 브로드캐스팅

스칼라는 브로드캐스트 차원을 명시적으로 지정하지 않고 항상 배열을 통해 브로드캐스트될 수 있습니다. 스칼라와 배열 사이의 요소별 이진 연산은 배열의 각 요소에 스칼라가 있는 연산을 적용한다는 의미입니다. 예를 들어 행렬에 스칼라를 추가한다는 것은 각 요소가 스칼라와 입력 행렬의 해당 요소를 합한 행렬을 생성하는 것을 의미합니다.

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

대부분의 방송 요구사항은 바이너리 연산에서 차원 튜플을 사용하여 캡처할 수 있습니다. 연산에 대한 입력의 순위가 다르면 이 브로드캐스트 튜플은 높은 순위 배열에서 하위 순위 배열과 일치시킬 측정기준을 지정합니다.

이전 예를 생각해 보세요. (2,3) 행렬에 스칼라를 추가하는 대신 차원 (3)의 벡터를 차원 (2,3) 행렬에 추가합니다. 브로드캐스트를 지정하지 않으면 이 작업은 유효하지 않습니다. 행렬 벡터 덧셈을 올바르게 요청하려면 브로드캐스팅 차원을 (1)로 지정하세요. 즉, 벡터의 차원이 행렬의 차원 1과 일치한다는 의미입니다. 2D에서 차원 0이 행을 나타내고 차원 1이 열을 나타낸다면 벡터의 각 요소가 행렬의 행 수와 일치하는 크기의 열이 됩니다.

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

더 복잡한 예로 3x3 행렬 (차원 (3,3))에 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와 일치시킨다는 것을 의미합니다.

이 유형의 브로드캐스트는 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과 일치해야 하는지 등을 지정합니다. 브로드캐스트 측정기준의 순서는 엄격하게 증가해야 합니다. 예를 들어 이전 예에서 V를 N과 T를 일치시키고, T를 P와 매칭하는 것은 불법입니다. 또한 V를 P와 N에 일치시키는 것도 불법입니다.

변질된 차원으로 유사 순위 배열 브로드캐스트

관련된 문제는 순위는 같지만 차원 크기가 다른 두 배열을 브로드캐스트하는 것입니다. NumPy와 마찬가지로 이는 배열이 호환되는 경우에만 가능합니다. 두 배열은 모든 차원이 호환될 때 호환됩니다. 다음과 같은 경우 두 측정기준이 호환됩니다.

  • 두 값이 같거나
  • 그 중 하나는 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 행렬의 차원 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|

더 복잡한 예는 (1, 2) 브로드캐스트 차원을 사용하여 크기 4x3x1의 배열에 추가한 크기 1x2의 행렬입니다. 먼저 1x2 행렬은 브로드캐스트 차원을 사용하여 랭크 3까지 브로드캐스트되며 중간 Mx1x2 배열을 생성합니다. 여기서 차원 크기 M은 더 큰 피연산자의 크기 (4x3x1 배열)에 의해 결정되어 4x1x2 중간 배열을 생성합니다. 브로드캐스트 차원이 (1, 2)이므로 차원 1과 2가 원래 1x2 행렬의 차원에 매핑되기 때문에 M은 0차원 (가장 왼쪽)에 있습니다. 이 중간 배열은 4x3x2 배열 결과를 생성하기 위해 퇴치 차원 브로드캐스트를 통해 4x3x1 행렬에 추가할 수 있습니다.