GPT와 함께 공부하는 딥러닝(MLP)

1. 퍼셉트론에서 다층 퍼셉트론으로: 신경망이 비선형 문제를 학습하는 방식

딥러닝을 처음 공부할 때 가장 중요한 질문 중 하나는 왜 층을 여러 개 쌓아야 하는가이다. 단순한 선형 모델로도 어떤 문제는 잘 풀리는데, 어떤 문제는 전혀 풀리지 않는다. 이 차이를 이해하려면 가장 먼저 퍼셉트론과 다층 퍼셉트론을 구분해서 볼 필요가 있다.

신경망은 생물학적 뉴런에서 아이디어를 가져왔지만, 실제로는 입력값에 가중치를 곱하고 더한 뒤 어떤 함수로 변환하는 계산 구조에 가깝다. 이 단순한 계산 단위가 여러 층으로 쌓이면서 복잡한 패턴을 표현하게 되고, 여기서 딥러닝의 핵심이 시작된다.

이 글에서는 생물학적 뉴런에서 출발해 인공신경망의 기본 구조를 살펴보고, 단층 퍼셉트론이 어디까지 할 수 있는지, 왜 XOR 문제에서 실패하는지, 그리고 다층 퍼셉트론이 어떻게 그 한계를 넘어서는지를 순서대로 설명한다. 마지막에는 시그모이드, Tanh, ReLU, Softmax 같은 비선형 활성화 함수가 왜 필요한지도 함께 정리한다.


2. 생물학적 뉴런과 인공 뉴런의 대응 관계

생물학적 뉴런은 수상돌기를 통해 신호를 입력받고, 세포체에서 이를 통합한 뒤, 축삭을 통해 출력 신호를 전달한다. 인공신경망은 이 구조를 수학적으로 단순화한 것이다. 여러 입력이 들어오면 각 입력에 중요도를 나타내는 가중치를 곱하고, 그 합에 편향을 더한 다음, 활성화 함수를 통과시켜 최종 출력을 만든다.

이 과정을 식으로 쓰면 다음과 같다.

[
z = w_1x_1 + w_2x_2 + \cdots + w_nx_n + b
]

[
\hat{y} = f(z)
]

여기서 $x_i$는 입력, $w_i$는 가중치, $b$는 편향, $f$는 활성화 함수다.
가중치는 각 입력이 결과에 얼마나 영향을 주는지를 나타내고, 편향은 결정 경계를 이동시키는 역할을 한다. 활성화 함수는 이 선형 결합 결과를 그대로 내보내지 않고 비선형적으로 변환해, 더 복잡한 관계를 학습할 수 있게 한다.

인공 뉴런의 핵심은 결국 선형 결합과 비선형 변환의 조합이다. 이 구조를 하나만 쓰면 퍼셉트론, 여러 층으로 쌓으면 다층 퍼셉트론이 된다.


3. 퍼셉트론이 중요한 이유

퍼셉트론은 가장 단순한 형태의 인공신경망이다. 구조는 단순하지만, 딥러닝 전체를 이해하는 출발점이 된다. 이유는 분명하다. 신경망이 입력을 받아 어떻게 출력으로 바꾸는지, 학습은 어떤 값을 수정하는 과정인지, 선형 분리가 무엇인지, 비선형성이 왜 필요한지를 퍼셉트론 단계에서 거의 모두 경험할 수 있기 때문이다.

퍼셉트론은 이진 분류 문제를 다루기에 적합하다. 출력이 0 또는 1처럼 나뉘는 문제에서, 입력 공간을 하나의 직선 또는 초평면으로 분리할 수 있다면 퍼셉트론으로 해결 가능하다. 반대로 하나의 직선으로 구분할 수 없는 문제는 단층 퍼셉트론만으로는 해결할 수 없다.

이 지점이 매우 중요하다. 딥러닝이 단순히 층을 많이 쌓은 모델이 아니라, 선형 모델이 갖는 표현 한계를 구조적으로 확장한 모델이라는 사실이 여기서 드러난다.


4. 단층 퍼셉트론으로 AND와 OR를 학습하는 방식

4.1 입력 데이터와 텐서 shape

가장 먼저 다루는 데이터는 논리 연산 AND와 OR이다. 입력은 두 개의 이진값 조합으로 이루어진다.

[
X =
\begin{bmatrix}
0 & 0
0 & 1
1 & 0
1 & 1
\end{bmatrix}
]

각 행은 하나의 샘플이고, 각 샘플은 두 개의 입력 특성을 가진다. 따라서 입력 텐서의 shape는 $(4, 2)$다.
정답 레이블은 이진 분류 결과이므로 다음처럼 shape가 $(4, 1)$인 열벡터로 둔다.

AND의 경우:

[
y =
\begin{bmatrix}
0
0
0
1
\end{bmatrix}
]

OR의 경우:

[
y =
\begin{bmatrix}
0
1
1
1
\end{bmatrix}
]

여기서 FloatTensor를 사용하는 이유는 모델의 출력이 연속적인 실수값으로 계산되고, BCELoss가 실수형 입력을 기대하기 때문이다. 정답이 0과 1이라도 손실 계산은 부동소수점 연산으로 이뤄진다.

4.2 모델 구조

모델은 다음처럼 매우 단순하다.

[
\hat{y} = \sigma(Wx + b)
]

입력 차원이 2이고 출력 차원이 1이므로 선형층은 2개의 입력을 받아 하나의 로그잇을 만든다. 여기에 시그모이드 함수를 적용해 출력값을 0과 1 사이의 확률처럼 해석한다.

시그모이드는 다음과 같다.

[
\sigma(x) = \frac{1}{1 + e^{-x}}
]

즉, 이 구조는 엄밀히 말하면 단층 퍼셉트론의 현대적 구현이라기보다, 시그모이드를 붙인 이진 로지스틱 분류기와 같은 형태다. 하지만 퍼셉트론의 핵심 개념인 선형 결정 경계를 이해하기에는 충분하다.

4.3 손실 함수와 학습

이진 분류에서는 Binary Cross Entropy를 사용한다.

[
L = -\frac{1}{N}\sum_{i=1}^{N}\left(y_i \log(\hat{y}_i) + (1-y_i)\log(1-\hat{y}_i)\right)
]

여기서 $y_i$는 실제 정답, $\hat{y}_i$는 예측 확률이다.
정답이 1인데 예측 확률이 낮거나, 정답이 0인데 예측 확률이 높을수록 손실이 커진다.

학습 루프는 다음 순서를 따른다.

  1. 입력 $X$를 모델에 넣어 예측값 $y_{pred}$를 계산한다.
  2. 예측값과 정답 $y$로 손실을 계산한다.
  3. optimizer.zero_grad()로 이전 step의 gradient를 초기화한다.
  4. loss.backward()로 역전파를 수행해 각 파라미터의 gradient를 구한다.
  5. optimizer.step()으로 파라미터를 업데이트한다.

여기서 zero_grad가 중요한 이유는 PyTorch가 gradient를 누적하기 때문이다. 이전 step의 gradient를 비우지 않으면 현재 step의 gradient에 계속 더해져 잘못된 업데이트가 일어난다.

4.4 정확도 계산 방식

예측값은 시그모이드 출력이므로 0과 1 사이의 연속값이다. 이를 분류 결과로 바꾸기 위해 0.5를 기준으로 threshold를 둔다.

[
\hat{c} =
\begin{cases}
1 & \text{if } \hat{y} \ge 0.5
0 & \text{otherwise}
\end{cases}
]

이렇게 만든 이진 예측값과 실제 레이블을 비교해 정확도를 계산한다.

4.5 왜 AND와 OR는 잘 풀리는가

AND와 OR는 모두 입력 공간에서 하나의 직선으로 분리할 수 있는 문제다. 이를 선형 분리 가능하다고 한다.

예를 들어 AND는 두 입력이 모두 1일 때만 출력이 1이므로, 평면 위에서 한쪽 구석의 점 하나만 분리하면 된다. OR는 둘 중 하나라도 1이면 출력이 1이므로, 반대로 하나의 점만 따로 분리하면 된다. 이런 구조는 단층 퍼셉트론의 결정 경계 하나로 충분하다.

4.6 AI가 추천하는 심화예제

같은 구조에서 활성화 함수를 시그모이드 대신 사용하지 않고, 선형층 출력만 관찰해 보면 모델이 실제로는 어떤 직선을 기준으로 분류하고 있는지 더 분명하게 이해할 수 있다. 또 learning rate를 1에서 0.1, 0.01로 바꿔보면 작은 데이터셋에서 학습 속도와 수렴 패턴이 어떻게 달라지는지도 확인할 수 있다.


5. XOR가 단층 퍼셉트론으로 풀리지 않는 이유

XOR의 정답은 다음과 같다.

[
y =
\begin{bmatrix}
0
1
1
0
\end{bmatrix}
]

즉, 두 입력이 다를 때만 1이다. 이 문제를 평면 위에 찍어 보면 정답 1인 점 두 개가 대각선 방향으로 떨어져 있고, 정답 0인 점도 반대 대각선에 놓인다. 따라서 하나의 직선으로 0과 1을 완전히 분리할 수 없다.

이것이 퍼셉트론의 대표적인 한계다. 선형 모델은 결정 경계가 하나의 직선이기 때문에, XOR처럼 비선형 구조를 가진 문제를 표현할 수 없다.

실제로 학습 결과를 보면 손실이 약 $0.693147$ 근처에서 더 이상 줄지 않고, 정확도도 50% 부근에 머무른다.
이 값은 이진 크로스엔트로피에서 예측이 애매한 상태, 즉 $\hat{y} \approx 0.5$인 경우 자주 나타나는 값이다.

[
-\log(0.5) \approx 0.693147
]

즉 모델은 어디로도 명확히 분류하지 못한 채, 평균적으로 반반에 가까운 예측을 내고 있다는 뜻이다.

여기서 중요한 것은 학습이 안 된 것이 아니라, 모델의 표현력이 부족하다는 점이다. optimizer나 epoch를 더 조정해도 구조 자체가 바뀌지 않으면 XOR는 해결되지 않는다.

5.1 선형 분리와 표현력

단층 퍼셉트론은 입력을 한 번의 선형 변환으로만 처리한다.

[
z = Wx + b
]

이 식이 아무리 잘 학습되어도 여전히 선형 함수다.
시그모이드를 붙여 출력 범위를 0과 1로 압축해도, 결정 경계 자체는 여전히 $z=0$에 해당하는 선형 경계다. 따라서 본질적으로 선형 분리 가능한 문제에만 적합하다.

5.2 AI가 추천하는 심화예제

XOR 데이터의 네 점을 직접 좌표평면에 찍어 보고, 여러 개의 임의 직선을 그어 보면서 왜 하나의 직선으로는 분리할 수 없는지 시각적으로 확인해 보면 이해가 훨씬 빨라진다. 이후 입력을 $x_1, x_2$만 쓰지 않고 $x_1x_2$ 같은 항을 추가해 보면, 특징 공간을 바꿨을 때 선형 모델이 비선형 문제를 풀 수 있게 되는 이유도 함께 볼 수 있다.


6. 다층 퍼셉트론이 XOR를 푸는 원리

6.1 모델 구조

XOR를 해결하기 위해 모델은 은닉층을 하나 추가한다. 구조는 다음과 같다.

[
h = \sigma(W_1x + b_1)
]

[
\hat{y} = \sigma(W_2h + b_2)
]

입력층에서 2차원 입력을 받고, 은닉층에서 2개의 뉴런으로 변환한 뒤, 다시 출력층에서 1개의 값으로 예측한다.
shape 관점에서 보면 다음과 같다.

  • 입력 $X$: $(4, 2)$
  • 첫 번째 선형층 가중치 $W_1$: $(2, 2)$에 대응
  • 은닉 표현 $h$: $(4, 2)$
  • 두 번째 선형층 가중치 $W_2$: $(2, 1)$에 대응
  • 최종 출력 $\hat{y}$: $(4, 1)$

이 구조에서 핵심은 은닉층이 입력 공간을 새로운 표현 공간으로 바꾼다는 점이다. 원래 공간에서는 XOR가 선형 분리되지 않지만, 은닉층을 거치며 표현이 바뀌면 출력층에서 선형 분리가 가능해진다.

6.2 왜 은닉층이 필요한가

은닉층이 없다면 모델은 입력에서 출력까지 한 번의 선형 변환만 수행한다. 하지만 은닉층이 추가되면 여러 개의 선형 변환과 비선형 변환이 합성된다.

[
\hat{y} = \sigma\left(W_2 \sigma(W_1x+b_1) + b_2\right)
]

이 함수는 더 이상 단순한 직선 하나로 표현되지 않는다.
은닉 뉴런 각각이 입력 공간을 다른 방식으로 나누고, 출력층이 이들을 조합해 XOR 같은 비선형 패턴을 표현할 수 있게 된다.

직관적으로 보면 은닉층은 원래 문제를 더 다루기 쉬운 중간 표현으로 바꾸는 장치다. 딥러닝에서 깊은 층이 중요한 이유도 같은 맥락이다. 층이 늘어날수록 데이터는 더 추상적인 표현으로 변환된다.

6.3 XOR 학습 결과가 개선되는 이유

학습 초반에는 여전히 정확도가 낮을 수 있지만, 학습이 진행되면서 손실이 크게 감소하고 정확도가 100%에 도달한다. 이는 단층 퍼셉트론에서는 불가능했던 비선형 경계가 은닉층을 통해 형성되었음을 의미한다.

이 과정은 단순히 층을 늘렸기 때문이 아니라, 비선형 활성화 함수가 층 사이에 들어가 있기 때문에 가능하다.
만약 은닉층을 추가하더라도 중간에 비선형 함수가 없다면, 여러 선형층을 연속으로 쌓아도 전체는 하나의 선형 변환으로 합쳐질 수 있다.

즉, 다층 퍼셉트론의 핵심은 층의 수 자체보다 선형 변환과 비선형 활성화의 반복에 있다.

6.4 AI가 추천하는 심화예제

은닉층의 뉴런 수를 2개에서 4개, 8개로 바꿔 보면 표현력이 늘어나면서 학습 안정성이 어떻게 달라지는지 확인할 수 있다. 또한 은닉층 활성화 함수를 시그모이드 대신 Tanh나 ReLU로 바꿔 보면 수렴 속도와 초기 학습 패턴의 차이도 비교할 수 있다.


7. 역전파는 무엇을 계산하는가

다층 퍼셉트론이 실제로 학습되려면, 각 층의 가중치를 어떤 방향으로 얼마나 수정해야 하는지 알아야 한다. 이때 사용하는 알고리즘이 역전파다.

역전파는 출력에서 계산된 오차를 입력 방향으로 거꾸로 전달하면서 각 파라미터의 gradient를 구한다. 수학적으로는 체인룰을 반복 적용하는 과정이다.

손실 함수가 $L$, 가중치가 $W$일 때, 우리가 알고 싶은 것은 다음 값이다.

[
\frac{\partial L}{\partial W}
]

이 값은 가중치를 아주 조금 바꿨을 때 손실이 얼마나 변하는지를 뜻한다.
gradient descent는 이 값을 이용해 손실이 감소하는 방향으로 가중치를 업데이트한다.

[
W \leftarrow W - \eta \frac{\partial L}{\partial W}
]

여기서 $\eta$는 learning rate다.

다층 구조에서는 각 층의 gradient가 서로 연결되어 있기 때문에, 출력층의 오차가 은닉층으로 전파되어야 한다. 예를 들어 두 층짜리 구조에서는 다음처럼 체인룰이 적용된다.

[
\frac{\partial L}{\partial W_1} = \frac{\partial L}{\partial \hat{y}}
\cdot
\frac{\partial \hat{y}}{\partial h}
\cdot
\frac{\partial h}{\partial W_1}
]

즉, 앞쪽 층의 파라미터를 업데이트하려면 뒤쪽 계산 결과가 어떻게 연결되어 있는지를 모두 따라가야 한다.

PyTorch에서는 loss.backward()가 이 과정을 자동미분으로 처리한다. 사용자는 계산 그래프를 구성하고 손실만 정의하면, 내부적으로 필요한 gradient가 모두 계산된다.

7.1 optimizer.step의 의미

optimizer.step()은 계산된 gradient를 실제 파라미터에 반영하는 단계다.
이 예제에서는 SGD를 사용한다. SGD는 가장 기본적인 최적화 방법으로, 현재 gradient 방향의 반대로 파라미터를 이동시킨다.

작은 데이터셋과 단순한 모델에서는 SGD만으로도 충분히 학습이 가능하다. learning rate를 1로 둔 것도 데이터가 매우 작고 문제 구조가 단순하기 때문에 가능한 설정이다. 실제 대규모 딥러닝에서는 이렇게 큰 값을 그대로 사용하면 발산할 가능성이 크다.

7.2 AI가 추천하는 심화예제

같은 XOR 문제에서 optimizer를 SGD 대신 Adam으로 바꾸고 learning rate를 조정해 보면, 최적화 방식이 수렴 속도에 어떤 영향을 주는지 체감할 수 있다. 또한 각 epoch마다 은닉층 출력값을 저장해 보면, 학습이 진행되면서 중간 표현이 어떻게 바뀌는지도 확인할 수 있다.


8. 비선형 활성화 함수가 필요한 이유

8.1 선형층만 여러 개 쌓아서는 충분하지 않다

신경망의 각 선형층은 다음과 같은 형태다.

[
z = Wx + b
]

선형층 두 개를 연속으로 적용해도 중간에 비선형 함수가 없으면 결국 하나의 선형 변환으로 합쳐진다.

[
W_2(W_1x + b_1) + b_2 = (W_2W_1)x + (W_2b_1 + b_2)
]

즉, 층을 여러 개 쌓아도 비선형성이 없으면 표현력이 늘어나지 않는다.
그래서 활성화 함수는 신경망에서 선택사항이 아니라 본질적인 구성요소다.


9. 시그모이드, Tanh, ReLU, Softmax의 의미

9.1 시그모이드

시그모이드는 입력을 0과 1 사이로 압축한다.

[
\sigma(x) = \frac{1}{1 + e^{-x}}
]

이 함수는 이진 분류 출력층에서 자주 사용된다. 출력값을 확률처럼 해석하기 쉽기 때문이다.
다만 입력 절댓값이 매우 커지면 기울기가 작아져 gradient vanishing 문제가 생길 수 있다.

시그모이드의 도함수는 다음과 같다.

[
\sigma'(x) = \sigma(x)(1-\sigma(x))
]

출력이 0 또는 1에 가까워질수록 도함수가 작아진다. 깊은 네트워크에서 시그모이드가 학습을 느리게 만들 수 있는 이유가 여기에 있다.

9.2 Tanh

Tanh는 출력을 -1에서 1 사이로 만든다.

[
\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}
]

시그모이드와 달리 0 중심 대칭이라는 장점이 있다. 출력 평균이 0 근처로 맞춰지기 쉬워 학습이 좀 더 안정적일 수 있다.
하지만 큰 입력에서 기울기가 작아지는 문제는 여전히 존재한다.

9.3 ReLU

ReLU는 현재 딥러닝에서 가장 널리 쓰이는 활성화 함수 중 하나다.

[
\text{ReLU}(x) = \max(0, x)
]

양수 구간에서는 기울기가 1이라 gradient vanishing을 완화하고, 계산도 단순해 학습 속도가 빠르다.
반면 입력이 계속 음수로 들어오면 뉴런이 0만 출력하는 죽은 ReLU 문제가 생길 수 있다.

9.4 Softmax

Softmax는 다중 클래스 분류에서 각 클래스의 점수를 확률 분포로 바꾸는 함수다.

[
\text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}}
]

모든 클래스 확률의 합이 1이 되므로, 어떤 클래스가 가장 유력한지 해석하기 쉽다.
이 함수는 보통 출력층의 로짓 벡터 전체에 대해 적용한다.

여기서 주의할 점은 Softmax는 하나의 스칼라 입력에 쓰는 함수라기보다, 클래스 점수 벡터 전체를 정규화하는 함수라는 점이다. 즉, 단순한 1차원 곡선 그림으로 감각을 잡을 수는 있지만, 실제 의미는 여러 클래스 점수 사이의 상대적 비중을 계산하는 데 있다.

9.5 어떤 활성화 함수를 어디에 써야 하는가

  • 이진 분류 출력층: 보통 시그모이드
  • 다중 클래스 분류 출력층: 보통 Softmax
  • 은닉층: 전통적으로 Sigmoid, Tanh를 썼지만 현재는 ReLU 계열을 더 많이 사용

활성화 함수 선택은 단순 취향 문제가 아니라 gradient 흐름, 수렴 속도, 표현력과 직접 연결된다.

9.6 AI가 추천하는 심화예제

같은 입력 구간에서 시그모이드, Tanh, ReLU의 그래프뿐 아니라 도함수도 함께 그려 보면 왜 어떤 함수는 gradient vanishing에 취약하고 어떤 함수는 비교적 안정적인지 더 쉽게 이해할 수 있다. Softmax는 두세 개 클래스 로짓 벡터를 직접 넣어 확률 분포가 어떻게 바뀌는지 계산해 보면, 단순 함수 그래프보다 훨씬 실전적으로 와닿는다.


10. 초보자가 놓치기 쉬운 구현 디테일

10.1 왜 입력과 정답 모두 2차원 텐서인가

입력은 배치 단위로 처리되므로 보통 shape가 $(N, D)$다.
여기서 $N$은 샘플 수, $D$는 특성 수다.
정답도 $(N, 1)$ 형태로 두면 모델 출력과 shape가 맞아 손실 함수를 바로 적용할 수 있다.

만약 정답을 $(4,)$처럼 1차원으로 두면 브로드캐스팅이나 shape mismatch로 인해 헷갈리기 쉽다. 초반에는 출력과 레이블의 shape를 명시적으로 맞추는 습관이 중요하다.

10.2 왜 threshold가 0.5인가

시그모이드 출력은 0과 1 사이 확률처럼 해석되므로, 일반적으로 0.5를 기준으로 클래스를 나눈다.
다만 실제 문제에서는 클래스 불균형이나 오탐 비용 때문에 threshold를 0.3, 0.7처럼 조정하기도 한다.

10.3 왜 loss와 accuracy를 함께 봐야 하는가

정확도는 최종 분류 결과만 보여주지만, 손실은 예측 확률이 얼마나 정답에 가까운지를 더 세밀하게 보여준다.
예를 들어 정확도는 이미 100%인데 손실이 계속 줄어드는 경우가 있다. 이는 맞히긴 했지만 확신도가 더 높아지고 있다는 의미다.

10.4 왜 작은 예제에서 learning rate가 크게 잡혀도 되는가

AND, OR, XOR 예제는 데이터가 4개뿐이고 입력도 매우 단순하다. 모델도 작아서 파라미터 수가 거의 없다. 이런 상황에서는 learning rate가 다소 커도 학습이 가능한 경우가 많다.
하지만 일반적인 딥러닝 문제에 같은 값을 그대로 적용하면 손실이 진동하거나 발산할 수 있다.


11. 퍼셉트론에서 딥러닝으로 이어지는 핵심 흐름

퍼셉트론은 입력을 가중합한 뒤 출력을 만드는 가장 단순한 신경망이다. AND와 OR처럼 선형 분리 가능한 문제는 이 구조만으로 충분히 해결할 수 있다. 하지만 XOR처럼 비선형 구조를 가진 문제에서는 단층 퍼셉트론이 실패한다. 이 실패는 학습 부족이 아니라 모델 표현력의 한계에서 비롯된다.

다층 퍼셉트론은 이 한계를 해결한다. 은닉층과 비선형 활성화 함수를 추가하면 입력을 더 유용한 표현으로 변환할 수 있고, 출력층은 그 표현 위에서 더 복잡한 결정 경계를 형성할 수 있다. 이 과정에서 역전파는 각 층의 가중치가 손실에 얼마나 기여했는지를 계산하고, 경사 하강법은 그 정보를 이용해 파라미터를 갱신한다.

결국 딥러닝의 핵심은 복잡한 모델을 무작정 쌓는 데 있지 않다.
선형 변환만으로는 풀 수 없는 문제를, 비선형 활성화와 계층적 표현 학습으로 해결하는 데 있다. 퍼셉트론, XOR, 다층 퍼셉트론, 활성화 함수, 역전파를 하나의 흐름으로 이해하면 이후 CNN, RNN, Transformer 같은 더 복잡한 모델도 훨씬 자연스럽게 받아들일 수 있다.

이 주제는 딥러닝의 가장 기초적인 내용처럼 보이지만, 사실은 신경망이 왜 작동하는가를 설명하는 가장 본질적인 출발점이다.