방송 중

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

방송이란 무엇인가요?

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

서로 다른 순위의 다차원 배열 간 작업 또는 모양이 다르지만 호환되는 다차원 배열 간 작업에는 브로드캐스트가 필요할 수 있습니다. X가 행렬 (순위 2의 배열)이고 v가 벡터 (순위 1의 배열)인 덧셈 X+v를 생각해 보세요. 요소별 덧셈을 실행하려면 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 언어는 최대한 엄격하고 명시적이므로 '마법 같은' 암시적인 특성을 피합니다. 이러한 특성을 사용하면 일부 계산을 약간 쉽게 정의할 수 있지만 장기적으로는 변경하기 어려운 사용자 코드에 가정이 더해지게 됩니다. 필요한 경우 클라이언트 수준 래퍼에 암시적인 매직 기능을 추가할 수 있습니다.

브로드캐스팅과 관련하여 XLA는 서로 다른 순위의 배열 간 연산에 관한 명시적인 브로드캐스팅 사양을 요구합니다. 이는 가능한 경우 사양을 추론하는 NumPy와는 다릅니다.

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

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

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

대부분의 브로드캐스팅 요구사항은 바이너리 연산에서 차원 튜플을 사용하여 포착할 수 있습니다. 연산에 대한 입력의 순위가 다른 경우 이 브로드캐스트 튜플은 높은 순위 배열에서 낮은 순위 배열과 일치시킬 차원을 지정합니다.

이전 예를 생각해 보세요. (2,3) 행렬에 스칼라를 추가하는 대신 차원 행렬 (2,3)에 차원 벡터 (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를 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차원 (가장 왼쪽 차원)에 있습니다. 이 중간 배열은 퇴행 차원 브로드캐스팅을 통해 4x3x1 행렬에 더해 4x3x2 배열 결과를 생성할 수 있습니다.