인공지능 및 생성형 AI
AI & Generative AI
3단계: 대규모 언어 모델 — 내부를 해부하고, 길들이고, 정렬하기
이론적 기초 — "왜 GPT는 '무언가'를 아는 것처럼 느껴지는가?"
2단계에서 우리는 Transformer를 배웠다. 핵심을 되새기면, Transformer의 핵심 장치는 Self-Attention이었다. 문장 안의 모든 단어가 서로를 "얼마나 주목해야 하는가"를 가중치로 계산하는 메커니즘이었고, 이것이 RNN의 고질적 단점인 장거리 의존성 망각 문제를 해결했다. 그런데 여기서 한 가지 질문을 던져 보자. Transformer가 단지 언어 번역을 잘 하는 도구라면, 어떻게 그것이 수학 문제를 풀고 코드를 작성하고 철학적 논쟁을 하는 GPT-4나 LLaMA-3가 되었을까?
답의 첫 번째 실마리는 **스케일링 법칙(Scaling Laws)**에 있다. 2020년 OpenAI가 발표한 Kaplan et al.의 논문 "Scaling Laws for Neural Language Models"는 당시 AI 연구자들에게 충격에 가까운 결론을 제시했다. 모델의 파라미터 수(N), 학습 데이터 토큰 수(D), 연산량(C) 이 세 가지를 일정 비율로 함께 키우면 모델의 성능이 멱함수(power law) 형태로 예측 가능하게 향상된다는 것이었다. 즉, 더 크게 만들수록 더 똑똑해진다는 주장이었고, 이것은 단순히 "양이 많으면 질이 좋아진다"는 직관과 닮아 있지만, 그 배후에는 훨씬 깊은 수학이 있다. 멱함수란 y = x^k 형태로, 지수 k가 0보다 클 때 x가 커질수록 y가 일정한 비율로 증가하는 관계다.
더 흥미로운 현상은 **창발(Emergence)**이다. 모델이 일정 규모 이하일 때는 보이지 않다가, 특정 임계점을 넘는 순간 갑자기 나타나는 능력들이 있다. 산수 추론, 다국어 번역, 심지어 농담의 뉘앙스를 파악하는 능력이 그렇다. 이것은 마치 물이 99°C에서 100°C로 넘어갈 때 갑자기 끓기 시작하는 것처럼, 양적 변화가 질적 변화를 유발하는 임계 현상이다. Wei et al. (2022)의 연구 "Emergent Abilities of Large Language Models"는 이를 체계적으로 문서화했다. 스스로에게 물어보라 — 이 창발이 왜 가능한지를, 지금 당장은 완벽히 설명할 수 없어도 이 질문을 마음에 품고 앞으로의 내용을 읽어라.
[노트 기록] 스케일링 법칙: Loss ∝ N^{-α} (파라미터 수에 대한 손실 감소), Loss ∝ D^{-β} (데이터 토큰 수에 대한 손실 감소). Kaplan et al. 2020. 창발(Emergence): 작은 모델에서는 없던 능력이 임계 규모를 초과하면 갑자기 나타나는 현상.
**사전학습(Pre-training)**의 개념도 여기서 짚어야 한다. LLM은 대부분 다음 토큰 예측(Next Token Prediction) 과제로 학습된다. 문장 "오늘 날씨가 ___" 에서 빈칸을 맞추는 작업을 수조(兆) 번 반복하면서, 모델은 언어의 문법, 사실 지식, 논리 구조, 감정적 뉘앙스를 모두 부산물로 획득한다. 이것이 왜 중요한가? 명시적으로 "사과는 과일이다"를 가르치지 않아도, "사과를 먹었다", "사과나무에서 따왔다", "사과 주스를 짰다"와 같은 수백만 개의 문장을 통해 모델이 스스로 '사과의 본질'을 파악한다는 뜻이다. 이것이 2단계에서 배운 Supervised Learning과 근본적으로 다른 점이다 — 정답 레이블이 텍스트 자체 안에 내재되어 있다.
본 내용 1 — LLM 아키텍처 해부: GPT와 LLaMA의 내부를 열어보면
Decoder-Only 아키텍처: 왜 GPT는 인코더를 버렸는가
2단계에서 배운 원본 Transformer는 **인코더(Encoder)**와 디코더(Decoder) 두 부분으로 나뉘어 있었다. 인코더는 입력 문장 전체를 보고 맥락 표현을 만들고, 디코더는 그것을 받아 순서대로 출력을 생성했다. 그런데 GPT 계열은 이 중 디코더만 사용한다. 왜일까? 텍스트 생성이라는 관점에서 보면, 우리는 왼쪽에서 오른쪽으로 단어를 하나씩 만들어 나간다. 미래의 단어를 아직 모르는 상태에서 현재 단어를 예측하려면, 인과적(Causal) 어텐션 — 즉 과거와 현재만 보고 미래는 보지 않는 마스킹된 어텐션 — 이 가장 자연스럽다. 반면 BERT처럼 문장을 분류하거나 이해하는 작업에는 양방향 인코더가 유리하다. 이 차이를 자기회귀(Autoregressive) 특성이라고 부른다.
[노트 기록] Autoregressive 생성: P(x_t | x_1, x_2, ..., x_{t-1}) — 이전 토큰들이 주어졌을 때 현재 토큰의 확률. 이 조건부 확률의 곱이 전체 문장의 확률을 이룬다 (Chain Rule of Probability).
토크나이저: 텍스트를 숫자로 바꾸는 관문
모델이 문자를 직접 처리하는 것이 아님을 기억하라. 텍스트는 먼저 **토큰(Token)**이라는 단위로 쪼개진다. GPT-4는 BPE(Byte Pair Encoding) 방식을 사용한다. BPE는 처음에 모든 문자를 개별 토큰으로 시작해서, 가장 자주 함께 등장하는 쌍을 하나의 토큰으로 합치는 과정을 반복한다. "unhappiness"는 "un", "happi", "ness" 정도로 쪼개질 수 있다. LLaMA는 SentencePiece 기반 BPE를 쓰며, 한국어같이 교착어(조사가 붙는 언어)에서는 영어보다 훨씬 많은 토큰이 생성되는 경향이 있다 — "나는 학교에 갔다"가 영어 "I went to school"보다 토큰 수가 많을 수 있다. 이것은 비용 문제(토큰당 과금)와 컨텍스트 길이 제한에서 실질적인 의미를 갖는다.
Positional Encoding의 진화: RoPE와 ALiBi
2단계의 원본 Transformer에서는 Sinusoidal Positional Encoding을 사용해 토큰의 위치 정보를 더했다. LLaMA는 **RoPE(Rotary Position Embedding)**를 채택했다. 핵심 아이디어는 위치 정보를 더하는 대신 **회전(Rotation)**으로 인코딩하는 것이다. 쿼리와 키 벡터를 위치 θ만큼 복소수 공간에서 회전시키면, 두 벡터의 내적(어텐션 점수)이 자동으로 상대적 위치 차이에만 의존하게 된다. 이것의 장점은 외삽(Extrapolation) — 즉 학습 때 보지 못한 더 긴 시퀀스에서도 잘 동작하는 경향이 있다는 것이다. RoPE(q, m) = q · e^{imθ}로 표현하면, m이 위치 인덱스이고 θ가 주파수 파라미터다. 수식이 낯설다면 지금은 "위치를 덧셈이 아닌 회전으로 인코딩한다"는 직관만 품어도 된다.
LLaMA의 핵심 혁신: RMSNorm, SwiGLU, GQA
GPT-2에서 LLaMA-3로 오면서 아키텍처에 세 가지 중요한 변화가 있었다. 첫째, **RMSNorm(Root Mean Square Normalization)**으로 LayerNorm을 대체했다. 기존 LayerNorm은 평균과 분산 두 가지를 계산하지만, RMSNorm은 평균을 제거하고 분산의 제곱근(RMS)만 사용한다. 수식으로는 RMSNorm(x) = x / RMS(x) · γ이며, 이것이 수렴 속도를 높이고 연산 효율을 개선한다. 둘째, FFN(Feed-Forward Network) 층의 활성화 함수를 SwiGLU로 교체했다. 기존 ReLU 대신 SwiGLU(x, W, V) = Swish(xW) ⊙ (xV)를 사용하는데, Swish 함수는 x · σ(x) 형태로 부드럽게 비선형성을 도입한다. Noam Shazeer의 2020년 논문은 이것이 거의 모든 언어 모델 벤치마크에서 성능을 향상시킴을 보였다. 셋째, **GQA(Grouped Query Attention)**다. 어텐션에서 Query는 토큰마다 고유하지만, Key와 Value는 여러 Query가 공유할 수 있다. 헤드 수가 32개라면 KV 헤드는 8개만 두고 4개씩 묶어 공유하면 KV 캐시 메모리를 4배 줄일 수 있다. KV 캐시란 이미 계산한 Key/Value 쌍을 저장해 반복 계산을 피하는 추론 최적화 기법인데, 긴 대화에서 메모리를 크게 잡아먹는다. GQA는 이 문제를 품질 저하 없이 해결한다.
[노트 기록] LLaMA 3 아키텍처 변경점 3가지: ① Pre-normalization (각 서브레이어 입력에 RMSNorm 적용) ② SwiGLU 활성화 ③ GQA (Grouped Query Attention). 이것이 같은 크기의 GPT-2보다 LLaMA가 효율적인 이유.
Flash Attention: 하드웨어를 의식한 소프트웨어 설계
Self-Attention의 연산 복잡도는 시퀀스 길이 L에 대해 **O(L²)**다. 10,000 토큰이면 1억 개의 어텐션 점수를 계산해야 한다. Dao et al. (2022)의 FlashAttention은 알고리즘은 동일하지만 GPU 메모리 계층구조(HBM vs SRAM)를 활용해 I/O 병목을 제거한다. HBM은 넓지만 느리고, SRAM(on-chip)은 좁지만 빠르다. 기존 어텐션은 거대한 어텐션 행렬을 HBM에 쓰고 읽는 과정을 반복했지만, FlashAttention은 타일(tile) 단위로 SRAM에 올려서 계산을 마치고 결과만 HBM에 저장한다. 수치적 결과는 동일하지만 속도는 2-4배 빠르고 메모리는 O(L²)가 아닌 O(L)로 줄어든다.
본 내용 2 — 파인튜닝: 사전학습된 거인을 특정 분야의 전문가로 만들기
왜 Full Fine-Tuning은 문제인가
LLM이 인터넷 전체를 학습한 방대한 지식 기반을 가지고 있다면, 의료 진단 보조 시스템을 만들기 위해 의학 문서로 추가 학습을 시키면 될 것 같다. 이것이 Full Fine-Tuning이다. 그런데 문제가 있다. LLaMA-3 70B는 파라미터가 700억 개이고, 각 파라미터를 32비트 부동소수점(float32)으로 저장하면 70B × 4bytes = 280GB의 메모리가 필요하다. 여기에 학습 시 그래디언트와 옵티마이저 상태(Adam은 파라미터당 3배)까지 포함하면 1TB를 넘긴다. A100 GPU 한 장이 80GB이니 최소 15장이 필요하다. 장당 가격이 수천만 원인 A100이 15장이면... 이것이 스타트업이나 개인 연구자가 Full Fine-Tuning을 엄두도 못 내는 이유다. 더 나쁜 문제가 있다 — Catastrophic Forgetting이다. 특정 도메인으로 강하게 파인튜닝하면 사전학습에서 얻은 일반 지식이 덮어씌워지는 현상이다. 2단계에서 Batch Normalization이 학습 안정성을 주는 방식을 기억한다면, 이것은 일종의 역방향 현상으로 이해할 수 있다.
[노트 기록] Catastrophic Forgetting: 새로운 과제를 학습할 때 이전에 배운 지식이 파괴되는 현상. McCloskey & Cohen (1989). Full Fine-Tuning 메모리: 파라미터 수 × (4 + 4 + 8) bytes ≈ 파라미터 수 × 16 bytes (Adam optimizer 기준).
PEFT: 적은 파라미터로 최대의 효과
**PEFT(Parameter-Efficient Fine-Tuning)**는 "모든 파라미터를 업데이트하지 말고, 소수의 특별한 파라미터만 건드리자"는 패러다임이다. 사람으로 비유하면, 의대를 졸업한 사람에게 특정 수술 기법을 가르칠 때 그 사람의 뇌 구조 전체를 재편할 필요가 없다. 관련 운동 기술과 의사 결정 회로만 미세하게 조정하면 된다. PEFT에는 여러 방법이 있으나, 현재 가장 지배적인 것이 LoRA다.
LoRA의 수학: 저랭크 행렬 분해의 우아함
Hu et al. (2021)이 발표한 LoRA(Low-Rank Adaptation) 논문은 이렇게 시작한다. 사전학습된 가중치 행렬 W ∈ R^{d×k}에 변화를 주려면, 그 변화량 ΔW도 같은 크기의 d×k 행렬이어야 한다. 그런데 연구자들은 관찰했다 — 파인튜닝 과정에서 ΔW가 **낮은 내재적 랭크(intrinsic rank)**를 가진다는 것을. 랭크(rank)란 행렬이 실제로 표현할 수 있는 선형 독립 차원의 수다. d=4096, k=4096인 행렬의 최대 랭크는 4096이지만, 파인튜닝에서 의미 있는 변화는 훨씬 낮은 랭크 공간에서 일어난다는 가설이다.
[노트 기록] LoRA 핵심 공식: W' = W + ΔW = W + BA 여기서 B ∈ R^{d×r}, A ∈ R^{r×k}, r ≪ min(d, k). 학습 가능한 파라미터: d×r + r×k = r(d+k). r=8이면 원래 d×k 대비 8(d+k)/(dk) 배의 파라미터만 사용. d=k=4096이라면 원래 16.7M → LoRA r=8이면 65,536개 (약 400배 감소).
이것이 왜 작동하는가? A는 가우시안 분포로 초기화하고 B는 0으로 초기화해서, 학습 시작 시 ΔW = BA = 0이 되게 한다. 즉 처음에는 사전학습된 W를 그대로 사용하고, 학습이 진행되면서 BA가 점진적으로 의미 있는 변화를 학습한다. 추론 시에는 W' = W + BA로 병합할 수 있어서 추가 지연(latency)이 없다. 실제로 LLaMA-7B 전체 파라미터 7억 개 중 LoRA r=16을 Query와 Value 행렬에만 적용하면 약 400만 개의 파라미터만 학습하면 된다 — 0.57%다.
QLoRA: 양자화와 LoRA의 만남
**QLoRA(Quantized LoRA)**는 Dettmers et al. (2023)이 제시한 기법으로, **4비트 양자화(Quantization)**와 LoRA를 결합한다. 양자화란 float32(32비트) 혹은 float16(16비트)으로 저장된 가중치를 더 낮은 비트로 압축하는 것이다. 4비트로 저장하면 float16 대비 메모리가 4배 줄어들지만, 정보 손실이 생긴다. QLoRA는 NF4(Normal Float 4-bit) 형식으로 사전학습된 W를 압축한 채로 고정해 두고, LoRA의 A와 B는 bfloat16으로 학습한다. 역전파 시에는 W를 일시적으로 bfloat16으로 복원(dequantize)해 그래디언트를 계산하고, 다시 4비트로 압축한다. 이 방식으로 65B 파라미터 모델을 단일 48GB GPU에서 파인튜닝할 수 있게 됐다. 2023년 이전에는 꿈도 못 꾸던 일이다.
[노트 기록] QLoRA 메모리 절약 원리: ① 4-bit NF4로 사전학습 가중치 압축 (float16 대비 4배 절약) ② Double Quantization: 양자화 상수 자체도 양자화 (추가 절약) ③ Paged Optimizers: GPU OOM 방지를 위한 페이징. Dettmers et al. "QLoRA: Efficient Finetuning of Quantized LLMs", 2023.
본 내용 3 — RLHF와 정렬: 모델이 "좋은 것"을 배우게 하는 법
정렬 문제: 왜 그냥 잘 학습된 LLM도 위험할 수 있는가
Next Token Prediction으로 학습된 모델은 인터넷의 텍스트를 흉내 낸다. 인터넷에는 유용하고 친절한 내용만 있지 않다 — 해로운 정보, 편견, 잘못된 사실도 넘쳐난다. 더 근본적으로, "다음 단어를 잘 예측한다"는 목표 함수가 "사람에게 도움이 된다"는 우리의 실제 목표와 다르다. 이것을 목표 불일치(Objective Misalignment) 혹은 **정렬 문제(Alignment Problem)**라고 부른다. Stuart Russell의 저서 "Human Compatible" (2019)은 AI가 명시된 목표를 극단적으로 최적화할 때 인간의 암묵적 의도에서 벗어나는 위험성을 상세히 분석한다. GPT-3를 처음 본 사람들은 성능에 감탄했지만, 특정 프롬프트에 폭발물 제조법, 자해 방법, 혐오 발언을 생성한다는 문제를 즉시 발견했다.
RLHF: 세 단계의 파이프라인
**RLHF(Reinforcement Learning from Human Feedback)**는 Christiano et al. (2017)에서 시작해 InstructGPT (Ouyang et al., 2022)에서 완성된 학습 패러다임이다. 전체 파이프라인은 세 단계다.
1단계 — SFT(Supervised Fine-Tuning): 사전학습된 모델에 "질문-좋은 대답" 쌍으로 구성된 고품질 데이터셋을 이용해 지도 학습으로 파인튜닝한다. 이것은 앞서 배운 LoRA/QLoRA로 효율적으로 수행할 수 있다. 결과는 "지시를 따르는 모델(Instruct Model)"이지만, 아직 인간이 선호하는 것과 해로운 것을 구별하지 못한다.
2단계 — RM(Reward Model) 학습: 인간 레이블러들이 같은 질문에 대한 여러 모델 응답을 비교해 순위를 매긴다. "응답 A가 응답 B보다 낫다"는 쌍 비교(pairwise comparison) 데이터를 수집한다. 이것으로 **보상 모델(Reward Model)**을 학습한다. Bradley-Terry 모델 기반으로, P(A > B) = σ(r(A) - r(B))를 최대화하도록 학습한다. r은 보상 함수, σ는 시그모이드다. 이 단계에서 "인간 선호"가 수치화된다.
3단계 — PPO(Proximal Policy Optimization): 1단계 SFT 모델을 **정책(Policy)**으로, 2단계 RM을 보상 함수로 사용해 강화학습을 수행한다. **PPO(Proximal Policy Optimization)**는 Schulman et al. (2017)이 제안한 알고리즘으로, 정책이 너무 급격히 변하지 않도록 제약하면서 보상을 최대화한다. [노트 기록] PPO 목적 함수: L^{CLIP}(θ) = E[min(r_t(θ)·A_t, clip(r_t(θ), 1-ε, 1+ε)·A_t)]. 여기서 r_t(θ)는 새 정책/구 정책의 확률 비율, A_t는 어드밴티지 추정값, ε는 클리핑 파라미터(보통 0.2). 이 클리핑이 "너무 급격한 업데이트"를 막는다. 그러나 실제 RLHF에서는 순수 보상만 극대화하면 모델이 RM의 허점을 파고드는 **보상 해킹(Reward Hacking)**이 생기기 때문에, SFT 모델과의 KL 발산 패널티를 추가한다: 총 보상 = r_θ(x, y) - β · KL[π_θ || π_{SFT}].
DPO: RLHF를 단순화하다
PPO 기반 RLHF는 강력하지만 구현이 복잡하다. 정책 모델, 보상 모델, 레퍼런스 모델, 가치 함수(Value Function) 등 여러 모델을 동시에 메모리에 올려야 한다. Rafailov et al. (2023)의 **DPO(Direct Preference Optimization)**는 이것을 획기적으로 단순화했다. 핵심 아이디어는 수학적 유도를 통해 "보상 모델을 명시적으로 학습할 필요가 없다"는 것을 보인 것이다. PPO의 최적해를 분석하면, 보상 함수 r이 언어 모델의 로그 확률 비율로 암묵적으로 표현될 수 있다: r*(x, y) = β log(π*(y|x) / π_{ref}(y|x)) + β log Z(x). 이것을 역으로 이용해, 쌍 비교 데이터에 대해 직접 정책을 최적화하는 손실 함수를 유도한다: L_{DPO}(π_θ; π_{ref}) = -E[ log σ(β log(π_θ(y_w|x)/π_{ref}(y_w|x)) - β log(π_θ(y_l|x)/π_{ref}(y_l|x))) ]. 여기서 y_w는 선호되는 응답(winner), y_l은 기피되는 응답(loser)이다. 이 식은 "선호 응답의 확률은 높이고, 기피 응답의 확률은 낮추되, 레퍼런스 모델에서 너무 멀어지지 않도록" 하는 직관을 수학으로 구현한 것이다.
[노트 기록] RLHF vs DPO 비교. RLHF: SFT → RM 학습 → PPO 강화학습 (3단계, 복잡). DPO: SFT → 직접 선호 최적화 (2단계, 단순). DPO 장점: RM 불필요, 단일 모델만 필요, 학습 안정적. 단점: 온라인 탐색 없음으로 RLHF보다 표현력 제한 가능성.
프로젝트 — 스스로 설계하고 분석하기
아래 세 프로젝트는 문제만 제시한다. 답을 찾는 과정에서 직접 코드를 작성하고, 분석하고, 질문을 만들어라. 각 문제는 40분 내외로 설계됐으나, 깊이 파고들수록 더 오래 걸릴 것이다.
프로젝트 1 — "LoRA 어댑터를 처음부터 구현하기"
Hugging Face의 transformers와 datasets 라이브러리를 사용하되, peft 라이브러리는 사용하지 말고, LoRA 레이어를 직접 PyTorch nn.Module로 구현하라. 다음 조건을 충족해야 한다. 대상 모델은 gpt2 (1.2억 파라미터, 가장 작은 GPT-2)이며, imdb 영화 리뷰 데이터셋으로 감성 분류(긍정/부정) 파인튜닝을 수행한다. 구현해야 할 핵심 클래스는 LoRALinear로, 기존 nn.Linear를 대체하며 weight_A(랭크 분해 행렬)와 weight_B를 추가 파라미터로 갖는다. 학습 중 사전학습 가중치는 requires_grad=False로 고정하고 LoRA 파라미터만 업데이트한다. 추론 시에는 W + BA를 병합하는 merge_weights 메서드도 구현하라. r=4, r=8, r=16 세 가지 설정으로 실험해 검증 정확도와 학습 가능한 파라미터 수를 비교하고, Full Fine-Tuning 대비 파라미터 효율성을 계산하는 리포트를 작성하라. 특별히 주목해야 할 것: r이 증가할 때 성능 향상이 항상 선형적인가? 왜 그렇거나 그렇지 않은가?
프로젝트 2 — "선호도 데이터셋 구축과 DPO 학습"
이 프로젝트는 두 파트로 나뉜다. 파트 A에서는 선호도 데이터셋을 직접 설계한다. 주제는 "고등학생 수학 질문에 대한 AI 답변"이다. 최소 30개의 질문을 선정하고, 각 질문에 대해 두 개의 답변 (chosen과 rejected)을 작성한다. chosen 답변은 단계적 풀이와 개념 설명을 포함하고, rejected 답변은 의도적으로 불완전하거나 오해를 유발하는 방식으로 작성하라. 이 과정에서 "좋은 AI 답변의 기준"이 무엇인지 직접 정의해야 한다. 파트 B에서는 trl 라이브러리의 DPOTrainer를 활용해 gpt2 모델을 파트 A의 데이터셋으로 DPO 학습한다. 학습 전후의 모델에 동일한 수학 질문 5개를 던져 응답을 비교하고, 구체적으로 어떤 측면이 달라졌는지 분석하라. 경고: DPO 손실이 학습 중 어떤 방향으로 변화하는가? 손실이 음수가 될 수 있는가? 그렇다면 이것은 정상인가?
프로젝트 3 — "LLM 아키텍처 탐정: 내부 표현 시각화"
transformers 라이브러리로 gpt2를 로드하고, output_attentions=True 옵션으로 추론해 각 레이어의 어텐션 패턴을 추출하라. 최소 세 종류의 문장 유형 (단순 서술문, 관계대명사를 포함한 복합문, 숫자가 포함된 논리 문장)에 대해 레이어별 어텐션 히트맵을 matplotlib으로 시각화하라. 분석해야 할 핵심 질문들: 얕은 레이어(layer 13)와 깊은 레이어(layer 1012)의 어텐션 패턴은 어떻게 다른가? 특정 헤드는 문법적 관계를, 다른 헤드는 의미적 관계를 포착하는가? (힌트: Jain & Wallace (2019) "Attention is not Explanation" 논문의 논쟁을 찾아보라.) 추가 도전: hidden_states도 추출해 마지막 레이어의 임베딩을 t-SNE로 차원 축소해 시각화하면, 의미적으로 유사한 토큰들이 공간에서 가깝게 위치하는가?
평가 기준 (자가 채점 항목)
파인튜닝 성능 (40점): LoRA 프로젝트에서 r=16의 검증 정확도가 Full Fine-Tuning의 95% 이상에 도달하면 30점, 파라미터 효율 분석 리포트가 구체적이면 10점. 정렬 효과 분석 (40점): DPO 학습 전후 모델 응답의 차이를 정량적 지표(BLEU, BERTScore 등 중 택일)와 정성적 분석으로 모두 제시하면 30점, 손실 동작 원리를 수식으로 설명하면 10점. 리포트 (20점): 아키텍처 시각화 프로젝트에서 어텐션 패턴 차이를 관찰하고 "어텐션이 해석가능성의 증거인가"에 대한 자신의 관점을 제시하면 20점.
여기까지 읽었다면 한 가지 스스로에게 물어봐라 — "LoRA가 왜 하필 행렬 분해를 쓰는가? SVD(Singular Value Decomposition)와 어떻게 다른가?" 이 질문에 답할 수 있다면 오늘 내용의 핵심을 제대로 소화한 것이다. 모르면 그것이 다음 탐구의 출발점이 된다. 프로젝트를 진행하면서 막히는 부분이 생기면, 막히는 지점이 무엇인지를 먼저 스스로 언어화해 보라. 질문이 정교해질수록 답도 정교해진다.