13. DL Primer 단계별 학습 문서
원문 경로: sources/mlsysbook/13-dl_primer/source.md
짧은 소개
이 장은 딥러닝을 “신기한 모델”이나 “검은 상자”로 두지 않고, 실제로 어떤 계산이 일어나며 그 계산이 시스템 설계에 어떤 영향을 주는지 설명해요.
핵심 질문은 이것입니다.
딥러닝 시스템 엔지니어는 왜 신경망을 그냥 가져다 쓰는 데서 멈추지 않고, 행렬 곱셈, 활성화 함수, 손실 함수, 역전파, 메모리 대역폭까지 이해해야 할까요?
원문은 규칙 기반 프로그래밍에서 딥러닝으로 넘어온 이유를 먼저 보여 주고, 생물학적 뉴런이 인공 뉴런으로 번역되는 과정을 설명한 뒤, 신경망의 계산, 학습, 추론, 실제 USPS 손글씨 우편번호 인식 사례까지 이어서 다뤄요.
읽는 방법
이 장은 처음부터 수식 하나하나를 붙잡고 읽으면 금방 무거워질 수 있어요. 반복해서 층을 올리는 방식으로 읽는 편이 좋아요.
1회독: 목차, 서론, 요약을 보며 큰 질문을 잡아요
↓
2회독: 그림과 흐름을 따라 입력 → 층 → 예측 → 오차 → 수정 구조를 잡아요
↓
3회독: 수식, 행렬 크기, 메모리, 학습/추론 차이를 꼼꼼히 확인해요
처음에는 “딥러닝은 예시를 보고 규칙을 배우는 방식”이라고 이해하고, 그다음에는 “가중합과 비선형 함수가 층층이 이어진 함수”로 보고, 마지막에는 “대규모 행렬 연산과 메모리 이동을 다루는 시스템”으로 보면 됩니다.
이 장의 한 줄 요약
딥러닝은 사람이 규칙을 직접 쓰는 대신 데이터에서 표현을 학습하는 방식이며, 그 성능과 비용은 신경망 수식뿐 아니라 행렬 연산, 메모리 대역폭, 학습/추론 파이프라인, 배포 환경이 함께 결정해요.
1단계: 중학교 수준
1. 딥러닝은 규칙을 직접 쓰기 어려워서 등장했어요
고양이 사진을 알아보는 프로그램을 만든다고 생각해 볼게요.
옛날 방식이라면 사람이 규칙을 하나하나 써야 해요.
- 귀가 삼각형이면 고양이일 수 있어요.
- 수염이 있으면 고양이일 수 있어요.
- 네 발이 보이면 고양이일 수 있어요.
그런데 현실 사진은 너무 복잡해요. 고양이가 옆을 볼 수도 있고, 어두운 곳에 있을 수도 있고, 얼굴 일부가 가려질 수도 있어요. 규칙을 계속 추가해도 새로운 예외가 계속 생겨요.
딥러닝은 이 문제를 다른 방식으로 풀어요. 사람이 규칙을 전부 적는 대신, 많은 예시를 보여 주고 기계가 스스로 공통점을 찾게 해요.
강아지에게 “앉아”를 가르칠 때, 다리 근육을 어떻게 움직이라고 명령하지는 않죠. 잘 앉으면 칭찬하고 간식을 주면서 스스로 행동을 맞춰 가게 해요. 딥러닝도 정답 예시를 보며 점점 자기 판단을 고쳐 가는 방식에 가까워요.
2. 신경망은 여러 층을 지나는 판단 기계예요
신경망은 한 번에 답을 내는 상자가 아니에요. 여러 층을 차례대로 지나며 입력을 조금씩 바꿔요.
입력
↓
첫 번째 층: 아주 단순한 특징을 봐요
↓
중간 층: 단순한 특징을 조합해요
↓
마지막 층: 최종 답을 내요
손글씨 숫자 이미지를 예로 들면, 앞쪽 층은 선이나 모서리처럼 단순한 모양을 보고, 뒤쪽 층은 그 선들이 모여 어떤 숫자처럼 보이는지 판단해요.
3. 생물학적 뉴런은 힌트를 줬지만, 인공 신경망은 뇌 복제품이 아니에요
딥러닝의 이름에는 “뉴런”과 “신경망”이 나오지만, 컴퓨터 안에 진짜 뇌세포가 들어 있는 것은 아니에요.
생물학적 뉴런은 여러 신호를 받아서, 충분히 강한 신호가 모이면 다음 뉴런으로 신호를 보내요. 인공 뉴런은 이 아이디어를 아주 단순하게 바꿔요.
| 생물학적 느낌 | 인공 신경망에서의 느낌 |
|---|---|
| 여러 신호가 들어와요 | 여러 입력값이 들어와요 |
| 연결마다 영향력이 달라요 | 가중치가 입력의 중요도를 정해요 |
| 신호를 모아 판단해요 | 숫자를 곱하고 더해요 |
| 다음 세포로 신호를 보내요 | 다음 층으로 출력값을 넘겨요 |
이 장은 뇌를 그대로 흉내 내자는 이야기가 아니라, “여러 입력을 받아 중요도를 조절하고, 결과를 다음 단계로 넘기는 구조”가 어떻게 계산 시스템이 되는지 보여 줘요.
4. 학습은 틀린 만큼 조금씩 고치는 과정이에요
신경망은 처음부터 잘 맞히지 못해요. 처음 가중치는 대체로 임의의 숫자라서, 초기 예측은 거의 찍기에 가까워요.
그래서 학습은 다음처럼 반복돼요.
문제를 보여 줘요
↓
신경망이 답을 예측해요
↓
정답과 비교해 얼마나 틀렸는지 봐요
↓
틀린 원인을 뒤로 되짚어요
↓
연결의 세기를 조금 바꿔요
이 과정을 아주 많이 반복하면, 신경망은 어떤 입력에서 어떤 답이 나와야 하는지 점점 잘 맞히게 돼요.
5. 딥러닝은 계산과 메모리를 많이 써요
딥러닝은 단순히 “똑똑한 아이디어”가 아니에요. 실제로는 엄청나게 많은 숫자를 곱하고 더하는 작업이에요.
작은 손글씨 숫자 모델도 수만 개의 숫자를 저장하고 계산해요. 더 큰 모델은 수백만, 수십억 개의 숫자를 다뤄요. 그래서 GPU, TPU 같은 병렬 계산 장치와 빠른 메모리가 중요해져요.
중학교 수준에서는 이렇게 정리하면 충분해요.
딥러닝은 예시를 보고 스스로 패턴을 찾는 여러 층짜리 판단 기계예요. 하지만 그 판단 기계가 잘 돌아가려면 많은 숫자 계산과 빠른 메모리가 필요해요.
2단계: 고등학교 수준
1. 규칙 기반, 고전적 머신러닝, 딥러닝의 차이를 흐름으로 봐요
원문은 AI 방식이 다음 방향으로 발전했다고 설명해요.
| 방식 | 사람이 하는 일 | 기계가 하는 일 | 한계 |
|---|---|---|---|
| 규칙 기반 프로그래밍 | 규칙을 직접 작성해요 | 규칙대로 실행해요 | 예외가 많으면 규칙이 폭발해요 |
| 고전적 머신러닝 | 특징을 설계해요 | 그 특징으로 패턴을 배워요 | 좋은 특징 설계가 어렵고 문제마다 달라요 |
| 딥러닝 | 예시와 정답을 준비해요 | 특징과 판단 규칙을 함께 배워요 | 데이터, 계산, 메모리 요구가 커져요 |
고전적 컴퓨터 비전에서는 HOG, SIFT, Gabor filter처럼 사람이 설계한 특징 추출기가 중요했어요. 딥러닝은 원본 픽셀에서 시작해 여러 층을 거치며 필요한 특징을 스스로 만들어 가요.
2. 신경망 한 층은 가중합과 활성화 함수로 볼 수 있어요
고등학교 수준에서는 신경망을 “입력값을 받아 출력값을 만드는 함수”로 보면 좋아요.
입력 x → 신경망 f → 예측값 y_hat
한 뉴런은 여러 입력을 받아 중요도만큼 반영해요. 이때 입력의 중요도를 나타내는 숫자가 가중치예요.
간단히 쓰면 다음과 같아요.
[ z = \sum_i x_i w_i + b ]
- (x_i): 입력값이에요.
- (w_i): 각 입력을 얼마나 중요하게 볼지 정하는 가중치예요.
- (b): 결과를 위아래로 조정하는 편향이에요.
- (z): 아직 최종 출력이 되기 전의 중간 점수예요.
그다음 활성화 함수를 통과해요.
[ a = f(z) ]
활성화 함수는 신경망이 단순한 직선 규칙만 배우지 않고, 휘어진 복잡한 패턴도 배울 수 있게 해 줘요.
3. 여러 층을 쌓으면 단순한 특징이 복잡한 특징으로 바뀌어요
손글씨 숫자를 예로 들어 볼게요. 28×28 이미지는 784개의 픽셀값으로 바뀔 수 있어요.
784개 픽셀값
↓
첫 번째 숨은 층: 선, 모서리 같은 단순 패턴
↓
두 번째 숨은 층: 획, 굽은 모양 같은 조합 패턴
↓
출력층: 0부터 9까지의 가능성
이렇게 각 층이 이전 층의 출력을 다시 입력으로 받아요. 그래서 신경망은 하나의 큰 함수이면서, 내부적으로는 여러 작은 함수가 연결된 구조예요.
4. 행렬은 여러 뉴런의 계산을 한 번에 묶는 방법이에요
뉴런 하나씩 따로 계산하면 느려요. 그래서 실제 신경망은 여러 입력과 여러 뉴런의 가중치를 행렬로 묶어 계산해요.
[ \mathbf{Z} = \mathbf{X}\mathbf{W} + \mathbf{b} ]
- (\mathbf{X}): 여러 입력을 모은 행렬이에요.
- (\mathbf{W}): 가중치들을 모은 행렬이에요.
- (\mathbf{b}): 편향 벡터예요.
- (\mathbf{Z}): 다음 활성화 함수에 들어갈 중간 결과예요.
이 식은 수학적으로 깔끔할 뿐 아니라, GPU 같은 장치가 잘 처리하는 형태예요. 그래서 딥러닝은 행렬 계산과 잘 맞아요.
5. 손실 함수는 “얼마나 틀렸는지”를 숫자로 말해 줘요
모델이 예측한 값과 정답이 얼마나 다른지 알아야 학습할 수 있어요. 이 차이를 하나의 숫자로 만드는 함수가 손실 함수예요.
손글씨 숫자 분류에서는 출력이 10개 확률처럼 해석돼요. 예를 들어 정답이 7이라면, 7에 해당하는 확률이 높아야 해요. 만약 모델이 7을 낮게 보고 3을 높게 보면 손실이 커져요.
분류 문제에서는 cross-entropy loss를 많이 써요.
[ L(\hat{y}, y) = -\sum_j y_j \log(\hat{y}_j) ]
정답을 one-hot 벡터로 표현하면, 실제로는 “정답 클래스에 준 확률이 얼마나 높은가”를 강하게 따져요.
6. 역전파는 오차의 책임을 뒤로 나눠 주는 과정이에요
모델이 틀렸다면 마지막 출력만 고치면 될까요? 아니에요. 앞쪽 층의 가중치도 예측에 영향을 줬기 때문에, 어느 연결이 얼마나 잘못에 기여했는지 계산해야 해요.
역전파는 이 과정을 뒤에서 앞으로 수행해요.
예측값과 정답 비교
↓
손실 계산
↓
출력층의 책임 계산
↓
이전 층으로 오차 신호 전달
↓
각 가중치를 조금씩 수정
여기서 핵심 수학은 미분이에요. 손실을 줄이려면 각 가중치를 어느 방향으로 바꿔야 하는지 알아야 하고, 그 방향을 gradient라고 해요.
7. 학습과 추론은 같은 모델을 쓰지만 시스템 요구가 달라요
학습은 모델을 고치는 과정이고, 추론은 학습된 모델로 새 입력의 답을 내는 과정이에요.
| 구분 | 학습 | 추론 |
|---|---|---|
| 목적 | 가중치를 좋은 값으로 바꿔요 | 고정된 가중치로 예측해요 |
| 계산 | forward + loss + backward + update | forward만 해요 |
| 메모리 | 중간 activation, gradient, optimizer 상태가 필요해요 | 파라미터와 현재 계산값 중심이에요 |
| 관심사 | 수렴, 안정성, 학습 속도 | latency, throughput, 전력, 비용 |
| 최적화 | 큰 batch, 안정적인 gradient | quantization, pruning, batching, cache 활용 |
이 차이 때문에 학습용 시스템과 서비스 배포용 시스템은 서로 다른 설계를 갖는 경우가 많아요.
8. 고등학교 수준 중간 정리
딥러닝의 핵심 흐름은 다음과 같아요.
데이터 준비
↓
forward pass로 예측
↓
loss로 오차 측정
↓
backpropagation으로 gradient 계산
↓
optimizer가 weight와 bias 수정
↓
반복 학습 후 inference에 사용
이제 3단계에서는 원문의 섹션 순서를 따라, 왜 이런 구조가 시스템적으로 중요해지는지 더 엄밀하게 살펴볼게요.
3단계: 대학교 수준
1. Deep Learning Systems Engineering Foundation
원문은 딥러닝을 “모델 정확도”만의 문제가 아니라 “시스템 공학”의 문제로 시작해요. 고양이를 찾는 예시는 간단해 보이지만, 규칙 기반 프로그램으로는 모든 조명, 자세, 품종, 가림, 각도를 다 규칙으로 쓰기 어려워요. 이 한계가 규칙 기반 프로그래밍에서 데이터 기반 학습으로 넘어가게 만든 핵심 동기예요.
딥러닝 시스템은 전통적 소프트웨어와 다르게 작동해요.
- 전통적 프로그램은 사람이 쓴 명시적 규칙을 실행해요.
- 딥러닝 모델은 데이터에서 학습한 수학적 변환을 실행해요.
- 문제 발생 시 원인이 코드 버그가 아니라 gradient 불안정, activation의 수치 정밀도, tensor memory layout, memory bandwidth일 수 있어요.
따라서 엔지니어는 신경망을 블랙박스로만 보면 안 돼요. 행렬 곱셈은 메모리 대역폭 요구를 만들고, 활성화 함수 선택은 하드웨어 효율을 바꾸며, 역전파는 activation 저장과 gradient 계산이라는 큰 메모리 비용을 만들어요.
이 장의 기본 관점은 다음과 같아요.
| 수학 개념 | 시스템에서 드러나는 요구 |
|---|---|
| Matrix multiplication | 병렬 연산 장치와 높은 메모리 대역폭이 필요해요 |
| Activation function | 연산 비용, gradient 흐름, 모바일 호환성에 영향을 줘요 |
| Backpropagation | 중간 activation 저장과 gradient 메모리가 필요해요 |
| Optimization | 학습 안정성, 수렴 속도, resource allocation을 좌우해요 |
| Training vs inference | 서로 다른 하드웨어와 최적화 전략을 요구해요 |
핵심은 “신경망은 예측 함수”이면서 동시에 “대규모 tensor 연산 시스템”이라는 점이에요.
2. Evolution of ML Paradigms
2.1 Traditional Rule-Based Programming Limitations
규칙 기반 프로그래밍은 입력을 처리하는 규칙을 사람이 직접 작성하는 방식이에요. Breakout 같은 게임처럼 상태와 물리 규칙이 명확한 문제에는 효과적이에요. 공이 벽돌에 부딪히면 벽돌을 없애고 공의 방향을 바꾸면 되니까요.
하지만 현실 문제는 다릅니다. 사람의 활동을 걷기와 달리기로 나누는 문제만 봐도 속도 기준 하나로 끝나지 않아요. 천천히 뛰는 사람, 빨리 걷는 사람, 멈췄다가 다시 움직이는 전환 구간이 모두 예외가 돼요. 고양이 인식도 마찬가지예요. 귀, 수염, 털, 몸통 규칙을 만들어도 각도, 조명, 가림 때문에 규칙이 계속 늘어나요.
1970~1980년대의 expert system은 전문가 지식을 규칙으로 옮기는 방식이었지만, 사람이 자연스럽게 처리하는 시각, 음성, 언어 같은 암묵적 지식은 규칙화하기 어려웠어요.
2.2 Classical Machine Learning
고전적 머신러닝은 “모든 규칙을 쓰지 말고, 데이터에서 패턴을 배우자”는 방향으로 나아갔어요. 하지만 여기서도 사람이 feature를 잘 설계해야 했어요.
컴퓨터 비전 예시를 보면 다음과 같아요.
| 기법 | 역할 | 한계 |
|---|---|---|
| HOG | 이미지의 edge 방향 분포를 특징으로 만들어요 | 어떤 특징이 좋은지 사람이 설계해야 해요 |
| SIFT | 크기와 회전에 비교적 안정적인 keypoint를 찾아요 | 구현과 조정에 전문성이 필요해요 |
| Gabor filter | 방향과 주파수 기반 texture를 잡아요 | 문제마다 filter 설계가 달라져요 |
이 방식은 얼굴 검출, 보행자 검출 같은 문제에서 성과가 있었지만, 새로운 문제마다 feature extractor를 다시 고민해야 했고, 설계자가 예상하지 못한 패턴은 놓칠 수 있었어요.
2.3 Deep Learning: Automatic Pattern Discovery
딥러닝은 raw data에서 직접 표현을 배워요. 원문은 전통적 프로그래밍과 머신러닝의 관계를 뒤집어서 설명해요.
전통적 프로그래밍: 규칙 + 데이터 → 답
머신러닝/딥러닝: 데이터 + 정답 → 규칙에 해당하는 모델
딥러닝의 강점은 계층적 표현 학습이에요.
edge → shape → object → concept
초기 층은 단순한 시각 요소를 잡고, 깊은 층은 더 추상적인 개념을 구성해요. 원문은 deep network가 계층적 구조를 가진 현실 패턴과 잘 맞기 때문에, 데이터와 계산이 늘어날수록 성능이 계속 좋아질 수 있다고 설명해요. ImageNet 경쟁에서 전통적 방법, AlexNet, ResNet을 거치며 오류율이 급격히 낮아진 흐름도 이 주장을 뒷받침해요.
다만 이 성공은 공짜가 아니에요. 딥러닝은 대규모 데이터, 큰 모델, 고성능 계산 장치, 빠른 저장 장치와 메모리를 요구해요.
2.4 Computational Infrastructure Requirements
딥러닝은 계산 시스템 자체를 바꿔요.
전통적 프로그램은 상대적으로 순차적이고 예측 가능한 메모리 접근 패턴을 가져요. 고전적 머신러닝은 feature extraction 때문에 계산량이 늘지만, 여전히 비교적 구조가 분명해요. 딥러닝은 거대한 행렬 연산과 tensor 이동이 중심이 돼요.
핵심 요구는 세 가지예요.
| 요구 | 설명 | 시스템적 의미 |
|---|---|---|
| Parallel matrix operation | 많은 곱셈과 덧셈을 동시에 처리해요 | CPU보다 GPU/TPU가 유리해요 |
| Hierarchical memory architecture | 빠른 cache와 큰 main memory 사이를 오가요 | data reuse와 memory locality가 중요해요 |
| Distributed computing | 모델과 데이터가 커지면 여러 장치가 필요해요 | 통신, 동기화, 효율이 병목이 될 수 있어요 |
특히 원문은 memory wall을 강조해요. 계산 장치를 더 늘려도, 데이터를 충분히 빨리 공급하지 못하면 연산 유닛은 기다리게 돼요. 그래서 neural accelerator는 가중치를 가까운 메모리에 두고 재사용하는 방식, high-bandwidth memory, cache hierarchy를 중요하게 다뤄요.
3. From Biology to Silicon
3.1 Biological Neural Processing Principles
원문은 생물학적 뇌에서 네 가지 원리를 뽑아요.
| 생물학적 원리 | 인공 신경망 설계에 주는 힌트 |
|---|---|
| Adaptive learning | 고정 규칙 대신 경험으로 연결을 바꿔요 |
| Parallel processing | 많은 작은 단위가 동시에 일해요 |
| Pattern recognition | 복잡하고 noisy한 데이터에서 패턴을 찾아요 |
| Energy efficiency | 인간 뇌는 약 20W로 엄청난 처리를 해요 |
중요한 점은 인공 신경망이 뇌를 그대로 복제하지 않는다는 거예요. 뇌의 원리 중 컴퓨터에서 구현 가능한 부분을 수학적 연산으로 추상화해요.
3.2 Biological Neuron Structure
생물학적 뉴런의 구성요소는 인공 뉴런의 구성요소와 이렇게 대응돼요.
| 생물학적 구성 | 역할 | 인공 신경망 대응 |
|---|---|---|
| Cell / neuron | 기본 처리 단위 | node 또는 artificial neuron |
| Dendrite | 다른 뉴런에서 신호를 받아요 | input |
| Synapse | 연결 강도를 조절해요 | weight |
| Soma | 들어온 신호를 통합해요 | weighted sum 또는 net input |
| Axon | 처리된 신호를 내보내요 | output |
이 대응은 직관을 주지만, 구현 방식은 크게 달라요. 생물학적 기억은 synapse와 neural pattern에 분산돼 있지만, 인공 신경망은 weight와 parameter라는 숫자 배열에 정보를 저장해요.
3.3 Artificial Neural Network Design Principles
생물학적 뉴런은 느리게 동작하지만, 엄청난 병렬성과 낮은 전력으로 강력한 처리를 해요. 반대로 silicon processor는 개별 연산은 매우 빠르지만, 대규모 신경망을 학습할 때 전력과 메모리 이동 비용이 커져요.
인공 신경망이 가져온 설계 요소는 다음이에요.
- 여러 입력을 통합하는 단순 처리 단위
- 경험에 따라 바뀌는 연결 강도
- threshold 또는 activation을 통한 비선형 반응
- 병렬 처리 구조
- 연결 강도 수정을 통한 학습
하지만 이 요소를 컴퓨터에 올리면 곧바로 시스템 요구가 생겨요. weight 저장 공간, weight를 읽어 오는 대역폭, activation 계산 장치, 학습 중 gradient 저장 공간이 모두 필요해요.
3.4 Mathematical Translation of Neural Concepts
인공 뉴런은 생물학적 과정을 세 가지 연산으로 단순화해요.
weighted input processing → summation → activation
수식으로는 다음 흐름이에요.
[ z = \sum_i x_i w_i + b ]
[ \hat{y} = f(z) ]
여기서 synapse의 연결 강도는 (w_i), soma의 신호 통합은 합산, threshold 기반 발화는 activation function에 대응돼요.
이 단순화 덕분에 신경망은 디지털 컴퓨터에서 실행 가능해졌지만, 동시에 많은 숫자 배열을 계속 읽고 쓰는 비용이 생겼어요. 원문은 이 지점에서 “생물학에서는 자연스러운 일이 인공 시스템에서는 높은 메모리 대역폭 요구로 바뀐다”고 설명해요.
3.5 Hardware and Software Requirements
생물학적 시스템은 memory와 processing이 통합돼 있지만, 일반 컴퓨터는 memory와 processor가 분리돼 있어요. 이 차이가 딥러닝 시스템의 병목을 만들어요.
- 수많은 weight를 저장할 큰 메모리가 필요해요.
- weight와 activation을 빠르게 이동시킬 bandwidth가 필요해요.
- 학습 중에는 gradient와 중간 activation까지 저장해야 해요.
- backpropagation은 생물학적 직접 대응물이 없는 계산 절차라서 소프트웨어 프레임워크와 하드웨어 최적화가 중요해요.
TensorFlow와 PyTorch 같은 프레임워크는 automatic differentiation, GPU memory 관리, 분산 학습 지원을 제공하며 복잡한 미분 계산을 시스템 기능으로 만들어 줘요.
3.6 Evolution of Neural Network Computing
원문은 perceptron에서 현대 딥러닝까지의 발전을 데이터, 알고리즘, 인프라의 공동 진화로 봐요.
- 1950년대 perceptron은 학습 가능한 인공 신경망의 출발점이었지만 당시 하드웨어가 약했어요.
- 1980년대 backpropagation은 다층 신경망 학습의 이론적 돌파구였지만 계산량이 컸어요.
- 2010년대 이후 deep learning이라는 이름이 널리 쓰이면서 GPU, 대규모 데이터, 안정적인 학습 알고리즘이 함께 발전했어요.
- TPU, high-bandwidth memory, fast interconnect, PyTorch/TensorFlow 같은 프레임워크가 실험과 배포를 가능하게 했어요.
결국 현대 딥러닝은 세 요소가 함께 맞아떨어진 결과예요.
더 많은 데이터
↔ 더 좋은 알고리즘
↔ 더 강한 컴퓨팅 인프라
4. Neural Network Fundamentals
4.1 Network Architecture Fundamentals
원문은 MNIST 손글씨 숫자 인식을 기본 예시로 사용해요. 각 이미지는 (28 \times 28 = 784)개 픽셀로 이루어져 있고, 각 픽셀값은 보통 0부터 255 사이에서 ([0,1]) 범위로 정규화돼요.
출력은 10개 값이에요. 각각 0부터 9까지의 숫자일 가능성을 나타내요.
예시 architecture는 다음과 같아요.
784 input neurons → 128 hidden neurons → 64 hidden neurons → 10 output neurons
이 구조는 작지만, 신경망의 기본 원리인 input representation, hidden transformation, output representation, parameter count, memory cost를 모두 보여 주기에 충분해요.
4.2 Nonlinear Activation Functions
한 뉴런은 먼저 weighted sum을 계산해요.
[ z = \sum_i x_i w_{ij} + b ]
그다음 activation function을 적용해요.
[ \hat{y} = \sigma(z) ]
activation이 없으면 여러 선형 층을 쌓아도 전체는 결국 하나의 선형 변환과 같아져요. 그래서 복잡한 비선형 패턴을 배우려면 activation이 필요해요.
원문이 다루는 주요 activation은 다음과 같아요.
| 함수 | 식과 범위 | 장점 | 한계와 시스템 의미 |
|---|---|---|---|
| Sigmoid | (\sigma(x)=\frac{1}{1+e^{-x}}), 0~1 | 확률처럼 해석하기 좋아요 | 큰 입력에서 gradient가 작아져 vanishing gradient가 생겨요. exponential 계산도 비싸요 |
| Tanh | (\tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}), -1~1 | zero-centered라 sigmoid보다 균형이 좋아요 | 여전히 saturation 구간에서 gradient가 작아져요 |
| ReLU | (\max(0,x)) | 양수 구간 gradient가 1이고 계산이 매우 싸요 | 계속 음수만 나오면 dying ReLU가 될 수 있어요 |
| Softmax | (\frac{e^{z_i}}{\sum_j e^{z_j}}) | 여러 class 확률 분포를 만들어요 | 보통 출력층 분류에 사용하고 수치 안정성이 중요해요 |
ReLU가 널리 쓰이는 이유는 수학적 이유와 하드웨어 이유가 함께 있어요. 양수 구간에서 gradient가 잘 흐르고, 계산이 단순 비교에 가까워서 sigmoid나 tanh보다 시간과 에너지를 덜 써요.
Universal approximation theorem은 activation이 있는 신경망이 충분한 뉴런을 가지면 연속 함수를 임의로 가깝게 근사할 수 있음을 말해요. 하지만 이 정리는 “얼마나 많은 뉴런이 필요한지”나 “어떻게 그 weight를 찾는지”까지 보장하지는 않아요. 그래서 실제 학습 알고리즘과 architecture 설계가 중요해져요.
4.3 Layers and Connections
단일 perceptron은 단순한 결정만 할 수 있어요. 신경망의 힘은 여러 뉴런을 layer로 묶고, layer를 여러 단계로 쌓을 때 나와요.
- Input layer는 raw feature를 받아요.
- Hidden layer는 표현을 여러 단계로 변환해요.
- Output layer는 최종 prediction을 만들어요.
각 layer는 이전 layer의 출력을 받아 weighted sum과 activation을 적용하고, 다음 layer로 넘겨요. 이 반복이 계층적 feature learning을 만들어요.
4.4 Parameters and Connections
신경망에서 학습되는 주요 parameter는 weight와 bias예요.
입력 feature가 (n)개이고 layer에 neuron이 (m)개라면 weight matrix는 다음 크기를 가져요.
[ \mathbf{W} \in \mathbb{R}^{n \times m} ]
한 layer의 계산은 다음처럼 표현할 수 있어요.
[ \mathbf{z} = \mathbf{x}^T\mathbf{W} + \mathbf{b} ]
여기서 (\mathbf{b} \in \mathbb{R}^m)는 각 neuron의 activation 기준을 조정해요. bias가 없으면 모든 입력이 0일 때 출력이 항상 제한되어 표현력이 줄어요.
전체 (L)개 layer 신경망은 layer마다 (\mathbf{W}^{(l)}), (\mathbf{b}^{(l)}), (f^{(l)})를 가져요.
[ \mathbf{h}^{(l)} = f^{(l)}(\mathbf{h}^{(l-1)T}\mathbf{W}^{(l)} + \mathbf{b}^{(l)}) ]
이 식은 신경망 계산의 핵심이에요. 동시에 시스템적으로는 각 layer의 weight matrix와 activation vector를 저장하고 빠르게 읽어야 한다는 뜻이에요.
4.5 Architecture Design
원문은 XOR 문제로 hidden layer의 필요성을 설명해요. XOR은 단일 선형 경계로는 풀 수 없어서, 최소한의 hidden layer가 필요해요. 이것은 “깊이”가 단순한 장식이 아니라 비선형 패턴을 표현하기 위한 구조임을 보여 줘요.
MNIST feedforward network에서는 입력층과 출력층 크기가 문제에 의해 거의 정해져요.
- 입력: (28 \times 28 = 784)개 픽셀
- 출력: 0~9 숫자를 위한 10개 class
반면 hidden layer의 개수와 너비는 설계자가 결정해야 해요.
| 설계 선택 | 장점 | 비용 |
|---|---|---|
| 더 깊게 만들기 | 더 추상적인 표현을 만들 수 있어요 | 학습이 어려워지고 vanishing gradient 위험이 커져요 |
| 더 넓게 만들기 | 한 층에서 더 많은 feature를 병렬로 배울 수 있어요 | parameter와 계산량이 늘어요 |
| dense 연결 | 모든 관계를 학습할 자유도가 있어요 | parameter가 크게 늘고 구조적 낭비가 생겨요 |
| sparse 연결 | 문제 구조를 반영해 효율적일 수 있어요 | 설계에 domain knowledge가 필요해요 |
| skip connection | 깊은 모델에서 정보와 gradient 흐름을 도와요 | architecture가 복잡해져요 |
parameter 수는 인접 layer 크기에 의해 정해져요.
[ \text{parameters between layers} = n_l \times n_{l+1} + n_{l+1} ]
원문의 예시인 (784 \rightarrow 100 \rightarrow 100 \rightarrow 10) network는 다음 parameter를 가져요.
| 연결 | weight 수 | bias 수 |
|---|---|---|
| 784 → 100 | 78,400 | 100 |
| 100 → 100 | 10,000 | 100 |
| 100 → 10 | 1,000 | 10 |
| 합계 | 89,400 | 210 |
총 89,610개 parameter예요. 작은 MNIST 모델도 이 정도이고, 현대 모델은 이 수가 수백만에서 수십억으로 커져요.
5. Learning Process
5.1 Supervised Learning from Labeled Examples
학습은 random하게 초기화된 weight를 의미 있는 pattern으로 바꾸는 과정이에요. MNIST에서는 60,000개의 학습 이미지와 정답 label을 사용해요.
한 iteration은 보통 하나의 batch를 처리해요.
batch 입력
↓
forward computation으로 예측
↓
loss function으로 오차 측정
↓
backpropagation으로 gradient 계산
↓
weight update
수식으로는 입력 (x), 정답 (y), parameter (\theta)에 대해 다음처럼 쓸 수 있어요.
[ \hat{y} = f(x;\theta) ]
[ \text{loss} = L(\hat{y}, y) ]
batch processing은 두 가지 이유로 중요해요. 첫째, 여러 예시를 한 번에 처리해 GPU를 잘 활용해요. 둘째, 여러 예시의 평균 gradient를 사용하므로 update가 더 안정적이에요.
5.2 Forward Pass Computation
forward propagation은 입력에서 예측까지 계산하는 과정이에요. 학습과 추론 모두에서 사용돼요.
각 layer는 두 단계를 반복해요.
[ \mathbf{Z}^{(l)} = \mathbf{W}^{(l)}\mathbf{A}^{(l-1)} + \mathbf{b}^{(l)} ]
[ \mathbf{A}^{(l)} = f(\mathbf{Z}^{(l)}) ]
전체 흐름은 다음과 같아요.
Input → Linear Transform → Activation → Linear Transform → Activation → Output
batch 크기가 (B)인 MNIST 예시에서는 입력 (\mathbf{X})가 (B \times 784) 형태가 돼요. batch가 32이고 첫 hidden layer가 128개 neuron이면, 첫 layer 결과는 (32 \times 128) 행렬이 돼요.
forward pass 중간 activation은 학습 중 backward pass에서 필요하므로 저장해야 해요. 예를 들어 batch size 32, hidden layer 크기 128, 256, 128이면 hidden/output activation만 16,704개 값을 저장해야 해요. 모델이 커질수록 이 저장 비용은 매우 커져요.
5.3 Loss Functions
loss function은 “좋은 예측”이라는 추상적 목표를 최적화 가능한 숫자로 바꿔요.
분류 문제인 MNIST에서는 cross-entropy loss가 표준적으로 쓰여요. 정답 digit이 7이면 one-hot vector는 7 위치만 1이고 나머지는 0이에요.
[ L(\hat{y}, y) = -\sum_{j=1}^{10} y_j \log(\hat{y}_j) ]
정답 class가 (c)이면 다음처럼 단순해져요.
[ L(\hat{y}, y) = -\log(\hat{y}_c) ]
즉 정답 class에 높은 확률을 주면 loss가 낮고, 낮은 확률을 주면 loss가 커져요. 이 loss는 gradient의 시작점이 되므로 학습 방향을 결정해요.
실제 구현에서는 수치 안정성도 중요해요.
- (\log(0))을 피하려고 작은 (\epsilon)을 더해요.
- softmax 계산에서는 (\max(z))를 빼는 log-sum-exp trick을 사용해 overflow를 줄여요.
- batch loss는 예시별 loss를 평균내 계산해요.
5.4 Gradient Computation and Backpropagation
역전파는 credit assignment 문제를 푸는 알고리즘이에요. 공장 조립 라인에서 마지막 검사에서 문제가 발견되면 어느 공정이 얼마나 책임이 있는지 뒤로 추적하듯, 신경망도 출력층에서 시작해 앞쪽 layer로 오차 신호를 보냅니다.
gradient 흐름은 forward와 반대 방향이에요.
[ \frac{\partial L}{\partial \mathbf{A}^{(l)}}
\frac{\partial L}{\partial \mathbf{A}^{(l+1)}} \frac{\partial \mathbf{A}^{(l+1)}}{\partial \mathbf{A}^{(l)}} ]
각 layer에서 중요한 gradient는 세 가지예요.
[ \frac{\partial L}{\partial \mathbf{W}^{(l)}}
\frac{\partial L}{\partial \mathbf{Z}^{(l)}}{\mathbf{A}^{(l-1)}}^T ]
[ \frac{\partial L}{\partial \mathbf{b}^{(l)}}
\frac{\partial L}{\partial \mathbf{Z}^{(l)}} ]
[ \frac{\partial L}{\partial \mathbf{A}^{(l-1)}}
{\mathbf{W}^{(l)}}^T \frac{\partial L}{\partial \mathbf{Z}^{(l)}} ]
이 수식들은 chain rule을 layer별로 적용한 결과예요. 현대 프레임워크는 forward pass 중 computation graph를 기록하고, 필요한 중간값을 저장한 뒤, backward() 호출 시 자동으로 gradient를 계산해요.
시스템 관점에서 역전파가 무거운 이유는 분명해요.
- forward pass의 중간 activation을 버리지 못해요.
- weight와 bias 크기만큼 gradient를 저장해야 해요.
- Adam 같은 optimizer는 momentum과 velocity를 추가로 저장해 gradient 저장량을 더 키워요.
- 모델이 커지면 memory bandwidth가 병목이 돼요.
또한 깊은 네트워크에서는 gradient가 너무 작아지는 vanishing gradient나 너무 커지는 exploding gradient가 생길 수 있어요. sigmoid나 tanh의 saturation 구간은 vanishing gradient를 악화시킬 수 있고, ReLU와 초기화 전략은 이를 완화하는 데 도움을 줘요.
5.5 Weight Update and Optimization
gradient를 구한 뒤에는 parameter를 수정해요. 기본 규칙은 gradient descent예요.
[ \theta_{\text{new}} = \theta_{\text{old}} - \alpha \nabla_{\theta}L ]
- (\theta): weight나 bias 같은 parameter예요.
- (\alpha): learning rate예요.
- (\nabla_{\theta}L): loss를 줄이기 위해 참고하는 gradient예요.
learning rate가 너무 크면 최적점을 지나쳐 loss가 출렁이거나 폭발할 수 있어요. 너무 작으면 학습이 매우 느려져요.
mini-batch gradient descent에서는 batch 안의 예시별 gradient를 평균내요.
[ \nabla_{\theta}L_{\text{batch}}
\frac{1}{B}\sum_{i=1}^B \nabla_{\theta}L_i ]
batch size는 중요한 시스템 trade-off예요. 큰 batch는 GPU 활용률과 gradient 안정성을 높일 수 있지만, activation 저장 공간이 batch size에 비례해서 늘어요. 그래서 사용 가능한 GPU memory가 batch size의 실질적 한계가 됩니다.
한 번 전체 training dataset을 모두 보는 것을 epoch라고 해요. MNIST처럼 60,000장, batch size 32라면 한 epoch는 1,875번의 batch iteration으로 구성돼요.
학습 안정성을 보려면 training loss, validation accuracy, training-validation gap을 함께 봐야 해요. training 성능만 좋아지고 validation 성능이 나빠지면 overfitting을 의심해야 해요.
6. Inference Pipeline
6.1 Production Deployment and Prediction Pipeline
추론은 학습된 parameter를 고정한 상태에서 새 입력에 대한 prediction을 만드는 단계예요. 학습과 달리 weight update가 없고 backward pass도 없어요.
원문은 여기서 중요한 제약을 짚어요. 배포된 모델은 runtime에 스스로 parameter를 바꾸지 않아요. 운영 데이터 분포가 바뀌어도 모델은 훈련 때 배운 통계적 pattern으로 계산을 계속해요. 그래서 데이터 분포가 변하면 체계적인 retraining이 필요해요.
6.2 Operational Phase Differences
학습과 추론의 차이는 시스템 설계를 크게 바꿔요.
| 항목 | Training | Inference |
|---|---|---|
| parameter | 계속 update돼요 | freeze돼요 |
| 계산 | forward + backward + optimizer | forward only |
| 메모리 | activation, gradient, optimizer state가 필요해요 | weight와 현재 activation 중심이에요 |
| precision | gradient 안정성을 위해 높은 정밀도가 자주 필요해요 | FP16, INT8 같은 reduced precision 활용 가능해요 |
| 목표 | 수렴과 일반화 | latency, throughput, energy efficiency |
| 하드웨어 | 고메모리 GPU와 냉각 인프라 | 모바일 NPU, edge accelerator, inference instance |
학습은 보통 더 많은 메모리를 써요. 중간 activation을 저장해야 하고, gradient와 optimizer 상태도 필요하기 때문이에요. 반면 추론은 각 layer 계산이 끝나면 이전 activation을 버리거나 buffer를 재사용할 수 있어요.
6.3 End-to-End Prediction Workflow
원문은 딥러닝 시스템이 neural computation만으로 이루어지지 않는다고 강조해요. 실제 inference pipeline은 hybrid architecture예요.
Raw input
↓
Pre-processing
↓
Neural network computation
↓
Raw output
↓
Post-processing
↓
Action or decision
pre-processing과 post-processing은 보통 전통적 computing logic으로 실행돼요. neural network는 그 중간에서 학습된 행렬 변환을 수행해요. 따라서 병목은 모델 내부뿐 아니라 이미지 resize, normalization, validation, output formatting 같은 주변 단계에서도 생길 수 있어요.
6.4 Data Preprocessing and Normalization
MNIST 예시에서 raw image는 다양한 크기, 방향, pixel range를 가질 수 있어요. 모델에 넣기 전에는 다음 과정이 필요해요.
- (28 \times 28) 크기로 scaling해요.
- pixel 값을 ([0,255])에서 ([0,1])로 normalization해요.
- 2D 이미지를 784-dimensional vector로 flatten해요.
- 입력이 올바른지 validation해요.
pre-processing은 학습된 변환이 아니라 고정된 deterministic transformation이에요. 하지만 성능에는 매우 중요해요. normalization이 어긋나면 모델은 훈련 때와 다른 분포를 보게 되고 정확도가 떨어질 수 있어요.
6.5 Forward Pass Computation Pipeline
추론 전에 trained weight와 bias를 memory에 load해야 해요. 원문의 (784 \rightarrow 100 \rightarrow 100 \rightarrow 10) network는 다음 parameter를 가져요.
- (784 \times 100 = 78,400) weights, 100 biases
- (100 \times 100 = 10,000) weights, 100 biases
- (100 \times 10 = 1,000) weights, 10 biases
총 89,610개 parameter예요. FP32라면 약 358.44KB예요.
단일 이미지 inference에서는 activation도 작아요.
- 첫 hidden layer output: 100 values
- 두 번째 hidden layer output: 100 values
- output layer: 10 values
총 210 values, FP32 기준 약 0.84KB예요.
연산량도 고정돼요.
| layer | multiply-add 수 |
|---|---|
| 첫 layer | 78,400 |
| 두 번째 layer | 10,000 |
| 출력 layer | 1,000 |
| 합계 | 89,400 |
이 고정성과 단순성 때문에 inference는 quantization, pruning, batching, memory buffer reuse, hardware-specific kernel 같은 최적화가 잘 먹혀요.
6.6 Performance Enhancement Techniques
inference batch size는 latency와 throughput의 균형 문제예요.
- 단일 입력 처리: latency가 낮아서 실시간 응답에 좋아요.
- batch 처리: GPU 같은 병렬 장치를 잘 써서 throughput이 높아요.
추론에서는 중간값을 오래 저장할 필요가 없으므로 in-place operation과 buffer reuse가 가능해요. 또한 training보다 낮은 precision을 사용해도 정확도 손실이 작을 때가 많아요. FP32 대신 FP16이나 INT8을 쓰면 메모리와 연산 비용을 크게 줄일 수 있어요.
6.7 Output Interpretation and Decision Making
모델의 output은 보통 바로 업무 결정이 아니에요. 예를 들어 MNIST 모델은 10개 확률을 내지만, 실제 시스템은 다음을 결정해야 해요.
- 가장 높은 확률의 digit을 선택할지
- confidence가 낮으면 사람에게 넘길지
- downstream system이 요구하는 형식으로 변환할지
- 오류와 예외를 어떻게 처리할지
이 post-processing은 전통적 CPU logic에 가까워요. 그래서 딥러닝 시스템은 neural network accelerator와 일반 CPU가 함께 일하는 heterogeneous system이 되는 경우가 많아요.
7. Case Study: USPS Digit Recognition
7.1 The Mail Sorting Challenge
USPS 손글씨 우편번호 인식 시스템은 신경망이 실제 대규모 생산 환경에 들어간 초기 사례예요. USPS는 하루에 1억 개가 넘는 우편물을 처리해야 했고, 손글씨 ZIP code를 빠르게 읽어 분류해야 했어요.
문제는 단순한 숫자 분류가 아니었어요.
- 사람마다 손글씨가 달라요.
- 봉투 색, 종이 질감, 펜 굵기가 달라요.
- 조명과 카메라 품질이 달라요.
- 밀리초 단위로 처리해야 해요.
- 잘못 분류하면 배송 지연과 비용이 생겨요.
따라서 이 시스템은 정확도뿐 아니라 confidence, 처리량, 예외 처리, 기계 장치와의 동기화까지 필요했어요.
7.2 Engineering Process and Design Decisions
데이터 수집은 가장 중요한 출발점이었어요. 실험실의 깨끗한 이미지가 아니라 실제 우편 시설의 다양한 손글씨와 환경을 반영해야 했어요. 이 과정은 이후 MNIST 데이터베이스와도 연결돼요.
architecture 설계는 정확도와 처리 시간 사이의 균형이었어요. 깊은 network는 정확도를 높일 수 있지만 당시 하드웨어에서는 처리 시간이 문제가 될 수 있었어요. 그래서 (28 \times 28) digit image를 빠르게 처리하면서도 충분한 정확도를 내는 구조가 필요했어요.
confidence threshold도 중요한 설계였어요.
- threshold가 너무 높으면 자동 처리되는 우편물이 줄어들어요.
- threshold가 너무 낮으면 잘못 분류되는 우편물이 늘어요.
정답인 경우와 오답인 경우의 confidence 분포를 분석해서 자동화율과 오류율 사이의 균형을 잡아야 했어요.
7.3 Production System Architecture
하나의 우편물이 처리되는 흐름은 이 장 전체의 개념을 묶어 보여 줘요.
고속 카메라로 ZIP code 영역 촬영
↓
이미지 전처리: 영역 찾기, digit 분리, thresholding, 28×28 정규화
↓
신경망 inference: 각 digit의 0~9 확률 계산
↓
post-processing: confidence 확인, ZIP code 조합
↓
분류 기계에 sorting instruction 전달
pre-processing은 전통적 computer vision이고, inference는 neural network computation이며, post-processing은 업무 규칙과 기계 제어에 가까워요. 이 혼합 구조가 실제 딥러닝 시스템의 모습이에요.
7.4 Performance Outcomes and Operational Impact
USPS 시스템은 수작업 분류를 크게 줄이고 처리 속도를 높였어요. 하지만 사람을 완전히 없앤 것은 아니에요. confidence가 낮거나 불확실한 우편물은 사람에게 넘어갔고, 사람의 역할은 전체 입력을 직접 처리하는 것에서 예외와 불확실 사례를 다루는 방향으로 바뀌었어요.
이 사례는 production 딥러닝의 교훈을 분명히 보여 줘요.
- training data가 실제 운영 분포를 잘 대표해야 해요.
- preprocessing 품질은 모델 정확도만큼 중요할 수 있어요.
- confidence threshold는 자동화와 오류율 사이의 핵심 조절 장치예요.
- 배포 시스템은 모델뿐 아니라 카메라, 조명, 기계 장치, monitoring을 포함해요.
- 운영 중 데이터 분포가 바뀌면 retraining과 유지보수가 필요해요.
7.5 Key Engineering Lessons
USPS 사례의 핵심은 “수학적으로 가능한 모델”을 “현장에서 돌아가는 시스템”으로 바꾸려면 파이프라인 전체를 설계해야 한다는 점이에요.
현대 edge AI, 모바일 얼굴 인식, 자율주행 perception도 같은 원리를 공유해요. 모델은 더 커지고 하드웨어는 더 좋아졌지만, 정확도와 latency, 전력, memory, confidence, human fallback 사이의 균형은 여전히 중요해요.
8. Deep Learning and the AI Triangle
원문은 딥러닝을 AI Triangle의 세 요소로 정리해요.
| 요소 | 이 장에서의 의미 |
|---|---|
| Algorithms | forward propagation, activation, backpropagation, gradient descent, architecture 선택이에요 |
| Data | label, 분포, 품질, 전처리, augmentation이 학습 성공을 결정해요 |
| Infrastructure | GPU/TPU, memory bandwidth, distributed training, inference accelerator가 실행 가능성을 결정해요 |
딥러닝의 성공은 알고리즘 하나만의 승리가 아니에요. 더 큰 데이터, 더 안정적인 학습 방법, 더 강한 계산 인프라가 함께 맞물렸기 때문에 가능했어요.
한 요소만 최적화하면 한계가 있어요. 좋은 알고리즘도 나쁜 데이터에서는 실패하고, 좋은 데이터도 계산 인프라가 없으면 훈련하기 어렵고, 강한 하드웨어도 학습 가능한 알고리즘이 없으면 의미가 없어요.
9. Fallacies and Pitfalls
원문은 딥러닝을 둘러싼 오해와 함정을 정리해요.
오해 1: 신경망은 이해하거나 디버깅할 수 없는 완전한 black box예요
신경망은 전통적 코드처럼 line-by-line으로 읽기 어렵지만, 완전히 이해 불가능한 것은 아니에요. activation visualization, gradient analysis, attention, ablation study 같은 방법으로 어떤 feature가 영향을 주는지 분석할 수 있어요.
오해 2: 딥러닝은 domain expertise를 없애 줘요
딥러닝은 feature engineering 부담을 줄이지만, domain knowledge를 없애지는 않아요. USPS 사례도 우편 처리 지식, 손글씨 다양성, 운영 제약, confidence threshold 설계가 있었기 때문에 성공했어요.
함정 1: 간단한 문제에 너무 복잡한 딥러닝 모델을 쓰는 것
데이터가 적거나 관계가 거의 선형인 문제에서는 logistic regression, linear model, decision tree가 더 빠르고 안정적일 수 있어요. 딥러닝은 hierarchy, non-linearity, high-dimensional interaction이 중요한 문제에서 특히 강해요.
함정 2: 데이터 분포를 이해하지 않고 학습하는 것
imbalanced dataset, outlier, non-stationary distribution은 학습을 크게 망칠 수 있어요. 모델 구조만 바꾸기 전에 데이터가 어떤 분포를 갖는지, minority class는 충분한지, 운영 데이터와 훈련 데이터가 다른지 봐야 해요.
함정 3: 연구용 모델을 그대로 production에 넣는 것
연구 환경에서 정확도가 높은 모델도 production에서는 실패할 수 있어요. latency budget, memory limit, concurrent traffic, preprocessing pipeline, serialization format, monitoring, fault tolerance가 모두 필요해요.
10. Summary
이 장은 fully-connected neural network를 중심으로 딥러닝의 기본 계산과 시스템 함의를 설명했어요.
핵심 정리는 다음과 같아요.
- 신경망은 hand-coded rule 대신 데이터에서 pattern을 학습해요.
- layer는 raw input을 점점 더 추상적인 representation으로 바꿔요.
- activation function은 비선형성을 넣어 복잡한 pattern을 표현하게 해요.
- training은 forward, loss, backward, update의 반복이에요.
- inference는 parameter를 고정하고 forward pass만 수행해요.
- training과 inference는 memory, precision, latency, throughput 요구가 달라요.
- fully-connected network는 이론적으로 강력하지만 이미지 같은 구조적 데이터에서는 모든 입력 관계를 똑같이 다뤄 비효율적일 수 있어요.
- CNN, RNN, Transformer 같은 특수 architecture는 이미지의 공간성, sequence의 시간성, attention 기반 관계 같은 문제 구조를 network 설계에 반영해 효율을 높여요.
마지막으로 이 장의 관점은 분명해요.
딥러닝을 잘 다루려면 수식만 알아도 부족하고, 하드웨어만 알아도 부족해요. 어떤 수식이 어떤 메모리 이동과 계산 패턴을 만들고, 그것이 학습과 추론 시스템에 어떤 요구를 만드는지 함께 봐야 해요.
복습 질문
- 규칙 기반 프로그래밍이 고양이 인식이나 손글씨 숫자 인식 같은 문제에서 어려운 이유는 무엇인가요?
- 고전적 머신러닝의 feature engineering과 딥러닝의 automatic representation learning은 어떻게 다른가요?
- 생물학적 뉴런의 dendrite, synapse, soma, axon은 인공 뉴런에서 각각 무엇에 대응하나요?
- (z = \sum_i x_i w_i + b)에서 (x_i), (w_i), (b), (z)는 각각 어떤 의미인가요?
- activation function이 없으면 여러 층을 쌓아도 표현력이 제한되는 이유는 무엇인가요?
- sigmoid, tanh, ReLU, softmax의 역할과 한계를 비교해 보세요.
- (784 \rightarrow 100 \rightarrow 100 \rightarrow 10) network의 parameter 수가 왜 89,610개가 되는지 계산해 보세요.
- forward pass에서 중간 activation을 저장해야 하는 이유는 무엇인가요?
- cross-entropy loss가 정답 class의 확률을 어떻게 벌점으로 바꾸는지 설명해 보세요.
- backpropagation이 “오차의 책임을 뒤로 나누는 과정”이라고 불리는 이유는 무엇인가요?
- learning rate가 너무 크거나 너무 작으면 각각 어떤 문제가 생기나요?
- batch size를 크게 할 때 얻는 장점과 잃는 점은 무엇인가요?
- training과 inference는 계산, 메모리, 정밀도 요구에서 어떻게 다른가요?
- inference pipeline에서 pre-processing과 post-processing이 중요한 이유는 무엇인가요?
- USPS 손글씨 우편번호 인식 사례에서 confidence threshold가 왜 핵심 설계 요소였나요?
- AI Triangle의 algorithms, data, infrastructure가 딥러닝에서 어떻게 서로 의존하나요?
- 딥러닝 모델을 production에 배포할 때 정확도 외에 어떤 시스템 조건을 확인해야 하나요?
- fully-connected network가 이미지 처리에서 비효율적일 수 있는 이유는 무엇인가요?