파이토치란(PyTorch)?
구글이 만든 텐서플로우(Tensorflow)에 대항하여 페이스북이 만든 딥러닝 프레임워크이다. 텐서플로우와 달리 대부분의 모듈이 파이썬으로 짜여있어 코드가 깔끔하고, 넘파이(NumPy)와 의 호환성이 뛰어나다. 또한 한줄의 명령어로 역전파 알고리즘을 수행하고, 연산과 동시에 동적그래프가 생성되어 자유로운 수정이 가능하다는 장점이 있다.
1. Tensor
파이토치의 텐서는 넘파이의 배열인 ndarray와 같은 개념이다. 파이토치는 텐서를 통해 값을 저장하고 함수를 수행한다.
import torch
import numpy as np
x=torch.Tensor([[1,2],[3,4]])
y=np.array([[1,2],[3,4]])
위의 예제에서 파이토치와 넘파이 코드 모두 2*2 행렬을 만들어낸다.
2. Autograd
파이토치는 연산을 수행할때마다 동적으로 그래프를 생성하여 추적하고, 미분및 역전파를 자동으로 수행하게 한다.
import torch
x=torch.Tensor(2,2)
y=torch.Tensor(2,2)
y.requires_grad_(True)
z=(x+y)+torch.Tensor(2,2)
with torch.no_grad():
z=(x+y)+torch.Tensor(2,2)
requires_grad=True 는 autograd 에 모든 연산(operation)들을 추적해야 한다고 알려준다. 예제에서 x+y에 해당하는 텐서가 생성되어 연산그래프에 할당되고 다시 생성된 텐서를 더해준뒤 이를 z에 할당한다. 만약 여기서 역전파를 수행하면, 생성된 연산 그래프를 따라 미분값을 전달할 수 있다. 미리 정해진 연산들을 컴파일을 통해 고정해야하는 케라스와 텐서플로우와는 달리, 파이토치에는 정해진 연산이 없다. 만약 역전파 알고리즘이 필요없다면 with torch.no_grad()의 코드를 이용하여 연산속도와 메모리 사용을 효율적으로 관리할 수 있다.
3. nn.Module
nn.Module 클래스를 사용하여 모델 구조를 구현하고, forward()를 오버라이드하여 피드포워드를 구현할 수도있다.
import torch
import torch.nn as nn
class MyLinear(nn.Module):
def __init__(self, input_size, output_size):
super().__init__()
self.W=nn.Parameter(torch.Tensor(input_size, output_size),requires_grad=True)
self.b=nn.Parameter(torch.Tensor(output_size),requires_grad=True)
def forward(self,x):
y=torch.mm(x,self.W)+self.b
return y
x=torch.Tensor(16,10)
linear=MyLinear(10,5)
y=linear(x)
params=[p.size() for p in linear.parameters()]
print(params)
이런식으로 W와 b를 선언하면 신경망의 학습 파라미터는 단순한 텐서가 아닌 파라미터이기때문에 paramter라는 클래스를 사용하여 텐서를 감싸주어야 한다. 위처럼 복잡한 코드 대신 아래처럼 간단하게 linear 클래스를 사용하여 나타낼 수도 있다.
class MyLinear(nn.Module):
def __init__ (self,input_size,output_size):
super(MyLinear,self).__init__()
self.linear=nn.Linear(input_size,output_size)
def forward(self,x):
y=self.linear(x)
return y
x=torch.Tensor(16,10)
linear=MyLinear(10,5)
y=linear(x)
params=[p.size() for p in linear.parameters()]
print(params)
3. backward(), train(), eval()
피드포워드에 이어서, 실제 정답값의 차이를 계산하여 손실값을 뒤로 전달하는 back-propagation을 수행할 수도 있다. 이때 손실값은 스칼라로 표현되어야 한다. 또한 사용자는 필요에 따라 훈련과 추론을 전환할 수 있다.
objective=100
x=torch.Tensor(16,10)
linear=MyLinear(10,5)
y=linear(x)
loss=(objective-y.sum())**2
loss.backward()
#training
linear.eval()
#inference
linear.train()
#training
4. GPU 사용
파이토치에서는 cuda()함수를 통해 gpu를 사용할 수 있으며 to() 함수를 이용하여 텐서또는 모듈을 원하는 디바이스로 보낼 수도있다.
x=torch.cuda.Tensor(10,16)
linear=MyLinear(10,5)
linear.cuda()
y=linear(x)
※본 게시물은 「김기현의 자연어처리 딥러닝캠프-파이토치편」을 참고하여 작성되었습니다.
'NLP' 카테고리의 다른 글
6. 단어 임베딩 (0) | 2021.07.21 |
---|---|
5. 자연어의 중의성을 해결하는 법 (0) | 2021.07.21 |
4. 전처리 (0) | 2021.07.19 |
2. 자연어처리를 위한 기초수학 (0) | 2021.07.13 |
1. 자연어 처리란? (0) | 2021.07.13 |