Downloads · 30 days
261
91% of all-time downloads
kiwi-farm/kiwi-coco-lm-base
kiwi-coco-lm-base is a feature extraction model from kiwi-farm. Use it when you need embeddings to search or compare text. It is set up for transformers. The card lists the license as apache-2.0.
1. Model Summary 2. Usage 3. Evaluation 4. Limitations 5. Training 6. License 7. Citation
Downloads · 30 days
261
91% of all-time downloads
All-time downloads
287
Public
Parameters
161M
323 MB on disk
Likes
6
Trending 1
Click a slice to open those files.
.safetensors323 MB · 98%
From the Hugging Face model README
Kiwi COCO-LM은 ModernBERT-base를 기반으로 한 한국어·영어 인코더 모델로, 최대 8192 토큰 길이의 입력을 처리할 수 있습니다. ModernBERT-base의 어휘에서 사용 빈도가 낮은 다국어 토큰을 덜어내고 그 자리에 한국어 토큰을 추가한 뒤, 기존 가중치를 이어받아 한국어·영어 말뭉치로 추가 사전학습을 진행했습니다.
추가 사전학습에는 COCO-LM의 방법론을 적용했습니다. ELECTRA의 Replaced Token Detection(RTD)은 각 토큰이 치환되었는지 여부만 판별하기 때문에 말뭉치로부터 얻는 학습 신호가 제한적입니다. COCO-LM은 이를 보완하기 위해 치환 여부 판별과 함께 원래 토큰을 복원하는 Corrective Language Modeling(CLM)으로 토큰 수준의 학습을 강화하고, Sequence Contrastive Learning(SCL)으로 시퀀스 수준의 표현도 함께 학습합니다. ModernBERT에 이 학습 방법론을 적용한 결과 Kiwi COCO-LM은 한국어(KLUE)와 영어(GLUE) 벤치마크 모두에서 비슷한 규모의 모델과 견줄 만한 성능을 보입니다(Evaluation 참고).
이 저장소는 Kiwi COCO-LM의 Discriminator를 제공합니다. 일반적으로는 Discriminator를 다운스트림 태스크에 미세조정하여 사용하지만, Generator가 필요한 경우라면 Kiwi COCO-LM Generator 저장소를 참고하시기 바랍니다.
| 종류 | 레이어 개수 | 파라미터 | 설명 |
|---|---|---|---|
| Generator | 6 | 80M | Discriminator가 잘 학습할 수 있도록 그럴싸한 노이즈를 생성 |
| Discriminator | 22 | 161M | Generator가 생성한 노이즈들을 파악하고 그 안에서 원래 의미를 복원하도록 학습. |
※ 파라미터 개수는 임베딩(64k × 768, 약 49M)을 포함한 값입니다. Discriminator의 파라미터 개수에는 사전학습에만 사용되는 RTD/SCL 헤드(약 1.3M)도 포함되어 있습니다.
이 모델은 transformers v5 이상에서 사용할 수 있습니다. (토크나이저 설정이 v5 형식으로 저장되어 있어 v4.x에서는 AutoTokenizer 로딩이 실패할 수 있습니다.)
pip install -U "transformers>=5.0.0"
import torch
from transformers import AutoTokenizer, AutoModel
model_id = "kiwi-farm/kiwi-coco-lm-base"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModel.from_pretrained(model_id)
inputs = tokenizer(["키위는 한국어 형태소 분석기입니다.", "Kiwi is a Korean morphological analyzer."], padding=True, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
cls_embeddings = outputs.last_hidden_state[:, 0] # [CLS] 토큰 임베딩
분류, 개체명 인식, 질의응답, 검색 등의 다운스트림 태스크에는 일반적인 BERT 계열 모델과 동일한 방식으로 미세조정하여 사용하면 됩니다.
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("kiwi-farm/kiwi-coco-lm-base", num_labels=7)
모델을 불러올 때 rtd_head, scl_head 등 사전학습용 헤드의 가중치가 사용되지 않는다(UNEXPECTED)는 메시지가 출력될 수 있는데, 이는 COCO-LM 사전학습에만 쓰이는 보조 헤드이므로 무시해도 됩니다.
⚠️ fill-mask 사용 관련 주의: 이 모델은 COCO-LM 방식으로 학습되었기 때문에, 메인 모델은 [MASK] 토큰이 아니라 Generator가 치환한 토큰이 섞인 입력을 받아 원래 토큰을 복원(Corrective LM)하도록 학습되었습니다. 따라서 fill-mask 파이프라인에 [MASK] 토큰을 넣어 빈칸을 채우는 용도로는 적합하지 않으며, 미세조정 후 사용하는 것을 권장합니다.
⚠️ ModernBERT의 아키텍처는 Flash Attention 2에서 효과적으로 동작하도록 설계되어 있습니다. 따라서 아래와 같이 Flash Attention을 설치한 뒤 사용하는걸 권장합니다:
pip install flash-attn
KLUE 태스크 중 일부(모델 크기 Base 기준)
| Model | Avg | YNAT | KLUE-STS | KLUE-NLI | KLUE-NER | KLUE-RE | KLUE-MRC |
|---|---|---|---|---|---|---|---|
| MacroF1 | PearsonR / F1 | Accuracy | Ent. MacroF1 / Chr. MacroF1 | MicroF1 / AUC | EM / RougeW | ||
| Kiwi COCO-LM | 82.34 | 86.15 | 92.23 / 86.90 | 87.87 | 84.44 / 93.02 | 65.36 / 69.67 | 71.38 / 77.00 |
| KLUE RoBERTa | 80.44 | 85.99 | 92.68 / 85.89 | 85.63 | 83.47 / 90.77 | 63.11 / 63.54 | 68.98 / 73.60 |
| KoELECTRA | 77.79 | 86.05 | 93.13 / 86.23 | 87.23 | 85.59 / 92.61 | 59.09 / 53.44 | 55.18 / 61.68 |
| A.X-Encoder | 82.91 | 85.77 | 92.58 / 86.33 | 87.37 | 87.63 / 93.29 | 65.74 / 68.40 | 74.97 / 79.70 |
| KF-DeBERTa | 82.89 | 86.53 | 92.63 / 87.45 | 87.73 | 85.26 / 92.62 | 67.16 / 70.38 | 72.92 / 77.73 |
| ModernBERT | 62.36 | 77.05 | 76.63 / 69.62 | 67.40 | 74.96 / 86.15 | 39.40 / 29.13 | 39.51 / 44.02 |
| mmBERT | 79.33 | 84.24 | 90.51 / 81.58 | 83.30 | 85.49 / 92.42 | 61.95 / 69.06 | 65.26 / 70.65 |
GLUE 태스크 중 일부
| Model | Avg | SST2 | CoLA | MRPC | STS-B | QQP | MNLI | QNLI | RTE | WNLI |
|---|---|---|---|---|---|---|---|---|---|---|
| Accuracy | MCC | Accuracy / F1 | PearsonR / SpearmanRho | Accuracy / F1 | Accuracy | Accuracy | Accuracy | Accuracy | ||
| Kiwi COCO-LM | 83.02 | 93.01 | 61.16 | 90.93 / 93.47 | 91.00 / 90.79 | 91.12 / 88.10 | 87.64 | 93.26 | 83.03 | 56.34 |
| KLUE RoBERTa | 70.75 | 87.27 | 4.45 | 83.82 / 88.26 | 85.24 / 84.92 | 89.44 / 85.50 | 79.78 | 86.78 | 63.54 | 56.34 |
| KoELECTRA | 69.49 | 81.65 | 11.84 | 86.03 / 89.69 | 84.48 / 84.24 | 86.35 / 80.87 | 72.73 | 84.94 | 62.09 | 56.34 |
| A.X-Encoder | 74.99 | 90.48 | 24.23 | 85.05 / 89.32 | 87.55 / 87.41 | 90.28 / 86.90 | 83.53 | 91.05 | 66.07 | 56.34 |
| KF-DeBERTa | 71.34 | 86.47 | 9.25 | 85.05 / 89.57 | 86.81 / 86.54 | 88.34 / 84.10 | 78.46 | 88.19 | 63.18 | 56.34 |
| ModernBERT | 80.30 | 95.30 | 61.92 | 86.52 / 90.30 | 90.00 / 89.95 | 90.83 / 87.74 | 88.73 | 93.34 | 66.43 | 49.30 |
| mmBERT | 81.01 | 93.69 | 60.79 | 87.75 / 91.38 | 90.81 / 90.79 | 91.35 / 88.42 | 87.46 | 93.06 | 80.14 | 43.66 |
위 표에 나온 모델들의 tokenizer가 한국어와 영어를 얼마나 효율적으로 처리하는지 비교했습니다. 한국어 샘플 문서(6,162 바이트, 534 어절)와 영어 샘플 문서(4,503 바이트, 693 단어)를 토큰화한 결과이며, 자세한 분석 방법과 전체 결과는 korean-tokenizer-analysis에서 확인할 수 있습니다.
| Model | 방식 | 전체 vocab 수 | 한글 포함 vocab 수 | 한국어 어절당 토큰 수 | 한국어 토큰당 바이트 수 | 영어 단어당 토큰 수 | 드문 음절 16개 중 UNK 수 |
|---|---|---|---|---|---|---|---|
| Kiwi COCO-LM | Byte-level BPE | 64,000 | 26,858 (41.97%) | 2.37 | 4.87 | 1.31 | 0 |
| KLUE RoBERTa | WordPiece | 32,000 | 28,445 (88.89%) | 2.41 | 4.79 | 2.54 | 14 |
| KoELECTRA | WordPiece | 35,000 | 29,021 (82.92%) | 2.44 | 4.73 | 2.48 | 10 |
| A.X-Encoder | WordPiece | 50,000 | 24,084 (48.17%) | 2.54 | 4.54 | 1.89 | 0 |
| KF-DeBERTa | WordPiece | 130,000 | 104,522 (80.40%) | 2.19 | 5.26 | 1.62 | 10 |
| ModernBERT | Byte-level BPE | 50,368 | 25 (0.05%) | 7.12 | 1.62 | 1.30 | 0 |
| mmBERT | BPE (byte fallback) | 256,000 | 2,295 (0.90%) | 3.30 | 3.50 | 1.24 | 0 |
걁, 겼, 긂, 깄, 뇄, 렜, 뢔, 뢨, 붴, 뻤, 쌘, 얬, 칢, 텼, 퉜, 홥처럼 잘 쓰이지 않는 한글 음절 16개를 각각 토큰화했을 때 [UNK]로 처리되어 원래 글자를 잃어버린 음절 수입니다.Kiwi COCO-LM의 tokenizer는 한국어 어절당 2.37토큰으로, 한국어 전용 WordPiece tokenizer인 KLUE RoBERTa(2.41), KoELECTRA(2.44)와 비슷하거나 조금 더 효율적입니다. 동시에 영어는 단어당 1.31토큰으로, 원본인 ModernBERT(1.30)와 거의 같은 효율을 유지합니다. 한국어 효율이 가장 좋은 KF-DeBERTa(2.19)는 vocab 크기가 Kiwi COCO-LM의 2배가 넘고 영어 효율은 떨어집니다(1.62). 또한 Kiwi COCO-LM의 tokenizer는 Byte-level BPE를 사용하기 때문에 WordPiece 기반 tokenizer와 달리 어떤 글자도 [UNK]로 처리되지 않습니다.
한편 ModernBERT는 한글 vocab이 25개뿐이라 한국어를 대부분 UTF-8 바이트 단위로 쪼개며, 어절당 7.12토큰으로 Kiwi COCO-LM보다 약 3배 많은 토큰을 사용합니다. 같은 8192 토큰 길이 안에 담을 수 있는 한국어 텍스트 분량이 그만큼 적다는 뜻입니다.
[MASK] 토큰 기반의 빈칸 채우기 용도로도 적합하지 않습니다. 다운스트림 태스크에 미세조정하여 사용하는 것을 권장합니다.| Seq Length | Batch Size | Tokens per Batch |
|---|---|---|
| 8192 | 4 | 32K |
| 8192 | 4 | 32K |
| 8192 | 4 | 32K |
| 8192 | 4 | 32K |
| 4096 | 8 | 32K |
| 4096 | 8 | 32K |
| 2048 | 16 | 32K |
| 2048 | 16 | 32K |
| 1024 | 32 | 32K |
| 1024 | 32 | 32K |
| 512 | 64 | 32K |
| 512 | 64 | 32K |
| 256 | 128 | 32K |
| 256 | 128 | 32K |
| 128 | 256 | 32K |
| 128 | 256 | 32K |
| 총 16 스텝 | 총 1024 배치 | 총 512K 토큰 |
| Language | Dataset | Tokens (1M) |
|---|---|---|
| Korean | 한국어 위키백과 | 601.4 |
| Korean | KcBERT 댓글 데이터 | 2747.8 |
| Korean | 한국어 웹 커뮤니티 댓글 | 133.7 |
| Korean | Koreascience.kr 초록 말뭉치 | 214.9 |
| Korean | 나무위키 | 1149.8 |
| Korean | AIHub 대규모 구매도서 말뭉치 | 1118.4 |
| Korean | AIHub 전문분야 말뭉치 | 1608.4 |
| Korean | AIHub 뉴스 말뭉치 | 439.8 |
| Korean | AIHub 대화 말뭉치 | 71.4 |
| Korean | NIK 구어 말뭉치 | 244.7 |
| Korean | NIK 문어 말뭉치 | 1452.2 |
| Korean | NIK 신문 말뭉치 | 2280.2 |
| Korean | NIK 온라인 게시자료 말뭉치 | 80.4 |
| - | Total | 12143.3 |
| Language | Dataset | Tokens (1M) |
|---|---|---|
| English | English Wikipedia | 8191.2 |
| Multilingual | FLAN Zero-shot (Train Set, Random Sampled) | 6833.1 |
| - | Total | 15024.3 |
학습 데이터는 약 27.2B 토큰으로 구성되어 있으며, 그 중 한국어 데이터는 12143.3M 토큰을, 영어(및 다국어) 데이터는 15024.3M 토큰을 차지합니다. 학습 데이터가 충분하지 않았기 때문에 동일한 데이터를 총 5 epoch 반복하여 약 136B 토큰을 학습했습니다. 단 동일한 말뭉치를 다시 학습하더라도 입력 자체는 달라지도록 매 epoch마다 random seed를 다르게 주어 마스킹이 적용되는 토큰을 다르게 만들었습니다.
Apache 2.0 license
If you use Kiwi COCO-LM in your work, please cite:
@misc{kiwi-coco-lm-2026,
author = {Minchul Lee},
title = {Kiwi COCO-LM: A Korean-English Long-Context Encoder based on ModernBERT},
year = {2026},
publisher = {Hugging Face},
howpublished = {\url{https://huggingface.co/kiwi-farm/kiwi-coco-lm-base}}
}