ML을 디버깅 가능한 시스템으로 보는 수학 토대
ML 학습을 선형대수, 확률, 미적분의 반복으로 보고, 벡터·행렬·분포·gradient가 실제 운영 판단에 어떻게 연결되는지 정리한다. 특히 attention 비용, softmax 안정성, KV cache 산정처럼 장애와 비용으로 드러나는 지점을 함께 짚는다.
Script Companion
오디오와 함께 스크립트 보기
- 01
ML 수학 토대의 출발점은 학습을 세 가지 반복으로 보는 것이다. 입력은 벡터와 행렬로 바뀌고, 모델은 출력 분포를 추정하며, 손실의 기울기를 따라 가중치를 갱신한다. 그래서 선형대수는 데이터와 모델 구조의 언어가 되고, 확률은 출력의 언어가 되며, 미적분은 학습 방향의 언어가 된다. 이 토대가 약하면 손실이 NaN으로 튀거나 수렴이 멈췄을 때 원인을 좁히기 어렵고, 모델 차원과 컨텍스트 길이가 왜 비용으로 이어지는지도 감으로만 보게 된다.
- 02
벡터는 단순한 number 배열이 아니라 방향과 크기를 함께 가진 좌표다. 임베딩 모델은 단어, 문장, 이미지, 사용자 같은 객체를 고차원 벡터로 바꾸고, 모델은 이 벡터 사이의 거리와 각도를 계산해 의미를 다룬다. L1 norm은 절댓값의 합이고, L2 norm은 제곱합의 제곱근이며, 코사인 유사도는 두 벡터의 방향을 비교한다. 긴 문장과 짧은 문장처럼 벡터 크기가 달라도 의미 방향을 볼 수 있기 때문에 ML에서 코사인 유사도가 자주 쓰인다. 내적은 같은 자리 곱의 합이면서 동시에 두 벡터가 얼마나 같은 방향을 보는지의 측정값이고, 이 직관이 query와 key의 내적인 attention으로 이어진다.
- 03
차원은 벡터의 길이이며, 표현력과 비용을 동시에 움직이는 축이다. 임베딩 차원이 커지면 더 많은 정보를 담을 수 있지만, 벡터 하나당 저장 바이트와 벡터 개수만큼 메모리도 늘어난다. fp32 기준으로 1억 개 임베딩에서 차원 1을 늘리면 약 400MB가 추가되고, fp16이나 int8이면 그에 비례해 줄어든다. OpenAI text-embedding-3-small은 1536차원, text-embedding-3-large는 3072차원이며, text-embedding-3-large는 dimensions 파라미터로 256에서 3072 사이 축소가 가능하다. Matryoshka representation 덕분에 앞부분 차원만 잘라도 의미가 보존되도록 학습된다는 점이 운영 비용 판단과 연결된다.
- 04
행렬은 벡터를 다른 벡터로 바꾸는 선형 변환이다. 신경망의 한 층은 본질적으로 y = W x + b이고, GPU가 강한 이유는 이 행렬 곱을 수많은 코어가 동시에 처리하면서 tensor core와 메모리 계층 최적화로 가중치 데이터를 재사용하기 때문이다. 전치는 행과 열을 바꾸는 연산이고, 역행렬은 정방행렬이며 가역일 때만 존재하지만, ML에서는 역행렬을 직접 계산하는 일이 드물다. 가중치 행렬이 보통 정방이 아니고 계산도 비싸기 때문에 gradient 기반 학습으로 접근한다. 이 관점에서 self-attention의 Q K^T는 모든 query와 key 쌍의 내적 표이고, 시퀀스 길이 n이 늘면 크기가 n 제곱으로 커진다.
- 05
attention에서 sqrt(d_k)로 나누는 이유는 학습 안정성과 직접 연결된다. Q와 K 원소의 평균이 0이고 분산이 1이면 Q K^T의 분산은 d_k에 비례해 커진다. 그대로 softmax에 넣으면 값이 거의 0이나 1로 몰려 saturate되고, gradient가 사라질 수 있다. sqrt(d_k)로 나누면 분산이 1 근처로 정규화되어 학습이 안정된다. 이 한 식은 LLM 비용과 메모리에도 큰 영향을 준다. Q K^T가 n 곱하기 n 크기로 커지기 때문에 long-context 비용과 KV cache 비용을 이해하려면 행렬 크기부터 봐야 한다.
- 06
확률은 모델 출력의 언어다. 분류 모델이 고양이 80%, 강아지 15%, 그 외 5%라고 말할 때 이 숫자들은 합이 1인 확률 분포이고, LLM이 다음 토큰을 예측할 때도 어휘 전체에 대한 분포를 출력한다. Bernoulli는 두 결과 중 하나, Categorical은 여러 결과 중 하나이며, LLM 다음 토큰 예측은 Categorical에 해당한다. Normal은 가중치 초기화와 노이즈 모델링에 자주 나오고, Uniform은 무작위 초기화의 한 형태다. 기댓값은 평균 위치, 분산은 퍼진 정도, 표준편차는 원래 단위로 해석할 수 있는 퍼짐이다. batch normalization은 미니배치의 평균과 분산을 정규화하고, gradient 분산이 크면 학습률을 줄이거나 gradient clipping을 적용한다.
- 07
softmax는 logit을 양수이고 합이 1인 분포로 바꾸며, 큰 값을 지수 함수로 더 강조한다. LLM 샘플링의 temperature는 이 softmax 입력을 나누는 파라미터다. 하지만 exp는 큰 logit에서 overflow를 일으킬 수 있다. fp16의 표현 가능 최댓값은 65,504이고, exp(11)은 약 59,874지만 exp(12)는 약 162,754라서 z가 11보다 크면 inf가 된다. 그래서 표준 구현은 모든 logit에서 최댓값을 먼저 빼는 Log-Sum-Exp trick을 쓴다. 이 안전화가 빠진 커스텀 softmax나 loss를 fp16이나 bf16 학습에 넣으면, 초기에는 정상처럼 보이다가 1k에서 10k step 이후 logit 분산이 커지며 loss가 NaN으로 튈 수 있다.
- 08
cross-entropy는 두 분포가 얼마나 다른지 재는 분류 손실의 표준이다. 정답 위치에 모델이 낮은 확률을 주면 음의 로그 값이 커져 손실이 커지고, 정확히 1의 확률을 주면 손실은 0이 된다. LLM 학습 손실도 본질적으로 next-token prediction의 cross-entropy다. Perplexity는 평균 cross-entropy의 지수값이며, 낮을수록 다음 토큰을 잘 맞힌다는 뜻이다. 미분은 여기서 학습 방향을 제공한다. 손실 함수가 f이고 가중치가 x라면, 미분은 이 가중치를 조금 늘렸을 때 손실이 얼마나 변하는지 알려준다. 모든 부분 미분을 모은 gradient는 함수가 가장 빠르게 증가하는 방향이고, 학습은 그 반대 방향으로 가중치를 옮기는 과정이다.
- 09
학습률은 gradient를 따라 얼마나 크게 움직일지 정한다. 너무 크면 손실이 overshoot하며 발산하고, 너무 작으면 학습이 느려진다. 문서의 기준으로 Adam 계열 일반 학습은 1e-4에서 1e-3, LLM pre-training peak LR은 1e-4에서 6e-4, fine-tuning은 더 작은 1e-6에서 5e-5 범위를 시작점으로 본다. 체인룰은 함수 합성의 미분 공식이며, 신경망이 f3, f2, f1이 이어진 합성 함수라는 점 때문에 backprop의 수학적 토대가 된다. 행렬 미분에서는 스칼라 손실을 벡터나 행렬에 대해 미분하고, 분류 손실의 backprop이 효율적인 이유도 softmax와 cross-entropy의 합성이 결국 예측 minus 정답 형태로 떨어지기 때문이다.
- 10
새 ML 기법을 만났을 때는 네 가지 질문이 분석의 틀이 된다. 어떤 벡터와 행렬 공간에서 작동하는가, 어떤 손실과 확률 분포를 가정하는가, 어떤 gradient 흐름이 학습을 결정하는가, 어떤 행렬 곱이 비용을 결정하는가를 묻는다. 이 질문은 logistic regression부터 트랜스포머, LoRA, MoE, DPO, GRPO까지 적용된다. self-attention에 대입하면 Q와 K는 n 곱하기 d_k 공간, V는 n 곱하기 d_v 공간에 있고, softmax(Q K^T / sqrt(d_k))는 각 query마다 n개 key 위의 Categorical 분포를 만든다. gradient는 softmax에서 V 곱을 거쳐 후속 layer로 흐르며, 비용을 결정하는 행렬 곱은 n 제곱으로 커지는 Q K^T다.
- 11
운영 관점에서는 행렬 크기가 곧 메모리와 비용이라는 감각이 중요하다. Llama-3-8B는 GQA로 query head는 32개지만 KV cache 식에는 num_kv_heads 8을 넣어야 한다. fp16, batch 1, num_layers 32, d_head 128 기준으로 per-token은 128KB이고, seq_len 2,048이면 요청당 약 256MB, seq_len 32,768이면 약 4GB가 된다. MHA로 착각해 num_kv_heads 32를 넣으면 4배 큰 값이 나와 GPU 용량 산정이 틀어진다. LLM 추론은 forward pass의 산술 연산보다 가중치 행렬을 GPU 메모리에서 읽는 시간이 더 큰 memory-bound 성격도 갖는다. 그래서 batching, KV cache, quantization은 모두 메모리 트래픽을 줄이는 판단으로 연결된다. 정리하면 선형대수는 표현과 비용, 확률은 출력과 손실, 미분은 학습 방향을 설명한다. 이 셋이 연결될 때 ML은 검은 상자가 아니라 디버깅 가능한 시스템으로 보인다.
같은 레이어