이 문서에서는 XLA의 브로드캐스팅 시맨틱스를 설명합니다.
브로드캐스팅이란 무엇인가요?
브로드캐스팅은 서로 다른 모양의 배열이 산술 연산에 호환되는 모양을 갖도록 하는 프로세스입니다. 이 용어는 NumPy 브로드캐스팅에서 가져왔습니다.
브로드캐스팅은 순위가 다른 다차원 배열 간 또는 모양이 다르지만 호환되는 다차원 배열 간 작업에 필요할 수 있습니다. X이 행렬 (2차원 배열)이고 v이 벡터 (1차원 배열)인 X+v 덧셈을 생각해 보세요. 요소별 덧셈을 실행하려면 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) 행렬에 스칼라를 추가하는 대신 (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,1) 및 (2,3)은 (2,3)에 브로드캐스트됩니다.
- (1,2,5)와 (7,2,5)는 (7,2,5)로 브로드캐스트됩니다.
- (7,2,5) 및 (7,1,5)가 (7,2,5)로 브로드캐스트됩니다.
- (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은 더 큰 피연산자(4x3x1 배열)의 크기에 따라 결정되어 4x1x2 중간 배열이 생성됩니다. M은 측정기준 1과 2가 브로드캐스트 측정기준이 (1, 2)인 원래 1x2 행렬의 측정기준에 매핑되므로 측정기준 0 (가장 왼쪽 측정기준)에 있습니다. 이 중간 배열은 축소된 차원의 브로드캐스팅을 사용하여 4x3x1 행렬에 추가하여 4x3x2 배열 결과를 생성할 수 있습니다.