파이썬 공부 Day 1: 퍼셉트론에서 GPU까지파이썬보다 먼저 배운 건 곱하고 더하기였습니다
파이썬 공부 첫날 노트에 남은 건 파이썬 문법이 아니었습니다. 인공지능이 어디서 왔는지, 그리고 왜 하필 GPU인지에 대한 이야기였습니다.
C는 이미 써 본 입장이라 문법보다 이쪽이 오히려 새로웠습니다. 결론부터 적으면 이렇습니다. 신경망이 하는 일은 결국 곱하고 더하기이고, 그 단순한 계산을 한꺼번에 많이 해 주는 장치가 GPU였습니다.
🧠 퍼셉트론: 뉴런 하나짜리 모델
퍼셉트론은 1958년 프랭크 로젠블랫이 만든 인공 뉴런 하나짜리 모델입니다. 뇌의 뉴런처럼 신호를 받아서 기준을 넘으면 1(발화), 못 넘으면 0을 냅니다.
y = 1 (w1*x1 + w2*x2 + b > 0 일 때)
y = 0 (그 외)
| 기호 | 이름 | 의미 |
|---|---|---|
| x | 입력 | 들어오는 신호 |
| w | 가중치 | 그 입력이 얼마나 중요한지 |
| b | 편향 | 발화 기준선 |
| η (eta) | 학습률 | 한 번에 얼마나 고칠지 |
학습은 틀린 만큼 가중치를 조금씩 고치는 과정입니다. t가 정답, y가 예측입니다.
w ← w + η * (t - y) * x
C로 짜 본 사람에게는 익숙한 모양입니다. 배열 두 개를 돌면서 곱하고 누적하는 for 루프, 딱 그것입니다. 이 "곱하고 더하기"가 뒤에서 GPU와 연결됩니다.
AND 게이트로 확인하기
w1 = 1, w2 = 1, b = -1.5로 두면 AND 게이트가 됩니다.
| x1 | x2 | 계산 | 출력 y |
|---|---|---|---|
| 0 | 0 | 0 + 0 - 1.5 = -1.5 | 0 |
| 0 | 1 | 0 + 1 - 1.5 = -0.5 | 0 |
| 1 | 0 | 1 + 0 - 1.5 = -0.5 | 0 |
| 1 | 1 | 1 + 1 - 1.5 = 0.5 | 1 |
b만 -0.5로 바꾸면 OR 게이트입니다. 표를 파이썬으로 옮기면 이렇습니다.
def perceptron(x1, x2, w1, w2, b):
s = w1 * x1 + w2 * x2 + b # 곱하고 더하기
# 기준선을 넘으면 발화
return 1 if s > 0 else 0
pairs = [(0, 0), (0, 1), (1, 0), (1, 1)]
for x1, x2 in pairs:
and_out = perceptron(x1, x2, 1, 1, -1.5)
or_out = perceptron(x1, x2, 1, 1, -0.5)
print(x1, x2, "AND:", and_out,
"OR:", or_out)
# 결과
# 0 0 AND: 0 OR: 0
# 0 1 AND: 0 OR: 1
# 1 0 AND: 0 OR: 1
# 1 1 AND: 1 OR: 1
가중치를 손으로 정하지 않고 학습 규칙으로 찾게 할 수도 있습니다. 0에서 출발해 틀릴 때마다 위의 공식대로 고치면, 몇 바퀴 안에 AND를 맞히는 값에 도착합니다.
data = [((0, 0), 0), ((0, 1), 0), # AND
((1, 0), 0), ((1, 1), 1)]
w, b, eta = [0.0, 0.0], 0.0, 0.1
for epoch in range(10):
errors = 0
for (x1, x2), t in data:
s = w[0] * x1 + w[1] * x2 + b
y = 1 if s > 0 else 0
# 틀린 만큼만 고친다
w[0] += eta * (t - y) * x1
w[1] += eta * (t - y) * x2
b += eta * (t - y)
errors += t != y
if errors == 0:
break
print(epoch + 1, [round(v, 2) for v in w],
round(b, 2))
# 결과
# 6 [0.2, 0.1] -0.2
여섯 바퀴째에 오차 0으로 멈췄습니다. 찾아낸 값(0.2, 0.1, -0.2)은 위에서 손으로 정한 1, 1, -1.5와 다르지만 똑같이 AND를 만듭니다. 답이 하나가 아니라 직선 하나만 잘 그으면 된다는 뜻입니다.
다만 (1, 0)은 합이 정확히 0이라 직선 위에 걸쳐 있습니다. 조건이 > 0이라 0으로 분류될 뿐, 여유는 전혀 없는 답입니다. 퍼셉트론 학습은 틀린 게 없어지는 순간 멈추기 때문입니다.
❄️ XOR 문제: 직선 하나로는 안 되는 것
퍼셉트론을 기하학적으로 보면 직선 하나로 평면을 두 쪽으로 자르는 일입니다. 그래서 선형 분류기라고 부릅니다. AND와 OR은 직선 하나로 나뉩니다.
XOR은 다릅니다. 대각선끼리 같은 편이라 어떤 직선을 그어도 못 나눕니다. (● = 출력 1, ○ = 출력 0)
AND: 직선 하나로 나뉨
x2 ↑
1 │ ○ ●
│ ╲
0 │ ○ ○
└────────────→ x1
0 1
XOR: 직선 하나로 불가
x2 ↑
1 │ ● ○
│
0 │ ○ ●
└────────────→ x1
0 1
1969년 마빈 민스키와 시모어 페퍼트가 책 『Perceptrons』에서 이 한계를 수학적으로 증명했습니다. "XOR도 못 하는 걸로 무슨 지능이냐"는 분위기가 퍼졌고 연구비가 끊겼습니다. 1970년대의 1차 AI 빙하기입니다.
층을 쌓으면 풀린다: 다층 퍼셉트론
답은 퍼셉트론을 여러 개 잇는 것이었습니다. XOR을 논리식으로 풀면 이렇게 쪼개집니다.
XOR = (x1 OR x2) AND NOT (x1 AND x2)
OR 하나, AND 하나를 은닉층에 두고 출력층에서 합치면 됩니다.
입력층 은닉층 출력층
x1 ─┬─▶ h1 = OR(x1, x2) ─┐
│ ├─▶ y = XOR
x2 ─┴─▶ h2 = AND(x1, x2) ─┘
y = step(h1 - h2 - 0.5)
(0,0) → h1=0, h2=0 → y=0
(0,1) → h1=1, h2=0 → y=1
(1,0) → h1=1, h2=0 → y=1
(1,1) → h1=1, h2=1 → y=0
앞의 퍼셉트론을 그대로 재사용하면 코드로도 바로 확인됩니다.
def step(s):
return 1 if s > 0 else 0
def xor(x1, x2):
h1 = step(x1 + x2 - 0.5) # 은닉층: OR
h2 = step(x1 + x2 - 1.5) # 은닉층: AND
# 출력층: OR 이면서 AND 는 아닐 때
return step(h1 - h2 - 0.5)
pairs = [(0, 0), (0, 1), (1, 0), (1, 1)]
print([xor(a, b) for a, b in pairs])
# 결과
# [0, 1, 1, 0]
여기서 새 문제가 생깁니다. 은닉층 가중치를 어떻게 학습시킬지 몰랐습니다. 위 코드도 가중치는 사람이 정해 준 값입니다.
이 문제는 1986년 럼멜하트, 힌튼, 윌리엄스의 역전파(Backpropagation)가 풀었습니다. 아이디어 자체는 1970년대에도 있었지만, 다층 신경망 학습법으로 널리 알린 건 이 1986년 논문입니다.
그래도 끝이 아니었습니다. 층이 깊어질수록 계산량이 폭발했고, 데이터는 부족했고, 당시 CPU로는 너무 느렸습니다. 신경망은 1990년대부터 2000년대까지 다시 침체기를 겪습니다.
CPU와 GPU: 박사 몇 명과 초등학생 수천 명
| CPU | GPU | |
|---|---|---|
| 코어 | 크고 똑똑한 코어 몇 개에서 수십 개 | 작고 단순한 코어 수천에서 수만 개 |
| 잘하는 일 | 복잡한 분기, 순서가 중요한 작업 (OS, 앱 로직) | 똑같은 단순 계산을 대량으로 동시에 |
| 설계 목표 | 지연시간(latency) 줄이기: 한 작업을 최대한 빨리 | 처리량(throughput) 늘리기: 많은 작업을 한꺼번에 |
| 원래 용도 | 범용 연산 | 그래픽 (픽셀 수백만 개를 각각 같은 공식으로 계산) |
| 비유 | 수학 박사 몇 명 | 덧셈만 할 줄 아는 초등학생 수천 명 |
어려운 문제 하나는 박사가 빨리 풉니다. 하지만 덧셈 100만 개라면 초등학생 수천 명이 나눠 푸는 쪽이 훨씬 빠릅니다.
⭐ 퍼셉트론과 GPU가 만나는 지점
노트에서 별표를 친 곳은 여기 하나였습니다. 앞의 내용이 전부 이 세 줄로 이어집니다.
- 뉴런 하나는
w · x + b, 곱하고 더하기입니다. - 뉴런 여러 개짜리 층 하나는 행렬 곱
y = Wx + b가 됩니다. - 입력 1,000개에 뉴런 1,000개짜리 층 하나면 곱셈이 100만 번입니다. 각 곱셈은 서로 독립이라 동시에 계산할 수 있습니다.
CPU는 코어 몇 개가 이 100만 번을 나눠서 차례차례 처리합니다. 그래서 느립니다.
GPU는 수천 개 코어가 동시에 나눠 처리합니다. 게다가 그래픽 계산(픽셀마다 같은 행렬 연산)과 구조가 똑같아서 그대로 가져다 쓸 수 있었습니다.
타임라인 한 장으로
| 연도 | 사건 | 의미 |
|---|---|---|
| 1958 | 퍼셉트론 등장 (로젠블랫) | 인공 뉴런의 시작 |
| 1969 | XOR 한계 증명 (민스키·페퍼트) | 1차 AI 빙하기 |
| 1986 | 역전파 논문 (럼멜하트·힌튼·윌리엄스) | 다층 퍼셉트론 학습 가능 |
| 2007 | NVIDIA CUDA 공개 | GPU를 그래픽 말고 일반 계산에도 쓸 수 있게 됨 |
| 2012 | AlexNet: GPU(GTX 580) 2장으로 학습, ImageNet 압승 (top-5 오류율 15.3% vs 2등 26.2%) | 딥러닝 붐 |
| 지금 | ChatGPT 같은 LLM | 거대한 퍼셉트론 층 쌓기 + GPU 수만 장 |
1969년에서 2012년까지 40년 넘게 걸린 셈입니다. 이론은 1986년에 이미 있었습니다. 기다린 건 그 계산을 감당할 하드웨어와 데이터였습니다.
🛠️ 오늘 살펴본 AI 도구
| 도구 | 만든 곳 | 한 줄 요약 |
|---|---|---|
| Hugging Face | Hugging Face | AI 모델·데이터셋 공유 플랫폼 ("AI계의 GitHub") |
| MediaPipe | 실시간 영상·이미지 ML 프레임워크 (써 본 것: 손 제스처 인식) | |
| Animated Drawings | Meta FAIR | 손그림 캐릭터에 사람 동작을 입혀 움직이게 |
Hugging Face
머신러닝·딥러닝 분야에서 가장 널리 쓰이는 오픈소스 AI 플랫폼이자 커뮤니티입니다. 소프트웨어 개발에 GitHub가 있다면 AI 생태계에는 Hugging Face가 있습니다. 그래서 흔히 "AI계의 GitHub"라고 부릅니다.
MediaPipe
Google이 만든 오픈소스 ML·컴퓨터 비전 프레임워크입니다. 안드로이드, iOS, 웹, 파이썬, 엣지 장치에서 실시간 비디오·이미지·오디오를 가볍고 빠르게 처리하도록 설계됐습니다. 저는 손 제스처 인식(Hand Landmarker)을 써 봤습니다.
Animated Drawings
Meta FAIR가 만든 도구입니다. 손으로 그린 2D 캐릭터에 사람의 3D 동작을 입혀 움직이는 애니메이션으로 바꿔 줍니다.
첫날을 한 줄로
퍼셉트론은 곱하고 더하기입니다. 층을 쌓으면 XOR도 풀리지만 계산량이 폭발합니다. 그 대량의 곱셈을 한꺼번에 처리하는 GPU가 딥러닝을 되살렸습니다.
첫날은 이렇게 "왜"를 먼저 짚었습니다. 파이썬 문법(변수, 자료형, 문자열, 리스트)은 Day 2에서 시작합니다.
Day 2부터 나오는 함수·메서드 표는 파이썬 치트시트에 따로 모아 뒀습니다.