많은 pytorch operation들은 numpy's broadcasting semantic을 support한다. 이를 통해 tensor argument들은 automatically 같은 size로 추가적인 데이터 copy 없이도 차원이 확장된다.
NumPy docs에 공식설명은 아래와 같다.
The term broadcasting describes how numpy treats arrays with different shapes during arithmetic operations.
Subject to certain constraints, the smaller array is “broadcast” across the larger array so that they have compatible shapes.
broadcasting은 다른 shape의 array operation에 numpy가 어떻게 대응하는지에 대해 묘사한 것이다. 특정한 조건 하에서 연산에 사용되는 array 중 더 작은 array가 larger array로 "broadcast"되어 계산가능한 shape을 갖게 된다.
아래의 조건이 맞으면 두 개의 tensor는 broadcatable한다.
만약 두 tensor 'x', 'y'가 broadcatable하다면 resulting tensor size는 아래와 같이 연산된다.
# can line up trailing dimensions to make reading easier
>>> x=torch.empty(5,1,4,1)
>>> y=torch.empty( 3,1,1)
>>> (x+y).size()
torch.Size([5, 3, 4, 1])
한가지 문제는 in-place operation은 broadcasting에 따라 in-place tensor의 모양이 변경되지 않는다는 것이다.
example
>>> x=torch.empty(5,3,4,1)
>>> y=torch.empty(3,1,1)
>>> (x.add_(y)).size()
torch.Size([5, 3, 4, 1])
# but:
>>> x=torch.empty(1,3,1)
>>> y=torch.empty(3,1,7)
>>> (x.add_(y)).size()
RuntimeError: The expanded size of the tensor (1) must match the existing size (7) at non-singleton dimension 2.
이 전 version의 pytorch는 피연산 tensor의 element의 개수가 같다면 특정 pointwise function을 shape이 다른 tensor에 대해서도 허용했다. 그러한 pointwise functiopn은 피연산 tensor들을 1-dimensional tensor로 간주하고 연산을 수행하였다. 이제 pytorch는 broadcasting을 지원하고 '1-dimensional' pointwise behavior (dimension이 다르지만 element개수가 같을 때 1-dimensional로 가정하고 pointwise function을 실행하는 행위)는 depreecated된 것으로 간주되고 python warning을 발생시킨다.
shape이 다르고, element 수가 같은 두 tensor가 broadcastable할 때, tensor broadcating의 도입은 이전 버전과는 다른 변화를 만든다.
example
>>> torch.add(torch.ones(4,1), torch.randn(4))
위의 함수는 이전 버전의 pytorch를 사용하였을 때 resulitng tensor의 size가 ([4,1])과 같았겟지만, 현재 버전에서는 resulting tensor의 size가 ([4,4]).