permute? view?
torch framework에서 torch tensor를 다루다 보면 tensor의 shape을 변형할 필요가 생긴다. 이때 단지 shape만을 맞추는 것은 permute와 view모두 가능하지만 두 개의 torch operation은 다른 결과를 가져올수 있고 의미를 고려하여 사용하여야 한다.
permute
Returns a view of the original tensor with its dimensions permuted.
view
Returns a new tensor with the same data as the self tensor but of a different shape.
A difference between permute and view
permute는 transpose의 일반화된 operation이다. 따라서, 2차원 (2, 3) shape를 가지는 a matrix의 경우는 a transpose한 결과와 같다. view의 경우엔 a matrix를 flatten 시키고 (3,2) 로 만들때 2개씩 잘라서 3개의를 만드는것과 같은 결과이다. loss를 계산할때 matrix multiplication을 하기위해 shape을 변형시킨다고 할때 view를 사용하게 되면 원래의 matrix가 가지는 의미와 특성을 잃을 수 있다.
구체적으로, permute는 다음과 같은 상황에서 올바른 의미로 계산될수 있다. 첫번째 a의 첫번째 행이 batch size를 의미하고 두번째가 token sequence length라고 할때 [1,2,3]은 한 문자의 토큰 list가 된다. 이때, permute의 경우는 여전히 첫번째 열을 가져오게 되면 [1,2,3]으로 한문장의 토큰 list라는 의미를 보존하지만 view의 경우엔 [1,3,5]로 서로다른 문장의 토큰들이 포함되어 의미를 잃게 되었다.
view를 사용하는 경우를 알아보기 위해 예를 들어 다음과 같은 CNN feature map이 있다고 가정해볼 수 있다.
(batch, channel, height, width)의 tensor가 있을때 이미지 pixel마다 어떤 (height*width)의 크기를 가진 vector을 곱해주고자 한다면 view를 사용하여 (batch, channel, heigth * width)의 3차원 tensor로 만들고 여기에 pixel마다 곱할 vector를 dot product를 하게되면 각 pixel에 값에 어떤 weight를 곱한다는 의미를 벗어나지 않는다. 즉, matrix차원의 의미를 생각할 필요가 없는 경우가 적절하다고 생각해 볼수가 있다.
여전히 명확히 언제 써야하는지에 대한 구체적인 규칙을 정하긴 힘들지만 둘간의 차이는 위의 예시들을 생각하며 사용하는것이 실수를 줄일수 있다.
'Pytorch' 카테고리의 다른 글
[Jupyter notebook] notebook에서 Java script와 통신하기 (2) | 2020.08.30 |
---|