minRNN KoโEn Translator (268M) โ ๋ฌธ์/๋ฌธ๋งฅ ๋จ์ ๋ฒ์ญ
PyTorch๋ก ๋ฐ๋ฅ๋ถํฐ ์ง์ ๊ตฌํํ ํ๊ตญ์ดโ์์ด ๋ฒ์ญ ๋ชจ๋ธ์ ๋๋ค. ์ดํ ์ ๋์ **minGRU ์ ํ ์ํ(minRNN)**์ ์ฐ๋ ์ธ์ฝ๋-๋์ฝ๋ seq2seq๋ก, ํ์ต์ ๋ณ๋ ฌ ์ค์บ์ผ๋ก ๋ณ๋ ฌํ๋๊ณ ๋์ฝ๋ฉ์ ์คํ ๋น O(1)ยท๋ฉ๋ชจ๋ฆฌ O(L)์ ๋๋ค. ์ฌ๋ฌ ๋ฌธ์ฅ์ ๋ฌธ๋งฅ ์๋์ฐ๋ก ๋ฌถ์ด ํต์งธ๋ก ๋ฒ์ญํ๋ ๋ฌธ์ ๋ชจ๋๋ฅผ ์ง์ํฉ๋๋ค โ ๋ฌธ์ฅ๋ณ ๋ฒ์ญ์์ ํ๋ค๋ฆฌ๋ ์ฉ์ดยท๋๋ช ์ฌยท๋ฌธ์ฒด ์ผ๊ด์ฑ์ ๋ฌธ๋งฅ์ผ๋ก ์ ์งํฉ๋๋ค.
A 268M-parameter KoreanโEnglish translation model implemented from scratch in PyTorch. Encoder-decoder seq2seq using minGRU linear recurrence (minRNN) instead of attention โ parallel-scan training, O(1)/step decoding. Supports document-level translation by encoding a window of sentences jointly (k-to-k decoding), keeping terminology and style consistent across sentences.
- ์ฝ๋/๊ตฌํ: https://github.com/wndaasa/ko-en-translator
- ์ํคํ ์ฒ: minRNN seq2seq โ d_model 1024, enc/dec ๊ฐ 8์ธต, d_ff 4096, heads 16, vocab 32K (๊ณต์ฉ BPE)
- positional embedding ์์(์ํ์ด ์์น๋ฅผ ๋ด๋น) โ max_len์ ๋ฐ๊ฟ๋ ๊ฐ์ค์น ์ฌ์ฌ์ฉ ๊ฐ๋ฅ
ํฌํจ ๋ชจ๋ธ
| ๊ฒฝ๋ก | ์ฉ๋ | ํ์ต | ์งํ |
|---|---|---|---|
doc-paper/best.pt |
๋ ผ๋ฌธ/๊ธฐ์ ๋ฌธ์ ๋ฌธ์๋ชจ๋ koโen (๊ถ์ฅ) | ๋ฌธ์ฅ ์ฌ์ ํ์ต โ AI Hub ๊ธฐ์ ๊ณผํ 60,483ํธ(179K ๋ฌธ๋งฅ ์๋์ฐ) ํ์ธํ๋ | val ppl 2.5, ๋ฌธ์๋ชจ๋ BLEU 35.46 |
sentence-base/best.pt |
๋ฒ์ฉ ๋ฌธ์ฅ ๋จ์ koโen (์๋ฐฉํฅ) | OPUS(NLLBยทCCMatrixยทOpenSubtitlesยทParaCrawl) 17M์ | val ppl 12.6, koโen BLEU ~26 |
tokenizer.json |
๊ณต์ฉ ByteLevel BPE (32K, ๋ฐฉํฅ ํ๊ทธ ํฌํจ) | โ | โ |
์ฌ์ฉ๋ฒ
๊ฐ์ค์น๋ ์๊ธฐ์๊ฒฐํ ์ฒดํฌํฌ์ธํธ(model/config/arch)์ด๋ฉฐ, ๋ชจ๋ธ ์ฝ๋๋ GitHub ์ ์ฅ์์์
๊ฐ์ ธ์ต๋๋ค:
git clone https://github.com/wndaasa/ko-en-translator
cd ko-en-translator && pip install torch tokenizers huggingface_hub
import torch
from huggingface_hub import hf_hub_download
from src.minrnn import MinRNNConfig, MinRNNSeq2Seq
from src.tokenizer import load_tokenizer
from src.data import CONTEXT_SEP
from src.translate import greedy_translate, greedy_translate_context
REPO = "Imsbee/ko-en-translator"
device = "cuda" if torch.cuda.is_available() else "cpu"
ckpt = torch.load(hf_hub_download(REPO, "doc-paper/best.pt"), map_location=device)
model = MinRNNSeq2Seq(MinRNNConfig(**ckpt["config"])).to(device).eval()
model.load_state_dict(ckpt["model"])
tok = load_tokenizer(hf_hub_download(REPO, "tokenizer.json"))
# ๋ฌธ์ ๋ชจ๋: ๋ฌธ์ฅ๋ค์ CONTEXT_SEP("\x1f")๋ก ์ด์ด ๋ถ์ฌ ์
๋ ฅ, k๋ฌธ์ฅ โ k๋ฌธ์ฅ ๋ฒ์ญ
doc = CONTEXT_SEP.join([
"๋ณธ ์ฐ๊ตฌ์์๋ ํํ ์ฌํ์ฉ ๊ธฐ์ ์ ๊ณต์ ์ ๋ถ์ํ์๋ค.",
"์ด ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.",
])
print(greedy_translate_context(model, tok, doc, device, target_lang="en"))
# ๋จ์ผ ๋ฌธ์ฅ ๋ชจ๋ (sentence-base/best.pt ๋ ์๋ฐฉํฅ: target_lang="ko"๋ ๊ฐ๋ฅ)
print(greedy_translate(model, tok, "ํ ๋ช
์ ํ์๊ฐ ๋ถ๋ถ ๋ฐ์์ ๋ณด์๋ค", device, target_lang="en"))
ํ์ต ๋ฐ์ดํฐยท๊ณผ์
- ๋ฌธ์ฅ ์ฌ์ ํ์ต: OPUS moses(NLLB, CCMatrix, OpenSubtitles, ParaCrawl) ์ ์ ยท์ ์ญ ์ค๋ณต์ ๊ฑฐ 16.99M์, ์๋ฐฉํฅ(koโen), max_len 128.
- ๋ฌธ๋งฅ ํ์ธํ๋: ๋ฌธ์ ๊ฒฝ๊ณ๋ฅผ ๋ณด์กดํ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ก ์ฐ์ ๋ฌธ์ฅ์
<eos>๊ตฌ๋ถ์๋ก ๊ฒฐํฉ (vocab ๋ฌด๋ณ๊ฒฝ), AI Hub '๊ธฐ์ ๊ณผํ' ํ์ ๋ ผ๋ฌธ 60,483ํธ โ 179,136 ๋ฌธ๋งฅ ์๋์ฐ, koโen ๋จ๋ฐฉํฅ, max_len 640. RTX 4090 24GB ํ ์ฅ์ผ๋ก ํ์ต.
์ ์ฑ ์ํ (doc-paper):
| ํ๊ตญ์ด | ๋ชจ๋ธ ์ถ๋ ฅ |
|---|---|
| ํ ๋ช ์ ํ์๊ฐ ๋ถ๋ถ ๋ฐ์์ ๋ณด์๋ค | one patient showed a partial response |
| ์ด ํํ ์ฌํ์ฉ ๊ธฐ์ ์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค | The process of this chemical recycling technology is as follows |
| ๊พธ์คํ ๊ตฌ๊ฐ ๊ฑด๊ฐ ๊ด๋ฆฌ ์ต๊ด ํ์ฑ์ด ์ค์ํ๋ค | It is important to form a steady oral health management habit |
์ minRNN์ธ๊ฐ
268M ๋์ผ ๋ชจ๋ธ ํฌ๊ธฐ์์ ๋์ฝ๋ forward๋ฅผ ๊ธธ์ด๋ณ๋ก ์ธก์ ํ๋ฉด(batch 1), ๊ธด ์ํ์ค์ผ์๋ก ํธ๋์คํฌ๋จธ(O(Lยฒ)) ๋๋น ๊ฒฉ์ฐจ๊ฐ ๋ฒ์ด์ง๋๋ค:
| L | Transformer | minRNN |
|---|---|---|
| 128 | 1054 MB / 2.7 ms | 1038 MB / 2.4 ms |
| 1024 | 1212 MB / 12.1 ms | 1083 MB / 9.5 ms |
| 4096 | 3288 MB / 114 ms | 1239 MB / 39 ms (๋ฉ๋ชจ๋ฆฌ 2.65ร, ์๋ 2.9ร) |
ํ๊ณ
- ๋ฌธ์๋ชจ๋ BLEU๋ ์งง์ ๋ฌธ์ ํ๋ณธ(20๊ฐ) ๊ธฐ์ค ์ฐธ๊ณ ์น์ ๋๋ค(๊ธด ๋ฌธ์ ์ ์ ํ๊ฐ ๋ฏธ์คํ).
doc-paper๋ ๋ ผ๋ฌธ/๊ธฐ์ ๋ฌธ์ด์ฒด์ ํนํ โ ๊ตฌ์ดยท์ผ์ ๋๋ฉ์ธ์sentence-base์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค.- greedy ๋์ฝ๋ฉ๋ง ๊ตฌํ๋์ด ์์ต๋๋ค(beam search ์์).
ํ์ต ๋ฐ์ดํฐ ์ถ์ฒ (Attribution)
- ๋ณธ ๋ชจ๋ธ์ AIํ๋ธ(aihub.or.kr)์ ใํ๊ตญ์ด-์์ด ๋ฒ์ญ ๋ง๋ญ์น(๊ธฐ์ ๊ณผํ)ใ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ์ฌ ํ์ต๋์์ต๋๋ค. ํด๋น AI๋ฐ์ดํฐ๋ ํ๊ตญ์ง๋ฅ์ ๋ณด์ฌํ์งํฅ์(NIA)์ ์ฌ์ ๊ฒฐ๊ณผ์ด๋ฉฐ, ์ด ๋ชจ๋ธ(2์ฐจ์ ์ ์๋ฌผ)์๋ ๋์ผํ๊ฒ ์ด๋ฅผ ๋ฐํ๋๋ค. AIํ๋ธ ๋ฐ์ดํฐ ์ด์ฉ์ ์ฑ ์ ๋ฐ๋ผ ์ ๋ฐ์ดํฐ๋ ์ฌ๋ฐฐํฌํ์ง ์์ผ๋ฉฐ, ์ด ์ ์ฅ์๋ ํ์ต๋ ๊ฐ์ค์น๋ง ๋ฐฐํฌํฉ๋๋ค.
- OPUS ๊ณต๊ฐ ๋ณ๋ ฌ ์ฝํผ์ค: NLLB, CCMatrix, OpenSubtitles, ParaCrawl โ ๊ฐ ์ฝํผ์ค์ ์ ๋ผ์ด์ ์ค๋ฅผ ๋ฐ๋ฆ ๋๋ค.