🤖 AI/ML

Neural Network

신경망

생물학적 뉴런 모방. 입력층, 은닉층, 출력층. 딥러닝 기반 구조.

📖 상세 설명

Neural Network(신경망)는 인간 뇌의 뉴런 구조를 모방한 기계학습 알고리즘입니다. 입력층(Input Layer), 은닉층(Hidden Layer), 출력층(Output Layer)으로 구성되며, 각 층의 노드(뉴런)들이 가중치로 연결되어 데이터의 패턴을 학습합니다.

1943년 McCulloch-Pitts 뉴런 모델에서 시작되어, 1986년 역전파(Backpropagation) 알고리즘의 재발견으로 실용화되었습니다. 2012년 AlexNet의 ImageNet 대회 우승 이후 딥러닝 시대가 본격화되었고, 현재 모든 AI 혁신의 기반 기술이 되었습니다.

신경망의 핵심은 순전파(Forward Propagation)로 예측을 생성하고, 손실 함수로 오차를 계산한 뒤, 역전파(Backpropagation)로 기울기를 구해 경사하강법으로 가중치를 업데이트하는 학습 과정입니다. 활성화 함수(ReLU, Sigmoid 등)가 비선형성을 부여합니다.

실무에서는 목적에 따라 CNN(이미지), RNN/Transformer(시퀀스), GAN(생성) 등 특화된 아키텍처를 선택합니다. PyTorch, TensorFlow 프레임워크로 구현하며, 은닉층이 2개 이상이면 '딥' 러닝이라 부릅니다.

💻 코드 예제

# PyTorch로 구현하는 기본 신경망
# pip install torch

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

# 간단한 신경망 정의
class SimpleNN(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(SimpleNN, self).__init__()
        # 입력층 -> 은닉층 1
        self.layer1 = nn.Linear(input_size, hidden_size)
        self.relu1 = nn.ReLU()
        # 은닉층 1 -> 은닉층 2
        self.layer2 = nn.Linear(hidden_size, hidden_size // 2)
        self.relu2 = nn.ReLU()
        # 은닉층 2 -> 출력층
        self.output = nn.Linear(hidden_size // 2, output_size)

    def forward(self, x):
        x = self.relu1(self.layer1(x))  # 첫 번째 은닉층
        x = self.relu2(self.layer2(x))  # 두 번째 은닉층
        x = self.output(x)              # 출력층
        return x

# 모델 생성
model = SimpleNN(input_size=784, hidden_size=256, output_size=10)
print(f"모델 구조:\n{model}")

# 손실 함수와 옵티마이저 정의
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 학습 루프 예시
def train_step(model, data, target):
    model.train()
    optimizer.zero_grad()           # 기울기 초기화
    output = model(data)            # 순전파
    loss = criterion(output, target) # 손실 계산
    loss.backward()                 # 역전파 (기울기 계산)
    optimizer.step()                # 가중치 업데이트
    return loss.item()

# 파라미터 수 확인
total_params = sum(p.numel() for p in model.parameters())
print(f"총 파라미터 수: {total_params:,}")
# 총 파라미터 수: 235,146

🗣️ 실무에서 이렇게 말하세요

💬 아키텍처 설계 회의에서
"분류 문제니까 기본 MLP로 시작하고, 성능이 부족하면 은닉층을 늘리거나 Dropout으로 regularization을 추가해봅시다. 이미지 데이터라면 CNN으로 바꾸는 게 맞고요."
💬 면접에서
"신경망은 순전파로 예측하고, 손실 함수로 오차를 계산한 뒤, 역전파로 기울기를 구해 경사하강법으로 가중치를 업데이트합니다. 활성화 함수가 비선형성을 부여하는데, 요즘은 ReLU가 vanishing gradient 문제가 적어서 많이 씁니다."
💬 디버깅 상황에서
"Loss가 줄지 않으면 learning rate 문제일 수 있어요. 먼저 1e-3에서 시작해서 조절하고, gradient가 폭발하면 gradient clipping을 적용해보세요."

⚠️ 흔한 실수 & 주의사항

무조건 깊은 네트워크가 좋다고 생각

레이어를 무작정 늘리면 overfitting, vanishing gradient 문제가 발생합니다. 데이터 양과 복잡도에 맞는 적절한 깊이가 중요합니다.

데이터 정규화 누락

입력 데이터의 스케일이 다르면 학습이 불안정해집니다. BatchNorm 사용이나 입력 데이터 표준화(mean=0, std=1)가 필수입니다.

올바른 접근법

간단한 모델로 시작해서 점진적으로 복잡도를 높이세요. 학습/검증 곡선을 모니터링하고, Early Stopping과 정규화 기법을 함께 사용하세요.

🔗 관련 용어

📚 더 배우기