딥러닝 신경망
경사하강법을 사용한 신경망 학습법 (선형)
안녕하세요! 딥러닝 신경망과 경사하강법에 대해 알아보는 시간을 가져보겠습니다. 이번 글에서는 선형 회귀 모델을 예시로 경사하강법을 사용한 신경망 학습법을 쉽게 이해할 수 있도록 설명하겠습니다.
선형 회귀 모델이란?
선형 회귀 모델은 데이터 속에서 패턴을 찾아 가장 잘 맞는 직선을 그리는 것을 목표로 합니다. 간단하게 말해, 주어진 입력(feature)과 출력(target) 사이의 선형 관계를 모델링하는 것이죠.
PyTorch를 이용한 선형 회귀 모델 구현
PyTorch의 nn.Module을 사용하여 선형 회귀 모델을 구현하는 방법을 알아봅시다.
import torch
import torch.nn as nn
class LinearRegressionModel(nn.Module):
def __init__(self, input_dim, output_dim):
# nn.Module 에 생성자 메서드를 호출
# super() 부모 클래스에 특정 함수 호출
super().__init__()
self.linear = nn.Linear(input_dim, output_dim)
# 데이터가 정상적으로 입력 됐다면, 어떻게 처리할지 정의하는 함수(순전파(forward pass))
# 즉 입력값이 정상이라면. 가중치 행렬과 입력값을 곱하고 편향을 더한 값을 반환
def forward(self, x):
return self.linear(x)
위 코드는 LinearRegressionModel 클래스를 정의합니다. nn.Module을 상속받아 신경망 모델의 기본 구조를 갖추고, nn.Linear를 사용하여 선형 레이어를 정의합니다. forward 함수는 입력 데이터 x가 모델을 통과하는 순전파 과정을 정의합니다.
순전파 테스트
작성한 모델에 임의의 입력값을 넣어 순전파가 잘 작동하는지 확인해 보겠습니다.
# 순전파 테스트
x = torch.tensor([[1.0, 2.0, 3.0, 4.0]])
model = LinearRegressionModel(input_dim=4, output_dim=6)
output = model(x)
print(output)
위 코드를 실행하면 모델에 입력 텐서 x가 전달되어 선형 레이어를 거친 출력 텐서가 출력됩니다.
신경망 학습 4단계 (경사하강법)
이제 경사하강법을 사용하여 신경망을 학습하는 4단계를 알아보겠습니다.
- 입력 (순전파): 모델에 입력값을 넣어 예측값을 계산합니다.
- 손실 계산: 예측값과 실제값을 비교하여 손실(loss)을 계산합니다. 손실 함수는 모델의 예측이 얼마나 빗나갔는지 나타내는 지표입니다.
- 기울기 계산 (역전파): 손실을 줄이기 위해 각 가중치가 얼마나 영향을 미쳤는지 계산합니다. 이 과정이 역전파(backpropagation)이며,
loss.backward()함수를 통해 자동으로 수행됩니다. 역전파는 손실 함수의 기울기(gradient)를 각 가중치에 대해 미분하여 계산합니다. - 가중치 업데이트: 계산된 기울기를 이용하여 가중치를 업데이트하여 손실을 줄여나갑니다. 옵티마이저(optimizer)의
step()함수를 통해 가중치가 업데이트됩니다.
경사하강법 시각화
경사하강법을 좀 더 직관적으로 이해하기 위해 간단한 손실 함수를 정의하고 경사하강법을 시각화해보겠습니다.
import numpy as np
import matplotlib.pyplot as plt
# 손실 함수 정의 (예: f(x, y) = x^2 + y^2)
def loss_function(x, y):
return x**2 + y**2
# 손실 함수의 기울기 계산
def gradient(x, y):
return np.array([2*x, 2*y])
# 경사하강법 함수
def gradient_descent(starting_point, learning_rate, num_iterations):
points = [starting_point]
point = starting_point
for _ in range(num_iterations):
grad = gradient(point[0], point[1])
point = point - learning_rate * grad
points.append(point)
return np.array(points)
# 초기값, 학습률, 반복 횟수 설정
starting_point = np.array([3.0, 4.0])
learning_rate = 0.1
num_iterations = 50
# 경사하강법 실행
points = gradient_descent(starting_point, learning_rate, num_iterations)
# 손실 함수 시각화
x = np.linspace(-5, 5, 400)
y = np.linspace(-5, 5, 400)
X, Y = np.meshgrid(x, y)
Z = loss_function(X, Y)
plt.figure(figsize=(10, 6))
plt.contour(X, Y, Z, levels=50, cmap='jet')
plt.plot(points[:, 0], points[:, 1], 'ro-', markersize=5, linewidth=2, label='Gradient Descent Path')
plt.scatter(0, 0, color='blue', s=100, label='Minimum Cost Point')
plt.title('Gradient Descent Optimization')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.colorbar()
plt.show()

위 코드는 2차원 손실 함수 f(x, y) = x2 + y2 에 대해 경사하강법이 최솟값을 찾아가는 과정을 시각적으로 보여줍니다. 붉은색 선은 경사하강법이 이동한 경로를 나타내며, 파란색 점은 최솟값 지점입니다.
경사하강법의 한계
경사하강법은 강력한 최적화 알고리즘이지만, 항상 최솟값을 보장하는 것은 아닙니다. 몇 가지 주의해야 할 점이 있습니다.
- 1. 지역 최소값(Local Minimum)에 빠질 가능성
- 손실 함수가 비선형적이거나 복잡할 경우, 여러 개의 지역 최소값이 존재할 수 있습니다. 경사하강법은 기울기가 0이 되는 지점을 찾아 이동하기 때문에, 전역 최소값(Global Minimum) 대신 지역 최소값(Local Minimum)에 멈출 수 있습니다.
- 2. 안장점(Saddle Point) 문제
- 안장점은 기울기가 0이지만 최소값이 아닌 지점으로, 방향에 따라 다시 증가할 수 있습니다. 경사하강법이 안장점에 도달하면 더 이상 이동하지 않고 멈출 수도 있습니다.
- 3. 학습률(Learning Rate)에 따른 문제
- 학습률이 너무 크면 최소값을 지나쳐 계속 진동할 수 있습니다. 반대로 학습률이 너무 작으면 학습 속도가 느려지고, 지역 최소값에서 멈출 수도 있습니다. 적절한 학습률을 찾는 것이 중요합니다.
- 4. 손실 함수의 형태에 따라 최솟값을 찾기 어려움
- 손실 함수가 볼록(Convex)한 형태라면 전역 최솟값을 찾을 수 있지만, 실제 신경망에서는 비볼록(Non-Convex)한 함수가 많아 전역 최솟값을 보장할 수 없습니다.
이번 글에서는 딥러닝 신경망의 기본적인 학습 방법인 경사하강법과 선형 회귀 모델을 함께 알아보았습니다. 경사하강법은 딥러닝 학습의 핵심 알고리즘이며, 다양한 문제에 적용될 수 있습니다. 하지만 한계점도 명확히 이해하고 사용하는 것이 중요합니다. 다음 글에서는 경사하강법의 한계를 보완하는 방법에 대해 알아보도록 하겠습니다.
'Python > Deep Learning' 카테고리의 다른 글
| 딥러닝 유사도 측정 (0) | 2025.02.17 |
|---|---|
| [PyTorch] 경사하강법 코드예제 (0) | 2025.02.11 |
| [PyTorch] 텐서 연산 (0) | 2025.02.06 |
| [딥러닝] PyTorch에서 Tensor 개념 (0) | 2025.02.05 |
| 딥러닝 발전과정,RNN (0) | 2025.02.03 |