pytorch broadcasting

J·2021년 6월 16일
1

pytorch

목록 보기
14/23

많은 pytorch operation들은 numpy's broadcasting semantic을 support한다. 이를 통해 tensor argument들은 automatically 같은 size로 추가적인 데이터 copy 없이도 차원이 확장된다.

what is broadcasting?

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을 갖게 된다.

General semantics

아래의 조건이 맞으면 두 개의 tensor는 broadcatable한다.

  • 각 tensor는 최소 one dimension이상 가지고 있어야한다.
  • dimension sizes를 iterate할 때에 dimension이 같거나 둘 중 하나가 1이거나 둘 중 하나가 없어야 한다.

만약 두 tensor 'x', 'y'가 broadcatable하다면 resulting tensor size는 아래와 같이 연산된다.

  • x와 y의 차원이 같지 않을 때 같은 길이로 만들기 위해 차원이 작은 tensor의 차원을 한 차원 늘려준다.
  • resulting dimension size는 차원에 따른 x와 y 사이즈의 최대값이 된다.
    example
# 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 semantics

한가지 문제는 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.

Backwards compatibility

이 전 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]).

Reference

  1. https://pytorch.org/docs/stable/notes/broadcasting.html#broadcasting-semantics
  2. https://numpy.org/doc/stable/user/basics.broadcasting.html
profile
I'm interested in processing video&images with deeplearning and solving problem in our lives.

0개의 댓글