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을 더 적은 차원을 가진 텐서 앞에 붙여서 길이를 같게 만든다.- 그런 다음,
x
와y
크기 중 최대 차원이 되도록 맞춰준다.
예를 들어
# 읽기 쉽게 하기 위해 뒤에서부터 차원을 나열
>>> 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.enabled
를 True
로 설정해야할 수도 있다.
예를 들어
>>> 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 |