
신경망: 퍼셉트론에서 딥러닝까지
단순한 함수들의 층이 복잡한 패턴을 학습하는 방식
아무도 이해하지 못한 수
2016년 3월 10일, 서울에서 열린 5국 시리즈의 두 번째 대국에서, AlphaGo라는 기계가 바둑판 다섯 번째 줄에 흑돌을 놓았습니다. 그 수는 너무나 이상해서 인간 해설자들은 그것이 실수라고 생각했습니다. 어느 프로 기사는 초보자가 그런 수를 두면 혼날 거라고 큰 소리로 말했습니다. 18번의 세계 챔피언이었던 이세돌은 자리에서 일어나 마음을 가다듬기 위해 방을 나갔습니다.
실수가 아니었습니다. 50수 뒤, 이제 “제37수”로 유명해진 그 돌은 대국 전체가 뒤집힌 경첩이었습니다. AlphaGo가 이겼습니다. 살아 있는 가장 위대한 기사 중 한 명으로 여겨지던 이세돌은 시리즈에서 4대 1로 패했습니다. 그리고 여기 중요한 부분이 있습니다: 어떤 인간도 AlphaGo에게 그 수를 가르치지 않았습니다. 그것은 어떤 교과서에도 없었습니다. 그 기계는 자기 자신과 수백만 번의 대국을 두고 어떤 사람도 본 적 없는 패턴이 나타날 때까지 수십억 개의 작은 내부 숫자를 조정함으로써 스스로 그것을 발견했습니다.
바둑은 관측 가능한 우주의 원자 수보다 더 많은 가능한 판 위치를 가집니다. 무차별 대입으로 풀 수 없습니다. 그것을 위한 규칙을 적어둘 수도 없습니다. 초인적인 수준으로 바둑을 두는 유일한 방법은 학습하는 것이며 — 그 학습을 수행한 것이 바로 신경망입니다: 단순한 수학적 단위들의 층으로, 충분한 데이터와 충분한 조정이 있으면 어떤 사람도 완전히 설명할 수 없는 구조를 찾아낼 수 있습니다.
그와 똑같은 기계장치 — 같은 가중합, 같은 훈련 루프, 같은 그래디언트 조정 — 이 바로 여러분이 대화하는 언어모델, 부정 카드 거래를 표시하는 시스템, 그리고 퀀트 펀드들이 이제 금융 시장에 적용하는 모델들을 움직입니다. 이 레슨은 그 상자 안에서 실제로 무슨 일이 일어나는지에 관한 것입니다.
퍼셉트론: 모든 것이 시작되는 곳
단순한 스팸 필터부터 GPT, AlphaGo까지 — 모든 신경망은 단 하나의 아이디어에서 파생됩니다: 1958년 프랭크 로젠블랫이 발명한 퍼셉트론입니다. 이는 생물학적 뉴런에서 느슨하게 영감을 받은 수학적 모델입니다. 실제 뉴런은 수상돌기를 통해 전기 신호를 받아, 세포체에 그것을 누적시키고, 결합된 입력이 임계값을 넘을 때만 축삭을 통해 신호를 발화시킵니다. 퍼셉트론은 정확히 같은 일을 하지만, 전압 대신 숫자로 합니다.
퍼셉트론은 입력 벡터 x를 받아, 각 입력에 학습된 가중치 w를 곱하고, 그 곱을 모두 더하고, 임계값을 이동시키는 편향(bias) 항 b를 더한 뒤, 그 결과를 활성화 함수에 통과시킵니다. 결과가 그 기준을 넘으면 뉴런은 “발화”하고, 그렇지 않으면 조용히 있습니다. 이 모든 것은 하나의 간결한 식으로 표현됩니다: output = f(w·x + b).
가중치를 볼륨 노브라고 생각해보십시오. 각 입력은 어떤 크기(음량)로 도착하고, 가중치는 그 입력이 이 특정 뉴런에 얼마나 중요한지를 결정합니다. 부정 거래를 포착하도록 학습하는 뉴런은 “계정 이력 대비 거래 규모”에 대한 가중치는 올리고 “시간대”에 대한 가중치는 낮출 것입니다. 학습이란, 그 핵심에서는, 그 노브들을 올바른 설정으로 돌리는 것 이상의 화려한 것이 아닙니다.
하나의 퍼셉트론에는 엄격한 한계가 있습니다: 데이터를 직선(또는 고차원에서는 평평한 초평면)으로만 분리할 수 있습니다. “이 점은 선 위에 있는가, 아래에 있는가?”는 대답할 수 있지만, “이 점은 굽은 영역 안에 있는가?”는 대답할 수 없습니다. 역사적인 예시는 XOR 문제입니다 — 단 하나의 퍼셉트론이 증명 가능하게 학습할 수 없는 패턴으로, 이는 1970년대에 AI 자금 지원을 여러 해 동안 얼어붙게 한 한계 중 하나였습니다. 그 탈출구는 지나고 보면 거의 우스울 정도로 단순합니다: 많은 퍼셉트론을 층으로 쌓고 그 사이에 비선형 활성화를 삽입하는 것입니다. 그렇게 하면 결과로 나오는 네트워크는 공간을 임의로 복잡한 모양으로 굽히고, 접고, 조각낼 수 있습니다.
층, 깊이, 그리고 왜 ‘딥’러닝인가
하나의 뉴런은 노브입니다. 유용한 네트워크는 정보를 양동이 릴레이처럼 앞으로 전달하는 층(layer)으로 조직된 수천 개의 노브입니다.
- 입력층 — 여러분의 원시 피처가 들어오는 곳입니다: 이미지의 픽셀, 문장의 단어들, 또는 트레이딩 모델이라면 가격, 거래량, 변동성, 오더북 불균형 같은 것들입니다.
- 은닉층 — 그 사이에 있는 층들로, 실제 작업이 일어나는 곳입니다. 각 층은 이전 층의 출력을 받아 새롭고 더 추상적인 피처로 재조합합니다.
- 출력층 — 최종 답입니다: 확률, 가격 예측, 클래스 레이블입니다.
딥러닝에서 “딥”이라는 단어는 단순히 많은 은닉층을 의미합니다. 그리고 깊이는 특정한 무언가를 사줍니다: 피처의 계층 구조입니다. 이미지 네트워크에서 첫 번째 층은 엣지를 탐지하고, 다음 층은 엣지를 모아 모양을 만들고, 그다음 층은 모양을 모아 객체를 만듭니다. 아무도 “엣지 탐지기”나 “눈 탐지기”를 프로그래밍하지 않았습니다 — 그런 개념들은 훈련으로부터 발생합니다. 네트워크는 자기 자신의 중간 어휘를 발명합니다.
여기에 아름다운 이론적 결과가 있습니다, 보편 근사 정리(universal approximation theorem)입니다: 단 하나의 은닉층만 있더라도 충분한 뉴런이 있다면 네트워크는 어떤 연속 함수든 임의의 정밀도로 근사할 수 있습니다. 다시 말해, 올바른 네트워크는 원칙적으로 여러분의 데이터에 존재하는 어떤 패턴이든 표현할 수 있습니다. 함정은 — 그리고 이건 큰 함정입니다 — “원칙적으로”가 엄청난 일을 하고 있다는 것입니다. 그 정리는 그런 네트워크가 존재한다는 것을 약속할 뿐입니다. 여러분이 그것을 찾을 수 있는지, 그것을 알아내기에 충분한 데이터가 있는지, 여러분이 쫓는 패턴이 실제로 존재하는지에 대해서는 아무것도 말해주지 않습니다. 금융처럼 저신호 영역에서는, “표현 가능함”과 “학습 가능함” 사이의 그 간극이 정확히 대부분의 모델이 죽는 곳입니다.
활성화 함수: 비선형이라는 비밀 소스
사람들을 놀라게 하는 한 가지 사실이 있습니다: 활성화 함수가 없다면, 깊이는 아무런 가치가 없습니다. 만약 모든 층이 단순한 가중합이었다면, 10개의 층을 쌓는 것은 수학적으로 하나의 층과 동일할 것입니다 — 선형 연산의 연쇄는 하나의 선형 연산으로 붕괴됩니다. 여러분은 화려한 직선을 만드는 데 컴퓨팅 비용을 낭비한 셈이 됩니다. 활성화 함수는 층 사이에 삽입되어 네트워크가 구부러지게 해주는 비선형 굴곡이며, 그 구부러짐이 바로 그것을 강력하게 만드는 것입니다.
모든 실무자가 알아야 할 활성화 함수들입니다:
- 시그모이드 — σ(x) = 1/(1+e⁻ˣ). 어떤 입력이든 (0, 1) 사이로 압축해, 자연스럽게 확률처럼 읽힙니다. 이진 출력에는 좋지만 은닉층 안에서는 나쁜 선택입니다: 큰 양수나 음수 입력에서는 곡선이 평평해지고, 그래디언트가 거의 0에 가까워져서 학습이 멈춰버립니다 — 기울기 소실(vanishing gradient) 문제입니다.
- Tanh — (−1, 1) 범위로 출력되며 0을 중심으로 하기 때문에 최적화에 도움이 됩니다. 여전히 극단값에서 포화되지만, 시그모이드보다는 덜 가혹합니다.
- ReLU — f(x) = max(0, x). 은닉층의 현대적 기본값입니다. 우스울 정도로 단순하고, 계산 비용이 저렴하며, 모든 양의 입력에 대해 건강한 그래디언트를 유지합니다. 결함은 “죽은 ReLU”입니다: 항상 0을 출력하도록 밀려난 뉴런은 영구적으로 비활성화될 수 있습니다.
- Leaky ReLU — f(x) = max(0.01x, x). 음수에 대해 그래디언트가 조금씩 흐르도록 허용해 뉴런이 죽는 것을 막습니다.
- GELU — ReLU의 매끄럽고 확률적인 사촌으로, BERT와 GPT 같은 트랜스포머 내부의 표준입니다.
역전파와 그래디언트 하강: 네트워크가 학습하는 방법
지금까지 우리는 가중치로 가득 찬 네트워크를 가지고 있습니다. 그러나 올바른 가중치 값은 어디서 오는 걸까요? 아무도 그것을 직접 입력하지 않습니다 — 수백만 개나 있습니다. 그것들은 근본적으로 미적분학이 부기(bookkeeping)를 담당하는 조직화된 시행착오인 피드백 루프를 통해 발견됩니다.
1단계는 순전파(forward pass)입니다: 예시를 입력하고, 그것이 층들을 통과하게 하고, 예측값을 읽어냅니다. 2단계는 손실 함수(loss function)를 사용해 그 예측이 얼마나 틀렸는지 측정하는 것입니다. 숫자(가격)를 예측하는 경우, 평균제곱오차가 예측과 실제 사이의 제곱 간극을 평균합니다. 분류의 경우, 교차 엔트로피가 예측된 확률이 정답으로부터 얼마나 떨어져 있는지를 측정합니다. 높은 손실은 “매우 틀렸다”는 뜻이며, 훈련의 전체 목표는 그 숫자를 낮추는 것입니다.
3단계는 영리한 부분입니다: 역전파(backpropagation)입니다. 미적분학의 연쇄 법칙을 사용해, 이 알고리즘은 손실로부터 모든 층을 거슬러 올라가며 각 개별 가중치에 대해 그래디언트를 계산합니다 — “이 가중치 하나를 살짝 올리면, 오차가 올라가는가, 내려가는가, 그리고 얼마나?”라는 질문에 대한 답입니다. 이것이 AI 겨울을 녹인 트릭입니다. 1980년대에 대중화된 역전파는 수백만 개의 가중치에 걸쳐 추측하는 대신 효율적으로 잘못을 배분하는 것을 가능하게 만들었습니다.
4단계는 그래디언트 하강입니다: w = w − α × ∂L/∂w 규칙을 사용해, 손실을 줄이는 방향으로 모든 가중치를 작은 걸음만큼 이동시킵니다. 안개 낀 언덕 위에 서서 계곡 바닥에 도달하려 하는 것을 상상해보십시오. 바닥이 보이지는 않지만, 발밑으로 어느 쪽이 내리막인지 느낄 수 있으니 그 방향으로 한 걸음 딛고 반복합니다. 학습률 α는 여러분의 걸음 폭이며, 전체 시스템에서 가장 중요한 다이얼이라고 해도 좋을 정도입니다. 너무 크면 계곡을 지나쳐 계속 튕겨 다니고, 너무 작으면 영원히 조금씩 나아가거나 중간의 구덩이에 갇혀버립니다.
여러분이 즉시 만나게 될 두 가지 개선안입니다. 미니배치: 매 예시마다 업데이트하는 것(잡음이 많음)이나 전체 데이터셋 이후에만 업데이트하는 것(느림) 대신, 작은 배치 — 일반적으로 32에서 256개 예시 — 이후에 업데이트하며, 이는 안정적이고 GPU 친화적이며 실전에서의 스위트 스팟입니다. 그리고 Adam: 각 가중치에 자신만의 적응적 걸음 폭을 부여하고 잡음이 많은 그래디언트를 매끈하게 하기 위해 모멘텀을 더하는 더 스마트한 옵티마이저입니다. Adam은 거의 모든 프로젝트를 시작할 때 합리적인 기본값입니다 — 다만 신호 대 잡음비가 낮은 금융에서는 학습률, 가중치 감쇠, 중단 지점을 여전히 수동으로 튜닝해야 할 것입니다.
과적합: 네트워크가 학습하는 대신 외울 때
다른 무엇보다도 더 많은 금융 모델을 망가뜨리는 실패 양상이 여기 있습니다. 신경망은 워낙 유연한 함수 근사기이기 때문에, 기회만 있다면 훈련 데이터 — 모든 무작위 잡음, 일회성 우연, 다시는 반복되지 않을 우연의 일치까지 포함해서 — 를 그대로 외워버립니다. 그것은 본 적 있는 데이터에서는 아름답게 점수를 내지만 새로운 것을 마주하는 순간 무너집니다. 이것이 과적합이며, 시장처럼 진짜 신호가 희미하고 잡음이 귀청을 찢는 곳에서는 예외가 아니라 기본 결과입니다. 이에 맞서 싸우는 도구들을 정규화(regularization)라고 부릅니다.
드롭아웃은 가장 널리 쓰입니다. 매 훈련 단계마다 모든 뉴런은 p(흔히 0.2~0.5)의 확률로 일시적으로 꺼집니다. 무작위 동료들이 계속 사라지는 와중에도 작동해야 하므로, 네트워크는 몇몇 취약한 뉴런에 모든 것을 걸기보다 지식을 많은 뉴런에 퍼뜨리는 법을 배웁니다 — 단일 모델 안에 내장된 앙상블 효과입니다. 예측 시점에는 모든 뉴런이 적절히 스케일되어 다시 켜집니다.
L1과 L2 페널티는 손실에 큰 가중치에 대한 세금을 더합니다. L2(가중치 감쇠)는 어떤 단일 가중치도 너무 커지지 않도록 억제해 영향력을 균등하게 퍼뜨립니다. L1은 더 날카롭습니다: 쓸모없는 가중치를 정확히 0까지 적극적으로 밀어붙여, 자동 피처 선택을 수행합니다. 여러분의 100개 피처 중 대부분이 잡음인 금융 데이터셋에서, L1은 실제로 신호를 담고 있는 소수를 조용히 찾아낼 수 있습니다.
배치 정규화는 각 층의 출력을 안정적인 평균과 분산으로 재조정해, 훈련을 안정시키고 더 높은 학습률을 사용할 수 있게 합니다. 조기 종료(early stopping)는 그중 가장 단순하고 가장 신뢰할 수 있는 방어책입니다: 훈련에서 제외된 검증 세트에서의 오차를 지켜보다가, 훈련 오차는 계속 떨어지는데 그것이 올라가기 시작하는 순간 멈추십시오 — 그 교차점이 바로 네트워크가 패턴 학습에서 잡음 외우기로 전환되는 정확한 순간입니다.
패턴을 위한 CNN, 시퀀스를 위한 RNN과 LSTM
평범한 순전파 네트워크는 모든 입력을 구조 없는 숫자 뭉치처럼 취급합니다. 그러나 많은 실제 데이터는 구조를 가지고 있습니다 — 이미지는 공간적 배치를, 가격 시리즈는 시간적 순서를 가지고 있으며 — 두 가지 전문화된 아키텍처가 그 구조를 직접 활용합니다.
합성곱 신경망(CNN)은 이미지를 위해 만들어졌습니다. 모든 픽셀을 모든 뉴런에 연결하는 대신, CNN은 작은 필터를 입력 위에서 슬라이딩시키며 국소적인 패턴 — 여기 엣지, 저기 텍스처 — 을 찾고, 같은 필터를 어디서나 재사용합니다. 초반 층은 엣지를 포착하고, 더 깊은 층은 그것들을 모아 모양과 객체를 만듭니다. 금융에서는 연구자들이 CNN을 다음과 같은 곳에 적용해왔습니다:
- 캔들 차트 이미지 — 차트 읽기를 시각적 패턴 인식 작업으로 재구성합니다.
- 오더북 히트맵 — 뎁스-오브-마켓 스냅샷에서 수요·공급 불균형을 포착합니다.
- 원시 가격 시퀀스에 대한 1D 합성곱 — 이미지 CNN이 공간적 모티프를 학습하는 방식으로 짧은 시간적 모티프를 학습합니다.
순환 신경망(RNN)은 시퀀스를 위해 만들어졌습니다. 각 시간 단계를 하나씩 처리하며 각 단계에서 다음 단계로 은닉 상태(hidden state) — 이어지는 기억 — 를 나릅니다. 이론상으로는 이것이 시계열에 이상적으로 만들어줍니다. 실제로는, 순수 RNN은 긴 시퀀스에서 기울기 소실 문제로 인해 무력해집니다: 여러 단계 전의 신호는 되돌아오는 길에 0에 가까워지므로, 네트워크는 단순히 먼 과거를 잊어버립니다.
장단기 기억(LSTM) 네트워크는 각 단계에서 메모리에서 무엇을 지우고, 무엇을 새로 쓰고, 무엇을 읽어낼지 결정하는 소수의 학습 가능한 게이트 — 잊기, 입력, 출력 — 로 이를 해결합니다. 그 게이팅은 LSTM이 수백 단계에 걸쳐 관련 정보를 유지할 수 있게 하며, 이것이 어제의 이벤트가 여전히 오늘의 가격을 움직이는 금융 시계열 모델링의 주력이 된 이유입니다.
import torch.nn as nn
class PricePredictor(nn.Module):
def __init__(self, input_dim, hidden_dim, num_layers):
super().__init__()
self.lstm = nn.LSTM(input_dim, hidden_dim,
num_layers, batch_first=True,
dropout=0.2)
self.fc = nn.Linear(hidden_dim, 1)
def forward(self, x):
out, _ = self.lstm(x)
return self.fc(out[:, -1, :])
WebSocket 피드가 연속적인 가격과 오더북 데이터를 스트리밍하는 GaiaEx 같은 플랫폼에서는, LSTM이 그 시퀀스를 자연스럽게 받아들일 수 있습니다. 다만 이 분야는 대체로 앞으로 나아갔습니다: 현대 언어모델을 뒷받침하는 아키텍처인 트랜스포머는 시간 단계를 하나씩 행진하는 대신 “어텐션”을 사용해 모든 시간 단계를 한 번에 살펴봄으로써, 많은 시퀀스 작업에서 LSTM과 동등하거나 더 나은 성능을 냅니다.
신경망이 해결하지 못하는 것 (특히 시장에서)
신경망은 놀라운 패턴 탐색기입니다. 그러나 정직한 교육이란 그것이 어디서 부서지는지를 짚는 것을 의미하며 — 트레이딩에서는, 그것이 값비싼 방식으로 부서집니다.
- 패턴이 존재하지 않을 때도 찾아냅니다. 딥 네트워크에 잡음을 주면 자신 있게 그것에 맞춰버립니다. 시장은 대체로 잡음이므로, 패턴이 실제이고 지속된다는 것을 증명할 부담은 여러분에게 있습니다 — 단지 작년 데이터에 존재했다는 것만으로는 안 됩니다.
- 블랙박스입니다. 모델이 정확할 수는 있지만 여전히 왜 그런지는 말해주지 못할 수 있습니다. 갑자기 돈을 잃을 때, 흔히 깔끔한 설명도 명확한 해결책도 없습니다. 리스크를 지는 자본에게는, “왜 그랬는지 모른다”는 것이 심각한 취약점입니다.
- 배고프고 취약합니다. 딥러닝은 수백만 개의 깨끗한 예시가 있을 때 빛을 발합니다. 금융의 역사는 짧고, 비정상적이고, 잡음이 많습니다 — 여러분의 모델을 훈련시킨 국면이 그저 존재하지 않게 될 수도 있으며, 이는 분포 이동이라는 문제입니다.
- 공짜로는 더 단순한 모델을 이기지 못합니다. 금융에서 흔한 표 형태, 피처 기반 데이터에서는, XGBoost 같은 그라디언트 부스트 트리가 신경망보다 빠르게 훈련되고 해석하기도 쉬우면서 종종 더 나은 성능을 냅니다. 복잡성은 미덕이 아니라 비용입니다.
- 공격당할 수 있습니다. 입력에 대한 작고 고의적인 변형이 네트워크의 출력을 뒤집을 수 있습니다 — 적대적 예시(adversarial example)라고 하며 — 이는 적대자가 여러분의 모델이 보는 것을 형성할 수 있는 어디에서든 중요합니다.
하드웨어, 도구, 그리고 여러분의 다음 발걸음
신경망을 훈련하는 것은 산술이 무겁습니다 — 거의 전부가 행렬 곱셈이며 — 그것을 어떤 하드웨어에서 돌리느냐가 여러분의 반복 속도를 “하룻밤”에서 “커피 한 잔 마시는 사이”로 바꿔놓습니다.
GPU가 표준입니다. 수천 개의 코어가 모두 동시에 다른 데이터에 같은 연산을 수행하며, 이는 정확히 신경망 수학의 형태입니다. CPU에서 8시간을 기어가는 모델이 현대 GPU에서는 15분 안에 끝날 수 있습니다. NVIDIA가 지배합니다: 소비자용 카드(RTX급 GPU)는 학습에 충분하고, 데이터센터급 카드(A100, H100)와 클라우드 인스턴스는 프로덕션 규모의 훈련을 처리합니다. 구글의 텐서 수학 전용 커스텀 칩인 TPU는 Google Cloud를 통해 매우 큰 모델에서 빛을 발하지만, GPU는 더 넓은 소프트웨어 지원 덕분에 대부분의 실무자에게 여전히 실용적인 기본값입니다.
시작하기 위해 아무것도 살 필요는 없습니다. Google Colab은 학습과 프로토타이핑에 충분한 무료 GPU 시간을 제공합니다. 모델이 커지면 클라우드 GPU를 필요할 때마다 임대하십시오. 매일 훈련하고 있고 클라우드 비용이 그것을 정당화할 때만 전용 하드웨어를 구입하십시오.
여기서부터의 합리적인 학습 경로입니다:
- 몇 개의 엔지니어링된 피처로 평범한 순전파 네트워크부터 시작하십시오 — 훈련이 빠르고, 디버깅이 쉽고, 정직한 베이스라인입니다.
- 원시 가격 시퀀스에 1D CNN을 시도해 그 베이스라인과 정면으로 비교하십시오.
- GaiaEx의 API에서 가져온 캔들 데이터의 시퀀스를 소비하는 LSTM을 만드십시오.
- 어텐션과 트랜스포머를 공부하십시오 — 시퀀스에서 점점 더 선호되는 아키텍처입니다.
- 무엇보다도, 여러분의 딥 모델을 항상 XGBoost 같은 그라디언트 부스팅 베이스라인과 대결시키십시오. 신경망이 여러분의 표 형태 금융 데이터에서 아웃오브샘플로 더 단순한 모델을 이기지 못한다면, 더 단순한 모델을 배포하고 넘어가십시오.
제37수를 찾아낸 그 루프 — 예측, 오차 측정, 가중치 조정, 반복 — 은 이 목록의 모든 시스템 안에서 실행되는 그 루프입니다. 그 루프를 이해하면 딥러닝을 이해한 것이며, 나머지는 그 위에 얹힌 아키텍처와 엔지니어링일 뿐입니다.

