본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Parameter Optimization; 매개변수 최적화
손실함수를 최소로 만드는 모형의 매개변수 값을 찾는 과정. 넓게는 학습 전에 정하는 하이퍼파라미터를 고르는 과정까지 포함한다

매개변수와 하이퍼파라미터

편집 원본 편집
구분 매개변수(Parameter) 하이퍼파라미터(Hyperparameter)
정하는 주체 데이터로부터 학습으로 추정 분석가가 학습 전에 지정
예 신경망 가중치·편향, 회귀계수, 서포트 벡터 학습률, 배치 크기, 에포크 수, 은닉층·노드 수, 트리 최대 깊이, K-NN의 k, SVM의 C, 정규화 강도
찾는 방법 경사 하강법 계열 옵티마이저, 최소제곱법 등 그리드 서치, 랜덤 서치, 베이지안 최적화

매개변수 최적화 기법

편집 원본 편집

매개변수 W, 손실함수 L, 학습률 η일 때 기본 갱신식은 W←W−η∂L∂W이다.

기법 핵심 아이디어 특징
경사 하강법(GD) 전체 데이터의 기울기 반대 방향으로 이동 한 번 갱신에 전체 데이터를 써서 느리고, 지역 최솟값·안장점에 머무를 수 있다
확률적 경사 하강법(SGD) 무작위로 고른 표본 하나(또는 미니배치)의 기울기로 갱신 빠르지만 경로가 지그재그로 흔들린다. 기울기가 방향마다 크게 다르면 비효율적이다
모멘텀(Momentum) v←αv−η∂L∂W,W←W+v 이전 이동 방향을 관성처럼 유지해 진동을 줄이고 수렴을 빠르게 한다
AdaGrad h←h+(∂L∂W)2,W←W−ηh+ϵ∂L∂W 많이 갱신된 매개변수의 학습률을 줄이는 적응적 학습률. 학습이 길어지면 학습률이 0에 가까워져 갱신이 멈출 수 있다
RMSProp h←ρh+(1−ρ)(∂L∂W)2 과거 기울기를 지수이동평균으로 잊어 가며 반영해 AdaGrad의 학습률 소멸 문제를 완화한다
Adam 1차 모멘트(기울기 평균, 모멘텀)와 2차 모멘트(기울기 제곱 평균, RMSProp)를 함께 쓰고 편향 보정 기본값 η=0.001,β1=0.9,β2=0.999,ϵ=10−8. 딥러닝에서 가장 널리 쓰는 기본 선택이다

ϵ은 0으로 나누는 것을 막는 작은 값이다.

학습률과 배치 크기

편집 원본 편집
  • 학습률 : 너무 크면 최솟값을 지나쳐 진동하거나 발산하고, 너무 작으면 수렴이 느리고 나쁜 지역 최솟값에 갇히기 쉽다. 학습 중 점차 줄이는 학습률 스케줄링을 쓰기도 한다
  • 배치 크기 : 한 번 갱신에 쓰는 데이터 수다. 크면 기울기 추정이 안정되고 병렬 계산이 유리하지만 메모리가 많이 들고 에포크당 갱신 횟수가 줄어든다. 작으면 기울기 잡음이 커진다
  • 1 에포크당 반복(iteration) 수 = 학습 데이터 수 ÷ 배치 크기. 데이터 10,000개, 배치 크기 100이면 100번이다

하이퍼파라미터 탐색

편집 원본 편집
방법 방식 장단점
그리드 서치(Grid Search) 후보 값의 모든 조합을 시험 빠짐없지만 조합 수가 곱으로 늘어 계산량이 크다
랜덤 서치(Random Search) 탐색 범위에서 조합을 무작위로 정해진 횟수만큼 추출 같은 계산량으로 중요한 하이퍼파라미터의 값을 더 다양하게 시험해 대개 더 효율적이다
베이지안 최적화 지금까지의 결과로 대리 모형(가우시안 프로세스 등)을 만들고, 획득 함수로 다음 시험 지점을 고름 적은 시도로 좋은 값을 찾는다. 순차적이라 병렬화가 어렵다

평가는 보통 K-fold 교차검증으로 하며, 최종 성능은 탐색에 쓰지 않은 테스트 데이터로 확인한다.

scikit-learn GridSearchCV 예제

편집 원본 편집
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.ensemble import RandomForestClassifier

X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, stratify=y, random_state=42)

param_grid = {
    "n_estimators": [100, 300],
    "max_depth": [None, 5, 10],
    "min_samples_leaf": [1, 3],
}   # 2 x 3 x 2 = 12개 조합, 5-fold면 60번 학습
gs = GridSearchCV(RandomForestClassifier(random_state=42),
                  param_grid, cv=5, scoring="roc_auc", n_jobs=-1)
gs.fit(X_train, y_train)

print(gs.best_params_, gs.best_score_)
print(gs.best_estimator_.score(X_test, y_test))

랜덤 서치는 RandomizedSearchCV에 분포와 n_iter를 주어 같은 방식으로 쓴다.

  • 매개변수와 하이퍼파라미터 구분(학습률·배치 크기·k·트리 깊이는 하이퍼파라미터)
  • 옵티마이저 특징 짝짓기(모멘텀 = 관성, AdaGrad = 학습률 감소, RMSProp = 지수이동평균, Adam = 모멘텀 + RMSProp)
  • 그리드 서치·랜덤 서치·베이지안 최적화의 차이, 실기에서 GridSearchCV 사용과 best_params_ 확인