사전 훈련
개념

훈련

gabury1고친 사람 github-actions[bot]

훈련은 예시 데이터를 보여 주며 모델(입력을 받아 답을 내는 계산식)이 맞는 답을 내도록 길들이는 일입니다. 모델이 답을 내면 틀린 만큼 모델 안의 숫자를 고칩니다. 이 일을 수없이 되풀이하면 처음 보는 입력에도 답을 내는 모델이 남습니다. 머신러닝에서는 같은 일을 학습이라고도 부릅니다.

쉽고 빠른 이해

무슨 일을 하는 물건인가 — 데이터를 보여 주며 모델이 답을 맞히게 만드는 일입니다. 「스팸」·「정상」 표시가 붙은 옛 메일 수만 통을 보여 주면 스팸을 가려내는 모델이 나옵니다.

왜 이렇게 하나 — 스팸을 가려내는 규칙을 사람이 다 적기는 어렵습니다. 규칙 대신 예시를 주고 기준은 프로그램이 찾게 합니다. 반대로 규칙을 몇 줄로 적을 수 있으면 굳이 훈련하지 않습니다. 정답이 붙은 예시를 모을 수 없을 때도 이 방식은 쓰기 어렵습니다.

어떻게 도나

  1. 모델이 예시에 답을 냅니다
  2. 그 답이 정답과 얼마나 다른지 잽니다
  3. 차이가 줄도록 모델 안의 숫자를 조금 고칩니다
  4. 이것을 데이터 전체에 여러 번 되풀이합니다

대가 — 데이터와 계산이 많이 듭니다. 큰 모델은 비싼 장비로 며칠씩 돌기도 합니다. 예시를 너무 오래 보면 답을 외워서 처음 보는 입력에는 오히려 틀립니다.

상세

먼저 훈련이 무엇을 찾는 일인지 봅니다. 그다음 훈련 한 바퀴가 어떤 동작으로 이루어지는지 그림으로 봅니다. 이어서 작은 코드로 그 한 바퀴를 손으로 돌려 봅니다.

뒤에서는 데이터 전체를 여러 번 보는 방법, 모델 종류마다 달라지는 훈련, 훈련을 언제 멈추는지를 차례로 봅니다. 끝에서는 훈련이 서비스와 어떻게 이어지는지 봅니다. 마지막으로 운영에서 말하는 다른 뜻의 훈련을 짚습니다.

활쏘기 연습

궁수는 화살을 한 발 쏘고 과녁을 봅니다. 화살이 왼쪽으로 빗나갔으면 다음에는 겨냥을 오른쪽으로 조금 옮깁니다. 쏘고, 보고, 고치기를 수백 번 하면 화살이 가운데로 모입니다.

머신러닝의 훈련도 이 순서를 따릅니다. 답을 내 보고, 얼마나 빗나갔는지 재고, 조금 고칩니다.

훈련이 찾는 값

훈련이 고치는 숫자가 무엇인지 스팸 필터로 봅니다.

머신러닝은 판정 규칙을 사람이 코드로 적는 대신 예시에서 뽑아내는 방식입니다. 스팸 필터라면 사람이 금지어 목록을 적지 않습니다. 「스팸」·「정상」 표시가 붙은 옛 메일 수만 통을 건넵니다.

뽑아낸 규칙을 담는 물건이 모델입니다. 모델은 입력을 받아 답을 내는 계산식입니다. 식 안에는 곱하고 더할 숫자가 많이 들어 있습니다.

식 안의 이 숫자들이 파라미터입니다. 식의 모양이 같아도 파라미터가 다르면 다른 답을 냅니다. 갓 만든 모델은 파라미터가 아무 값이라 엉뚱한 답을 냅니다.

훈련은 쓸 만한 답을 내는 파라미터 값을 찾는 과정입니다. 훈련이 끝나면 파라미터를 더는 고치지 않고 고정합니다. 그 값을 담은 모델은 파일로 저장해 둡니다.

훈련에 들어가는 데이터

훈련에 쓰는 예시 모음이 훈련 데이터입니다. 표로 그리면 한 줄이 예시 하나입니다. 스팸 필터라면 메일 한 통이 한 줄입니다.

한 줄에는 모델이 보고 판단할 값이 여럿 들어 있습니다. 이 값들이 특성입니다. 메일의 길이나 메일에 든 링크 개수가 특성입니다.

같은 줄에는 모델이 맞혀야 할 답도 붙어 있습니다. 이 답이 레이블입니다. 「스팸」·「정상」 표시가 레이블입니다.

이렇게 레이블이 붙은 데이터로 하는 훈련을 지도학습이라고 부릅니다. 레이블 없이 데이터의 짜임만 찾는 비지도학습도 있습니다. 이 항목은 가장 흔한 지도학습을 기준으로 설명합니다.

한 바퀴의 짜임

훈련은 예측하기, 손실 재기, 파라미터 고치기 세 동작을 되풀이합니다. 셋을 하나씩 짚은 뒤 마지막에 고리 하나로 그립니다.

먼저 모델이 지금의 파라미터로 예시에 답을 냅니다. 모델이 내놓는 이 답을 예측이라고 부릅니다.

다음으로 예측이 레이블과 얼마나 다른지를 숫자 하나로 잽니다. 이 숫자를 손실이라고 부릅니다. 손실이 작을수록 모델이 잘 맞힌 것입니다.

손실을 계산하는 식은 손실 함수입니다. 뒤의 손 예제에서는 차이를 제곱해 평균 내는 식을 씁니다.

그다음 손실이 줄어드는 쪽으로 파라미터를 조금 고칩니다. 어느 쪽이 줄어드는 쪽인지는 기울기가 알려 줍니다. 기울기는 파라미터를 조금 키울 때 손실이 얼마나, 어느 방향으로 변하는지를 나타내는 값입니다.

기울기의 반대 방향으로 파라미터를 조금씩 옮기는 방법을 경사 하강법이라고 부릅니다. 손실을 언덕에 비기면 내리막을 따라 한 발씩 내려가는 셈입니다. 많은 모델이 이 방법으로 훈련합니다.

세 동작을 한 번 마치면 훈련 데이터에서 다음 예시 묶음을 꺼내 다시 돕니다. 훈련 데이터를 한 번 다 보면 손실이 충분히 줄었는지 확인합니다. 이 고리를 그리면 이렇습니다.

flowchart TD
    A["훈련 데이터에서 예시 묶음을 꺼낸다"] --> B["모델이 예측을 낸다"]
    B --> C["예측과 레이블을 견줘 손실을 잰다"]
    C --> D["손실이 줄도록 파라미터를 고친다"]
    D --> E{"훈련 데이터를 한 번 다 봤나"}
    E -->|아직| A
    E -->|다 봤다| G{"손실이 충분히 줄었나"}
    G -->|아직| A
    G -->|충분하다| F["파라미터를 고정해 저장한다"]

그림에서 예시 묶음을 꺼내 파라미터를 고치기까지가 한 바퀴입니다. 훈련 시간 대부분은 이 고리를 도는 데 듭니다. 데이터를 한 번 다 보는 단위는 「데이터 전체를 여러 번 보는 법」에서 봅니다. 「충분히 줄었나」의 판단은 「언제 멈추나」에서 봅니다.

손으로 돌리는 한 바퀴

가장 작은 모델로 훈련을 해 봅니다. 입력 x 에 파라미터 w 하나를 곱해 답을 내는 모델입니다. 훈련 데이터는 두 줄뿐입니다. 정답은 언제나 입력의 두 배입니다.

훈련이 잘 되면 w 가 2 쪽으로 옮겨 가야 합니다. 그것을 채점과 고치기 두 단계로 나눠 확인합니다.

먼저 채점입니다. 아래 loss 는 예측과 정답의 차이를 제곱해 평균을 냅니다. 제곱하면 빗나간 방향이 어느 쪽이든 손실이 양수가 됩니다.

Python
xs, ys = [1, 3], [2, 6]

def loss(w):
    errs = [(w*x - y)**2 for x, y in zip(xs, ys)]
    return sum(errs) / len(errs)

loss(0.0)   # 20.0
loss(1.0)   # 5.0
loss(2.0)   # 0.0

w 가 2 에 가까울수록 손실이 작습니다. 훈련은 이 손실이 가장 작아지는 w 를 찾는 일입니다. 다만 실무의 모델은 이렇게 하나씩 넣어 볼 수 없을 만큼 파라미터가 많습니다.

다음은 고치기입니다. 아래 grad 는 지금의 w 에서 손실의 기울기를 구합니다. 안의 식 2*(w*x - y)*x 는 제곱 오차를 w 로 미분한 결과입니다. 기울기가 음수면 w 를 키워야 손실이 줄어듭니다.

Python
def grad(w):
    gs = [2*(w*x - y)*x for x, y in zip(xs, ys)]
    return sum(gs) / len(gs)

w = 0.0
grad(w)               # -20.0
w = w - 0.05*grad(w)
w, loss(w)            # (1.0, 5.0)
w = w - 0.05*grad(w)
w, loss(w)            # (1.5, 1.25)
w = w - 0.05*grad(w)
w, loss(w)            # (1.75, 0.3125)

w = w - 0.05*grad(w) 한 줄이 훈련 한 바퀴입니다. 세 바퀴 만에 w 는 0 에서 1.75 까지 2 쪽으로 다가갔습니다. 손실은 20 에서 0.3125 로 줄었습니다.

코드의 0.05 는 한 번에 얼마나 크게 고칠지를 정하는 값입니다. 이 값을 학습률이라고 부릅니다. 학습률이 너무 크면 2 를 지나쳐 오히려 멀어집니다. 너무 작으면 바퀴를 아주 많이 돌아야 합니다.

실무의 모델은 파라미터가 수백만 개를 넘기도 합니다. 그래도 한 바퀴의 짜임은 같습니다. 파라미터마다 기울기를 구하고 모두 조금씩 옮깁니다.

파라미터가 이렇게 많은 대표 모델이 신경망입니다. 신경망은 곱하고 더하는 계산을 층으로 여러 겹 쌓은 모델입니다. 신경망은 이 많은 기울기를 역전파라는 계산으로 한꺼번에 구합니다.

데이터 전체를 여러 번 보는 법

실무의 훈련 데이터는 위 예처럼 두 줄이 아니라 아주 많습니다. 그 많은 데이터를 어떤 단위로 나눠 도는지 봅니다.

훈련 데이터를 처음부터 끝까지 한 번 다 보는 것을 에포크 한 번이라고 부릅니다. 한 번 봐서는 파라미터가 충분히 옮겨 가지 않습니다. 훈련은 보통 에포크를 여러 번 돕니다.

예시를 한 줄씩 보고 고치면 고치는 횟수가 너무 많아집니다. 반대로 전체를 다 보고 한 번 고치면 한 번 고치는 데 너무 오래 걸립니다. 앞의 손 예제는 두 줄 전체를 보고 한 번 고쳤습니다. 데이터가 많을 때 흔히 쓰는 것은 그 중간입니다.

예시 여러 줄을 묶어 그 묶음마다 한 번 고칩니다. 이 묶음을 미니배치라고 부릅니다.

학습률, 에포크 수, 미니배치 크기는 훈련이 찾는 값이 아닙니다. 사람이 훈련을 시작하기 전에 정합니다. 이렇게 훈련 밖에서 정하는 설정값을 하이퍼파라미터라고 부릅니다. 파라미터는 훈련이 찾습니다. 하이퍼파라미터는 사람이 고릅니다.

모델마다 다른 훈련

앞에서 본 「기울기를 따라 숫자를 고친다」는 가장 흔한 훈련 방법입니다. 하지만 모든 모델이 이렇게 훈련하지는 않습니다. 이름은 같은 훈련이어도 모델 종류마다 하는 일이 다릅니다.

아래 표가 대표 모델 셋을 견줍니다. 표 다음 두 문단은 숫자를 고치지 않는 두 방법을 풉니다.

표 첫 줄의 선형 회귀는 입력에 숫자를 곱하고 더해 답을 내는 모델입니다. 앞의 손 예제가 쓴 w*x 모델이 가장 단순한 선형 회귀입니다.

모델 훈련이 하는 일
선형 회귀 · 신경망 손실이 줄도록 파라미터 숫자를 고친다
결정 트리 데이터를 가장 잘 가르는 질문을 골라 가지를 친다
최근접 이웃 데이터를 저장해 두기만 한다

결정 트리는 숫자를 조금씩 고치지 않습니다. 「메일에 든 링크가 세 개를 넘나」 같은 질문 가운데 데이터를 가장 깔끔하게 둘로 가르는 것을 고릅니다. 갈린 무리마다 다시 질문을 고르기를 되풀이하면 나무 모양의 판정표가 생깁니다.

최근접 이웃은 훈련 때 거의 아무것도 하지 않습니다. 데이터를 저장해 두었다가 새 입력이 오면 그와 가장 닮은 예를 찾아 답을 빌려 옵니다. 훈련에 드는 시간은 짧은 대신 답할 때 계산이 많습니다.

세 방법 모두 데이터에서 판정 기준을 세운다는 점은 같습니다. 그래서 다 같이 훈련이라고 부릅니다.

언제 멈추나

손실을 끝없이 줄인다고 처음 보는 입력을 더 잘 맞히지는 않습니다. 훈련을 너무 오래 하면 무엇이 어긋나는지, 그것을 어떻게 알아채는지 봅니다.

모델이 훈련 데이터를 너무 잘 맞히게 되면 예시를 외운 상태가 됩니다. 외운 답은 처음 보는 입력에는 통하지 않습니다. 이렇게 훈련 데이터에만 맞고 새 데이터에서 틀리는 상태를 과적합이라고 부릅니다.

훈련의 목표는 처음 보는 데이터를 잘 맞히는 것입니다. 이 능력을 일반화라고 부릅니다. 훈련 데이터의 손실만 봐서는 일반화가 되는지 알 수 없습니다.

그래서 데이터 일부를 떼어 훈련에 쓰지 않고 남겨 둡니다. 에포크가 끝날 때마다 이 데이터로 손실을 따로 잽니다. 점검용으로 떼어 둔 이 데이터가 검증 세트입니다.

훈련이 진행되면 훈련 데이터의 손실은 계속 줄어듭니다. 검증 세트의 손실은 한동안 같이 줄다가 어느 때부터 다시 늘어납니다. 그때가 모델이 외우기 시작한 때입니다. 그 시점에 훈련을 멈추는 방법을 조기 종료라고 부릅니다.

데이터는 보통 셋으로 나눕니다. 셋의 쓰임을 나란히 놓으면 이렇습니다.

나눈 데이터 쓰는 때
훈련 데이터 파라미터를 고칠 때
검증 세트 훈련을 멈출 때와 하이퍼파라미터를 고를 때
테스트 세트 다 끝난 뒤 성적을 한 번 매길 때

테스트 세트를 따로 두는 까닭은 검증 세트도 훈련에 영향을 주기 때문입니다. 멈출 때와 하이퍼파라미터를 검증 세트 점수를 보고 골랐습니다. 그래서 검증 세트 점수는 실력보다 좋게 나오기 쉽습니다. 한 번도 쓰지 않은 테스트 세트가 마지막 성적을 매깁니다.

훈련과 추론

훈련이 끝난 모델은 서비스에 올라가 요청에 답합니다. 백엔드 개발자가 모델을 만나는 곳은 대개 이 뒤쪽입니다. 훈련이 그 뒤쪽과 어떻게 이어지는지 봅니다.

서버는 저장해 둔 모델 파일을 메모리에 올립니다. 요청이 오면 고정된 파라미터로 계산을 한 번 해서 답합니다. 이 계산을 추론이라고 부릅니다.

모델을 서버에 띄워 두고 요청마다 추론을 돌려 답하게 하는 일은 모델 서빙이라고 부릅니다. 훈련과 추론은 하는 일이 달라서 드는 비용도 다릅니다.

훈련 추론
파라미터 고친다 고정한다
입력 레이블이 붙은 예시 레이블이 없는 새 입력
횟수 모델을 만들 때 요청이 올 때마다
한 번에 드는 시간 길다 짧다

훈련은 같은 곱셈과 덧셈을 엄청나게 되풀이합니다. 그래서 곱셈을 동시에 많이 하는 GPU(Graphics Processing Unit, 그래픽 처리 장치)로 돌리는 경우가 많습니다. 큰 모델은 GPU 여러 대로 며칠씩 훈련하기도 합니다.

서버 쪽에서 보면 훈련은 요청과 따로 도는 오래 걸리는 배치 처리 작업입니다. 여기서 배치는 요청과 상관없이 몰아서 돌리는 작업을 뜻합니다. 예시 묶음을 뜻하는 앞의 미니배치와는 다른 말입니다.

훈련은 한 번으로 끝나지 않는 경우가 많습니다. 세상이 바뀌면 들어오는 입력도 훈련 데이터와 달라집니다. 이 어긋남을 분포 이동이라고 부릅니다. 스팸 필터라면 스팸 보내는 쪽이 새 수법을 쓰기 시작할 때 들어오는 메일이 옛 훈련 데이터와 달라집니다.

분포 이동이 쌓이면 모델의 답이 점점 틀립니다. 그때는 새 데이터를 모아 주기적으로 다시 훈련합니다. 이 일을 재학습이라고 부릅니다.

훈련 때와 서빙 때 입력을 다루는 방식이 어긋나도 모델이 틀린 답을 냅니다. 훈련 때 거리를 km 로 넣었는데 서빙에서 m 로 넣는 경우가 그렇습니다. 에러는 나지 않아 쉽게 드러나지 않습니다. 이 문제를 훈련-서빙 스큐라고 부릅니다.

운영에서 말하는 훈련

머신러닝 밖에서도 개발자는 「훈련」이라는 말을 씁니다. 장애가 났다고 가정하고 대응 절차를 미리 밟아 보는 연습입니다. 재해 복구 훈련이나 모의 장애 훈련이 그렇습니다.

이 훈련은 사람과 절차를 점검하는 일이라 모델도 데이터도 나오지 않습니다. 대화에서 「훈련 돌린다」가 나오면 어느 뜻인지 가려 들어야 합니다.

관련 항목

훈련의 앞뒤에 서는 머신러닝 단계

머신러닝 · 데이터 수집 · 전처리 · 특성 공학 · 추론 · 모델 서빙 · 재학습 · MLOps

훈련에 들어가는 데이터

훈련 데이터 · 검증 세트 · 테스트 세트 · 레이블 · 특성 · 데이터셋 · 데이터 분할 · 데이터 누수

훈련이 고치는 모델의 구성 요소

모델 · 파라미터 · 가중치 · 편향 · 신경망 · 레이어

훈련 한 바퀴를 이루는 계산

예측 · 순전파 · 손실 함수 · 기울기 · 역전파 · 미분 · 경사 하강법 · 확률적 경사 하강법 · 옵티마이저

훈련을 조절하는 설정값

하이퍼파라미터 · 학습률 · 에포크 · 미니배치 · 배치 크기 · 조기 종료 · 그리드 서치

훈련이 어긋날 때 생기는 문제

과적합 · 과소적합 · 일반화 · 편향과 분산 · 기울기 소실 · 분포 이동 · 훈련-서빙 스큐

훈련 방식의 하위 종류

지도학습 · 비지도학습 · 준지도학습 · 강화학습 · 자기지도학습 · 전이 학습 · 사전 학습 · 파인튜닝 · 온라인 학습

훈련 방법이 서로 다른 모델

선형 회귀 · 로지스틱 회귀 · 결정 트리 · 최근접 이웃 · 딥러닝 · 앙상블

훈련을 돌리는 장비와 도구

GPU · TPU · 분산 학습 · 체크포인트 · 배치 처리 · PyTorch · TensorFlow · scikit-learn

이름이 겹치는 운영 훈련

재해 복구 · 장애 대응 · 게임 데이 · 카오스 엔지니어링

다른 이름: training · 학습 · 모델 학습 · 트레이닝