AI 입문 ④-④: 경사 하강법(Gradient Descent)이란 무엇인가요? AI가 '오류'를 줄여 학습하는 원리
요약
본 글은 AI 모델의 학습 원리 중 하나인 경사 하강법(Gradient Descent)을 설명합니다. 손실 함수로 오류를 측정하고, 이 오류를 줄이는 방향으로 가중치와 편향 같은 내부 수치를 조정하는 방법을 다룹니다. 핵심적으로 '경사와 반대 방향'으로 업데이트하며, 이때 업데이트 크기를 조절하는 학습률(Learning Rate)의 중요성을 강조합니다.
핵심 포인트
- 경사 하강법은 손실이 작아지는 방향으로 가중치/편향을 조정하는 방법이다.
- 학습 과정은 '현재 위치의 기울기'를 조사하여 낮은 곳으로 나아가는 것에 비유된다.
- 가중치 업데이트 공식: 새로운 가중치 = 현재 가중치 − 학습률 × 경사
- 학습률(Learning Rate)은 하이퍼파라미터로, 학습 진행 속도를 조절하는 설정값이다.
지난 시간에는 손실 함수에 대해 설명했습니다.
손실 함수는 AI의 예측값과 정답 사이의 차이를 수치로 평가하는 것입니다.
하지만, 오류의 크기를 알게 되었다고 해서 예측이 좋아지지는 않습니다.
여기서 다음 의문이 생깁니다.
'오류를 작게 만들기 위해 무엇을, 어떻게 바꿔야 할까?'
이번 시간에는 그 방법인 **경사 하강법(Gradient Descent)**에 대해 설명합니다.
마지막으로, 작은 신경망을 실제로 작동시켜 보겠습니다.
경사 하강법이란, 손실이 작아지는 방향을 경사(gradient)로부터 조사하여 가중치(weight)나 편향(bias)을 조금씩 업데이트하는 방법입니다.
신경망의 계산에는 입력에 곱해지는 '가중치'와 그 계산 결과에 더해지는 '편향'이 있습니다.
이러한 수치들에 의해, 동일한 입력값에 대한 예측도 달라집니다.
즉, 여기서 말하는 학습이란 **'예측값이 정답에 가까워지도록 모델 내부의 수치를 조정하는 것'**입니다.
손실 함수로 오류를 측정하고, 경사 하강법으로 그 오류를 줄이도록 조정합니다.
예를 들어, 시야가 좋지 않은 언덕길에서 낮은 곳으로 내려가고 싶다고 상상해 봅시다. 멀리까지 보이지 않아도 발밑의 기울기만 알면, 아래로 내려가는 방향으로 조금씩 나아갈 수 있습니다.
현재 위치의 기울기를 조사한다
↓
아래로 내려가는 방향으로 조금 전진한다
↓
이동한 장소에서 다시 한번 기울기를 조사한다
이 이미지를 학습에 비유하면, 지면의 높이가 '손실'에 해당하고, 현재 위치가 '현재 가중치나 편향의 값'에 해당합니다.
한 번에 정답 장소로 이동하는 것이 아니라, 현재지의 정보를 사용하여 손실이 작은 곳을 찾아 나아갑니다.
참고로, 실제 신경망에서는 지형이 복잡하기 때문에 반드시 가장 낮은 곳에 도달할 수 있는 것은 아닙니다.
여기서 나온 '경사(gradient)'는 언덕길의 기울기에 해당합니다.
가중치를 하나만 생각한다면, **'그 가중치를 조금 늘렸을 때, 손실이 어느 방향으로, 얼마나 변화하는지'**를 나타내는 것이 그 가중치에 대한 경사입니다.
가중치나 편향이 여러 개일 경우에는 각각에 대해 계산한 값들을 모아서 경사라고 부릅니다.
| 경사의 부호 | 현재 가중치를 조금 늘릴 경우 | 손실을 줄이기 위한 업데이트 방향 |
|---|---|---|
| 플러스(+) | 손실이 증가하는 방향 | 가중치를 줄인다 |
| 마이너스(-) | 손실이 감소하는 방향 | 가중치를 늘린다 |
중요한 것은, 경사와 반대 방향으로 나아가는 것입니다.
경사를 사용한다고 해서 그대로 더하는 것이 아니라, 기본적인 경사 하강법에서는 빼기(뺄셈)를 합니다.
새로운 가중치 = 현재 가중치 − 학습률 × 경사
편향도 같은 방식으로 업데이트합니다.
여기서의 기울기는 '가중치의 값과 손실의 관계'에 대한 기울기입니다. 학습 횟수를 가로축으로 한 그래프의 기울기를 사용하는 것이 아닙니다.
새롭게 등장한 **학습률(Learning Rate)**은 경사를 사용하여 업데이트할 때 그 크기를 조정하는 값입니다.
실제 업데이트량은 '학습률 × 경사'로 결정됩니다.
언덕길 예시에서는, 한 걸음의 크기를 조정하는 역할에 해당합니다.
| 학습률 | 발생하기 쉬운 일 |
|---|---|
| 너무 작을 경우 | 업데이트가 작아져서 학습이 잘 진행되지 않는다 |
| ... |
즉, **'크게 하면 빠르게 학습할 수 있다'**는 것이 아닙니다.
가중치나 편향은 학습에 의해 업데이트되는 수치이지만, 학습률은 학습의 진행 방식을 조정하는 설정입니다.
이러한 설정을 **'하이퍼파라미터(Hyperparameter)'**라고 부릅니다.
간단한 예시로 가중치가 어떻게 변하는지 확인해 보겠습니다.
여기서는 계산을 쉽게 하기 위해 편향은 사용하지 않습니다.
예측 = 입력 × 가중치
입력: 1
정답: 2
...
첫 번째 예측은 '1 × 1 = 1'이므로, 정답인 2와 차이가 납니다.
이번에는 지난 시간에 소개한 평균 제곱 오차(MSE)를 사용합니다.
데이터가 1건이므로, 손실은 '예측값과 정답의 차이를 제곱한 값'이 됩니다.
손실 = (1 − 2)² = 1
이 예시에서는, 손실은 (가중치 − 2)² 입니다.
이것을 가중치에 대해 미분하면, 경사는 2 × (가중치 − 2)가 됩니다.
처음 가중치는 1이므로, 경사는 -2입니다.
학습률을 0.1로 하면, 가중치는 다음과 같이 업데이트됩니다.
새로운 가중치 = 1 − 0.1 × (−2)
= 1.2
가중치가 늘어났으므로, 새로운 예측값도 1.2가 됩니다.
업데이트 후 손실 = (1.2 − 2)²
= 0.64
손실이 1에서 0.64로 작아졌습니다.
매번, 그 시점의 가중치로부터 경사를 다시 계산하고 업데이트를 계속하면 다음과 같이 됩니다.
| 업데이트 횟수 | 가중치 = 이번 예측 | 손실 |
|---|---|---|
| 0회 | 1.00000 | 1.00000 |
| ... | ||
| 이 예시에서는, 가중치가 2에 가까워질수록 예측이 정답에 가까워지고, 손실도 작아집니다. |
여기서, 신경망(Neural Network) 학습에서 자주 등장하는 또 하나의 용어를 소개합니다.
오차 역전파법 (Backpropagation) 입니다.
신경망에는 수많은 가중치(weight)와 편향(bias)이 있습니다.
각각의 기울기(gradient)를 출력 측에서 입력 측으로 계산을 추적하며 효율적으로 구하는 메커니즘이 오차 역전파법입니다.
기울기 하강법(Gradient Descent)과는 역할이 다릅니다.
| 이름 | 역할 |
|---|---|
| 오차 역전파법 | 각 파라미터에 대한 손실의 기울기를 계산한다 |
| 기울기 하강법 | 계산된 기울기를 사용하여 파라미터를 업데이트한다 |
'기울기를 계산하는 처리' 와 '가중치를 업데이트하는 처리' 는 별개라는 점을 염두에 두면 이후 코드가 읽기 쉬워집니다.
여기까지의 흐름을 정리하면 다음과 같습니다:

이 처리를 반복함으로써 신경망 학습이 진행됩니다.
여기서는 PyTorch를 사용하여 실제로 동작시켜 보겠습니다.
이번에 학습할 관계는 '입력을 2배하여 1을 더하는' 것입니다.
이미지는 다음과 같습니다:
입력: 0.00 → 정답: 1.0
입력: 0.25 → 정답: 1.5
입력: 0.50 → 정답: 2.0
...
이 정도의 관계라면, 더 단순한 모델로도 충분하지만, 이번에는 '지금까지 설명한 메커니즘이 코드에서 어디에 해당하는지' 를 확인하기 위해 일부러 신경망을 사용합니다.
구성은 다음과 같습니다:
입력 1개 → 은닉층 8개 (ReLU) → 출력 1개
ReLU 함수를 사용하므로, 다음 기사를 읽어보시면 좋을 것 같습니다.
게시된 코드의 동작 확인 환경은 Python3.10.6/PyTorch2.10.0+cu130입니다.
GPU나 CUDA가 없어도 작동하도록 했습니다.
아래 내용을 neural_network_intro.py로 저장합니다:
import platform
import torch
from torch import nn
...
저장한 후 아래 명령어로 실행합니다:
python neural_network_intro.py
동작 확인 환경에서는 다음과 같이 나왔습니다:
학습 전 손실: 3.697508e+00
학습 후 손실: 5.570655e-13
입력: 0.2, 예측: 1.400, 정답: 1.400
...
e-13은 '10의 마이너스 13승'을 나타내는 표기입니다. 학습 후 손실은 0에 매우 가까운 값이 되었습니다. 또한, 학습에 사용하지 않은 입력 0.2와 0.8에 대해서도 각각 정답인 1.4와 2.6에 가까운 예측이 나왔습니다.
표시 자릿수로는 일치하지만, 내부의 값이 완전히 같다는 의미는 아닙니다.
모델의 예측 처리에 '2배하여 1을 더하는' 공식을 직접 작성한 것은 아닙니다.
입력과 정답 쌍을 사용하여 모델 내부의 가중치와 편향을 업데이트한 결과입니다.
참고로, 코드 끝에 있는 expected는 결과를 확인하기 위한 정답 계산이며, 모델 예측에는 사용되지 않습니다.
※ 초기값이나 PyTorch 버전, 실행 환경에 따라 세부적인 수치는 달라질 수 있습니다.
이번 설명과 코드가 연결되는 부분은 다음입니다:
loss = loss_fn(prediction, y_train) # 오차의 크기를 측정한다
loss.backward() # 기울기를 계산한다
optimizer.step() # 가중치와 편향을 업데이트한다
loss.backward()를 호출만 한다고 해서 가중치가 업데이트되지는 않습니다.
업데이트하는 것은 다음 optimizer.step()입니다.
또한, PyTorch에서는 기울기가 누적되기 때문에, 이번에는 각 회차 계산 전에 optimizer.zero_grad()로 이전의 기울기를 초기화했습니다.
결론부터 말하자면 아닙니다.
우선, 실제 학습에서는 손실이 매번 깔끔하게 내려가지는 않습니다.
예를 들어, 데이터를 작은 묶음으로 나누어 업데이트하는 미니배치 학습(mini-batch learning)에서는 사용하는 데이터의 차이에 따라 손실이 오르내릴 수 있습니다.
게다가, 학습에 사용된 데이터에서 손실이 작다는 것과, 처음 보는 데이터에서도 좋은 예측을 할 수 있는 것은 별개입니다.
학습 데이터에만 너무 맞춰지는 '과적합(Overfitting)' 이 발생할 수도 있으므로, 실제 개발에서는 학습에 사용하지 않은 데이터에서의 평가도 필요합니다.
본 기사에서는 그림 작도에 생성 AI를 사용했습니다。
주식회사 ONE WEDGE는 웹 시스템 개발, SES(System Engineering Service), AI/DX 지원을 수행하는 IT 기업입니다.
생성 AI를 활용한 업무 효율화 및 차세대 시스템 개발에도 주력하고 있으며, 기업의 과제 해결뿐만 아니라 엔지니어 개개인의 성장에도 진심으로 임하고 있습니다.
또한, 기술은 '혼자 배우는 것'이 아니라 '함께 성장하는 것'이라고 생각하여 사내외 커뮤니티 조성에도 힘쓰고 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기