관리 메뉴

개발자의 스터디 노트

지도학습 훈련 순서 본문

파이썬/파이토치 자연어처리

지도학습 훈련 순서

박개발씨 2022. 2. 12. 00:11

지도 학습 훈련 순서는 데이터 생성 > 모델 선택 > 손실 함수 선택 > 최적화 알고리즘 설정 > 학습 실행의 순서를 가집니다.

 

1. 학습 데이터 생성

 - 선형적으로 구분할 수 있는 예제 데이터 만들기, 이 분류 작업은 데이터 포인트가 지정된 클래스 중 어디에 속하는지 구별하는 작업입니다.

 

2. 모델 선택

 - 학습 모델은 퍼셉트론을 사용합니다. 퍼셉트론은 어떤 크기의 입력도 다룰 수 있습니다. 일반적인 모델 구축 과정에서 입력 크기는 문제와 데이터에 따라 결정됩니다. 2차원 평면에 들어갈 데이터를 만들면 입력 크기는 2입니다. 클래스가 2 개 있는 문제를 위해 클래스에 인덱스 0과 1을 할당합니다. 출력이 0과 1이기 때문에 퍼셉트론의 활성화 함수는 시그모이드입니다. 퍼셉트론의 출력은 데이터 포인트(x)가 클래스 1일 확률, 즉P(y=1|x)입니다.

 

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

 - 이분 분류 문제에서 결정 경계를 적용해 출력 확률을 두개의 클래스로 바꾸어야 합니다. 예측 클래스는 1 혹은 0입니다. 일반적으로 결정 경계는 0.5로 지정합니다. 하지만 실정에서 만족스러운 분류 정밀도를 얻으려면 이 하이퍼파라미터를 튜닝해야 할 수 있습니다.

 

4. 손실 함수 선택

 - 지도 학습에는 데이터를 준비하고 모델 구조를 고른 뒤 선택할 중요한 요소가 2개 더 있습니다. 손실 함수와 옵티마이저 입니다. 모델의 출력이 확률이라면 가장 적절한 손실 함수는 크로스 엔트로피 기반의 손실 함수입니다. 0과 1의 이진 출력 모델은 이진 크로스 엔트로피 손실 함수를 사용합니다.

 

5. 옵티마이저 선택

 - 모델이 예측을 만들고 손실 함수가 예측과 타깃 사이의 오차를 측정하면 옵티마이저가 이 오차 신호를 사용해 모델의 가중치를 업데이트 합니다. 가장 간단한 구조에서는 하이퍼파라미터 하나로 옵티마이저의 업데이트 동작을 제어합니다. 학습률(learning rate)이라고 부르는 이 하이퍼파라미터는 오차 신호가 가중치 업데이트에 영향을 얼마나 미치는지 조절합니다. 학습률이 크면 가중치가 크게 바뀌고 수렴에 영향을 미칠 수 있고, 학습률이 너무 작으면 훈련 진행 속도가 심하게 느려질 수 있습니다.

- 파이토치 라이브러리는 여러 종류의 옵티마이저를 제공합니다. 확률적 경사 하강법(SGD)은 고전적인 알고리즘입니다. 하지만 어려운 최적화 문제에서는 SGD에 수렴 문제가 있어 종종 나쁜 모델을 만듭니다. 현재 선호하는 옵티마이저는 Adagrad나 Adam 같은 적응형 옵티마이저입니다. Adam의 기본 학습률은 0.001입니다. 논문에서 권장하는 사항이 따로 있는 게 아니라면 학습률 같은 하이퍼파라미터는 항상 기본값을 먼저 사용하는 편이 좋습니다.

# Adam 옵티마이저 준비
import torch.nn as nn
import torch.optim as optim

input_dim = 2
lr = 0.001

perceptron = Perceptron(input_dim=input_dim)
bce_loss = nn.BCELoss()
optimizer = optim.Adam(params=perceptron.parameters(), lr=lr)

6. 학습 실행 : 그레이디언트 기반의 지도 학습

 - 학습은 손실 계산에서 시작합니다. 즉 모델의 예측이 타깃에서 얼마나 멀리 떨어져 있는지 측정합니다. 결국 손실의 그레이디언트는 모델 파라미터를 얼마나 많이 바꿔야 하는지를 나타내는 신호가 됩니다. 각 파라미터의 그레이디언트는 이 파라미터에 대한 손실값의 순간 변화율을 의미합니다. 이는 각 파라미터가 손실 함수에 얼마나 많이 기여하는지를 알 수 있다는 의미입니다. 이 변화율은 기울기입니다. 가장 간단한 형태에서 그레이디언트 기반의 모델 훈련에는 각 파라미터에 대한 손실의 그레이디언트로 해당 파라미터를 반복해서 업데이트하는 작업이 필요합니다.

# 퍼셉트론과 이진 분류를 위한 지도 학습 훈련 반복

# 각 에포크는 전체 훈련 데이터를 사용합니다.
for epoch_i in range(n_epochs):
	# 내부 반복은 데이터셋에 있는 배치에 대해 수행됩니다.
    for batch_i in range(n_batches):
    
    	# 0단계 : 데이터 가져오기
        x_data, y_target = get_toy_data(batch_size)
        
        # 1단계 : 그레이디언트 초기화
        perceptron.zero_grad()
        
        # 2단계 : 모델의 정방향 계산 수행하기
        y_pred = perceptron(x_data, apply_sigmoid=True)
        
        # 3단계 : 최적하련느 손실 계산하기
        loss = gce_loss(y_pred, y_target)
        
        # 4단계 : 손실 신호를 거꾸로 전파하기
        loss.backward()
        
        # 5단계 : 옵티마이저로 업데이트하기
        optimizer.step()

위 코드는 대략적인 그레디언트 업데이트 알고리즘을 설명한 코드 입니다.

 - 전체 훈련 데이터셋은 배치(batch)로 분할됩니다. 그레이디언트 각 단계는 배치 하나에서 수행됩니다. 하이퍼파라미터 batch_size는 배치 크기를 지정합니다. 훈련 데이터셋은 고정되어 있으므로 배치 키기를 늘리면 배치 개수는 줄어듭니다.

 - 고정된 크기의 데이터셋에서 만든 여러 배치를 반복한 후 훈련 반복은 하나의 에포크(epoch)를 완료합니다. 에포크는 완전한 훈련 반복 한 번을 의미합니다. 에포크 당 배치 개수가 데이터셋의 배치 개수와 같다면 에포크가 데이터셋에 대한 완전한 반복 한 번이 됩니다. 모델은 여러 에포크 동안 훈련됩니다. 훈련할 에포크 횟수는 고르기 쉽지 않지만 멈출 시기를 결정하는 방법은 따로 있습니다.