| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- 데이터분석
- 영국석사
- unity
- 코딩테스트 준비
- 부트캠프
- 인턴십 면접
- 자동화
- 해외석사준비
- 미국석사
- 머신러닝
- ICT 글로벌 인턴십
- 해외유학준비
- 코딩테스트
- 통계
- n8n
- 아이펠 리서치
- 아이펠
- SQLD
- SQL
- 해외입시
- 제이펍
- 데이터사이언스
- 해외석사
- 인공지능
- 모두의연구소
- 개발 도서
- 코드트리
- OpenAI
- 딥러닝
- docker
- Today
- Total
Developer Jenny Lim's Blog
[D+47] 아이펠 리서치 14기 TIL | BERT Pre-trained Model 개발하기 본문
[D+47] 아이펠 리서치 14기 TIL | BERT Pre-trained Model 개발하기
Jenny Lim 2025. 9. 15. 05:05
1. 오늘 배운 내용
이번 프로젝트는 100만 개 파라미터 규모의 Mini BERT 모델을 한국어 나무위키 데이터셋으로 사전 학습하여 최적의 성능을 달성하도록 하는 것이었다. 100만 개도 많다고 생각했는데, 이는 정말 작은 모델에 속할 뿐이었다. BERT 계열의 경우 Base 모델은 약 110M, Large 모델은 340M의 파라미터를 갖고 있다. GPT-3 역시 약 175B의 파라미터를 갖고 있다니 엄청나다.
조금 더 검색을 해보니 SKT의 KoBERT는 약 1억 개의 파라미터를 갖고 있고, 최근에 개발된 한국어 LLM의 경우 대부분 수십억 ~ 수천억 개의 파라미터를 갖고 있다고 한다. 이번 프로젝트에서 목표로 설정한 '100만 개 파라미터'는 임베딩 및 경량화 연구에 적합한 수준이다. 본격적인 LLM의 경우 10억 개의 파라미터 이상을 갖고 있으니 정말 많은 자원들이 필요하겠구나 싶었다.
[실험 1 - Baseline 구축]
- Vocab size : 8000
- Epoch : 10
- Learning Rate : 1e-2
- Random Seed 고정
- SentencePiece 기반 토크나이저 학습
- MLM 마스크 생성 : 전체 토큰의 15%를 마스킹(80% : [MASK] 토큰 / 10% : 랜덤 토큰 / 10% : 원래 토큰 유지)
- NSP pair 생성(50% : 실제 이어지는 문장 / 50% : 랜덤 문장 연결) + 문장 구분을 위한 세그먼트 임베딩 추가
- Optimizer : Adam
- Loss : CrossEntropyLoss

MLM은 34.0%, NSP는 61.5%의 정확도를 보였는데, 기본적인 언어 패턴 학습을 시작했다는 것을 보여주지만, 성능 곡선이 epoch 10 시점에서도 계속 상승 중인 것을 확인하여 아직 학습이 충분히 진행되지 않았다는 것을 알았다. 여기서 하이퍼 파라미터를 조정해보면 좋을 것 같다는 생각이 들긴 했으나, 무작정 바꾸기보다는 근거를 바탕으로 실험을 진행하는 것이 맞다고 판단했다.
[실험 2 - 모델 구조 탐색]
- Deep & Narrow
- Layer 수를 늘려서 깊이를 증가시킨 구조 + Hidden size는 작게 유지
- Layer 수 : 4
- Hidden size : 80
- Head 수 : 4
- 각 Head dimension : 20
- FFN dimension : 320
- Wide & Shallow
- Hidden size를 크게 늘리고 layer 수를 축소
- Layer 수 : 2
- Hidden size : 112
- Head 수 : 4
- 각 Head dimension : 28
- FFN dimension : 448

파라미터 총량을 고정한 채로 깊고 좁은 구조와 얕고 넓은 구조의 성능을 비교했다. 얕고 넓은 구조가 모든 지표에서 근소하게 성능 우위를 보였다. 이를 바탕으로 적은 파라미터 환경에서는 모델의 깊이보다 각 레이어의 표현력을 확보하는 것이 더 효과적일 수 있겠다고 생각했다. 이후에 진행하는 실험들은 얕고 넓은 구조를 기본으로 사용해서 실험을 진행했다.
[실험 3 - 학습률 및 Epoch 최적화]
- Learning Rate : 1e-4, 2e-4, 3e-4

현재의 학습률(1e-4)과 낮은 Epoch(10)로 인해 모델이 적절히 학습하지 못하여 최적의 성능을 못 내는 것이 아닐까 가설을 세웠다. 학습률을 2e-4, 3e-4로 순차적으로 상향하고, 학습 시간을 30 Epochs로 대폭 늘려서 성능 변화를 관찰했다. Epoch를 10으로 고정하니, 아무리 학습률이 증가해도 정확도 향상 속도가 느려서 마지막에는 Epoch를 3배 증가했다. 결국 학습률을 3e-4로 높이고 학습 시간을 30 Epochs로 늘렸을 때 NSP 정확도가 약 9% 증가했다.
[실험 4 - Warm-up과 Weight Decay 적용]
- Epoch : 30
- Batch size : 64
- Optimizer : Adam (lr=3e-4, weight_decay=0.01)
- Schedule r: Cosine Decay with Warm-up
- Warmup step : 전체 step의 5% (1/20)
- Learning rate : 0 → 3e-4 (Warm-up) → Cosine decay

Warm-up은 학습 초반에 Learning Rate를 작은 값에서 시작해서 점진적으로 키우는 전략이다. 학습 초기에는 모델의 파라미터가 랜덤으로 초기화되어 있는 상태이기 때문에 학습률이 너무 크면 발산 위험이 크다. 작은 학습률로 시작해서 모델이 안정화된 후에 목표 학습률까지 올리는 것이 더 안정적이다.
Weight Decay는 Optimizer에서 가중치 값이 지나치게 커지지 않도록 제약을 주는 정규화 기법이다. Loss에 L2 패널티를 더해주는데, 파라미터 값이 커지면 과적합 위험이 크기 때문이다. 가중치를 작게 유지시켜서 일반화 성능을 높이고자 한다.

두 기법을 적용한 모델이 훨씩 좋은 성능을 보였다. 이를 통해 모델의 성능을 최대한 끌어내기 위해서는 단순히 파라미터를 조정하는 것이 아닌, 훈련 과정 자체를 안정화하고 규제하는 기법이 필요함을 알 수 있었다. 현재 어휘 크기를 변경하거나 다른 토크나이저를 적용했을 때는 성능이 어떻게 달라질지 궁금하기도 하다. 이번 프로젝트 관련 내용은 아래 깃허브에서 더 자세히 볼 수 있다!
AIFFEL_quest_rs/GoingDeeper/GD1112/mini BERT-warmup+weightdecay.ipynb at main · JeongMinIsBest/AIFFEL_quest_rs
Aiffel Research 14th Archive 🧙🏻♂️. Contribute to JeongMinIsBest/AIFFEL_quest_rs development by creating an account on GitHub.
github.com
2. 느낀점 / 어려웠던 점
이번 프로젝트는 지난 프로젝트보다 어렵다고 느껴지지 않았다. (지난 프로젝트가 1이라면 이번 프로젝트는 지난 프로젝트의 0.2 정도?) 트랜스포머 구현부터 학습까지 너무 오래 걸려서 실험 결과도 제대로 합치지 못해 인사이트를 제대로 도출하지 못했다. 심지어 전체 데이터셋에 대한 역번역은 무려 10시간이 넘게 걸렸다. 오후 7시 정도부터 다시 시작해서 런타임이 종료되지 않도록 중간에 점검도 하다보니 어느새 오전 5시였다.

요즘 수면 시간이 하루에 3시간이 될까 말까 하면서 입시 스트레스도 같이 받으니 아침에 두통이 너무 심해져서 2시간 정도 더 자고 와서 교육에 참여했다. 매니저님이랑 퍼실님께서 최소 7시간은 꼭 자야된다고 말씀해주셨는데 이걸 작성하는 와중에도 밤을 새고 있다. ^.^ ; 그래도 목요일에 교육 끝나고 잠깐 잔다고 했는데 너무 푹 자고 일어나서 오늘 교육은 제일 일찍 참여하게 되었다!
일찍 접속한 김에 퍼실님이랑 아침에 진로 상담을 진행하게 되었는데 항상 따뜻한 조언을 많이 해주셔서 너무 감사했다. 지금 가장 큰 고민이 '내가 관심있는 분야로 갈 것인지' VS '트렌드를 따라갈 것인지'인데, 퍼실님과 이야기를 나누면서 연구 주제를 조금 더 세분화할 수 있었고 읽어보면 좋을 자료들도 많이 얻을 수 있었다. 정말 막막했던 시작에서 출구를 찾아가고 있는 모습이 적절하게 경사 하강법을 수행하는 느낌이다!

덕분에 이번 실험도 만족스럽게 끝낼 수 있었고 연구 방향성도 찾아가고 .. 이전의 고생들을 보답 받는 느낌이다. 은근한 완벽주의 성격 때문에 나 자신한테 실망한 적이 너무 많아서 프로젝트 하면서 나 자신한테 많이 깨졌었다. 이번 프로젝트는 정말 큰 수확이라고 생각한다. 이게 바로 스스로 부딪혀보면서 배우는 성장의 고통이 성장으로서 거듭나게 된 순간인 것 같다.
이번 주부터 1일 1논문 정리를 시작하기로 마음 먹었는데 회고록과 같이 밀리지 않고 꼭 작성하기로 한다. 지금 자기소개서랑 포트폴리오 정리도 바빠 죽겠지만 이미 주어진 일인데 못 한다고 생각하지 말자. 이번 주 교육도 힘 내서 열심히 공부해보자!