Link

실습: 행렬 곱

이번에는 파이토치에서 행렬곱을 구현해보겠습니다.

>>> x = torch.FloatTensor([[1, 2],
...                        [3, 4],
...                        [5, 6]])
>>> y = torch.FloatTensor([[1, 2],
...                        [1, 2]])
>>> print(x.size(), y.size())
torch.Size([3, 2]) torch.Size([2, 2])

$3\times2$ 크기의 텐서 x와 $2\times2$ 크기의 텐서 y를 만들었습니다. 파이토치의 matmul 함수를 이용하면 행렬 곱을 수행할 수 있습니다. 다음 코드는 앞서 만든 x와 y의 행렬 곱을 수행하고, 결과 행렬의 크기를 출력하는 코드입니다.

>>> z = torch.matmul(x, y)
>>> print(z.size())
torch.Size([3, 2])

행렬 곱의 결과물이 저장된 텐서 z의 크기는 우리가 기대한대로 $3\times2$ 인것을 볼 수 있습니다.

배치 행렬 곱

딥러닝을 수행할 때, 보통은 여러 샘플을 동시에 병렬 계산하곤합니다. 따라서 행렬 곱 연산의 경우에도 여러 곱셈을 동시에 진행할 수 있어야 합니다. bmmBatch Matrix Multiplication 함수가 이 역할을 수행합니다. 다음 코드와 같이 텐서를 선언합니다.

>>> x = torch.FloatTensor(3, 3, 2)
>>> y = torch.FloatTensor(3, 2, 3)

$3\times3\times2$ 크기의 텐서는 $3\times2$ 크기의 행렬이 3개 있는 것이라고 볼 수 있습니다. 마찬가지로 $3\times2\times3$ 크기의 텐서는 $2\times3$ 크기의 행렬이 3개 있는 것입니다. 여기서 bmm 함수를 활용하여 3번 수행되는 행렬 곱 연산을 동시에 병렬로 진행할 수 있습니다.

>>> z = torch.bmm(x, y)
>>> print(z.size())
torch.Size([3, 3, 3])

결과물의 크기가 우리가 예상한대로 $3\times3$ 크기의 행렬이 3개 있는 $3\times3\times3$ 형태로 나오는 것을 볼 수 있습니다. 이처럼 bmm 함수는 마지막 2개의 차원을 행렬 취급하여 행렬 곱 연산을 병렬로 수행합니다. 이를 위해서는 마지막 2개의 차원을 제외한 다른 차원들의 크기는 동일해야 bmm 함수를 적용할 수 있습니다.