Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발자가 될래요

[플레이데이터 SK네트웍스 Family AI 캠프 23기] 6주차 회고 본문

SKN_Family_AI

[플레이데이터 SK네트웍스 Family AI 캠프 23기] 6주차 회고

Youcan 2026. 1. 4. 07:28

회고 방식


The four Fs

  • FACTS(사실, 객관) : 이번 일주일 동안 있었던 일, 내가 한 일
  • FEELINGS(느낌, 주관) : 나의 감정적인 반응, 느낌
  • FINDINGS(배운 것) : 그 상황으로부터 내가 배운 것, 얻은 것
  • FUTURE(미래) : 배운 것을 미래에는 어떻게 적용할 지

FACTS
머신러닝에 이어서 딥러닝을 배우게 됐다. 머신러닝과 딥러닝의 정의와 차이점, Pytorch의 기본적인 함수와 메서드 사용, 단층 퍼셉트론과 다층 퍼셉트론, 활성화 함수, 다차원 배열 계산에 대해 배우고 실습을 진행하였다.


FEELINGS
역시 생각했던 것처럼 쉽지 않다. 머신러닝도 굉장히 어렵게 느껴졌는데, 딥러닝은 내가 코드를 작성하고 실행했을 때, 내부의 일이 어떻게 진행되어 이런 결과가 나온건지 명확하게 알지 못하고 값을 보다보니 더 어렵게 느껴지는 것 같다.

 

FINDINGS

다층 퍼셉트론

 

 

다층 퍼셉트론(Multi-Layer Perceptron, MLP)은 여러 개의 퍼셉트론을 연결하여 비선형 문제를 해결한다. 입력층, 은닉층, 출력층을 가지고 있으며 은닉층에서 비선형 활성화 함수를 사용하여 복잡한 패턴을 학습할 수 있다. 각 층은 활성화 함수를 사용하여 출력을 계산한다.

 

더보기
import torch                        # pytorch 기본 라이브러리 (텐서 연산, 자동 미분 등)
import torch.nn as nn               # 신경망 레이어, 활성화/손실함수
import torch.optim as optim         # 가중치 업데이트 (최적화 알고리즘)

X = [[0, 0], [0, 1], [1, 0], [1, 1]]
y = [[0], [1], [1], [0]]

X = torch.FloatTensor(X)            # 입력 데이터 Tensor
y = torch.FloatTensor(y)            # 정답 레이블 데이터 Tensor

print(X.shape)
print(y.shape)

# 모델 정의(다층 퍼셉트론)
model = nn.Sequential(
    nn.Linear(2, 4),         # 입력 2개 -> 은닉층 4개
    nn.Tanh(),              # 은닉층 활성화함수 (tanh는 신경망에 비선형성을 추가해준다.)
    nn.Linear(4, 1),          # 은닉층 4개 -> 출력 1
    nn.Sigmoid()            # 출력층 활성화함수 (출력값을 0~1 확률로 변환)
)

# 손실함수와 옵티마이저 설정
criterion = nn.BCELoss()

optimizer = optim.SGD(      # 확률적 경사하강법 SGD
    model.parameters(),     # 학습할 가중치와 편향
    lr = 0.1,               # 학습률
)

# 학습 루프
for epoch in range(10000):
    optimizer.zero_grad()               # 이전 step에서 계산된 gradient를 0으로 초기화
    output = model(X)                   # 순전파(forward pass) : 입력 X값을 모델에 통과시켜 예측값 계산
    loss = criterion(output, y)         # 예측값(output)과 실제값(y)의 차이 측정 = 손실 계산
    loss.backward()                     # 역전파(backpropagation) : 손실을 기준으로 각 파라미터 gradient 계산
    optimizer.step()                    # 가중치 업데이트 : 계산된 gradient를 사용해 파라미터 업데이트

    if epoch % 1000 == 0:
        print(f"Epoch {epoch}, Loss: {loss.item():.4f}")

# 결과 확인
with torch.no_grad():                   # 평가 단계에서는 gradient 계산 하지않음 (메모리 절약 및 속도 향상)
    prediction = model(X).round()       # 모델 출력이 0~1 확률 값. round()는 반올림 (0.5 기준으로 0/1 반환)
    print("최종 예측 :", prediction)

 

Epoch 0, Loss: 0.7096
Epoch 1000, Loss: 0.0851
Epoch 2000, Loss: 0.0217
Epoch 3000, Loss: 0.0118
Epoch 4000, Loss: 0.0080
Epoch 5000, Loss: 0.0060
Epoch 6000, Loss: 0.0048
Epoch 7000, Loss: 0.0040
Epoch 8000, Loss: 0.0035
Epoch 9000, Loss: 0.0030
최종 예측 : tensor([[0.],
        [1.],
        [1.],
        [0.]])

 

XOR 정도 되는 비선형 문제를 해결하려면 은닉층 노드 수가 최소 2개 이상이어야 한다.

ReLU 활성화함수 대신 tanh 함수 사용시 초기 학습 안정성에 도움이 된다.

출력층의 Sigmoid 활성화함수 + BCE 손실함수는 이진 분류에 매우 적합하다.

활성화함수는 대략 이렇다.

  • 시그모이드(Sigmoid) 함수
    • 시그모이드 함수는 출력값을 0과 1 사이로 압축하는 비선형 함수이다. 주로 이진 분류에서 사용된다.
    • 단, 시그모이드 함수는 경사하강법을 사용하여 학습할 때 기울기가 매우 작은 값으로 변할 수 있어 학습이 느려지는 기울기 소실 문제가 발생할 수 있다.

Sigmoid 함수

 

x가 커질수록 분모의 e^(-x)값이 점점 0에 가까워지고, 출력이 1에 가까워진다.

x가 작아질수록 e^(-x)값이 점점 커지면서 출력이 0에 가까워진다.

즉 Sigmoid 함수는 입력 신호의 크기를 활성화 확률에 따라 0~1사이의 값으로 표현해주는 함수이다.

  • ReLU 함수
    • ReLU(Rectified Linear Unit)는 입력값이 음수나 0이면 0으로 변환하고, 양수는 그대로 출력한다. 비선형성을 제공하면서도 계산이 간단하여 딥러닝에서 자주 사용된다.
    • 시그모이드에서 발생할 수 있는 기울기 소실 문제를 해결하고 학습 속도를 빠르게 만든다.

 

더보기

ReLU함수

def relu(x):
    return np.maximum(0, x)

x = np.linspace(-10, 10, 100)
y = relu(x)
plt.plot(x, y)
plt.title("ReLU Function")
plt.show()
  • Leaky ReLU
    • ReLU (Rectified Linear Unit)의 변형된 형태로, ReLU의 단점인 죽은 뉴런 문제 (Dying ReLU Problem)를 해결하기 위해 고안되었다.
    • α는 작은 양수(일반적으로 0.01)로 설정한다.

  • Tanh (Hyperbolic Tangent)
    • 시그모이드(Sigmoid) 함수의 변형된 형태로, 출력 범위가 -1에서 1까지 확장된 함수이다.
    • 입력값 x가 양수면 +쪽으로, 음수면 -쪽으로 이동한다.

더보기
def tanh(x):
    return np.tanh(x)

x = np.linspace(-10, 10, 100)
y = tanh(x)
plt.plot(x, y)
plt.title("Tanh Function")
plt.show()

 

출력층의 활성화 함수

출력층에서는 주로 항등 함수, 시그모이드 함수, 소프트맥스 함수. 이 3가지의 활성화 함수가 사용된다.

  • 세 가지 함수를 주로 사용하는 이유
    1. 문제 유형에 최적화
      • 항등 함수 (Identity Function): 회귀 문제에서, 연속적인 값을 그대로 출력할 때 적합하다.
      • 시그모이드 함수 (Sigmoid Function): 이진 분류나 다중 레이블 분류에서, 각 클래스의 존재 확률을 0과 1 사이로 표현할 때 유용하다.
      • 소프트맥스 함수 (Softmax Function): 다중 클래스 분류에서, 각 클래스에 대한 예측 확률 분포를 생성하기 위해 사용된다.
    • 각 활성화 함수의 짝이 되는 손실함수
      • Sigmoid = BCE(Binary Cross Entropy)
      • Softmax = CCE(Categorical Cross Entropy)

출력층의 뉴런 수는 해결하려는 문제에 따라 결정된다.

  • 회귀 문제: 1개 (연속된 값 출력)
  • 이진 분류: 1개 또는 2개 (시그모이드 사용 시 1개, 소프트맥스 사용 시 2개)
  • 다중 클래스 분류: 클래스 개수와 동일한 뉴런 개수 (소프트맥스 사용)

 

 

 

FUTURE
모든 것이 새롭고 모르는 것만 나온다. 앞으로 프로젝트를 시작하게 될텐데 과연 무엇을, 어떻게 해야할지 감이 잘 오지 않는다. 수업시간에 최대한의 집중력으로 학습하는 것이 중요할 것 같다. 그래도 지난 2주동안은 크리스마스와 신정이 있어서 심적으로는 편안한 느낌이 있었는데, 다음주부터는 휴일이 없기 때문에 심적으로, 정신적으로 쉽지 않은 일주일이 될 것 같다.