본문으로 바로가기

Pytorch docs 요약] Broadcasting Semantics

category Programming/Pytorch 2019. 1. 30. 12:31

원본

BROADCASTING SEMANTICS

많은 pytorch operation은 NumPy Broadcasting Semantics을 지원한다.

짧게 말해, PyTorch operation이 broadcast를 지원하면, 그 텐서 매개변수들은 자동적으로 (데이터를 복사하지 않고서) 동일한 크기(size)로 확장될 수 있다.

GENERAL SEMANTICS

만약 다음 두 가지 규칙을 유효하면, 두 개의 텐서는 "broadcastable"하다.

  • 각 텐서는 최소한 한 차원(dimension)은 가지고 있다.
  • 차원 크기에 따라 반복할 때, 뒤 쪽에서 시작하여 차원의 크기는 동일해야하고, 그 중 하나는 1이거나 존재하지 않아야 한다.

예를 들어

>>> x=torch.empty(5,7,3)
>>> y=torch.empty(5,7,3)
# 동일한 shape는 항상 broadcastable하다 (즉, 위 규칙이 항상 유효하다)

>>> x=torch.empty((0,))
>>> y=torch.empty(2,2)
# x와 y는 broadcastable하지 않다. 왜냐하면 x가 최소한 한 차원도 없기 때문이다

# 뒤 차원을 일렬로 나열
>>> x=torch.empty(5,3,4,1)
>>> y=torch.empty(  3,1,1)
# x와 y는 broadcastable
# 맨 뒤에서 첫 번째 차원: 둘 다 1
# 맨 뒤에서 두 번째 차원: y가 1 (하나가 1)
# 맨 뒤에서 세 번째 차원: x와 y의 크기가 같음
# 맨 뒤에서 네 번째 차원: y가 존재하지 않음

# 하지만
>>> x=torch.empty(5,2,4,1)
>>> y=torch.empty(  3,1,1)
# 뒤에서 3번째 차원이 달라서 (2 != 3) x와 y는 "broadcastable"하지 않다.

만약 x, y가 "broadcastable"하다면, 결과적으로 텐서 크기는 다음과 같이 계산할 수 있다.

  • x, y 차원수가 다르다면, 1을 더 적은 차원을 가진 텐서 앞에 붙여서 길이를 같게 만든다.
  • 그런 다음, xy 크기 중 최대 차원이 되도록 맞춰준다.

예를 들어

# 읽기 쉽게 하기 위해 뒤에서부터 차원을 나열
>>> x=torch.empty(5,1,4,1)
>>> y=torch.empty(  3,1,1)
>>> (x+y).size()
torch.Size([5, 3, 4, 1])

>>> x=torch.empty(1)
>>> y=torch.empty(3,1,7)
>>> (x+y).size()
torch.Size([3, 1, 7])

>>> x=torch.empty(5,2,4,1)
>>> y=torch.empty(3,1,1)
>>> (x+y).size()
RuntimeError: The size of tensor a (2) must match the size of tensor b (3) at non-singleton dimension 1

BACKWARDS COMPATIBILITY

Pytorch 이전 버전은 각 텐서의 요소 수가 동일하는 한 다른 shape의 텐서에서 끼리 어떤 pointwise function을 실행하는 것이 가능했다. pointwise operation은 각 텐서를 1-차원으로 보고 실행되었다. PyTorch는 이제 broadcasting을 지원하고 1-차원 pointwise 동작은 더이상 지원되지 않는 것으로 간주하고 요소 수는 같지만 broadcastable하지 않은 경우엔 Python warning을 낸다.

두 텐서가 같은 shape는 아니지만, broadcastable하고 같은 요소 수를 가진 경우 broadcasting의 도입은 backwards incompatible 변화를 야기할 수 있다. 예를 들면

>>> torch.add(torch.ones(4,1), torch.randn(4))

이 것은 Tensor 크기를 torch.Size([4,1])로 만드는 게 아니라 torch.Size([4, 4])로 만든다. broadcasting도입으로 인해 나타날 수 있는 이 backwards incompatibilities를 감지하기 위해, 이러한 경우에 경고를 해주는 torch.utils.backcompat.broadcast_warning.enabledTrue로 설정해야할 수도 있다.

예를 들어

>>> torch.utils.backcompat.broadcast_warning.enabled=True
>>> torch.add(torch.ones(4,1), torch.ones(4))
__main__:1: UserWarning: self and other do not have the same shape, but are broadcastable, and have the same number of elements.
Changing behavior in a backwards incompatible manner to broadcasting rather than viewing as 1-dimensional.

'Programming > Pytorch' 카테고리의 다른 글

Pytorch docs 요약] Cuda semantics  (0) 2019.02.02
Pytorch docs 요약] Autograd Mechanics  (0) 2019.01.27