T'SPACE

다채로운 에디터들의 이야기

컴퓨터공학/인공지능

Stochastic Gradient Descent 경사하강법

Tonny Kang 2024. 7. 31. 15:26
반응형

신경망 훈련 방법: 학습 과정 이해하기


이번 강의에서는 신경망을 훈련시키는 방법과 신경망이 어떻게 학습하는지를 알아보겠습니다.

모든 머신러닝 작업과 마찬가지로, 우리는 먼저 학습 데이터를 준비해야 합니다. 학습 데이터의 각 예시는 입력(특징)과 기대 출력(목표)으로 구성됩니다. 신경망을 훈련시킨다는 것은, 이러한 입력을 출력으로 변환할 수 있도록 네트워크의 가중치를 조정하는 것을 의미합니다.

학습 데이터를 준비하는 것 외에도, 우리는 두 가지 요소가 더 필요합니다:

  1. 손실 함수: 네트워크의 예측이 얼마나 좋은지를 측정합니다.
  2. 최적화 알고리즘: 네트워크가 가중치를 어떻게 변경해야 할지 알려줍니다.

손실 함수


손실 함수는 모델의 예측값과 목표값의 차이를 측정합니다. 문제 유형에 따라 다른 손실 함수를 사용할 수 있습니다.

회귀 문제에서 흔히 사용되는 손실 함수는 평균 절대 오차(MAE)입니다. 각 예측값 y_pred와 실제 목표값 y_true의 절대 차이를 측정합니다: abs(y_true - y_pred).

전체 데이터셋에 대한 MAE 손실은 이러한 절대 차이의 평균입니다.

평균 절대 오차는 맞춰진 곡선과 데이터 포인트 사이의 평균 거리입니다.

728x90

MAE 외에도 회귀 문제에 사용될 수 있는 다른 손실 함수로는 평균 제곱 오차(MSE)와 Huber 손실 등이 있습니다.

훈련 중, 모델은 손실 함수를 가중치 조정의 지침으로 사용합니다. 손실이 낮을수록 더 나은 모델이라고 할 수 있습니다. 즉, 손실 함수는 네트워크의 목표를 설정하는 역할을 합니다.

최적화 알고리즘 - 확률적 경사 하강법


최적화 알고리즘은 손실을 최소화하기 위해 가중치를 조정하는 알고리즘입니다.

딥러닝에서 사용되는 대부분의 최적화 알고리즘은 확률적 경사 하강법(SGD)이라는 계열에 속합니다. 이들은 반복적인 알고리즘으로, 다음과 같은 단계로 네트워크를 학습시킵니다:

  1. 일부 학습 데이터를 샘플링하여 네트워크를 통해 예측을 수행합니다.
  2. 예측값과 실제 값 사이의 손실을 측정합니다.
  3. 손실을 줄이기 위해 가중치를 조정합니다.

이 과정을 반복하여 손실이 만족할 만큼 작아지거나 더 이상 줄어들지 않을 때까지 학습을 계속합니다.

확률적 경사 하강법을 이용한 신경망 훈련 과정.

반응형

각 반복의 샘플은 미니배치라고 하며, 전체 학습 데이터를 한번 통과하는 것을 에포크라고 부릅니다. 에포크의 수는 네트워크가 각 학습 예제를 보는 횟수를 나타냅니다.

학습률과 배치 크기


배치 크기당 가중치 변화의 크기는 학습률에 의해 결정됩니다. 학습률이 작을수록 네트워크가 가중치에 도달하기 위해 더 많은 미니배치를 필요로 합니다.

학습률과 미니배치 크기는 SGD 훈련 과정에 큰 영향을 미치는 두 가지 주요 매개변수입니다. 이들의 상호작용은 종종 미묘하며, 이러한 매개변수의 올바른 선택은 항상 명확하지 않습니다.

다행히도, 대부분의 경우 만족스러운 결과를 얻기 위해 광범위한 하이퍼파라미터 검색을 할 필요는 없습니다. Adam이라는 SGD 알고리즘은 적응형 학습률을 가지고 있어, 대부분의 문제에 대해 별도의 파라미터 튜닝 없이도 적합한 결과를 제공합니다. Adam은 훌륭한 범용 최적화 알고리즘입니다.

손실 함수와 최적화 알고리즘 설정


모델을 정의한 후, compile 메서드를 사용하여 손실 함수와 최적화 알고리즘을 추가할 수 있습니다:

model.compile(
    optimizer="adam",
    loss="mae",
)

이렇게 하면 문자열을 통해 손실 함수와 최적화 알고리즘을 지정할 수 있습니다. 필요한 경우 Keras API를 통해 직접 접근하여 매개변수를 조정할 수도 있지만, 기본값으로도 충분한 경우가 많습니다.

그래디언트는 가중치를 변경해야 할 방향을 알려주는 벡터입니다. 더 정확히 말하면, 손실을 가장 빠르게 줄이는 방향으로 가중치를 변경하는 방법을 알려줍니다. 이 과정이 경사 하강법이라고 불리는 이유는 그래디언트를 사용하여 손실 곡선에서 최소값을 향해 하강하기 때문입니다. 확률적이라는 단어는 "확률에 의해 결정된다"는 의미입니다. 우리의 훈련은 미니배치가 데이터셋에서 무작위 샘플이기 때문에 확률적입니다. 그래서 이것을 SGD라고 부릅니다!

예제 - 레드 와인 품질 예측


이 데이터셋에는 약 1600개의 포르투갈 레드 와인에 대한 물리화학적 측정값과 블라인드 맛 테스트를 통한 품질 등급이 포함되어 있습니다. 이러한 측정값을 바탕으로 와인의 품질을 얼마나 잘 예측할 수 있을까요?

먼저, 모든 특징값을 [0,1] 범위로 조정합니다.

import pandas as pd
from IPython.display import display

red_wine = pd.read_csv('../input/dl-course-data/red-wine.csv')

# 학습 데이터와 검증 데이터로 나누기
df_train = red_wine.sample(frac=0.7, random_state=0)
df_valid = red_wine.drop(df_train.index)
display(df_train.head(4))

# [0, 1] 범위로 스케일 조정
max_ = df_train.max(axis=0)
min_ = df_train.min(axis=0)
df_train = (df_train - min_) / (max_ - min_)
df_valid = (df_valid - min_) / (max_ - min_)

# 특징과 목표로 분리
X_train = df_train.drop('quality', axis=1)
X_valid = df_valid.drop('quality', axis=1)
y_train = df_train['quality']
y_valid = df_valid['quality']

특징 컬럼이 11개이므로 입력도 11개입니다.

3개의 층과 1500개 이상의 뉴런으로 구성된 네트워크를 선택했습니다. 이 네트워크는 데이터의 복잡한 관계를 학습할 수 있습니다.

from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([
    layers.Dense(512, activation='relu', input_shape=[11]),
    layers.Dense(512, activation='relu'),
    layers.Dense(512, activation='relu'),
    layers.Dense(1),
])

모델의 아키텍처를 결정하는 것은 과정의 일부분입니다. 단순하게 시작하고 검증 손실을 지표로 사용하십시오. 모델 개발에 대해 더 자세히 배우게 될 것입니다.

모델을 정의한 후, 최적화 알고리즘과 손실 함수를 컴파일합니다.

model.compile(
    optimizer="adam",
    loss="mae",
)

이제 훈련을 시작할 준비가 되었습니다! Keras에게 256개의 학습 데이터를 한 번에 전달하고(batch_size), 데이터셋 전체를 10번(epochs) 반복하도록 지시했습니다.

history = model.fit(
    X_train, y_train,
    validation_data=(X_valid, y_valid),
    batch_size=256,
    epochs=10,
)

Keras는 모델이 훈련되는 동안 손실 정보를 지속적으로 업데이트해 줍니다.

손실을 시각화하는 더 좋은 방법은 이를 그래프로

반응형