본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

https://abit.ly/lisbva

공부 시작

강의 종료

수강 인증

학습 인증샷

강의 후기

 

딥러닝 추천 모델의 필요성

비선형적인 패턴 학습

비정형 데이터 학습

병렬처리 분산컴퓨팅 gpu 사용 등 대규모 데이터 처리에 효율적

 

ch03-01. 딥러닝이란

적절한 수의 뉴런과 활성함수가 있다면, 어디든 갈 수 있어

 

적절한 수의 뉴런과 활성함수는 어떻게 정하지?

=>

1. 경험 기반 설정

점진적 실험

성능 vs 파라미터 수 트레이드오프

 

결국 여러가지 경우의 수를 테스트 해야한다

이 점이 딥러닝 모델의 블랙박스와 유사한 경우라고 생각한다.

어떻게 계산해서 추천한지를 모르는 것 처럼

뉴런을 어떻게 구성해야 잘 추천할 수 있는지 또한 모험을 통해 알아가야한다.

그래서 더더욱 데이터 최적화와 학습 최적화가 중요하다.

 

정해진 공식이 없어 간단한 가이드라인을 따르지만 결국 경험을 기반한 튜닝이 중요하다.

데이터가 적으면 간단하게 시작하고

데이터가 크고 복잡하면 더 깊고 넓게 시도해볼 수 있다.

 

다양한 layer, batchnorm, dropout, activation function 들을 조합 별 학습시키고 최고의 결과를 출력하는 파이토치 베이스 코드

import torch
import torch.nn as nn
import torch.optim as optim
import itertools

# 1. 학습 데이터 준비 (y = 2x + 1)
X = torch.tensor([[1.0], [2.0], [3.0], [4.0]])
y = torch.tensor([[3.0], [5.0], [7.0], [9.0]])

# 2. 실험 파라미터
hidden_layer_configs = [
    [32],
    [64, 32],
    [128, 64, 32]
]

activation_functions = {
    'ReLU': nn.ReLU,
    'Tanh': nn.Tanh,
    'Sigmoid': nn.Sigmoid
}

batchnorm_options = [True, False]
dropout_options = [True, False]
dropout_prob = 0.3  # 고정

# 3. MLP 클래스 정의
class MLP(nn.Module):
    def __init__(self, input_dim, hidden_dims, output_dim, activation_fn, use_bn=False, use_dropout=False, dropout_p=0.3):
        super(MLP, self).__init__()
        layers = []
        prev_dim = input_dim
        for dim in hidden_dims:
            layers.append(nn.Linear(prev_dim, dim))
            if use_bn:
                layers.append(nn.BatchNorm1d(dim))
            layers.append(activation_fn())
            if use_dropout:
                layers.append(nn.Dropout(p=dropout_p))
            prev_dim = dim
        layers.append(nn.Linear(prev_dim, output_dim))
        self.model = nn.Sequential(*layers)

    def forward(self, x):
        return self.model(x)

# 4. 학습 함수
def train(model, X, y, epochs=500, lr=0.01):
    criterion = nn.MSELoss()
    optimizer = optim.SGD(model.parameters(), lr=lr)
    for epoch in range(epochs):
        model.train()
        pred = model(X)
        loss = criterion(pred, y)

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

# 5. 조합별 실험
best_loss = float('inf')
best_model_state = None
best_config = None

combinations = itertools.product(
    hidden_layer_configs,
    activation_functions.items(),
    batchnorm_options,
    dropout_options
)

print("모든 조합 실험 시작...\n")

for hidden_dims, (act_name, act_fn), use_bn, use_dropout in combinations:
    model = MLP(
        input_dim=1,
        hidden_dims=hidden_dims,
        output_dim=1,
        activation_fn=act_fn,
        use_bn=use_bn,
        use_dropout=use_dropout,
        dropout_p=dropout_prob
    )
    loss = train(model, X, y)
    print(f"Structure {hidden_dims}, Act {act_name}, BN {use_bn}, Dropout {use_dropout} → Loss: {loss:.6f}")

    if loss < best_loss:
        best_loss = loss
        best_model_state = model.state_dict()
        best_config = {
            'hidden_dims': hidden_dims,
            'activation': act_name,
            'batchnorm': use_bn,
            'dropout': use_dropout
        }

# 6. 저장
torch.save({
    'config': best_config,
    'state_dict': best_model_state
}, "best_model.pt")

# 7. 결과 출력
print("\n✅ Best Model Configuration:")
print(f"  Structure   : {best_config['hidden_dims']}")
print(f"  Activation  : {best_config['activation']}")
print(f"  BatchNorm   : {best_config['batchnorm']}")
print(f"  Dropout     : {best_config['dropout']}")
print(f"  Final Loss  : {best_loss:.6f}")
print("📦 모델이 best_model.pt에 저장되었습니다.")

 

 

실제 서비스에서는 layer의 순서 또한 고려해야겠지만 좋은 gpu를 가지고 빨리 처리하면,,ㅋ,ㅋ