NLP with PyTorch 04. 지도 학습 훈련

‎yeon·2023년 2월 16일
0

NLP with PyTorch

목록 보기
4/4
post-thumbnail

지도 학습 훈련

🦄지도 학습(Supervised Learning) 의 훈련 데이터는 sample과 target(label)의 쌍이다. 모델은 sample에 대한 예측(output)을 계산하고 손실 함수는 이를 target과 비교하여 오차를 측정한다. 지도 학습은 gradient 기반의 최적화 알고리즘으로 모델 파라미터를 조정하여 손실을 낮춘다.

2차원 데이터를 두 개의 클래스 중 하나로 분류하는 예제를 통해서 지도 학습 훈련 과정을 이해해보자.

✔️Decision Boundary
분류 문제에서 결정 경계(decision boundary)는 벡터 공간에서 서로 다른 클래스로 나누는 초평면이다. 결정 경계는 초평면(hyper-plane)이므로 분류 문제는 선형적이고 서로 다른 클래스들은 선형적으로 나눌 수 있다.
✔️Disciriminant Function
K개의 class 분류 문제에서 gk(x)g_k(x)kk번째 클래스에 속할 확률을 표현한 식이고 이를 discriminant function이라고 한다.

1 예제 데이터 만들기

선형적으로 나눌 수 있는 예제 데이터는 get_toy_data() 함수를 이용하여 만들 수 있다.

def get_toy_data(batch_size, left_center=LEFT_CENTER, right_center=RIGHT_CENTER):
    x_data = []
    y_targets = np.zeros(batch_size)
    for batch_i in range(batch_size):
        if np.random.random() > 0.5:
            x_data.append(np.random.normal(loc=left_center))
        else:
            x_data.append(np.random.normal(loc=right_center))
            y_targets[batch_i] = 1
    return torch.tensor(x_data, dtype=torch.float32), torch.tensor(y_targets, dtype=torch.float32)

2 모델 선택

Perceptron을 모델으로 선택하고자 한다. 예제 데이터셋은 2차원 데이터 포인트이므로 입력 크기(input dimension)는 2이다.

class Perceptron(nn.Module):
    def __init__(self, input_dim):
        super(Perceptron, self).__init__()
        self.fc1 = nn.Linear(input_dim, 1)

    def forward(self, x_in):
        return torch.sigmoid(self.fc1(x_in))

이 문제는 각각의 데이터 포인트를 두 개의 class 중 하나로 분류하는 것이다. 이 문제를 위해 class를 인덱스 0과 1을 할당한다.

Perceptron의 activation function은 sigmoid이고 출력은 데이터 포인트(xx)가 Class 1(P(y=1x)P(y=1|x))일 확률을 나타낸다.

3 확률을 클래스로 변환하기

결정 경계(decision boundary) δ\delta를 적용하여 output인 확률을 두 개의 클래스로 바꾸어야 한다. 예측 확률 P(y=1x)>δP(y=1|x)>\delta이면 예측 클래스는 1이고 나머지는 0으로 분류한다. 일반적으로 δ=0.5\delta=0.5으로 지정한다.

4 손실 함수 선택

예제 데이터를 두 개의 class로 나누는 문제이므로 binary cross entropy cost function을 이용한다.

5 Optimizer 선택

PyTorch는 여러 종류의 optimizer를 제공한다. SGD는 고전적인 algorithm이고 종종 나쁜 모델을 만든다. 따라서 Adagrad나 Adam과 같은 적응형 optimizer를 선호한다.

이번 예시에서는 Adam을 사용하며 기본 학습률(learning rate)은 0.001이다.

import torch
import torch.optim as optim

input_dim = 2
lr = 0.001

perceptron = Perceptron(input_dim = input_dim)
criterion = nn.BCELoss()
optimixer = optim.Adam(params = perceptron.parameters(), lr=lr)

6 Gradient Update Algorithm

  1. 모델(perceptron) 객체 안에 저장된 gradient와 같은 부가 정보를 zero_grad() 함수로 초기화한다.
  2. 모델이 입력 데이터에 대해 출력(y_pred)을 계산한다.
  3. 모델 출력(y_pred)과 정답값(y)을 비교하여 손실을 계산한다.
  4. 손실 객체(criterion)의 method backward()를 사용하여 backpropagation을 진행한다.
  5. Optimizer의 step() 함수로 parameter에 gradient를 업데이트하는 방법을 지시한다.
for epoch_i in range(n_epochs):
	for batch_i in range(n_batches):
    	
        x, y = get_toy_data(batch_size)
        
        perceptron.zero_grad()
        y_pred = perceptron(x, apply_sigmoid=True)
        loss = criterion(y, y_pred)
        loss.backward()
        optimizer.step()

0개의 댓글