신경망을 아무리 깊게 쌓더라도, 각 층이 선형 변환만 한다면 전체 네트워크는 여전히 하나의 선형 함수에 불과합니다.
수식으로 보면,
f₁(x) = A₁x
f₂(f₁(x)) = A₂A₁x
f(x) = Ax
(하나의 선형 변환)즉, 여러 층을 쌓아도 선형성만 있다면 표현력은 하나의 선형 모델과 다르지 않습니다.
이로 인해 다음과 같은 한계가 생깁니다:
여기에 활성화 함수 (ReLU, sigmoid, tanh 등) 같은 비선형 요소를 삽입하면 상황이 완전히 달라집니다.
각 층이 비선형 변환을 포함하게 되면, 신경망은 단순한 선형 조합이 아닌 복잡한 함수 조합을 만들 수 있습니다.
이로 인해 네트워크는 다음과 같은 능력을 가집니다:
XOR 입력/출력
x₁ | x₂ | y (x₁ ⊕ x₂) |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
이 문제는 선형 모델로는 절대 해결할 수 없는 고전적인 예제입니다.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neural_network import MLPClassifier
# XOR 데이터 생성
X = np.array([[0,0], [0,1], [1,0], [1,1]])
y = np.array([0, 1, 1, 0])
# 모델: 은닉층 1개 (2뉴런), 비선형 활성화 함수 (ReLU)
model = MLPClassifier(hidden_layer_sizes=(2,), activation='relu', max_iter=1000)
model.fit(X, y)
# 예측 결과 확인
print("예측 결과:", model.predict(X))
# 시각화
h = 0.01
xx, yy = np.meshgrid(np.arange(-0.1, 1.1, h), np.arange(-0.1, 1.1, h))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.coolwarm, alpha=0.6)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', cmap=plt.cm.coolwarm, s=100)
plt.title("XOR Problem - Nonlinear Classification with Hidden Layer")
plt.xlabel("x1")
plt.ylabel("x2")
plt.grid(True)
plt.show()
"충분히 많은 뉴런과 비선형성을 갖춘 신경망은 모든 연속 함수를 근사할 수 있다."
이 정리는 왜 비선형성이 중요한지를 이론적으로 뒷받침합니다.
→ 만약 비선형성이 없다면, 아무리 층을 쌓아도 네트워크는 고작 하나의 선형 모델일 뿐입니다.