Skip to main content
Summary

역전파가 방향이라면, 학습률은 보폭이다

이전 장에서 우리는 역전파를 이렇게 이해했습니다. 모델이 예측하고, 손실을 계산하고, 그 손실이 각 가중치에 얼마나 책임이 있는지 거꾸로 추적합니다. 그러면 각 가중치마다 "이쪽으로 움직이면 손실이 줄어들 가능성이 크다"라는 방향 정보가 생깁니다.

그런데 방향만 알아서는 충분하지 않습니다. 산을 내려갈 때도 어느 쪽이 아래인지는 알 수 있지만, 한 걸음에 얼마나 크게 움직일지는 따로 정해야 합니다. 너무 작게 움직이면 하루 종일 내려가도 제자리인 것처럼 느껴집니다. 너무 크게 움직이면 내리막길을 따라가는 것이 아니라 반대편 언덕으로 튕겨 올라갈 수도 있습니다.

딥러닝에서 이 보폭을 정하는 값이 학습률, 영어로는 learning rate입니다.

가중치 업데이트를 아주 단순하게 쓰면 다음과 같습니다.

새 가중치 = 현재 가중치 - 학습률 × 기울기

여기서 기울기는 역전파가 알려 준 방향과 세기입니다. 학습률은 그 기울기를 얼마나 반영할지 결정하는 숫자입니다. 같은 기울기를 얻어도 학습률이 크면 가중치가 크게 바뀌고, 학습률이 작으면 가중치가 조금만 바뀝니다.

예를 들어 어떤 가중치가 현재 2.0이고, 손실을 줄이기 위해 계산된 기울기가 0.3이라고 해 봅시다. 학습률이 0.1이면 가중치는 이렇게 바뀝니다.

새 가중치 = 2.0 - 0.1 × 0.3
         = 1.97

반면 학습률이 1.0이면 이렇게 됩니다.

새 가중치 = 2.0 - 1.0 × 0.3
         = 1.7

둘 다 같은 방향으로 움직였지만, 움직인 폭은 완전히 다릅니다. 학습률은 모델이 얼마나 과감하게 자기 생각을 고치는지 정하는 손잡이입니다.

학습률, 배치, 에폭

학습률이 너무 크면 모델은 지나친다

학습률이 크면 처음에는 좋아 보일 수 있습니다. 손실이 빠르게 줄어드는 듯 보이기 때문입니다. 하지만 너무 큰 학습률은 목적지를 향해 가는 것이 아니라 목적지를 계속 지나치게 만듭니다.

공을 그릇 바닥으로 굴려 보낸다고 상상해 봅시다. 바닥이 손실이 가장 작은 지점입니다. 공을 살짝 밀면 그릇 바닥 근처로 천천히 내려갑니다. 그런데 공을 너무 세게 밀면 바닥을 지나 반대편으로 올라갑니다. 다시 내려오다가 또 반대편으로 튀어 오릅니다. 모델도 비슷합니다. 손실이 작아지는 지점을 향해 움직이지만, 학습률이 너무 크면 좋은 지점을 지나쳐 버립니다.

이때 손실 곡선은 보통 불안정합니다. 조금 줄어드는 듯하다가 갑자기 커지고, 다시 내려가다가 또 튀어 오릅니다. 심하면 손실이 계속 커지거나 NaN이 나타나기도 합니다. NaN은 "숫자로 표현할 수 없는 값"이라는 뜻인데, 학습이 사실상 망가졌다는 신호로 볼 수 있습니다.

이런 현상을 발산이라고 부릅니다. 모델이 손실을 줄이는 방향으로 안정적으로 내려가지 못하고, 오히려 손실이 커지는 쪽으로 튀어 나가는 상태입니다.

학습이 발산할 때 가장 먼저 의심해야 할 값은 학습률입니다. 다른 구조를 바꾸기 전에 학습률을 10분의 1로 줄여 보는 것만으로 문제가 해결되는 경우가 많습니다.

학습률이 너무 작으면 모델은 거의 배우지 못한다

반대로 학습률이 너무 작으면 모델은 조심성이 지나치게 많아집니다. 방향은 알고 있지만 한 걸음이 너무 작아서 손실이 거의 줄어들지 않습니다.

이때 손실 곡선은 아주 천천히 내려갑니다. 멀리서 보면 거의 수평선처럼 보일 수도 있습니다. 모델이 전혀 학습하지 않는 것은 아니지만, 우리가 기다릴 수 있는 시간 안에는 의미 있는 변화가 일어나지 않습니다.

이런 경우에는 학습률을 조금 키워 볼 수 있습니다. 예를 들어 0.00001로 학습했을 때 손실이 거의 변하지 않는다면 0.0001이나 0.001을 시도해 볼 수 있습니다. 물론 무작정 크게 키우면 앞에서 본 발산 문제가 생길 수 있으므로, 보통은 10배 또는 3배 정도의 단위로 조심스럽게 바꿔 봅니다.

학습률을 정할 때 중요한 감각은 이것입니다.

모델은 너무 겁이 많아도 안 되고, 너무 성급해도 안 됩니다. 좋은 학습률은 손실을 안정적으로, 그리고 충분히 빠르게 줄이는 보폭입니다.

배치: 한 번에 몇 개의 데이터를 보고 고칠 것인가

이제 두 번째 손잡이를 살펴봅시다. 배치 크기입니다.

딥러닝 모델은 데이터를 하나씩만 보고 학습할 수도 있고, 전체 데이터를 한 번에 보고 학습할 수도 있습니다. 하지만 실제로는 그 중간 방식을 많이 씁니다. 데이터를 작은 묶음으로 나누고, 한 묶음을 보고 손실을 계산한 뒤 가중치를 한 번 업데이트합니다. 이 작은 묶음을 배치라고 합니다.

예를 들어 손글씨 숫자 이미지가 60,000장 있다고 해 봅시다. 배치 크기를 100으로 정하면 모델은 이미지를 100장씩 묶어서 봅니다. 한 배치에서 예측을 하고, 손실을 계산하고, 역전파로 기울기를 구하고, 가중치를 한 번 수정합니다. 그러면 전체 데이터를 한 번 다 보는 동안 다음과 같은 횟수의 업데이트가 일어납니다.

60,000개 ÷ 배치 크기 100 = 600번 업데이트

배치 크기가 1이면 데이터 하나를 볼 때마다 가중치를 고칩니다. 배치 크기가 60,000이면 전체 데이터를 다 본 뒤에야 가중치를 한 번 고칩니다. 딥러닝에서는 보통 이 둘 사이의 값, 예를 들어 32, 64, 128, 256 같은 배치 크기를 자주 사용합니다.

여기서 중요한 질문이 생깁니다. 왜 굳이 묶어서 볼까요?

하나의 데이터만 보고 판단하면 기울기가 매우 흔들릴 수 있습니다. 어떤 사진 한 장은 너무 어둡고, 어떤 문장 하나는 표현이 특이하고, 어떤 숫자 이미지는 사람이 봐도 헷갈릴 수 있습니다. 이런 데이터 하나만 보고 "이 방향이 정답이야!"라고 가중치를 바꾸면 모델이 이리저리 흔들립니다.

반대로 여러 데이터를 묶어서 평균적인 손실을 보면 방향이 조금 더 안정됩니다. 한두 개의 특이한 데이터가 있어도 묶음 전체의 경향이 기울기에 반영되기 때문입니다.

작은 배치와 큰 배치의 성격

배치 크기는 단순히 "한 번에 몇 개를 넣을 것인가"의 문제가 아닙니다. 학습의 성격을 바꾸는 중요한 선택입니다.

작은 배치는 자주 움직입니다. 데이터 몇 개만 보고 빠르게 가중치를 고치기 때문에 업데이트 횟수가 많습니다. 대신 방향이 조금 시끄럽습니다. 매번 보는 데이터 묶음이 다르기 때문에 손실 곡선도 잔물결처럼 흔들릴 수 있습니다. 하지만 이 흔들림이 항상 나쁜 것은 아닙니다. 때로는 작은 흔들림 덕분에 모델이 답답한 지점에서 빠져나오기도 합니다.

큰 배치는 더 차분합니다. 많은 데이터를 한 번에 보고 평균적인 방향을 계산하므로 기울기가 안정적입니다. 손실 곡선도 상대적으로 매끄럽게 보일 수 있습니다. 대신 한 번 업데이트하기 위해 더 많은 계산과 메모리가 필요합니다. 특히 GPU 메모리가 부족하면 큰 배치를 사용할 수 없습니다. 또한 같은 에폭 수를 기준으로 보면, 배치가 커질수록 한 에폭 안에서 가중치를 업데이트하는 횟수는 줄어듭니다.

예를 들어 데이터가 10,000개일 때 배치 크기별 업데이트 횟수는 다음과 같습니다.

배치 크기한 에폭당 업데이트 횟수특징
101,000번자주 업데이트하지만 기울기가 많이 흔들릴 수 있음
100100번안정성과 속도 사이의 균형을 잡기 좋음
1,00010번기울기는 안정적이지만 업데이트 횟수가 적음

그래서 배치 크기는 학습 속도, 메모리 사용량, 기울기의 안정성 사이에서 균형을 잡는 값입니다. 처음 실험할 때는 너무 극단적인 값보다 32, 64, 128 같은 적당한 값에서 시작하는 경우가 많습니다.

에폭: 전체 데이터를 몇 번 다시 볼 것인가

세 번째 손잡이는 에폭입니다. 에폭은 모델이 전체 학습 데이터를 처음부터 끝까지 한 번 보는 단위입니다.

데이터가 60,000개 있고, 모델이 그 60,000개를 모두 한 번씩 봤다면 1에폭이 끝난 것입니다. 같은 데이터를 다시 섞어서 한 번 더 보면 2에폭입니다. 10번 반복해서 보면 10에폭입니다.

사람이 공부하는 과정과 비슷합니다. 교재를 한 번 읽었다고 모든 내용을 이해하지는 못합니다. 두 번째 읽을 때는 처음에 놓쳤던 구조가 보이고, 세 번째 읽을 때는 문제 풀이의 패턴이 보입니다. 모델도 마찬가지입니다. 전체 데이터를 한 번 본 것만으로는 가중치가 충분히 조정되지 않을 수 있습니다. 그래서 여러 에폭 동안 반복해서 학습합니다.

다만 에폭을 무조건 늘리는 것이 정답은 아닙니다. 모델이 충분히 배운 뒤에도 같은 데이터를 계속 반복해서 보면, 학습 데이터에 지나치게 맞춰질 수 있습니다. 이것을 과적합이라고 합니다. 과적합은 뒤에서 더 자세히 다루겠지만, 간단히 말해 "시험 범위의 예제는 외웠는데 새로운 문제에는 약한 상태"입니다.

이번 장에서는 우선 에폭을 이렇게 기억하면 됩니다.

에폭은 모델에게 학습 데이터를 몇 번 복습시킬지 정하는 값입니다.

배치와 에폭은 함께 움직인다

배치와 에폭은 따로 떨어진 개념처럼 보이지만, 실제 학습에서는 함께 움직입니다.

예를 들어 학습 데이터가 1,000개 있고 배치 크기가 100이라고 해 봅시다. 그러면 한 에폭은 10번의 업데이트로 이루어집니다.

1,000개 ÷ 100개 = 10번 업데이트

이 상태에서 5에폭을 학습하면 총 업데이트 횟수는 50번입니다.

10번 업데이트 × 5에폭 = 50번 업데이트

만약 배치 크기를 10으로 줄이면 어떻게 될까요? 한 에폭에 100번 업데이트합니다. 같은 5에폭이라도 총 업데이트 횟수는 500번이 됩니다.

1,000개 ÷ 10개 = 100번 업데이트
100번 업데이트 × 5에폭 = 500번 업데이트

즉, "5에폭 학습했다"라는 말만으로는 실제로 가중치가 몇 번 바뀌었는지 알 수 없습니다. 배치 크기를 함께 봐야 합니다.

이 관점은 매우 중요합니다. 어떤 모델은 10에폭만 학습해도 충분히 좋아지고, 어떤 모델은 100에폭을 학습해도 부족합니다. 데이터 크기, 배치 크기, 학습률, 모델 구조가 함께 영향을 주기 때문입니다.

딥러닝 학습은 단순히 "몇 번 돌렸다"의 문제가 아닙니다. 얼마나 큰 보폭으로, 얼마나 많은 데이터를 묶어서, 전체 데이터를 몇 번 반복했는지의 조합입니다.

학습 루프에서 세 값은 어디에 있을까

아직 PyTorch를 본격적으로 다루지는 않았지만, 학습률·배치·에폭이 학습 루프 안에서 어디에 놓이는지 미리 감각을 잡아 봅시다.

learning_rate = 0.001
batch_size = 64
num_epochs = 10

for epoch in range(num_epochs):
    for x_batch, y_batch in dataloader:
        pred = model(x_batch)
        loss = loss_fn(pred, y_batch)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

이 짧은 코드 안에 딥러닝 학습의 기본 리듬이 모두 들어 있습니다.

num_epochs는 바깥 반복문의 횟수를 정합니다. 전체 데이터를 몇 번 반복해서 볼지 결정합니다. batch_size는 dataloader가 데이터를 몇 개씩 묶어 꺼내 줄지 결정합니다. learning_rate는 optimizer.step()에서 가중치를 얼마나 크게 수정할지 결정합니다.

실제로는 학습률이 optimizer를 만들 때 들어가고, 배치 크기는 데이터로더를 만들 때 들어갑니다. 하지만 큰 흐름은 위 코드처럼 이해하면 충분합니다. 모델은 배치를 하나 받고, 예측하고, 손실을 계산하고, 역전파하고, 학습률에 따라 가중치를 고칩니다. 이 과정을 배치마다 반복하고, 전체 데이터를 다 보면 한 에폭이 끝납니다.

손실 곡선은 모델의 심전도다

학습률, 배치, 에폭을 조절할 때 가장 먼저 보는 것은 손실 곡선입니다. 손실 곡선은 학습이 진행될수록 손실이 어떻게 변하는지 그린 그래프입니다.

이 그래프는 모델의 심전도와 같습니다. 숫자만 보면 무슨 일이 일어나는지 감이 잘 오지 않지만, 곡선으로 보면 학습이 건강하게 진행되는지, 너무 흥분했는지, 거의 움직이지 않는지 한눈에 보입니다.

건강한 학습에서는 손실이 대체로 내려갑니다. 중간중간 작은 흔들림은 있을 수 있지만, 전체적인 방향은 아래입니다. 특히 작은 배치를 사용할 때는 손실이 매끄럽게 떨어지지 않고 약간 출렁일 수 있습니다. 이것은 자연스러운 현상입니다. 중요한 것은 장기적인 추세입니다.

반대로 손실 곡선이 이상한 모양을 보이면 학습 설정을 의심해야 합니다.

과소학습: 아직 충분히 배우지 못한 상태

과소학습은 모델이 데이터의 패턴을 충분히 배우지 못한 상태입니다. 손실이 아직 높고, 정확도도 낮습니다. 학습 데이터에서도 성능이 좋지 않고, 검증 데이터에서도 성능이 좋지 않습니다.

손실 곡선으로 보면 과소학습은 대체로 두 가지 모습으로 나타납니다. 첫째, 손실이 계속 내려가고 있는데 학습을 너무 일찍 멈춘 경우입니다. 모델은 아직 배우는 중인데 우리가 중간에 책을 덮어 버린 셈입니다. 이때는 에폭을 늘리면 성능이 좋아질 수 있습니다.

둘째, 손실이 처음부터 높은 수준에서 거의 내려가지 않는 경우입니다. 이때는 학습률이 너무 작거나, 모델 구조가 너무 단순하거나, 입력 데이터가 제대로 준비되지 않았을 수 있습니다. 학습률을 조금 키워 보고, 데이터와 라벨이 올바른지 확인하고, 모델이 문제를 풀 만큼 충분한 표현력을 갖고 있는지 점검해야 합니다.

과소학습을 마주했을 때는 이렇게 생각해 볼 수 있습니다.

"모델이 아직 충분히 복습하지 못한 것인가, 아니면 복습해도 이해할 수 없는 구조인가?"

전자는 에폭 문제일 수 있고, 후자는 모델 구조나 데이터 표현 문제일 수 있습니다.

발산: 너무 큰 보폭으로 튕겨 나가는 상태

발산은 앞에서 본 것처럼 손실이 줄어들지 않고 오히려 커지는 상태입니다. 손실 곡선이 위로 치솟거나, 큰 폭으로 출렁이거나, 어느 순간 숫자가 망가집니다.

발산할 때 가장 흔한 원인은 학습률이 너무 큰 것입니다. 기울기가 알려 준 방향 자체는 맞을 수 있지만, 한 번에 너무 멀리 가기 때문에 좋은 지점을 지나쳐 버립니다.

이럴 때는 우선 학습률을 줄입니다. 예를 들어 0.01에서 발산한다면 0.001이나 0.0003을 시도해 볼 수 있습니다. 그래도 불안정하다면 입력 데이터의 스케일이 너무 크지 않은지, 손실 함수가 문제에 맞는지, 모델 출력과 정답 형식이 맞는지도 확인해야 합니다.

발산은 딥러닝 초보자가 자주 만나는 현상입니다. 하지만 너무 겁먹을 필요는 없습니다. 모델이 "전혀 이해할 수 없다"고 말하는 것이 아니라, 대개는 "너무 세게 밀고 있다"고 말하는 경우가 많습니다.

정체: 내려가야 할 것 같은데 멈춘 상태

정체는 손실이 어느 지점에서 더 이상 잘 내려가지 않는 상태입니다. 발산처럼 폭발하지는 않습니다. 하지만 기대만큼 좋아지지도 않습니다. 그래프가 완만하게 수평에 가까워집니다.

정체에는 여러 이유가 있습니다. 학습률이 너무 작아서 거의 움직이지 못할 수도 있고, 반대로 학습률이 약간 커서 좋은 지점 근처에서 미세하게 접근하지 못하고 맴돌 수도 있습니다. 배치 크기가 너무 커서 업데이트 횟수가 적은 것도 원인이 될 수 있습니다. 모델 구조가 부족하거나 데이터에 노이즈가 많은 경우에도 정체가 나타납니다.

정체를 볼 때는 먼저 손실이 어느 단계에서 멈췄는지 살펴야 합니다. 처음부터 거의 내려가지 않았다면 학습률, 데이터, 모델 구조를 의심합니다. 어느 정도 잘 내려가다가 멈췄다면 학습률을 조금 낮추거나, 더 많은 에폭을 주거나, 다음 장에서 배울 더 나은 최적화 알고리즘을 사용해 볼 수 있습니다.

딥러닝 학습에서 정체는 막다른 길이라기보다 갈림길에 가깝습니다. "더 작은 보폭이 필요한가?", "다른 방식의 보폭 조절이 필요한가?", "모델이 더 풍부한 표현을 배워야 하는가?"를 묻는 신호입니다.

세 손잡이를 함께 조절하는 감각

학습이 잘 안 될 때 학습률, 배치 크기, 에폭을 따로따로 외우면 오히려 헷갈립니다. 세 값은 하나의 리듬으로 이해하는 것이 좋습니다.

학습률은 한 번 업데이트할 때 얼마나 크게 움직일지 정합니다. 배치 크기는 한 번 업데이트하기 전에 몇 개의 데이터를 보고 판단할지 정합니다. 에폭은 전체 데이터를 몇 번 반복해서 볼지 정합니다.

조금 더 직관적으로 말하면 이렇습니다.

값질문너무 작으면너무 크면
학습률한 걸음이 얼마나 큰가?너무 느리게 배움발산하거나 불안정해짐
배치 크기한 번에 몇 개를 보고 판단하는가?기울기가 많이 흔들림메모리를 많이 쓰고 업데이트 횟수가 줄어듦
에폭전체 데이터를 몇 번 복습하는가?과소학습 가능성과적합 가능성

처음 실험에서는 너무 많은 것을 한꺼번에 바꾸지 않는 것이 좋습니다. 학습률을 바꾸면서 동시에 배치 크기와 모델 구조까지 바꾸면 무엇 때문에 좋아졌는지 알 수 없습니다. 실험은 요리와 비슷합니다. 소금, 불 세기, 조리 시간을 한꺼번에 바꾸면 맛이 왜 달라졌는지 알기 어렵습니다.

딥러닝에서도 한 번에 하나씩 바꾸며 손실 곡선을 관찰하는 습관이 중요합니다.

처음 확인할 체크리스트

모델이 생각처럼 학습되지 않을 때는 복잡한 이론으로 바로 뛰어들기보다 기본 손잡이부터 확인하는 것이 좋습니다. 현장에서 많은 문제는 아주 깊은 곳이 아니라, 의외로 이 세 값 근처에서 시작됩니다.

  • 손실이 갑자기 커지거나 NaN이 나오면 학습률을 줄여 본다.

  • 손실이 거의 변하지 않으면 학습률이 너무 작지 않은지, 에폭이 부족하지 않은지 확인한다.

  • 손실이 심하게 출렁이면 배치 크기를 조금 키우거나 학습률을 낮춰 본다.

  • 학습 데이터에서도 성능이 낮으면 과소학습을 의심하고 더 오래 학습하거나 모델 표현력을 점검한다.

  • 학습은 잘되는데 검증 성능이 나빠지면 에폭을 너무 많이 준 것은 아닌지 확인한다.

이 체크리스트는 정답표가 아니라 출발점입니다. 딥러닝에는 늘 예외가 있습니다. 하지만 초반 실험에서 이 정도만 확인해도 많은 시행착오를 줄일 수 있습니다.

좋은 학습은 속도보다 리듬이다

딥러닝을 처음 배우면 "손실을 빨리 줄이는 것"에만 관심이 가기 쉽습니다. 하지만 좋은 학습은 단순히 빠른 학습이 아닙니다. 너무 빠르면 지나치고, 너무 느리면 도착하지 못합니다. 너무 적게 보면 이해하지 못하고, 너무 많이 보면 외워 버릴 수 있습니다. 너무 작은 배치는 흔들리고, 너무 큰 배치는 둔해질 수 있습니다.

그래서 학습률, 배치, 에폭은 딥러닝 학습의 리듬입니다.

역전파가 "어느 방향으로 고칠지"를 알려 준다면, 학습률은 "얼마나 크게 고칠지"를 정합니다. 배치는 "얼마나 많은 사례를 보고 판단할지"를 정합니다. 에폭은 "몇 번 반복해서 익힐지"를 정합니다.

이 세 손잡이를 이해하면 학습 과정이 훨씬 덜 신비롭게 느껴집니다. 모델은 마법처럼 똑똑해지는 것이 아닙니다. 데이터를 보고, 틀린 정도를 계산하고, 어느 가중치가 책임이 있는지 추적하고, 정해진 보폭으로 조금씩 고칩니다. 그리고 이 일을 배치마다, 에폭마다 반복합니다.

다음 장에서는 이 보폭을 더 영리하게 조절하는 방법을 살펴봅니다. 지금까지는 경사하강법이라는 기본 아이디어를 배웠다면, 이제는 그 아이디어를 더 안정적이고 빠르게 만드는 여러 최적화 알고리즘으로 넘어갈 차례입니다.

책 목록

처음 만나는 딥러닝: 신경망에서 Transformer와 LLM까지

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기