사전 하이퍼파라미터
개념

하이퍼파라미터

gabury1고친 사람 github-actions[bot]

하이퍼파라미터는 머신러닝 모델을 학습시키기 전에 사람이 정해 두는 값입니다. 모델을 얼마나 크게 지을지와 데이터를 몇 바퀴 볼지 같은 것이 여기에 듭니다. 학습이 도는 동안에는 이 값이 바뀌지 않습니다. 같은 데이터로 배워도 이 값에 따라 모델의 점수가 크게 달라집니다.

쉽고 빠른 이해

무슨 일을 하는 물건인가 — 학습을 시작하기 전에 맞춰 두는 다이얼입니다. 「모델을 얼마나 크게 지을까」, 「한 번에 얼마나 크게 고칠까」, 「데이터를 몇 바퀴 볼까」가 이런 다이얼입니다.

왜 이렇게 하나 — 학습은 정해진 모양 안에서 숫자를 맞추는 일만 합니다. 모델의 크기나 학습 바퀴 수까지 학습 데이터 점수로 정하면 늘 크게 짓고 오래 돌린 쪽이 이깁니다. 그러면 데이터를 외우기만 하는 모델이 나옵니다. 그래서 이 값은 따로 떼어 고릅니다.

어떻게 도나

  1. 다이얼 값의 후보를 몇 개 정합니다
  2. 후보마다 모델을 처음부터 학습시킵니다
  3. 학습에 쓰지 않은 데이터로 점수를 견줘 하나를 고릅니다

대가 — 후보 하나마다 학습을 한 번 더 돌려야 합니다. 다이얼이 많아지면 견줄 조합이 곱으로 불어납니다. 그만큼 시간과 계산 비용이 크게 듭니다.

상세

빵을 굽기 전에 오븐 온도와 굽는 시간을 맞춥니다. 반죽이 부풀고 겉이 익는 일은 오븐 안에서 저절로 일어납니다. 사람이 손대는 것은 문을 닫기 전에 돌려 둔 두 다이얼뿐입니다. 빵이 잘 구워졌는지는 다 굽고 꺼낸 뒤에야 압니다.

머신러닝에서 데이터를 보고 판정 기준을 배운 프로그램을 모델이라고 합니다. 모델은 두 가지로 이루어집니다. 계산을 어떤 식으로 엮을지 정한 모양과, 그 식에 들어가는 숫자들입니다. 스팸 메일 거르기라면 「이 낱말이 있으면 스팸 쪽으로 얼마나 기울까」를 정하는 숫자들이 그런 숫자입니다.

식에 들어가는 숫자들을 파라미터라고 부릅니다. 파라미터는 처음에 아무 값으로 시작합니다. 학습은 데이터를 보며 이 숫자들을 조금씩 고쳐 맞추는 과정입니다.

신경망은 작은 계산을 여러 겹으로 쌓아 올린 모델입니다. 신경망에서는 입력마다 곱하는 가중치가 대표적인 파라미터입니다.

하이퍼파라미터는 학습이 시작되기 전에 사람이 정해 두는 값입니다. 모델의 모양과 학습이 도는 방식이 이 값으로 정해집니다. 모양 안에 들어갈 숫자는 학습이 찾습니다. 그 바깥의 것은 사람이 정합니다.

모양을 정하는 값의 예는 신경망을 몇 겹으로 쌓을지입니다. 학습이 도는 방식을 정하는 값의 예는 숫자를 한 번에 얼마나 크게 고칠지와 데이터를 몇 바퀴 볼지입니다. 어느 쪽이든 학습이 도는 동안에는 바뀌지 않습니다.

앞의 오븐으로 돌아가면, 문을 닫기 전에 돌려 두는 다이얼이 하이퍼파라미터입니다. 오븐 안에서 반죽이 저절로 부푸는 일이 학습입니다. 꺼낸 뒤에야 아는 결과는 학습에 안 쓴 데이터로 잰 점수입니다.

이름의 「하이퍼」는 「위에」라는 뜻을 더하는 접두어입니다. 파라미터 위에서 파라미터가 어떻게 정해질지를 다스리는 값이라 이렇게 부릅니다. 우리말로는 초매개변수라고도 옮깁니다.

파라미터와 가르는 기준

파라미터와 하이퍼파라미터는 질문 하나로 가를 수 있습니다. 「학습이 데이터를 보고 이 값을 고치나」입니다. 고치면 파라미터입니다. 안 고치면 하이퍼파라미터입니다.

파라미터 하이퍼파라미터
누가 정하나 학습이 데이터를 보고 찾는다 사람이 고른다
언제 정하나 학습하는 동안 계속 바뀐다 학습 전에 정하고 고정한다
개수 큰 모델이면 수백만 개를 넘는다 대개 몇 개에서 몇십 개
예 가중치 학습을 몇 바퀴 돌릴지

표의 개수 줄을 보면 둘을 왜 다르게 다루는지 알 수 있습니다. 수백만 개를 사람이 하나씩 고를 수는 없으니 학습에 맡깁니다. 그 학습을 어떻게 돌릴지를 정하는 몇 개만 사람 손에 남습니다.

코드로 보는 차이

숫자 하나를 맞추는 가장 작은 학습을 코드로 적어 봅니다. 어느 줄이 파라미터이고 어느 줄이 하이퍼파라미터인지 가린 뒤, 하이퍼파라미터 하나를 바꿔 결과가 어떻게 달라지는지 봅니다.

모델은 입력 x 에 w 를 곱해 답을 냅니다. 데이터는 한 건뿐입니다. 입력이 1 이면 정답은 2 입니다. 그러니 w 가 2 가 되면 정답을 맞힙니다.

모델의 답이 정답에서 벗어난 정도를 손실이라고 합니다. 이 예에서 손실은 (w - 2)² 입니다. 손실이 0 이면 정답을 맞힌 것입니다. 손실은 점수와 거꾸로 낮을수록 잘 맞힌 것입니다.

손실을 줄이려면 w 를 어느 쪽으로 옮겨야 하는지 알아야 합니다. 그 방향과 가파른 정도를 알려 주는 값이 기울기입니다. 아래 grad 함수가 이 기울기를 돌려줍니다.

기울기의 반대쪽으로 w 를 조금씩 옮기면 손실이 줄어듭니다. 이 방법을 경사 하강법이라고 합니다.

Python
def grad(w):
    return 2 * (w - 2)

lr = 0.1      # 하이퍼파라미터
epochs = 3    # 하이퍼파라미터
w = 0.0       # 파라미터

for _ in range(epochs):
    w -= lr * grad(w)  # 0.4, 0.72, 0.976

lr 은 학습률입니다. 한 번에 w 를 얼마나 크게 옮길지 정합니다. epochs 는 데이터를 몇 바퀴 볼지 정합니다. 이 한 바퀴를 에포크라고 부릅니다.

두 값은 반복문이 돌기 전에 정해집니다. 반복문 안에서는 안 바뀝니다. 반복문 안에서 바뀌는 것은 w 하나뿐입니다. 이것이 파라미터입니다. 세 바퀴를 도는 동안 w 는 정답 2 에 다가갔습니다.

이제 다른 줄은 손대지 않고 lr 만 바꿔 봅니다. 아래 표는 세 바퀴를 돈 뒤의 w 입니다.

lr 세 바퀴 뒤 w 어떻게 됐나
0.01 약 0.12 너무 조금씩 옮겨 정답 근처에도 못 갔다
0.1 0.976 정답 쪽으로 다가가는 중이다
0.5 2.0 첫 바퀴에 정답에 닿았다
1.1 약 5.46 정답을 건너뛰며 점점 멀어진다

바꾼 것은 숫자 하나뿐입니다. 결과는 네 갈래로 갈렸습니다. 학습률이 너무 작으면 학습이 정답에 닿기 전에 끝납니다. 너무 크면 정답을 건너뛰어 오히려 멀어집니다.

0.5 가 한 번에 닿은 것은 이 장난감 문제의 손실 모양 덕분입니다. 다른 문제에서는 알맞은 값이 또 다릅니다. 그래서 하이퍼파라미터는 문제마다 새로 골라야 합니다.

흔히 만나는 하이퍼파라미터

앞의 학습률과 에포크 수 말고도 모델마다 고를 값이 따로 있습니다. 아래 표는 실무에서 자주 듣는 하이퍼파라미터를 모은 것입니다.

표에 나오는 레이어는 신경망을 이루는 한 겹입니다. 한 겹마다 작은 계산 단위인 뉴런이 여럿 들어 있습니다.

이름 무엇을 정하나 쓰는 모델
학습률 파라미터를 한 번에 얼마나 크게 고칠지 경사 하강법으로 배우는 모델
에포크 수 학습 데이터를 몇 바퀴 볼지 경사 하강법으로 배우는 모델
배치 크기 파라미터를 한 번 고칠 때 데이터를 몇 건 볼지 경사 하강법으로 배우는 모델
레이어 수 · 뉴런 수 신경망을 얼마나 깊고 넓게 지을지 신경망
최대 깊이 질문을 몇 단계까지 이어 갈지 결정 트리
k 가장 가까운 데이터를 몇 개 볼지 [[최근접 이웃
규제 강도 파라미터가 커지는 것을 얼마나 억누를지. 커질수록 학습 데이터를 외우기 쉽다 여러 모델

표의 값들은 앞에서 말한 두 무리로 나뉩니다. 레이어 수와 최대 깊이처럼 모델의 모양을 정하는 값이 한 무리입니다. 학습률과 에포크 수와 배치 크기처럼 학습 과정을 정하는 값이 다른 무리입니다.

모양을 정하는 값은 학습이 끝난 뒤에도 모델에 남습니다. 레이어가 셋인 신경망은 다 배운 뒤에도 레이어가 셋입니다. 학습 과정을 정하는 값은 다 쓰고 나면 모델 안에 흔적이 없습니다. 그 모델을 다시 만들 때 필요한 조리법으로만 남습니다.

학습이 스스로 정하지 못하는 까닭

파라미터는 학습에 맡기면서 이 값들만 사람 손에 남는 까닭은 셋입니다.

첫째, 학습 데이터 점수로 고르면 언제나 같은 쪽이 이깁니다. 모델을 크게 지을수록, 오래 학습할수록 학습 데이터에서는 점수가 오릅니다. 그렇게 얻은 모델은 학습 데이터를 외웠을 뿐이라 새 데이터에서는 자주 틀립니다. 이 상태를 과적합이라고 합니다.

둘째, 학습 과정을 정하는 값은 학습보다 먼저 있어야 합니다. 학습률이 정해져야 w 를 처음 한 번 고칠 수 있습니다. 학습이 학습률까지 고르려면 그 고르는 일에도 또 다른 학습률이 필요해집니다.

셋째, 정수나 선택지인 값은 조금씩 고칠 수가 없습니다. 경사 하강법은 값을 조금씩 옮기며 손실을 줄입니다. 레이어 수는 3 다음이 4 이고 그 사이 값이 없습니다. 그래서 이런 값은 후보를 정해 놓고 하나씩 시험해 보는 수밖에 없습니다.

값을 고르는 과정

하이퍼파라미터를 고를 때는 데이터를 나눠 씁니다. 고르는 데 쓰는 데이터를 학습 데이터와 떼어 두는 것이 핵심입니다.

정답이 달린 데이터는 대개 세 몫으로 나눕니다. 훈련 세트는 파라미터를 학습하는 몫입니다. 앞에서 학습 데이터라 부른 것이 이것입니다.

검증 세트로는 하이퍼파라미터 후보들의 점수를 잽니다. 테스트 세트는 다 고른 뒤 마지막에 한 번만 써서 모델의 점수를 잽니다.

flowchart TD
    A["후보 값을 정한다"] --> B["훈련 세트로 학습한다"]
    B --> C["검증 세트로 점수를 잰다"]
    C -->|"후보가 남았다"| A
    C -->|"후보를 다 봤다"| D["점수가 가장 높은 값을 고른다"]
    D --> E["테스트 세트로 한 번 잰다"]

그림의 고리는 후보 하나마다 한 바퀴씩 돕니다. 바퀴마다 모델을 처음부터 다시 학습시킵니다. 테스트 세트는 고리 밖에 있어서 고르기가 다 끝난 뒤에 한 번만 지나갑니다.

검증 세트를 따로 두는 까닭은 앞 소절의 첫째 이유와 같습니다. 학습에 안 쓴 데이터로 재야 외우기만 한 모델이 뽑히지 않습니다.

데이터가 적어 검증 세트를 넉넉히 떼기 어려우면 교차 검증을 씁니다. 데이터를 여러 조각으로 나눠 조각마다 돌아가며 검증에 쓰는 방법입니다.

이렇게 후보를 바꿔 가며 가장 나은 값을 찾는 일을 하이퍼파라미터 튜닝이라고 부릅니다.

후보를 뽑는 방법

후보 값을 뽑는 방법은 크게 셋입니다. 셋은 「학습을 몇 번 돌리나」에서 갈립니다.

방법 후보를 뽑는 법 학습 횟수
그리드 탐색 값마다 후보를 몇 개 정하고 모든 조합을 다 시험한다 후보 수를 곱한 만큼
랜덤 탐색 값마다 범위를 정하고 그 안에서 무작위로 뽑는다 미리 정한 횟수만큼
베이즈 최적화 앞서 시험한 결과를 보고 점수가 좋을 법한 곳을 다음 후보로 고른다 미리 정한 횟수만큼

그리드 탐색은 하이퍼파라미터가 늘수록 학습 횟수가 곱으로 불어납니다. 학습률 후보 셋과 배치 크기 후보 셋이면 아홉 번입니다. 하이퍼파라미터 넷에 후보가 다섯씩이면 육백스물다섯 번이 됩니다.

랜덤 탐색과 베이즈 최적화는 이 곱셈을 피합니다. 학습 횟수를 먼저 정해 둡니다. 후보는 그 횟수 안에서 뽑습니다.

학습률처럼 알맞은 값의 크기조차 짐작하기 어려운 값은 열 배 간격으로 후보를 둡니다. 0.1, 0.01, 0.001 처럼 잡는 식입니다. 0.1 과 0.2 가운데 어느 쪽인지보다 0.1 언저리인지 0.001 언저리인지가 먼저 궁금하기 때문입니다.

백엔드 개발자가 만나는 모습

모델을 직접 만들지 않는 개발자도 하이퍼파라미터를 마주칩니다. 학습 코드를 배포하거나 모델 파일을 받아 서비스에 붙일 때입니다.

학습 코드는 대개 하이퍼파라미터를 코드 밖 설정으로 받습니다. 실행 인자에 --lr 0.001 --epochs 10 처럼 학습률과 에포크 수를 적거나, 같은 값을 설정 파일에 적는 식입니다. 애플리케이션 서버가 접속 주소나 스레드 수를 설정 파일에서 읽는 것과 모양이 같습니다.

학습이 끝나면 모델 파일에는 파라미터가 담깁니다. 학습률처럼 학습 과정을 정한 값은 모델을 쓰는 데 필요 없어서 파일에서 빠지기 쉽습니다. 그 값을 따로 적어 두지 않으면 같은 모델을 다시 만들 수 없습니다.

모델을 띄워 두고 요청마다 답하게 하는 일을 모델 서빙이라고 합니다. 서빙하는 쪽에서는 하이퍼파라미터를 바꿀 일이 없습니다. 하이퍼파라미터를 바꾸려면 학습부터 다시 돌려 새 모델 파일을 받아야 합니다.

이름이 겹치는 두 낱말

「파라미터」는 다른 뜻으로도 쓰입니다. 백엔드 개발자가 먼저 떠올리는 프로그래밍의 뜻과 통계의 뜻입니다.

프로그래밍에서 파라미터는 함수가 받는 입력을 말합니다. 우리말로는 매개변수라고 부릅니다. 학습 코드에서 학습률을 함수 인자로 넘기면, 그 값은 프로그래밍 뜻으로는 매개변수입니다. 머신러닝 뜻으로는 하이퍼파라미터입니다.

통계에서는 확률 분포를 정하는 숫자를 모수라고 부릅니다. 동전을 던져 앞면이 나올 확률이 그런 숫자입니다. 영어로는 이것도 parameter 입니다.

베이즈 통계는 데이터를 보기 전의 믿음을 확률 분포로 적어 둡니다. 이 분포를 사전 분포라고 합니다. 동전이라면 「앞면 확률은 0.5 언저리일 것이다」라는 믿음이 사전 분포가 됩니다.

베이즈 통계에서는 사전 분포를 정하는 숫자를 하이퍼파라미터라고 부릅니다. 모수를 정하는 분포를 한 층 위에서 다시 정하는 숫자라서 「위에」가 붙었습니다. 머신러닝의 뜻과 갈래는 다르지만 「파라미터를 정하는 쪽에 선 값」이라는 뼈대는 같습니다.

관련 항목

학습이 하이퍼파라미터 아래에서 찾는 값

파라미터 · 가중치 · 편향 · 모델

하이퍼파라미터의 대표 종류

학습률 · 에포크 · 배치 크기 · 미니배치 · 학습률 스케줄 · 모멘텀 · 드롭아웃 · 규제 · 은닉 레이어 · 조기 종료

하이퍼파라미터를 고르는 방법

하이퍼파라미터 튜닝 · 그리드 탐색 · 랜덤 탐색 · 베이즈 최적화 · 교차 검증 · 모델 선택 · 자동 머신러닝

하이퍼파라미터를 고를 때 나누는 데이터 세트

훈련 세트 · 검증 세트 · 테스트 세트 · 데이터 누수

하이퍼파라미터를 잘못 골라 생기는 문제

과적합 · 과소적합 · 발산 · 편향과 분산

하이퍼파라미터가 움직이는 학습 절차

훈련 · 경사 하강법 · 손실 함수 · 기울기 · 역전파

하이퍼파라미터를 갖는 모델

신경망 · 결정 트리 · 최근접 이웃 · 서포트 벡터 머신 · 랜덤 포레스트 · 그레이디언트 부스팅

하이퍼파라미터와 이름이 겹치는 용어

매개변수 · 모수 · 사전 분포 · 베이즈 통계

하이퍼파라미터를 기록해 모델을 다시 만드는 운영 작업

설정 파일 · 실험 추적 · 재현성 · 모델 서빙 · 모델 레지스트리

하이퍼파라미터가 속하는 상위 분야

머신러닝 · 지도학습 · 딥러닝 · 최적화

다른 이름: hyperparameter · 하이퍼 파라미터 · 초매개변수