오늘 현지 TensorFlow Everywhere 이벤트에 참석하세요!

브로드캐스팅 의미 체계

이 설명서에서는 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 언어는 가능한 한 엄격하고 명시적이며, 암시적 및 '마법적인' 특성을 피합니다. 이러한 특성을 사용하면 장기적으로 변경하기 어려운 사용자 코드에 더 많은 가정을 적용하는 대신 일부 계산을 정의하기가 약간 더 쉬워질 수 있습니다. 필요한 경우 클라이언트 수준 래퍼에 암시적 및 마법적 특성을 추가할 수 있습니다.

브로드캐스팅에서는 서로 다른 순위의 배열 간 연산에 대한 명시적인 브로드캐스팅 사양이 필요합니다. 이는 추론이 가능한 경우 사양을 추론하는 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|

참고: 요소를 3개 가진 벡터에 2x3 행렬을 추가할 때 브로드캐스팅 차원 0은 유효하지 않습니다.

브로드캐스팅 차원은 더 작은 랭크 형상이 더 큰 순위 형상으로 브로드캐스팅되는 방법을 설명하는 튜플일 수 있습니다. 예를 들어, 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('중복 제거' 차원)입니다.

두 개의 호환 가능한 배열이 발견되면 결과 형상은 모든 차원 인덱스에서 두 입력 중 최대값을 갖습니다.

예는 다음과 같습니다.

  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과 일치함을 나타냅니다. 그러면 1x2 배열의 해당 차원 크기와 일치하도록 값 M이 선택되는 크기 4xM의 행렬이 생성됩니다. 따라서 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은 4x1x2 중간 배열을 생성하는 더 큰 피연산자(4x3x1 배열)의 크기에 의해 결정됩니다. 브로드캐스팅 차원이 (1, 2)이므로 차원 1과 2가 원래 1x2 행렬의 차원에 매핑되기 때문에 M은 차원 0(가장 왼쪽 차원)에 있습니다. 이 중간 배열은 4x3x2 배열 결과를 생성하기 위해 중복 제거 차원의 브로드캐스팅으로 4x3x1 행렬에 추가할 수 있습니다.