신경망과 역전파, LLM 운영의 기본 비용 모델
신경망은 선형 변환과 비선형 활성화의 합성이고, 역전파는 체인룰로 gradient를 거꾸로 계산하는 학습 메커니즘이다. 이 구조를 이해하면 vanishing gradient, NaN, GPU 메모리, full fine-tuning과 LoRA, QLoRA 선택까지 한 줄로 연결된다.
Script Companion
오디오와 함께 스크립트 보기
- 01
신경망과 역전파는 단순히 딥러닝 입문 개념에 머물지 않는다. 트랜스포머, CNN, RNN, LLM은 모두 이 구조의 확장이고, 실제 학습이 흔들릴 때 보는 NaN, vanishing gradient, exploding gradient도 forward와 backward 흐름 안에서 추적한다. 특히 LLM 운영에서는 forward activation 저장과 AdamW state가 학습 메모리의 큰 부분을 차지한다는 직관이 중요하다. full fine-tuning, LoRA, QLoRA 중 무엇을 고를지도 결국 이 메모리 산식 위에서 결정된다.
- 02
가장 작은 출발점은 perceptron과 1층 신경망이다. 활성화 함수가 없으면 1층 신경망은 logistic regression과 같아지고, LLM의 마지막 layer도 어휘 크기만큼 큰 softmax classifier로 볼 수 있다. 엄밀히는 logistic이 아니라 multinomial softmax지만, 다음 토큰을 분류한다는 점에서 같은 family에 놓인다. 여기서 중요한 경계는 비선형성이 없을 때다. 층을 아무리 깊게 쌓아도 선형 변환을 여러 번 합성한 결과는 결국 하나의 선형 변환과 같다.
- 03
다층 신경망, 즉 MLP는 각 층에서 행렬 곱, bias, 비선형 활성화를 반복하는 함수 합성이다. Universal Approximation Theorem은 충분히 큰 hidden layer 하나만으로도 어떤 연속함수든 임의 정밀도로 근사할 수 있다고 말한다. 하지만 여기서 충분히 크다는 조건은 현실적으로 비현실적일 수 있다. 그래서 깊이가 가치를 가진다. 깊은 구조는 무작정 많은 뉴런을 한 층에 몰아넣는 대신, 여러 단계의 합성으로 표현을 나누어 만들 수 있게 해준다.
- 04
활성화 함수는 표현력을 만드는 장치이면서 동시에 학습 실패의 원인이 되기도 한다. Sigmoid는 0과 1 사이 값을 만들지만 vanishing gradient 위험이 있고, Tanh는 -1과 1 사이에 zero-centered 값을 만든다. ReLU는 단순하고 빠르지만 dying ReLU 위험이 있으며, GELU는 ReLU의 부드러운 버전으로 BERT와 GPT-2/3에 쓰인다. SiLU 또는 Swish는 smooth하고 self-gated 성격을 갖고, SwiGLU와 GeGLU는 gated linear unit 계열이다. 문서 기준으로 LLM 시대의 표준은 SwiGLU와 GELU 계열이고, ReLU는 단순한 분류기에서 주로 남는다.
- 05
Forward pass는 입력에서 출력까지 한 방향으로 값을 계산하는 단계다. 각 layer의 activation은 backward에서 필요하므로 메모리에 저장된다. 이 저장이 학습 메모리의 큰 부분을 만든다. 그래서 LLM 학습에서 batch size가 커지거나 seq_len이 길어지면 메모리가 선형으로 증가한다. 겉으로는 단순히 한 번 출력값을 계산하는 과정처럼 보이지만, 학습 관점에서는 나중에 gradient를 계산하기 위한 중간 결과를 쌓아두는 과정이기도 하다.
- 06
Backward pass, 즉 역전파는 손실에서 시작해 각 층의 gradient를 거꾸로 계산한다. 핵심은 체인룰이다. forward에서 저장한 activation을 사용해 각 가중치의 gradient를 계산하기 때문에, activation 저장이 빠지면 backward를 그대로 수행할 수 없다. 대안은 재계산이고, 이때 gradient checkpointing이 등장한다. activation을 전부 저장하지 않고 일부만 저장한 뒤 backward에서 다시 계산하면 메모리는 줄지만 시간이 늘어난다. 이 지점이 신경망 학습의 기본 trade-off다.
- 07
깊은 신경망의 대표 실패 모드는 vanishing gradient와 exploding gradient다. Vanishing은 깊은 층의 가중치가 거의 변하지 않는 증상이고, sigmoid나 tanh의 작은 미분이 깊이 곱셈을 거치며 0에 가까워질 때 생긴다. 대응은 ReLU나 GELU 계열 활성화, residual connection, layer norm, Xavier 또는 He init, fp16 underflow 상황의 loss scaling이다. Exploding은 손실이 NaN이 되거나 가중치가 발산하는 증상이고, 큰 가중치와 깊이 곱셈이 원인이다. gradient clipping, weight init, learning rate 감소가 표준 대응이다.
- 08
가중치 초기화는 학습 첫 1000 step의 안정성을 좌우한다. 너무 작으면 vanishing이 오고, 너무 크면 exploding이 온다. Xavier 또는 Glorot 초기화는 variance를 1/n_in으로 두며 tanh와 sigmoid에 맞고, He 또는 Kaiming 초기화는 variance를 2/n_in으로 두며 ReLU에 맞는다. GPT-2와 BERT에는 truncated normal, std=0.02, initializer_range=0.02가 등장한다. 현대 LLM인 LLaMA와 Mistral 등은 깊이 보정을 추가해 출력 projection을 1/√(2L)로 스케일하여 깊이가 늘어도 안정성을 유지한다.
- 09
Residual connection과 Layer Norm은 깊은 신경망 학습을 가능하게 만든 핵심 구조다. Residual은 y = x + f(x) 형태로, gradient가 1 + df/dx로 전파되어 vanishing을 막는 데 도움을 준다. 이 구조는 ResNet(2015)에서 트랜스포머까지 이어진다. Layer Norm은 한 sample 안에서 hidden 차원을 정규화하며 트랜스포머의 표준이 되었다. Original Transformer는 post-norm이고, 현대 LLM은 pre-norm을 주로 쓴다. 문서의 판단은 pre-norm이 깊은 모델에서 학습 안정성 우위가 있다는 것이다.
- 10
LLM 학습 메모리는 정적 비용과 동적 비용을 함께 봐야 한다. 7B 모델 mixed-precision 학습 기준으로 parameters fp16은 14GB, gradients fp16도 14GB, fp32 master weights는 28GB다. AdamW state는 1차 모멘트 m과 2차 모멘트 v가 각각 28GB를 차지한다. activation을 제외해도 합계는 약 112GB이며, activation까지 포함하면 단일 A100 80GB로는 7B mixed-precision full fine-tune이 부족하다. 그래서 H100 1장이나 ZeRO, FSDP 기반 multi-GPU 분산이 표준 선택지가 된다.
- 11
메모리 절감 기법은 모두 trade-off를 가진다. FlashAttention은 attention의 메모리 복잡도를 O(n²)에서 O(n)으로 낮추고, 커널 fusion으로 5% 미만 오버헤드에서 seq_len이 큰 학습의 GB 단위 절감을 만든다. Gradient checkpointing은 메모리를 50~60% 줄이는 대신 시간을 20~30% 늘리고, selective checkpointing은 추가 시간이 10~15% 수준으로 언급된다. Mixed precision은 forward와 backward는 fp16 또는 bf16으로, 누적 업데이트는 fp32 master copy로 처리한다. ZeRO와 FSDP는 optimizer state, gradients, parameters를 GPU 사이에 나누며, Stage 1, 2, 3으로 갈수록 더 공격적이다.
- 12
Fine-tuning 선택도 같은 비용 모델에서 나온다. LoRA 16-bit는 약 24GB까지 낮출 수 있고, QLoRA는 base model을 NF4 4-bit로 양자화해 7B를 6~8GB까지 끌어내린다. LoRA의 rank는 r=8이 부족할 수 있고, 운영 표준은 r=16~32로 제시된다. target_modules도 q, k, v, o뿐 아니라 gate, up, down까지 7개를 볼 수 있다. 5K에서 50K의 일반 도메인은 QLoRA + Unsloth가 표준 선택으로 제시되지만, 50K에서 500K는 LoRA 16-bit r=32와 7개 target_modules로 갈아타는 분기가 나온다.
- 13
Autograd 디버깅에서는 PyTorch의 loss.backward()가 자동으로 gradient를 계산한다는 점에서 출발한다. param.grad로 gradient를 확인하고, detect_anomaly()로 NaN 전파 위치를 추적하며, 중간 activation과 gradient의 norm이나 평균을 보아 vanishing과 exploding을 감지한다. gradient norm이 0에 가까우면 활성화, 초기화, residual을 점검하고, gradient norm이 1e3보다 매우 크면 clipping과 learning rate 감소를 본다. 특정 layer만 NaN이면 init 또는 정규화 문제를 의심하고, forward는 괜찮은데 backward에서 NaN이면 fp16 underflow를 보고 bf16이나 loss scaling을 고려한다.
- 14
더 위험한 것은 에러 없이 천천히 망가지는 silent failure다. Gradient checkpointing을 켰는데 메모리 절감폭이 5% 미만이면 activation이 작은 모델이거나 segment 수가 부적절할 수 있다. LoRA loss는 떨어지는데 평가 점수가 base와 거의 같으면 rank 부족이나 target_modules가 q_proj, v_proj 두 개뿐인 구성을 의심한다. fp16 underflow의 silent 단계에서는 일부 layer만 업데이트가 멈출 수 있다. detect_anomaly() traceback도 NaN이 발생한 위치가 아니라 전파된 위치를 가리킬 수 있으므로, 각 layer의 forward hook으로 첫 NaN 발생 layer를 직접 찾는 접근이 필요하다.
- 15
마지막으로 이 문서는 신경망 메모리를 일반 시스템 비용 모델로 옮겨 본다. Parameters는 정적 저장소, activations는 캐시나 sliding window 메모리, gradients는 event log나 undo buffer, optimizer state는 adaptive system의 metadata나 index에 대응한다. Mixed precision은 DB의 int8 column storage나 압축 표와 유사하고, gradient checkpointing은 recomputation과 storage trade-off로 읽힌다. PagedAttention, RoPE, MoE, MLA 같은 새 기법을 만나도 질문은 같다. 정적 메모리를 줄이는가, 동적 메모리를 줄이는가, 정확도와 메모리와 시간 중 무엇을 맞바꾸는가, 어떤 조건에서 효과가 사라지는가, silent failure가 가능한가를 먼저 확인한다.
같은 레이어