데이터 샘플링
- 단순히 "데이터 줄이기"가 아니라 데이터 분포를 재조정하여 모델이 학습해야 할 목표 분포를 만드는 과정
자동완성에서 실제로 쓰이는 샘플링 기법들
1. Subsampling
- 과다 등장 쿼리/토큰의 등장 확률 제어
- 단순히 “빈도가 높은 쿼리를 일정 비율로 줄이기”가 아니라, 아래 두 가지 문제를 해결하기 위한 확률적 다운샘플링
- Zipf's Law로 인해 상위 몇백 개 쿼리가 전체 데이터의 50% 이상 차지하는 문제 해결
- Transformer 학습 시 loss가 특정 패턴에 과도하게 최적화되는 것 방지
- 결과
- 데이터 다양성 증대
- 상위 쿼리 편향 감소
- 모델이 "날씨", "뉴스", "유튜브" 같은 패턴만 배우는 문제 완화
예)
- “날씨”가 하루 50만 번 → 50만 개 모두 사용 X
- 확률 0.01로 줄여서 약 5천 개만 학습
2. Weighted Time Sampling(Temporal Decay Sampling)
- 자동완성은
트렌드 민감도가 매우 높기 때문에 단순 시간 가중치가 아니라, 대부분 지수 감쇠(Exponential Decay) 기법을 사용
- 특징
- 최근 검색 데이터는 거의 100% 유지
- 오래된 데이터는 자동으로 가중치 감소
- 일간/주간 트렌드 반영이 매우 빠름
- 실제 구현은 연속적인 decay curve 형태로 시간별 sampling weight가 달라짐
3. Frequency-Aware Balanced Sampling(구간 기반 균형 샘플링)
- Zipf 분포를 flatten 하기 위해 쿼리 빈도 로그를 구간(bin) 으로 나누고, 각 구간별 target distribution을 맞추는 방식
- 자동완성 모델의 목표: “다양한 패턴 + 충분한 희귀 패턴 + 과다 패턴 억제”
- 다양성을 확보하기 위해 인기 검색어/드문 검색어 구간을 만들어 균형 있게 샘플링
- rare query oversampling 시 노이즈 비율이 증가할 수 있어서,
- 정제된 rare bucket만 100% 사용하고 raw 로그 rare bucket은 일부만 retention 하기도 함
| 검색어 종류 | 샘플링 비율 |
|---|
| 상위 인기 1~100 | 1% |
| 중간 인기 101~10,000 | 10% |
| 드문 검색어 | 100% |
4. Negative Sampling (Contextual Negative Mining)
- 단순 랜덤 샘플링이 아니라, 문맥적으로 "헷갈릴 만한" 잘못된 후보를 생성하는 것이 핵심
(1) 유형
-
Random negative
- 가장 기본적인 수준
- "치킨" → "축구" 같은 무관 negative
-
Hard negative
- 최근 모델들은 “문맥은 비슷하지만 자연스럽지 않은 continuation”을 생성한다
"치킨" → "치킨 가격"은 긍정
"치킨" → "치킨 반지름"은 hard negative
- In-batch negative
- Transformer 학습에서 가장 많이 씀
- batch 내 다른 라벨을 negative로 재사용
- 학습 효율 ↑, 메모리 효율 ↑
(2) 목적
- 모델이 자연스러운 다음 검색어를 구분하게 됨
- perplexity 개선
- 자동완성 품질 상승
5. Query Session Based Sampling (사용자 의도 단위 샘플링)
- 단순히 “세션을 묶어서 함께 샘플링”이 아니라, 사용자 의도 전환(Intent shift)을 기준으로 세그먼트 분리 후 샘플링하는 방식
(1) 세션 분리 기준
- 시간 기반: 30분 inactivity
- intent 기반: 검색어 embedding cosine similarity가 threshold 이하일 때 split
- action 기반: 클릭/스크롤 등 사용자 행동
(2) 이유
- 자동완성은 “사용자가 다음에 무엇을 검색할까?” 를 예측하는 task이기 때문에 세션 기반 데이터는 strong supervision signal을 줌
[치킨] → [치킨 배달] → [배달 시간]
6. Deduplication Sampling (중복 제어 + Noise Reduction)
(1) Exact deduplication
- 동일한 쿼리는 user-level / global-level로 중복 제거
(2) Fuzzy deduplication
- 오타나 경미한 철자 차이가 있는 쿼리를 묶어서 처리
- 예: “아이폰배터리” / “아이폰 베터리” / “iphone battery”
- Levenshtein distance 기반 또는 embedding distance 기반으로 병합
(3) Spam/automation detection
- 의도적으로 반복되는 자동화 트래픽 제거
- 안티 스팸 모듈과 연동
- 이 단계에서 품질이 확연히 좋아짐
실제 자동 완성 모델 학습 파이프라인에서의 샘플링 흐름
- 전체 쿼리 로그 → 깨끗하게 정제(Cleaning) → 샘플링 → 모델 학습
(원본 쿼리 로그: 5억~20억 건)
↓
1) Cleaning
- 스팸/자동화 필터링
- 인코딩/오타 normalization
- fuzzy deduplication
↓
2) Frequency-based Subsampling
- Zipf 상위 쿼리 다운샘플링
- 각 bucket별 target distribution 설정
↓
3) Temporal Weighted Sampling
- exponential decay 적용
- 최근 트렌드 weight 강화
↓
4) Negative Sampling (In-batch + Hard negative mining)
- 자연스러운/비자연스러운 continuation 데이터 구성
↓
5) Session-based Sampling
- intent shift 기준으로 세션 segmentation
- session-aware pair 생성
↓
[최종 학습 데이터 ≈ 1~5백만 건 수준의 고품질 샘플]
↓
Transformer Decoder / BERT Decoder-Only Autocomplete Model 학습