[논문 리뷰] Mid-training 이해하기
Mid-training은 Fine-tuning처럼 정답 응답을 맞추는 단계가 아니라, 터미널 모델에 필요한 능력 분포와 데이터 흐름을 다시 조정하는 continued training 단계다.
1. 왜 Mid-training이 헷갈렸나
처음에는 Mid-training이라는 용어 자체가 낯설었습니다. 이미 학습된 모델을 다시 학습시키는 단계라면 Fine-tuning과 무엇이 다른지부터 모호했습니다. 둘 다 학습된 모델에 데이터를 더 넣는 것처럼 보였기 때문입니다.
논문을 읽고 나니 차이는 데이터 출처보다 학습 위치, 목적, 포맷에 가깝게 정리됐습니다. Fine-tuning은 보통 사용자 지시와 이상적 응답을 맞추는 쪽에 가깝습니다. 반면 Mid-training은 pre-training 이후, SFT/post-training 이전에 모델의 능력 분포를 다시 조정하는 continued training 단계에 가깝습니다.
이 글은 그 혼란에서 출발합니다. Mid-training을 Fine-tuning의 다른 이름으로 보지 않고 왜 별도 단계로 봐야 하는지 정리하는 것이 목적입니다. 특히 터미널 모델을 만든다면 어떤 데이터 관점으로 해석할 수 있는지까지 함께 봅니다.
2. 제가 정리한 Mid-training 정의
논문 기준 정의는 이렇습니다.
Mid-Training of Large Language Models: A Survey는 Mid-training을 large-scale pre-training과 task-specific fine-tuning 사이의 중간 단계로 봅니다.- 이 단계에서는 annealing-style phase를 통해 데이터 품질을 조정하고 optimization schedule을 바꾸며 context length를 확장합니다.
- 다른 survey도 Mid-training을 pre-training과 post-training 사이에서 수학, 코딩, 추론, long-context 같은 지정 능력을 강화하면서 foundational competency를 유지하는 단계로 설명합니다.
제가 이해한 정의는 이렇습니다.
Mid-training은 SFT처럼 정답 응답을 직접 맞추는 단계라기보다, 다음 토큰을 예측하는 방식으로 학습하면서 목표 도메인의 데이터에서 반복되는 패턴, 구조, 해석 능력을 강화하는 단계입니다.
터미널 모델 관점에서 패턴, 구조, 해석은 이렇게 풀어볼 수 있습니다.
- 패턴: 어떤 상황에서 어떤 도구나 행동이 반복되는지를 말합니다.
- 구조: 사용자 요청, context, tool call, output, 검증 보고가 어떤 순서로 이어지는지를 말합니다.
- 해석: output, log, error를 읽고 다음 행동을 결정하는 능력입니다.
보강 문장:
데이터 믹스는 범용성을 유지하면서 특화성/해석 능력을 보강하기 위해 조절합니다.
Learning rate scheduling은 언어 모델이 고품질/목표 데이터의 신호를 안정적으로 흡수하고 기존에 배운 범용 능력이 과하게 흔들리지 않도록 조절하는 역할을 합니다.
Long-context mid-training은 긴 로그/문서/작업 episode를 continuation corpus로 학습시켜 모델이 앞선 정보와 뒤의 행동 연결, 여러 파일 사이의 관계 파악, 반복 실패 회피 능력을 강화하게 합니다. 동시에 context length와 position encoding 같은 설정을 조정해 긴 입력을 실제로 처리할 수 있게 만듭니다.
3. Pre-training, Mid-training, SFT/Post-training의 차이
세 단계를 구분할 때 기준은 이미 학습된 모델을 다시 학습하느냐가 아닙니다. 그 기준으로 보면 Mid-training과 Fine-tuning은 둘 다 비슷해 보입니다. 더 봐야 할 기준은 학습 위치, 목적, 데이터 포맷, objective입니다.
SFT, post-training, preference tuning, RLHF/DPO는 엄밀히는 서로 다른 단계입니다. 다만 이 글에서는 Mid-training과 대비하기 위해 사용자 지시와 선호 행동에 맞추는 후반 학습 흐름을 SFT/Post-training으로 묶어 설명하겠습니다.
| 단계 | 위치 | 목적 | 주된 데이터 형태 | 터미널 모델 예시 |
|---|---|---|---|---|
| Pre-training | 초기 대규모 학습 | 넓은 언어, 지식, 코드, 문서 패턴 학습 | 웹, 책, 코드, 위키, 논문 등 대규모 corpus | 코드와 문서의 일반 구조를 배움 |
| Mid-training | Pre-training 이후, SFT 이전 | 범용성을 유지하면서 목표 능력의 병목 보강 | 목표 도메인 continuation corpus, 고품질 데이터 mix, long-context corpus | 로그, tool output, patch, 검증 흐름을 학습 |
| SFT/Post-training | Mid-training 이후 | 사용자 지시, 응답 형식, 선호 행동에 맞춤 | instruction-response pair, preference data, RL/RLHF/DPO 데이터 | 사용자 요청에 맞춰 어떻게 답할지 학습 |
구분은 단순합니다.
- 같은 Codex 로그라도 continuation corpus로 만들면 Mid-training에 가깝습니다.
- 사용자 요청과 최종 답변만 뽑아 instruction-response pair로 만들면 SFT에 가깝습니다.
4. Data Mix를 어떻게 잡을까
Mid-training은 고품질 데이터를 많이 넣는 단계만은 아닙니다. 목표 능력에 맞춰 데이터 비율을 조절하는 일이 핵심입니다. Mid-training의 목표가 범용 능력을 유지하면서 특화 능력을 올리는 데 있기 때문입니다.
예를 들어 코딩 데이터를 많이 넣으면 코드 작성과 디버깅 능력은 좋아질 수 있습니다. 하지만 일반 독해, 상식, 한국어 이해, 짧은 문맥 응답 안정성이 같이 유지되는지는 따로 봐야 합니다. 그래서 목표 능력 데이터와 보존 능력 데이터를 함께 섞어야 합니다.
터미널 모델을 목표로 한다면 데이터 축은 대략 이렇게 나뉩니다.
- 코딩/디버깅/CLI 작업 데이터
- 기술 문서/README/API/log 데이터
- 한국어 작업 지시 이해용 continuation 데이터
- 수학/논리 추론 데이터
- 일반 고품질 웹/상식/독해 보존 데이터
- 정제된 Codex 작업 로그 continuation
- long-context 로그/문서 데이터
이때 Codex 작업 로그는 개인 대화 기록 그 자체가 아닙니다. 제대로 정제하면 사용자 요청, tool call, output 해석, 다음 행동, 검증 보고가 이어지는 작업 흐름 데이터가 될 수 있습니다. 다만 개인 작업 습관과 특정 포맷에 과적합될 수 있으므로 처음부터 큰 비율로 넣는 것은 위험합니다.
첫 실험이라면 Codex 로그를 전체의 20% 이하로 두고 나머지는 외부 코딩/문서/추론/일반 독해 데이터로 채우는 식이 더 안전합니다.
5. Learning Rate Scheduling이 맡는 일
데이터 믹스가 무엇을 배울지의 문제라면, learning rate scheduling은 얼마나 안정적으로 배울지의 문제에 가깝습니다.
Pre-training 초반의 모델은 아직 많은 것을 모릅니다. 그래서 큰 폭으로 빠르게 학습할 필요가 있습니다. Mid-training 시점의 모델은 이미 언어, 코드, 문서 구조, 일반 지식을 어느 정도 배운 상태입니다. 이때 목표 데이터의 비율을 바꾸면서 learning rate까지 너무 크게 유지하면 고품질 데이터의 세밀한 신호를 안정적으로 흡수하지 못하거나 기존에 배운 범용 능력을 흔들 수 있습니다.
그래서 Mid-training에서는 learning rate annealing이나 multi-stage schedule이 중요해집니다. 저는 이렇게 이해했습니다.
Learning rate scheduling은 언어 모델이 고품질/목표 데이터의 신호를 안정적으로 흡수하고 기존에 배운 범용 능력이 과하게 흔들리지 않도록 조절하는 역할을 합니다.
논문에서는 이 현상을 gradient noise scale, information bottleneck, curriculum learning 관점에서 설명합니다. 이 글에서는 수식까지 들어가기보다, 후반 학습에서는 데이터 분포와 학습률을 함께 조정해야 한다는 직관만 가져가겠습니다.
발표나 블로그에 그림을 넣는다면 다음 자료가 적합합니다.
Mid-Training of Large Language Models: A Survey의 mid-training taxonomy 또는 theory 설명 그림을 인용합니다.- 본문에는 복잡한 이론 설명을 길게 쓰지 않고 그림 아래에 “데이터 품질, optimization schedule, context extension이 함께 움직인다”는 캡션을 붙입니다.
6. Long-context Extension은 데이터만으로 끝나지 않는다
Long-context는 모델이 긴 입력을 처리하도록 구조와 데이터를 함께 조정하는 문제입니다. 긴 데이터를 넣는다고 해결되는 문제가 아닙니다.
데이터 측면에서는 긴 로그, 여러 파일, README, 테스트 출력, diff, 이전 tool output처럼 앞에서 본 정보와 뒤의 행동을 연결해야 하는 샘플이 필요합니다. 모델 설정 측면에서도 context length, position encoding 조정(RoPE/YaRN/LongRoPE 계열), attention 관련 조정이 필요합니다. 긴 데이터를 넣었더라도 모델이 그 길이를 안정적으로 처리할 수 없다면 long-context 능력은 제대로 생기기 어렵습니다.
대표적인 용어는 다음 정도로 이해하면 됩니다.
- RoPE: Transformer에서 위치 정보를 회전 기반으로 표현하는 방식입니다.
- YaRN: RoPE 기반 모델의 context length를 늘릴 때 쓰이는 scaling 계열 방법입니다.
- LongRoPE: 더 긴 context window를 목표로 RoPE의 위치/주파수 스케일링을 조정하는 계열 방법입니다.
터미널 모델에서는 이 문제가 더 직접적으로 드러납니다. 하나의 요청을 처리할 때 여러 파일을 읽고 테스트 로그를 본 뒤 패치를 만들고 다시 검증해야 합니다. 이때 모델은 초기 목표를 잃지 않아야 하고 앞선 output과 뒤의 행동을 연결해야 하며 같은 실패를 반복하지 않아야 합니다.
Long-context mid-training은 긴 로그/문서/작업 episode를 continuation corpus로 학습시키는 데이터 문제이자, 긴 입력을 실제로 처리할 수 있게 만드는 학습 설정 문제입니다.
7. Codex 로그를 데이터로 보면
Codex 로그의 가치는 두 가지입니다.
- 단순 Q&A가 아니라 작업 흐름이 들어 있습니다.
- 사용자 요청, tool call, output, 실패 로그, 해석, 후속 행동, 검증 보고가 연결될 수 있습니다.
Codex 로그를 그대로 블로그에 넣을 필요는 없습니다. 원문보다 구조가 중요합니다. 예를 들어 실제 로그에서 확인되는 흐름은 아래처럼 익명화할 수 있습니다. 아래 예시는 “잘못된 경로 가정 -> 실패 출력 -> 실패 원인 해석 -> 보정된 다음 행동” 흐름을 일반화한 것입니다.
<user_request>
보고서 추출 기능이 제거된 것 같은데, 현재 저장소와 기존 백엔드를 비교해서 확인해줘.
</user_request>
<assistant_update>
현재 저장소와 기존 백엔드에서 보고서/docx 관련 엔드포인트, 서비스, 의존성을 비교해보겠다.
</assistant_update>
<tool_call>
name: exec_command
arguments:
cmd: "rg -n 'docx|report|download|export' backend frontend"
workdir: "<CURRENT_REPO>"
</tool_call>
<tool_output>
exit_code: 2
stderr:
"rg: backend: No such file or directory"
"rg: frontend: No such file or directory"
</tool_output>
<interpretation>
현재 저장소의 실제 디렉터리명이 backend/frontend가 아니라 번호가 붙은 이름이라 첫 검색이 실패했다.
</interpretation>
<next_action>
실제 디렉터리명을 확인한 뒤, 보정된 경로로 다시 검색한다.
</next_action>
이런 데이터는 instruction-response pair라기보다 continuation corpus에 가깝습니다. 모델이 최종 답변 하나만 보는 것이 아니라, 요청을 읽고 도구를 호출하고 실패 출력을 해석한 뒤 다음 행동을 고르는 흐름을 보기 때문입니다.
정제 원칙은 간단합니다.
- 남길 것: 사용자 요청, tool name, 정제된 tool arguments, tool output, exit code, 실패 해석, 후속 행동, 검증 결과입니다.
- 제거/익명화할 것: token, secret, credential, 계정 ID, 절대 경로, 사용자명, bucket명, session id, call id, 불필요한 timestamp/meta입니다.
블로그나 학습 데이터 예시에는 원문을 그대로 넣기보다, 위처럼 구조만 살린 mini segment를 사용하는 편이 안전합니다.
8. 실패와 멈춤도 학습 데이터다
실패 데이터는 무조건 나쁜 데이터가 아닙니다. 터미널 모델은 실패를 피하는 것뿐 아니라 실패를 해석하고 회복하는 법도 배워야 합니다. 다만 실패 기록을 그대로 많이 넣으면 위험합니다. 모델이 잘못된 추론이나 무관한 명령 반복까지 따라 할 수 있기 때문입니다.
좋은 실패 데이터는 다음 흐름을 가져야 합니다.
실패 관찰 -> 실패 해석 -> 회복/복구 행동 -> 재검증 성공
짧은 예시는 아래와 같습니다.
<tool_call>
cmd: "python -c '...'"
</tool_call>
<tool_output>
exit_code: 127
stderr: "command not found: python"
</tool_output>
<interpretation>
현재 환경에는 python 명령이 없고 python3를 사용해야 한다.
</interpretation>
<recovery_action>
cmd: "python3 -c '...'"
</recovery_action>
<verification_output>
exit_code: 0
stdout: "expected result ..."
</verification_output>
이 흐름은 실패 자체보다, 실패를 어떻게 읽고 다음 행동으로 복구하는지 보여주는 데 의미가 있습니다.
좋은 멈춤 데이터는 다음 흐름을 가져야 합니다.
사용자 요청 -> 위험 신호 발견 -> 위험 이유 설명 -> 사용자 확인 요청 또는 안전한 대안 제시
예시는 아래와 같습니다.
<user_request>
빌드 산출물이 꼬인 것 같으니 프로젝트 폴더에서 불필요한 파일을 전부 지워줘.
</user_request>
<proposed_command>
rm -rf <PROJECT_DIR>/*
</proposed_command>
<risk_signal>
데이터 삭제 범위가 넓고, 소스 파일까지 삭제될 수 있다.
</risk_signal>
<safe_decision>
바로 삭제하지 않는다. 먼저 삭제 후보를 list/dry-run으로 확인하고, 실제 삭제 전 사용자 확인을 요청한다.
</safe_decision>
좋은 멈춤 데이터는 모델이 무조건 거절하도록 만드는 데이터가 아닙니다. 진행해야 할 때와 멈춰야 할 때를 구분하도록 만드는 데이터입니다.
9. 첫 실험용 데이터 믹스 가설
여기서의 비율은 정답 레시피가 아니라 첫 실험을 위한 가설입니다. 목적은 “터미널 모델이 사용자 요청을 작은 단위로 안전하게 수행하고 실패를 해석하며 필요한 경우 멈출 수 있는가”를 보는 데 있습니다.
초기 가설에서는 Codex 로그를 20% 이하로 둡니다. Codex 로그는 목표 도메인에 매우 가깝지만 개인 작업 습관과 특정 도구 포맷에 과적합될 수 있습니다. 나머지는 외부 데이터로 일반화, 코딩, 문서, 추론 능력을 보완합니다.
예시 mix는 이렇게 잡습니다.
| 데이터 축 | 비율 가설 | 역할 |
|---|---|---|
| 외부 코딩/디버깅/CLI 데이터 | 15% | 코드 수정, 명령 실행, 디버깅의 일반 능력 보강 |
| 외부 기술 문서/README/API/log 데이터 | 13% | 문서와 로그를 읽고 작업 맥락을 파악하는 능력 보강 |
| 한국어 작업 지시 이해용 continuation 데이터 | 13% | 한국어 요청을 작업 단위로 해석하는 능력 보강 |
| 수학/논리 추론 데이터 | 11% | 단계적 추론, 조건 처리, 검산 습관을 전이 가능한 방식으로 보강 |
| 일반 고품질 웹/상식/독해 보존 데이터 | 13% | 일반 독해, 상식, 언어 능력 보존 |
| 정제된 Codex 작업 로그 continuation | 20% | 사용자 요청, tool call, output 해석, 다음 행동, 검증 보고 흐름 학습 |
| 외부 long-context 로그/문서 데이터 | 13% | 긴 로그와 여러 파일 사이의 관계를 유지하는 능력 보강 |
Codex 로그 20% 내부도 다시 나눕니다.
| Codex 로그 내부 유형 | 전체 mix 기준 | 역할 |
|---|---|---|
| 짧은 segment | 14% | 다음 행동과 output 해석을 반복 학습 |
| 긴 episode | 2% | 목표 유지와 장기 context 연결 |
| 좋은 멈춤 segment | 4% | 위험하거나 불명확한 상황에서 사용자 확인 |
이 비율의 의도는 긴 작업을 한 번에 끝까지 밀어붙이는 모델이 아니라, 작은 단위로 진행하고 사용자와 상호작용하며 목표를 달성하는 모델을 먼저 보려는 데 있습니다.
10. 평가는 작은 터미널 작업부터
논문에서는 Mid-training 효과를 평가할 때 일반 지식, reasoning, 수학, 코딩, 다국어, long-context benchmark를 함께 봅니다. “Mid-training 전용 단일 benchmark”가 따로 있다기보다, Mid-training의 목표 능력에 맞춰 여러 benchmark를 묶어 봅니다.
Mid-training은 특정 능력만 올리는 것이 아니라, 목표 능력을 올리면서 범용 능력이 크게 무너지지 않는지도 봐야 하기 때문입니다.
대표 benchmark는 범주별로 이렇게 볼 수 있습니다.
- 일반 지식/이해: MMLU, MMLU-Pro
- 모델의 넓은 지식과 문제 이해 능력이 유지되는지 봅니다.
- 일반 reasoning: ARC, HellaSwag, BBH
- 단순 암기가 아니라 상식 추론과 다단계 reasoning이 유지되는지 봅니다.
- 수학/논리 추론: GSM8K, MATH
- 단계적 풀이, 조건 처리, 계산/검산 능력이 좋아졌는지 봅니다.
- 코딩: HumanEval, MBPP
- 함수 단위 코드 생성과 문제 해결 능력을 봅니다.
- Long-context: LongBench, Ruler
- 긴 입력 안에서 정보를 찾고 유지하는 능력을 봅니다.
다른 Mid-training survey는 여기에 agent/tool-use와 code fixing 계열도 포함합니다. 참고용으로만 짧게 보면 이렇습니다.
- BFCL: function calling/tool-use 능력을 평가하는 benchmark입니다.
- ACEBench: agent/tool-use 능력을 평가하는 benchmark입니다.
- SWE-bench: 실제 GitHub issue를 고치는 능력을 평가하는 benchmark입니다.
이 계열은 터미널 모델 사례와 더 직접적으로 맞물립니다. 다만 이 글의 첫 실험 설계에서는 이 benchmark를 바로 쓰기보다, 작은 터미널 작업 평가를 먼저 구성하는 쪽이 더 현실적입니다.
터미널 모델 실험에서는 논문 benchmark만으로 충분하지 않습니다. 우리가 보고 싶은 것은 “작은 터미널 작업을 안전하게 수행하는가”이기 때문입니다. 큰 프로젝트 하나를 오래 맡기는 평가보다, 작은 작업을 여러 개 구성하는 쪽이 더 맞습니다.
목표 능력 평가는 다음 항목으로 구성합니다.
- 작은 터미널 작업 성공률
- 실패 로그 해석
- 다음 명령 선택
- 패치 후 검증 선택
예시 태스크:
- 실패 로그를 보고 다음에 실행할 명령을 고릅니다.
- 테스트 실패 원인을 후보별로 좁힙니다.
- 패치 후 어떤 검증 명령을 실행해야 하는지 고릅니다.
- tool output을 보고 다음 행동을 결정합니다.
- 사용자 요청을 작은 실행 단위로 분해합니다.
보존 능력 평가는 다음을 봅니다.
- 일반 독해
- 상식
- 언어 품질
- 한국어 이해
안전/멈춤 능력 평가는 다음을 봅니다.
- 안전한 로컬 명령은 진행합니다.
- 위험 작업은 확인 질문을 합니다.
- 하면 안 되는 작업은 멈춥니다.
- 로컬 탐색으로 확인 가능한 요청은 불필요하게 질문하지 않습니다.
예시 태스크:
ls,rg, 테스트 실행처럼 안전한 로컬 명령은 진행합니다.rm -rf, DB delete, 외부 배포처럼 위험한 작업은 확인 질문을 합니다.- 토큰이나 credential 노출 요청은 멈춥니다.
- 정보가 부족하지만 repo 안에서 확인 가능한 경우는 먼저 탐색합니다.
- repo 안에서 확인할 수 없는 중요한 의사결정은 사용자에게 묻습니다.
11. 결론
Mid-training은 Fine-tuning의 다른 이름이 아닙니다. SFT처럼 정답 응답을 직접 맞추는 단계도 아닙니다.
이 글에서 정리한 Mid-training은 이미 넓은 능력을 가진 모델을 목표 도메인에 맞게 다시 조정하는 continued training 단계입니다. 핵심은 데이터 믹스, learning rate scheduling, long-context extension입니다.
터미널 모델 관점에서는 사용자 요청, tool call, output 해석, 다음 행동, 검증 보고의 흐름을 continuation corpus로 구성할 수 있습니다. 여기에 실패 복구와 좋은 멈춤 데이터를 포함하면 단순히 많이 실행하는 모델이 아니라 안전하게 진행하고 필요할 때 멈출 수 있는 모델을 목표로 삼을 수 있습니다.
References
- Kaixiang Mo et al., “Mid-Training of Large Language Models: A Survey”, arXiv:2510.06826, 2025. https://arxiv.org/abs/2510.06826
- Chengying Tu et al., “A Survey on LLM Mid-training”, arXiv:2510.23081, 2025. https://arxiv.org/abs/2510.23081
- Team OLMo et al., “2 OLMo 2 Furious”, arXiv:2501.00656, 2025. https://arxiv.org/abs/2501.00656
- Tianyu Gao et al., “How to Train Long-Context Language Models (Effectively)”, arXiv:2410.02660, 2024. https://arxiv.org/abs/2410.02660