시그모이드 vs ReLU: 기하학적 맥락 상실에 따른 추론 비용
딥러닝 모델에서 시그모이드(Sigmoid) 활성화 함수는 입력값을 0과 1 사이로 압축하여 기하학적 맥락을 상실하게 만들어 모델의 깊이가 주는 이점을 제한합니다. 반면, ReLU는 양수 입력값의 크기를 보존하여 심층 신경망이 과도한 너비나 연산량 없이도 풍부한 표현력을 유지할 수 있게 합니다. 이 글은 두 활성화 함수의 신호 전파 방식과 표현 기하학 차이를 실험을 통해 분석하며, 이것이 모델의 추론 효율성과 확장성에 미치는 영향을 설명합니다.
인공지능(AI) 인프라, 애플리케이션, 기술, 에디터 추천, 언어 모델, 머신러닝, 튜토리얼 등
심층 신경망(Deep Neural Network)은 각 레이어가 입력 공간을 재형성하여 점차 더 복잡한 결정 경계(Decision Boundary)를 형성하는 기하학적 시스템으로 이해될 수 있습니다. 이 과정이 효과적으로 작동하려면 레이어가 의미 있는 공간 정보, 특히 데이터 포인트가 이러한 경계에서 얼마나 떨어져 있는지에 대한 거리 정보를 유지해야 합니다. 이 거리 정보가 있어야 더 깊은 레이어에서 풍부한 비선형 표현을 구축할 수 있기 때문입니다.
시그모이드(Sigmoid) 함수는 모든 입력값을 0과 1 사이의 좁은 범위로 압축하여 이 과정을 방해합니다. 값이 결정 경계에서 멀어질수록 서로 구별할 수 없게 되어 레이어 간에 기하학적 맥락(Geometric Context)이 손실됩니다. 이는 결과적으로 표현력을 약화시키고 네트워크 깊이의 효과를 제한합니다.
반면, ReLU 함수는 양수 입력값에 대해 크기(Magnitude)를 그대로 보존하므로 거리 정보가 네트워크 전체에 원활하게 흘러갈 수 있습니다. 덕분에 더 깊은 모델이 과도한 너비(Width)나 연산량(Compute) 없이도 뛰어난 표현력을 유지할 수 있습니다.
이 글에서는 이러한 순전파(Forward-pass) 동작에 초점을 맞추어, 'Two-moons(두 개의 달)' 실험을 통해 시그모이드와 ReLU가 신호 전파와 표현 기하학에서 어떻게 다른지 분석하고, 이것이 추론 효율성 및 확장성에 대해 어떤 의미를 갖는지 알아봅니다.
의존성 설정 코드 복사 완료 다른 브라우저 사용 import numpy as np import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec from matplotlib.colors import ListedColormap from sklearn.datasets import make_moons from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split
코드 복사 완료 다른 브라우저 사용 plt.rcParams.update({ "font.family": "monospace", "axes.spines.top": False, "axes.spines.right": False, "figure.facecolor": "white", "axes.facecolor": "#f7f7f7", "axes.grid": True, "grid.color": "#e0e0e0", "grid.linewidth": 0.6, })
T = { "bg": "white", "panel": "#f7f7f7", "sig": "#e05c5c", "relu": "#3a7bd5", "c0": "#f4a261", "c1": "#2a9d8f", "text": "#1a1a1a", "muted": "#666666", }
데이터셋 생성하기 통제된 환경에서 활성화 함수(Activation Function)의 효과를 연구하기 위해, 먼저 사이킷런(scikit-learn)의 make_moons를 사용하여 합성 데이터셋을 생성합니다. 이는 단순한 선형 경계로는 해결할 수 없는 비선형적인 두 개의 클래스 문제를 생성하므로, 신경망이 얼마나 잘 복잡한 결정 표면을 학습하는지 테스트하기에 이상적입니다.
작업을 더욱 현실적으로 만들기 위해 약간의 노이즈(Noise)를 추가하고, StandardScaler를 사용하여 두 차원의 특성(Feature)을 동일한 스케일로 표준화함으로써 안정적인 훈련을 보장합니다. 그런 다음 일반화(Generalization) 성능을 평가하기 위해 데이터셋을 훈련 세트와 테스트 세트로 분할합니다. 마지막으로 데이터 분포를 시각화합니다.
이 플롯(Plot)은 시그모이드 네트워크와 ReLU 네트워크가 모델링하려고 시도할 기준선(Baseline) 역할을 하는 기하학적 형태입니다. 이를 통해 나중에 각 활성화 함수가 레이어를 거치면서 이 공간을 어떻게 변환하는지 비교할 수 있습니다.
코드 복사 완료 다른 브라우저 사용 X, y = make_moons(n_samples=400, noise=0.18, random_state=42) X = StandardScaler().fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.25, random_state=42 )
fig, ax = plt.subplots(figsize=(7, 5)) fig.patch.set_facecolor(T["bg"]) ax.set_facecolor(T["panel"])
ax.scatter(X[y == 0, 0], X[y == 0, 1], c=T["c0"], s=40, edgecolors="white", linewidths=0.5, label="Class 0", alpha=0.9) ax.scatter(X[y == 1, 0], X[y == 1, 1], c=T["c1"], s=40, edgecolors="white", linewidths=0.5, label="Class 1", alpha=0.9)
ax.set_title("make_moons -- our dataset", color=T["text"], fontsize=13) ax.set_xlabel("x₁", color=T["muted"]); ax.set_ylabel("x₂", color=T["muted"]) ax.tick_params(colors=T["muted"]); ax.legend(fontsize=10)
plt.tight_layout() plt.savefig("moons_dataset.png", dpi=140, bbox_inches="tight") plt.show()
신경망 생성하기 다음으로, 활성화 함수의 효과를 분리하여 관찰하기 위해 작고 통제된 신경망을 구현합니다. 여기서의 목표는 고도로 최적화된 모델을 구축하는 것이 아니라, 시그모이드와 Re