딥러닝 모델을 훈련할 때 가장 중요한 것 중 하나가 바로 하이퍼파라미터(Hyperparameter) 입니다. 하지만 많은 초보자들이 하이퍼파라미터의 개념을 단순히 “조정해야 하는 값” 정도로만 이해하고 있습니다. 실제로 하이퍼파라미터는 모델이 손실 함수(loss function)의 최적점을 찾아가는 과정에서 중요한 역할을 합니다.
이번 글에서는 하이퍼파라미터가 학습 과정에서 어떻게 작용하는지를 쉽게 설명하고, 직접 코드로 구현해보며 감을 잡을 수 있도록 구성했습니다.
1. 배치 크기 (Batch Size)란?
배치 크기(batch size) 는 손실 함수가 한 번에 처리하는 데이터의 양을 의미합니다. 배치 크기를 조절하면 손실 함수가 얼마나 자주 업데이트되는지가 달라집니다.
배치 크기가 학습에 미치는 영향
- 작은 배치 크기 → 업데이트가 자주 이루어지지만, 기울기가 흔들릴 가능성이 있음 (노이즈 증가).
- 큰 배치 크기 → 더 정확한 기울기를 계산할 수 있지만, 업데이트가 적어 속도가 느려질 수 있음.
배치 크기 코드 예제
data = [i for i in range(1, 101)] # 예제 데이터
batch_size = 10 # 배치 크기
for i in range(0, len(data), batch_size):
batch = data[i:i+batch_size]
print(f"Batch: {batch}")
이 코드를 실행하면 데이터가 10개씩 묶여서 처리되는 것을 확인할 수 있습니다.
2. 에포크 수 (Epochs)란?
에포크(epochs) 는 모델이 주어진 데이터셋을 몇 번 반복해서 학습할지 결정하는 값입니다.
에포크가 학습에 미치는 영향
- 에포크 수가 적으면 → 최적점을 찾기 전에 학습이 끝나서 성능이 낮을 수 있음.
- 에포크 수가 많으면 → 불필요한 반복으로 과적합(overfitting)될 가능성이 있음.
에포크 코드 예제
data = [1, 2, 3, 4, 5] # 간단한 데이터
epochs = 3 # 에포크 수
for epoch in range(epochs):
for item in data:
print(f"Epoch {epoch+1}, Data: {item}")
이 코드를 실행하면 같은 데이터를 여러 번 학습하는 것을 볼 수 있습니다.
3. 옵티마이저 (Optimizer)란?
옵티마이저(Optimizer) 는 손실 함수의 기울기를 따라가며 최적의 가중치를 찾는 알고리즘입니다.
대표적인 옵티마이저
- SGD (확률적 경사 하강법): 기울기를 따라 한 번에 일정한 크기로 이동합니다.
- Adam: 기울기의 변화량까지 고려하여 효율적으로 이동합니다.
옵티마이저 코드 예제 (SGD 구현)
current_value = 10 # 초기값
learning_rate = 0.1 # 학습률
def loss_function(x): # 손실 함수
return x ** 2
def gradient(x): # 손실 함수의 기울기
return 2 * x
for step in range(10): # 10번 업데이트
grad = gradient(current_value)
current_value -= learning_rate * grad # 경사 하강법 업데이트
print(f"Step {step+1}: Value = {current_value}, Loss = {loss_function(current_value)}")
4. 드롭아웃 비율 (Dropout Rate)란?
드롭아웃(Dropout) 은 모델이 특정 뉴런을 랜덤하게 비활성화하여 과적합을 방지하는 방법입니다.
드롭아웃 코드 예제
import random
neurons = [1, 2, 3, 4, 5] # 예제 뉴런 값
dropout_rate = 0.4 # 드롭아웃 비율
active_neurons = [n for n in neurons if random.random() > dropout_rate]
print(f"Active Neurons: {active_neurons}")
5. 정규화 계수 (Regularization Parameter)란?
정규화(Regularization) 는 모델이 너무 복잡해지는 것을 방지하는 역할을 합니다.
정규화 코드 예제
weights = [0.5, -0.3, 0.8] # 가중치
l2_lambda = 0.01 # L2 정규화 계수
def loss_function(weights):
mse_loss = sum(w**2 for w in weights) # MSE 계산
l2_penalty = l2_lambda * sum(w**2 for w in weights) # L2 정규화 추가
return mse_loss + l2_penalty
print(f"Loss with Regularization: {loss_function(weights)}")
6. 활성화 함수 (Activation Function)란?
활성화 함수(Activation Function) 는 뉴런이 출력할 값을 결정하는 역할을 합니다.
활성화 함수 코드 예제
def relu(x):
return max(0, x)
def sigmoid(x):
import math
return 1 / (1 + math.exp(-x))
inputs = [-1, 0, 1, 2] # 입력 값
relu_outputs = [relu(x) for x in inputs]
sigmoid_outputs = [sigmoid(x) for x in inputs]
print(f"ReLU Outputs: {relu_outputs}")
print(f"Sigmoid Outputs: {sigmoid_outputs}")
7. 초기화 방법 (Initialization Method)란?
초기화 방법은 모델의 학습 시작 시 가중치를 어떻게 설정할지를 결정합니다.
초기화 코드 예제
import random
neurons = 5 # 뉴런 수
random_initialization = [random.uniform(-1, 1) for _ in range(neurons)]
print(f"Randomly Initialized Weights: {random_initialization}")
마무리
딥러닝 모델을 효과적으로 학습시키려면 하이퍼파라미터가 어떤 역할을 하는지 정확히 이해하고 조절하는 것이 중요합니다.
위에서 설명한 내용과 코드를 직접 실행해보면서, 하이퍼파라미터가 모델 성능에 어떤 영향을 미치는지 감을 잡아보세요!
답글 남기기