Tensor를 조작하는 법을 한번 정리했다.
보통 머신러닝과 딥러닝에서 다루게 되는 기본적인 단위는 스칼라, 벡터, 행렬, 텐서이다.
먼저 scalar는 간단하게 숫자 하나라고 생각하면 된다.
Vector는 1차원의 배열이라고 생각하면 된다. 파이썬에서는 1차원 배열 혹은 list로 표현한다.
Matrix는 행렬로 행과 열을 가지는 2차원 형상을 가지고 있는 구조이다. 파이썬에서는 2차원 배열로 표현하며, 가로를 행(row), 세로줄을 열(column)이라고 한다.
Tensor란 간단하게 말해서 다차원 배열이라고 부른다. 그러므로 vector, matrix도 tensor라고 부를 수 있다. 파이썬에서는 3차원 이상의 배열로 표현한다.
딥러닝을 다룰 때, matrix와 tensor의 크기, 즉 차원을 항상 고려해야한다.
보통 2차원 tensor 크기를 표현할 때는 (batch_size x dimension)으로 차원이 이루어진다.
예를 들어, batch_size가 64라면 데이터의 나열이 64의 길이를 가지고 있다고 하자. 즉 batch_size 하나는 64차원을 가지게 되고 batch의 개수가 2000개라고 한다면, 총 data는 64 x 2000의 크기를 가지게 되고 이는 2차원, 2D tensor라고 할 수 있다.
자연어 처리에서 보통 (batch_size, sequence_length, dimension)이라는 3차원, 3D tensor를 다룬다.
예를 들어, 아래와 같은 4개의 문장으로 이루어진 data가 존재한다고 하자.
우선 이를 숫자로 encoding을 해줘야하므로 tokenization를 진행한다.
이때, input size는 4x3 size의 2D tensor이다.
이제 token을 vector값으로 나타내면 다음과 같다.
이러한 vector를 훈련 data로 구성하면 다음과 같다.
4x3x3 size의 3D tensor
만약 batch_size를 2로 설정하면 다음과 같다.
Batch 하나당 tensor의 size는 2x3x3이고 이는 (batch_size, sequence_length, dimension).
이제 pytorch를 통해 tensor에 대한 여러 함수를 알아보자.
Pytorch에서 tensor를 쌓는 경우 사용하게 되는 cat과 stack함수에 대해 알아보자.
먼저 torch.cat 함수는 원하는 dimension 방향으로 지정한 tensor를 쌓아준다.
예를 들어, (1,1,1)와 (2,1,1)의 차원을 갖는 두개의 tensor를 dim = 0으로 쌓는 경우, tensor의 차원은 (3,1,1)가 된다. 여기서 두번째와 세번째 차원은 같아야한다.
위와 같이 (3,3)차원의 3개의 tensor를 dim=0으로 쌓을경우 차원은 (3+3+3, 3)이고 dim=1로 쌓을경우, 차원은 (3, 3+3+3)이 된다.
다음으로 stack 함수를 알아보자.
Stack은 cat과 달리 새로운 차원에 차곡차곡 쌓아주는 함수이다.
에를 들어, (a,b,c) 사이즈의 tensor 3개를 dim = 2의 방향으로 쌓는다면, (a,b,3,c)형태로 (a,b,c) 사이즈의 tensor를 쌓게된다. 이때, 같은 사이즈의 tensor끼리만 사용할 수 있다.
dim = 0 방향으로 3개의 tensor를 쌓아 stack한 tensor의 사이즈는 (3,4,4)가 되었고 dim = 1 방향으로 stack한 tensor의 사이즈는 (4,3,4)가 되었다.
다음은 pytorch의 view함수에 대해 알아보자. View 함수는 numpy에서 reshape과 비슷한 역할을 한다. Tensor의 원소의 수는 유지하면서 사이즈를 변경해주는 함수이다.
기존 사이즈가 (2,2,3)인 tensor를 view함수를 통해 사이즈를 재설정한 코드이다. view([-1,3])에서 -1이 가지는 의미는 우리가 설정하는게 아니라 pytorch가 알아서 변경해주는 것이다. 그리고 3은 두번째 차원을 3으로 지정해주는것이다. 그러면 결국 (2,2,3)에서 (?,3)이 되어야되는데 2x2x3 = 12, ?x3 = 12가 되어야하므로 (4,3)의 형태가 된 것을 확인할 수 있다.
3차원의 tensor 바꾸는것도 같은 방법이다. (2,2,3)의 사이즈를 가진 tensor를 (?, 1, 3)으로 바꾸는데 이는 위와 같은 방법으로 (4,1,3)의 size를 가진 tensor로 바뀐다.
Squeeze함수는 쉽게 얘기해서 tensor가 가지고 있는 차원 중 1인 차원을 제거하는 함수이다.
위와 같이 (1,2,3)의 사이즈 tensor가 squeeze 함수를 통해 (2,3)으로 변경된것을 확인할 수 있다.
Unsqueeze는 squeeze와 반대로 지정해준 위치에 1인 차원을 추가해주는 함수이다.
0의 자리에 1인 차원이 추가되어있는것을 확인할 수 있다.
Transpose 함수는 두가지 차원을 맞바꾸는 함수이다.
사이즈가 (1,2,3)인 tensor의 0번째와 1번째 차원을 맞바꾼 결과이다.
Permute 함수는 transpose와 다르게 모든 차원을 맞바꿀 수 있다.
(1,2,3)의 사이즈 tensor를 permute(2,1,0)의 차원의 자리수를 바꿔 (3,2,1) 사이즈의 tensor로 바뀌었다.