Pytorch로 시작하는 딥러닝 입문(02-02 텐서 조작하기)

2024. 1. 31. 10:19딥러닝 모델: 파이토치

♣  벡터, 행렬, 텐서(Vecto, Metrix, Tensor)

 

- 차원이 없는 값을 스칼라, 1차원으로 구성된 값을 벡터라고 함. 벡터를 1차원 텐서라고도 함

- 2차원으로 구성된 값을 행렬(Matrix)라고 함. 2차원 텐서라고도 함. 

- 3차원을 텐서(Tensor)라고 함. 

- 텐서(torch.Tensor)는 Numpy의 배열, 행렬과 매우 유사한 자료구조임. 파이토치에서 scalar, vector, matrix, tensor 등을 표현하는 데 사용

- tensor는 backward pass에서 계산된 Gradient를 저장하는 기능이 있음. 즉 torch.Tensor에 어떤 operation(더하기, 곱셈 등)을 취하면 해당 operation이 Computational Graph에 기록된다. 

 

♣ 텐서의 모양

2D Tensor

위의 2차원 텐서의 크기 |t|를 (batch size × dimension)으로 표현한 경우임. 

아래 그림과 같이 행렬에서 행의 크기가 batch size를, 열의 크기가 dim을 의미함.

 

훈련 데이터 한 개의 크기를 256이라고 하면 [1, 2, 3, 5...] 이런 숫자들의 나열이 265의 길이로 있는 것. 

즉 훈련 데이터 한 개에서 벡터의 차원(dim)이 256이 되는 것임. 이런 훈련 데이터가 3000개라고 하면 전체 훈련 데이터의 크기는 3,000 × 256이 되며, 행렬이니까 2D 텐서임. 

3,000개 데이터를 하나씩 꺼내서 처리할 수도 있지만 보통은 훈련 데이터를 하나씩 처리하기보다 덩어리로 처리함. 

3,000개에서 64개씩 꺼내서 처리한다고 하면 이 때 batch size를 64라고 함.  

전체 데이터(3,000, 256)
한 번에 처리하는 덩어리(64, 256)

 

따라서 컴퓨터가 한 번에 처리하는 2D 텐서의 크기는 (batch size × dim) = 64 × 256 

 

 

3D Tensor

 

일반적으로 자연어 처리보다 vision 분야(이미지, 영상 처리)에서 더 복잡한 텐서를 다루게 된다. 

이미지에는 가로, 세로가 존재하며 여러 장의 이미지로 구성하게 되면 3차원 텐서가 된다. 

 

 

자연어 처리에서는 보통 (batch size, 문장 길이, 단어 벡터의 차원)이라는 3차원 텐서를 사용함. 

 

 

 

NLP 분야의 3D 텐서 예제

4개 문장으로 구성된 전체 훈련 데이터

 

이 상태에서는 컴퓨터가 '나는 사과를 좋아해' 라는 문장이 단어가 1개인지 3개인지 이해하지 못함. 입력 데이터로 사용하기 위해서 단어별로 나눠줘야 함. 

 

이제 훈련 데이터의 크기는 4 × 3 크기를 가지는 2D 텐서임. 컴퓨터는 텍스트보다 숫자를 더 잘 처리할 수 있기 때문에 각 단어를 벡터로 만듦. 아래와 같이 단어가 3차원 벡터로 변환됨. 

 

단어를 3차원 벡터로 변환한 값을 이용하여 훈련 데이터를 재구성하면 아래와 같음. 

batch size = 4, 문장의 길이 = 3(한 문장이 3개의 리스트로 이뤄짐), 단어의 벡터 차원=3(한 단어가 3개의 수로 이뤄짐. 예를 들어 '나는'이 0.1, 0.2, 0.9 로 이뤄짐)

 

따라서 이 훈련 데이터는  4 × 3 × 3의 크기를 가지는 3D 텐서임. 이 3D 텐서에서 batch size를 2로 정하면

컴퓨터는 배치 단위로 데이터를 가져가서 연산을 수행함. 현재 각 배치의 텐서 크기는 (2 × 3 × 3)

각각 batch size, 문장 길이, 단어 벡터의 차원을 의미함.

 

 

♣ 넘파이로 텐서 만들기(벡터와 행렬 만들기)

1D 텐서 만들기(벡터)

 

1차원 텐서인 벡터의 차원과 크기 출력하기

 벡터이므로 차원은 1차원 출력. shape는 크기를 출력하는데 (7,)은 (1, 7)을 의미함. 즉 (1 × 7) 크기를 가지는 벡터임

 

 

 

2D 텐서 만들기(행렬)

 

행렬이므로 2차원에, shape는 (4 × 3), 즉 4행 3열임을 의미함. 

 

 

♣ Pytorch로 텐서 선언하기

1D Tensor(벡터)

 

 

1차원 텐서이며, 원소가 7개임. 인덱스와 슬라이싱을 이용하여 각 원소에 접근할 수 있음

 

 

2D Tensor(행렬)

 

 

행렬이므로 텐서는 2차원이며, (4, 3)의 크기를 가짐. 슬라이싱을 이용하여 요소 가져오기

 

 

 

브로드캐스팅

두 행렬 A, B가 있을 때 행렬의 덧셈 또는 뺄셈을 하려면 A, B의 크기가 같아야 함. 

또한 두 행렬을 곱한다면 A의 마지막 차원과 B의 첫 번째 차원이 일치해야 함. 

하지만 딥러닝을 하게 되면 크기가 다른 행렬 또는 텐서에 대해서 사칙 연산을 수행하는 경우가 생김. 

이를 위해 파이토치에서는 자동으로 크기를 맞춰서 연산을 수행하게 만드는 '브로드캐스팅' 기능을 제공함. 

 

1) 벡터 + 스칼라에서 브로드캐스팅 기능 적용

 

m1의 크기는 (1, 2), m2의 크기는 (1,)이라서 수학적으로는 연산이 불가함. 하지만 파이토치는 m2의 크기를(1, 2)로 변경하여 연산을 수행함. 

 

 

2) 벡터 간 연산에서 브로드캐스팅 기능 적용

 

브로드캐스팅은 편리하지만 주의해서 사용해야 함. 크기가 같은 행렬끼리 더한다고 생각해서 썼는데 크기가 달랐고, 브로드캐스팅 덕분에 수행되어 버리는 경우가 있음. 이런 경우에는 어디서 문제가 발생했는지 찾기 어려울 수 있음. 

 

 

그 밖의 기능(multiple, mean, sum, max, argmax)

https://wikidocs.net/52460

 

02-02 텐서 조작하기(Tensor Manipulation) 1

이번 챕터에서 배울 내용에 대해서 리뷰해보겠습니다. 벡터, 행렬, 텐서의 개념에 대해서 이해하고, Numpy와 파이토치로 벡터, 행렬, 텐서를 다루는 방법에 대해서 이해합니…

wikidocs.net