Skip to main content
Summary

지난 장에서 우리는 손실 함수를 배웠습니다. 모델의 예측이 얼마나 틀렸는지 숫자로 나타내는 장치였지요. 손실이 크다는 것은 모델이 많이 틀렸다는 뜻이고, 손실이 작다는 것은 정답에 가까워졌다는 뜻입니다.

그렇다면 이제 가장 중요한 질문이 남습니다.

모델은 손실을 어떻게 줄일까요?

사람이라면 틀린 문제를 보고 "아, 이 부분을 잘못 생각했구나" 하고 고칠 수 있습니다. 하지만 신경망은 스스로 반성문을 쓰지 않습니다. 대신 숫자를 고칩니다. 가중치와 편향이라는 숫자를 아주 조금씩 바꾸면서, 손실이 줄어드는 방향을 찾아갑니다.

이 과정을 대표하는 방법이 바로 경사하강법입니다.

경사하강법은 이름 그대로 "경사를 따라 내려가는 방법"입니다. 여기서 내려간다는 말은 높은 산에서 낮은 곳으로 내려간다는 뜻이고, 딥러닝에서는 큰 손실에서 작은 손실로 이동한다는 뜻입니다.

경사하강법

손실 지형 위에 서 있는 모델

상상해 봅시다. 눈앞에 울퉁불퉁한 산길이 펼쳐져 있습니다. 어떤 곳은 높고, 어떤 곳은 낮습니다. 우리는 이 산길에서 가장 낮은 골짜기를 찾고 싶습니다.

이때 산의 높이가 손실입니다. 높을수록 모델이 많이 틀린 것이고, 낮을수록 모델이 덜 틀린 것입니다. 그리고 우리가 서 있는 위치는 현재 모델의 가중치 값입니다.

가중치가 하나뿐이라면 이 비유는 단순합니다. 가로축은 가중치, 세로축은 손실입니다. 가중치 값을 바꾸면 손실 값도 달라집니다. 어떤 가중치에서는 손실이 높고, 어떤 가중치에서는 손실이 낮습니다.

하지만 실제 신경망에는 가중치가 하나가 아닙니다. 수천 개, 수백만 개, 때로는 수천억 개의 가중치가 있습니다. 그러면 손실 지형은 우리가 눈으로 그릴 수 없는 고차원 공간이 됩니다. 그래도 핵심은 같습니다.

현재 모델은 손실 지형의 어느 한 지점에 서 있습니다. 학습이란 그 지점에서 출발해 손실이 더 낮아지는 방향으로 조금씩 이동하는 일입니다.

지금 당장 어느 쪽으로 내려가야 할까

문제는 이것입니다. 우리는 전체 산의 지도를 가지고 있지 않습니다. 모든 방향을 다 걸어 보고 가장 낮은 곳을 찾을 수도 없습니다. 신경망의 가중치 조합은 너무 많기 때문입니다.

그래서 모델은 현재 위치에서 할 수 있는 가장 현실적인 질문을 던집니다.

"지금 이 자리에서 어느 방향으로 움직이면 손실이 줄어들까?"

이 질문에 답해 주는 것이 기울기입니다. 기울기는 현재 위치에서 손실이 어느 방향으로, 얼마나 빠르게 변하는지를 알려 줍니다.

산길을 걷는 사람으로 비유하면 기울기는 발밑의 경사입니다. 앞쪽이 급하게 올라가는지, 오른쪽이 내려가는지, 왼쪽이 거의 평평한지 느끼는 것과 비슷합니다. 전체 지도를 몰라도 발밑의 경사는 알 수 있습니다. 그리고 그 경사를 보고 한 걸음 내려갈 수 있습니다.

딥러닝에서도 마찬가지입니다. 모델은 현재 가중치에서 손실을 계산합니다. 그런 다음 각 가중치가 손실에 어떤 영향을 주는지 봅니다. 어떤 가중치를 키우면 손실이 커지는지, 줄이면 손실이 작아지는지, 또는 거의 영향이 없는지를 계산합니다.

이때 중요한 점은 경사하강법이 완벽한 미래를 예측하는 방법이 아니라는 것입니다. 경사하강법은 지금 이 순간의 방향을 보고 조금 움직이는 방법입니다. 아주 멀리 있는 골짜기를 한 번에 찾아가는 것이 아니라, 현재 발밑의 경사를 보고 한 걸음씩 내려갑니다.

업데이트의 핵심 공식

경사하강법의 핵심은 한 줄로 표현할 수 있습니다.

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

이 식은 단순하지만 딥러닝 학습의 심장에 가깝습니다.

여기서 현재 가중치는 모델이 지금 가지고 있는 숫자입니다. 기울기는 이 가중치를 바꿨을 때 손실이 어떻게 변하는지를 알려 주는 값입니다. 학습률은 한 번에 얼마나 크게 움직일지를 정하는 숫자입니다.

왜 기울기를 빼는 걸까요?

기울기는 손실이 증가하는 방향을 가리킵니다. 우리는 손실을 줄이고 싶습니다. 따라서 기울기가 가리키는 방향의 반대로 움직여야 합니다. 그래서 - 기울기가 등장합니다.

조금 더 구체적으로 보겠습니다. 어떤 가중치의 기울기가 양수라고 해 봅시다. 이는 대체로 그 가중치를 키우면 손실이 커진다는 뜻입니다. 그러면 손실을 줄이려면 가중치를 낮춰야 합니다. 식에서도 양수 기울기를 빼므로 새 가중치는 작아집니다.

반대로 기울기가 음수라면 어떨까요? 이는 가중치를 키우는 쪽이 손실을 줄이는 방향일 수 있다는 뜻입니다. 식에서는 음수를 빼게 됩니다. 음수를 빼면 더하는 것과 같으므로 새 가중치는 커집니다.

즉 경사하강법은 기울기의 부호를 보고 어느 쪽으로 움직일지 정합니다. 기울기의 크기는 얼마나 강하게 움직일지에 영향을 줍니다. 기울기가 크면 현재 위치에서 손실이 가파르게 변한다는 뜻이므로 업데이트도 상대적으로 커집니다. 기울기가 작으면 손실 지형이 완만하다는 뜻이므로 변화도 작아집니다.

아주 작은 예로 보는 가중치 이동

가중치 하나가 있고, 현재 값이 2.0이라고 해 봅시다. 손실을 계산해 보니 이 가중치에 대한 기울기가 0.5였습니다. 학습률은 0.1로 정했습니다.

업데이트는 이렇게 됩니다.

새 가중치 = 2.0 - 0.1 × 0.5

따라서 새 가중치는 1.95가 됩니다. 기울기가 양수였으므로 가중치가 조금 줄었습니다.

이번에는 기울기가 -0.5라고 해 봅시다.

새 가중치 = 2.0 - 0.1 × (-0.5)

새 가중치는 2.05가 됩니다. 기울기가 음수였으므로 가중치가 조금 커졌습니다.

이 작은 계산 안에 신경망 학습의 핵심이 들어 있습니다. 모델은 예측합니다. 손실을 계산합니다. 각 가중치가 손실에 어떤 영향을 주었는지 봅니다. 그리고 손실을 줄이는 방향으로 가중치를 조금 바꿉니다. 이 과정을 수없이 반복합니다.

신경망이 학습한다는 말은 결국 이런 의미입니다. 거대한 모델 안에 있는 수많은 숫자들이 손실을 줄이는 방향으로 조금씩 이동하는 것입니다.

학습률: 한 걸음의 크기

경사하강법에서 학습률은 매우 중요합니다. 학습률은 한 번 업데이트할 때 얼마나 크게 움직일지를 정합니다.

산을 내려가는 사람을 다시 떠올려 봅시다. 한 걸음이 너무 작으면 안전하기는 하지만 너무 느립니다. 낮은 곳에 도착하기까지 시간이 오래 걸립니다. 반대로 한 걸음이 너무 크면 어떻게 될까요? 골짜기를 향해 내려가다가 반대편 언덕으로 훌쩍 넘어가 버릴 수 있습니다. 심하면 계속 이리저리 튀면서 오히려 낮은 곳에 가까워지지 못합니다.

딥러닝에서도 똑같은 일이 일어납니다.

학습률이 너무 작으면 손실은 줄어들 수 있지만 속도가 매우 느립니다. 모델이 조금씩 좋아지기는 하는데, 학습이 답답하게 진행됩니다. 충분히 학습하기 전에 시간이 다 지나갈 수도 있습니다.

학습률이 너무 크면 손실이 불안정해집니다. 한 번의 업데이트가 너무 커서 좋은 지점을 지나쳐 버립니다. 손실이 줄어들기는커녕 오히려 커질 수 있습니다. 학습 그래프를 보면 손실이 위아래로 크게 흔들리거나, 어느 순간 폭발하듯 커지는 모습이 나타나기도 합니다.

적절한 학습률은 모델이 안정적으로, 그러나 너무 느리지 않게 내려가도록 돕습니다. 그래서 딥러닝 실험에서 학습률은 가장 먼저 확인해야 할 중요한 하이퍼파라미터입니다. 하이퍼파라미터란 모델이 데이터로부터 직접 배우는 값이 아니라, 사람이 학습 전에 정해 주는 설정값을 말합니다.

한 번에 모든 데이터를 볼 것인가

이제 또 하나의 현실적인 문제가 등장합니다. 기울기를 계산하려면 손실을 계산해야 합니다. 손실을 계산하려면 데이터를 모델에 넣어 예측해야 합니다.

그렇다면 매번 전체 데이터를 모두 사용해서 기울기를 계산해야 할까요?

데이터가 100개라면 가능할 수도 있습니다. 하지만 데이터가 100만 개, 1억 개라면 이야기가 달라집니다. 한 번 업데이트할 때마다 모든 데이터를 보는 것은 너무 느립니다. 메모리도 많이 필요합니다.

그래서 경사하강법에는 데이터를 얼마나 사용해 한 번의 업데이트를 할 것인지에 따라 여러 방식이 있습니다.

  • 전체 배치 경사하강법은 모든 학습 데이터를 사용해 한 번의 기울기를 계산합니다. 방향은 비교적 안정적이지만, 데이터가 많으면 한 번 움직이는 데 시간이 오래 걸립니다.

  • 확률적 경사하강법은 데이터 하나를 사용해 한 번의 기울기를 계산합니다. 매우 자주 업데이트할 수 있지만, 방향이 많이 흔들릴 수 있습니다.

  • 미니배치 경사하강법은 일부 데이터 묶음을 사용해 기울기를 계산합니다. 실제 딥러닝에서 가장 널리 쓰이는 방식으로, 안정성과 속도 사이의 균형을 잡습니다.

여기서 배치란 한 번에 모델에 넣는 데이터 묶음을 뜻합니다. 미니배치는 전체 데이터 중 작은 묶음입니다. 예를 들어 학습 데이터가 60,000개 있고 배치 크기가 64라면, 모델은 64개씩 데이터를 보고 손실과 기울기를 계산한 뒤 가중치를 업데이트합니다.

전체 데이터를 한 번에 보면 방향은 더 차분할 수 있습니다. 많은 사람에게 의견을 물어본 뒤 결정하는 것과 비슷합니다. 하지만 결정이 느립니다. 반대로 데이터 하나만 보고 업데이트하면 매우 빠르게 반응하지만, 한 사람의 의견만 듣고 방향을 바꾸는 셈이라 흔들림이 큽니다. 미니배치는 적당한 수의 의견을 듣고 자주 움직이는 방식입니다.

흔들림은 항상 나쁜 것일까

확률적 경사하강법이나 미니배치 경사하강법은 손실이 매번 매끄럽게 줄어들지 않을 수 있습니다. 어떤 배치에서는 손실이 줄고, 다음 배치에서는 조금 늘어날 수도 있습니다. 처음 보면 불안해 보입니다.

하지만 이 흔들림이 항상 나쁜 것은 아닙니다. 손실 지형은 단순한 그릇 모양이 아닙니다. 실제 신경망의 손실 지형은 울퉁불퉁하고 복잡합니다. 너무 정확하고 조심스럽게만 움직이면 작은 움푹 팬 지점에 갇힐 수도 있습니다. 미니배치가 만드는 적당한 흔들림은 때로 그런 지점에서 빠져나오는 데 도움을 줄 수 있습니다.

물론 흔들림이 너무 크면 학습이 불안정해집니다. 그래서 배치 크기와 학습률은 함께 생각해야 합니다. 배치가 작으면 기울기 추정이 더 흔들릴 수 있고, 학습률이 크면 그 흔들림이 더 크게 반영됩니다. 배치가 크면 기울기는 안정적이지만 계산 비용이 커지고, 업데이트 횟수는 줄어들 수 있습니다.

딥러닝은 수학 공식만으로 끝나는 세계가 아닙니다. 실제 학습에서는 이런 균형 감각이 중요합니다. 너무 빠르지도, 너무 느리지도 않게. 너무 흔들리지도, 너무 굳어 있지도 않게. 모델이 손실 지형을 잘 내려가도록 길을 잡아 주는 일이 필요합니다.

PyTorch 학습 루프와 경사하강법

앞으로 PyTorch를 다룰 때 우리는 경사하강법의 흐름을 코드로 만나게 됩니다. 아직 코드를 완전히 이해하지 않아도 괜찮습니다. 중요한 것은 큰 흐름입니다.

일반적인 학습 루프는 다음 순서로 움직입니다.

  • 모델이 입력 데이터를 보고 예측값을 만듭니다.

  • 예측값과 정답을 비교해 손실을 계산합니다.

  • 손실을 줄이는 방향을 찾기 위해 기울기를 계산합니다.

  • 옵티마이저가 기울기를 사용해 가중치를 업데이트합니다.

PyTorch에서는 보통 loss.backward()가 기울기 계산을 담당합니다. 이 함수가 호출되면 PyTorch는 손실에서 출발해 모델 안의 파라미터들이 손실에 얼마나 영향을 주었는지 계산합니다. 그리고 optimizer.step()이 그 기울기를 사용해 실제로 가중치를 바꿉니다.

이때 옵티마이저는 가중치를 어떻게 업데이트할지 정하는 도구입니다. 가장 기본적인 옵티마이저가 SGD, 즉 확률적 경사하강법입니다. 나중에 Adam 같은 더 발전된 최적화 알고리즘도 배우겠지만, 그 바탕에는 여전히 같은 질문이 있습니다.

"손실을 줄이려면 이 가중치를 어느 방향으로 얼마나 움직여야 할까?"

경사하강법이 보여 주는 학습의 모습

딥러닝을 처음 접하면 신경망이 마치 스스로 생각하는 것처럼 보일 수 있습니다. 하지만 안쪽을 들여다보면 훨씬 구체적인 과정이 있습니다.

모델이 예측합니다. 예측이 틀린 정도를 손실로 계산합니다. 손실이 각 가중치에 의해 어떻게 달라지는지 기울기로 확인합니다. 그리고 그 반대 방향으로 가중치를 조금 움직입니다. 이 일을 수천 번, 수만 번, 때로는 훨씬 더 많이 반복합니다.

그 반복 속에서 처음에는 엉뚱한 예측을 하던 모델이 점점 나아집니다. 숫자 이미지를 보고 아무렇게나 답하던 모델이 획의 패턴을 알아보기 시작합니다. 문장을 숫자로만 보던 모델이 단어의 쓰임새를 조금씩 구분하기 시작합니다. 나중에 우리가 Transformer와 LLM을 배울 때도 이 큰 원리는 사라지지 않습니다. 거대한 언어 모델 역시 예측하고, 틀린 정도를 계산하고, 기울기를 따라 파라미터를 조정하며 학습합니다.

경사하강법을 이해하면 딥러닝은 갑자기 덜 신비로워집니다. 모델이 똑똑해지는 과정은 마법이 아니라, 틀린 만큼 고치고 다시 시도하는 반복입니다.

다만 아직 한 가지가 남았습니다. 우리는 기울기가 중요하다고 말했습니다. 기울기의 부호와 크기가 가중치 업데이트를 결정한다고도 했습니다. 그런데 이 기울기는 정확히 어떻게 구할까요?

그 질문에 답하려면 미분을 만나야 합니다. 다음 장에서는 미분을 어려운 공식이 아니라 "작은 변화가 결과를 얼마나 바꾸는지 보는 도구"로 이해해 보겠습니다.

책 목록

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

전체 목차 보기

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

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

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

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

참여하기