ํ ํฌ๋์ด์ [[tokenizer]]
ํ ํฌ๋์ด์ ๋ ๋ชจ๋ธ์ ์ ๋ ฅ์ ์ค๋นํ๋ ์ญํ ์ ๋ด๋นํฉ๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ๋ชจ๋ ๋ชจ๋ธ์ ์ํ ํ ํฌ๋์ด์ ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๋๋ถ๋ถ์ ํ ํฌ๋์ด์ ๋ ๋ ๊ฐ์ง ๋ฒ์ ์ผ๋ก ์ ๊ณต๋ฉ๋๋ค. ์์ ํ ํ์ด์ฌ ๊ตฌํ๊ณผ Rust ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๐ค Tokenizers์ ๊ธฐ๋ฐํ "Fast" ๊ตฌํ์ ๋๋ค. "Fast" ๊ตฌํ์ ๋ค์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค:
- ํนํ ๋ฐฐ์น ํ ํฐํ๋ฅผ ์ํํ ๋ ์๋๊ฐ ํฌ๊ฒ ํฅ์๋ฉ๋๋ค.
- ์๋ณธ ๋ฌธ์์ด(๋ฌธ์ ๋ฐ ๋จ์ด)๊ณผ ํ ํฐ ๊ณต๊ฐ ์ฌ์ด๋ฅผ ๋งคํํ๋ ์ถ๊ฐ์ ์ธ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค. (์: ํน์ ๋ฌธ์๋ฅผ ํฌํจํ๋ ํ ํฐ์ ์ธ๋ฑ์ค๋ฅผ ์ป๊ฑฐ๋, ํน์ ํ ํฐ์ ํด๋นํ๋ ๋ฌธ์ ๋ฒ์๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฑ).
๊ธฐ๋ณธ ํด๋์ค์ธ [PreTrainedTokenizer]์ [PreTrainedTokenizerFast]๋ ๋ฌธ์์ด ์
๋ ฅ์ ์ธ์ฝ๋ฉํ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ฉฐ(์๋ ์ฐธ์กฐ), ๋ก์ปฌ ํ์ผ์ด๋ ๋๋ ํ ๋ฆฌ, ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ ์ฌ์ ํ๋ จ๋ ํ ํฌ๋์ด์ (HuggingFace์ AWS S3 ์ ์ฅ์์์ ๋ค์ด๋ก๋๋)๋ก๋ถํฐ ํ์ด์ฌ ๋ฐ "Fast" ํ ํฌ๋์ด์ ๋ฅผ ์ธ์คํด์คํํ๊ฑฐ๋ ์ ์ฅํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด ๋ ํด๋์ค๋ ๊ณตํต ๋ฉ์๋๋ฅผ ํฌํจํ๋ [~tokenization_utils_base.PreTrainedTokenizerBase]์ ์์กดํฉ๋๋ค.
[PreTrainedTokenizer]์ [PreTrainedTokenizerFast]๋ ๋ชจ๋ ํ ํฌ๋์ด์ ์์ ์ฌ์ฉ๋๋ ์ฃผ์ ๋ฉ์๋๋ค์ ๊ตฌํํฉ๋๋ค:
- ํ ํฐํ(๋ฌธ์์ด์ ํ์ ๋จ์ด ํ ํฐ ๋ฌธ์์ด๋ก ๋ถํ ), ํ ํฐ ๋ฌธ์์ด์ ID๋ก ๋ณํ ๋ฐ ๊ทธ ๋ฐ๋ ๊ณผ์ , ๊ทธ๋ฆฌ๊ณ ์ธ์ฝ๋ฉ/๋์ฝ๋ฉ(์ฆ, ํ ํฐํ ๋ฐ ์ ์๋ก ๋ณํ)์ ์ํํฉ๋๋ค.
- ๊ตฌ์กฐ(BPE, SentencePiece ๋ฑ)์ ๊ตฌ์ ๋ฐ์ง ์๊ณ ์ดํ์ ์๋ก์ด ํ ํฐ์ ์ถ๊ฐํฉ๋๋ค.
- ํน์ ํ ํฐ(๋ง์คํฌ, ๋ฌธ์ฅ ์์ ๋ฑ) ๊ด๋ฆฌ: ํ ํฐ์ ์ถ๊ฐํ๊ณ , ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ํ ํฌ๋์ด์ ์ ์์ฑ์ ํ ๋นํ๋ฉฐ, ํ ํฐํ ๊ณผ์ ์์ ๋ถ๋ฆฌ๋์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
[BatchEncoding]์ [~tokenization_utils_base.PreTrainedTokenizerBase]์ ์ธ์ฝ๋ฉ ๋ฉ์๋(__call__, encode_plus, batch_encode_plus)์ ์ถ๋ ฅ์ ๋ด๊ณ ์์ผ๋ฉฐ, ํ์ด์ฌ ๋์
๋๋ฆฌ๋ฅผ ์์๋ฐ์ต๋๋ค. ํ ํฌ๋์ด์ ๊ฐ ์์ ํ์ด์ฌ ํ ํฌ๋์ด์ ์ธ ๊ฒฝ์ฐ ์ด ํด๋์ค๋ ํ์ค ํ์ด์ฌ ๋์
๋๋ฆฌ์ฒ๋ผ ๋์ํ๋ฉฐ, ์ด๋ฌํ ๋ฉ์๋๋ค๋ก ๊ณ์ฐ๋ ๋ค์ํ ๋ชจ๋ธ ์
๋ ฅ(input_ids, attention_mask ๋ฑ)์ ๊ฐ์ต๋๋ค. ํ ํฌ๋์ด์ ๊ฐ "Fast" ํ ํฌ๋์ด์ ์ผ ๊ฒฝ์ฐ(์ฆ, HuggingFace tokenizers ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ฐ์ผ ๊ฒฝ์ฐ), ์ด ํด๋์ค๋ ์ถ๊ฐ์ ์ผ๋ก ์๋ณธ ๋ฌธ์์ด(๋ฌธ์ ๋ฐ ๋จ์ด)๊ณผ ํ ํฐ ๊ณต๊ฐ ์ฌ์ด๋ฅผ ๋งคํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ฌ๋ฌ ๊ณ ๊ธ ์ ๋ ฌ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค (์: ํน์ ๋ฌธ์๋ฅผ ํฌํจํ๋ ํ ํฐ์ ์ธ๋ฑ์ค๋ฅผ ์ป๊ฑฐ๋, ํน์ ํ ํฐ์ ํด๋นํ๋ ๋ฌธ์ ๋ฒ์๋ฅผ ์ป๋ ๋ฑ).
๋ฉํฐ๋ชจ๋ฌ ํ ํฌ๋์ด์ [[multimodal-tokenizer]]
๊ทธ ์ธ์๋ ๊ฐ ํ ํฌ๋์ด์ ๋ "๋ฉํฐ๋ชจ๋ฌ" ํ ํฌ๋์ด์ ๊ฐ ๋ ์ ์์ผ๋ฉฐ, ์ด๋ ํ ํฌ๋์ด์ ๊ฐ ๋ชจ๋ ๊ด๋ จ ํน์ ํ ํฐ์ ํ ํฌ๋์ด์ ์์ฑ์ ์ผ๋ถ๋ก ์ ์ฅํ์ฌ ๋ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, LLaVA์ ๊ฐ์ ๋น์ -์ธ์ด ๋ชจ๋ธ์์ ํ ํฌ๋์ด์ ๋ฅผ ๊ฐ์ ธ์ค๋ฉด, tokenizer.image_token_id์ ์ ๊ทผํ์ฌ ํ๋ ์ด์คํ๋๋ก ์ฌ์ฉ๋๋ ํน์ ์ด๋ฏธ์ง ํ ํฐ์ ์ป์ ์ ์์ต๋๋ค.
๋ชจ๋ ์ ํ์ ํ ํฌ๋์ด์ ์ ์ถ๊ฐ ํน์ ํ ํฐ์ ํ์ฑํํ๋ ค๋ฉด, ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๊ณ ํ ํฌ๋์ด์ ๋ฅผ ์ ์ฅํด์ผ ํฉ๋๋ค. ์ถ๊ฐ ํน์ ํ ํฐ์ ๋ฐ๋์ ํน์ ๋ชจ๋ฌ๋ฆฌํฐ์ ๊ด๋ จ๋ ํ์๋ ์์ผ๋ฉฐ, ๋ชจ๋ธ์ด ์์ฃผ ์ ๊ทผํด์ผ ํ๋ ์ด๋ค ๊ฒ์ด๋ ๋ ์ ์์ต๋๋ค. ์๋ ์ฝ๋์์ output_dir์ ์ ์ฅ๋ ํ ํฌ๋์ด์ ๋ ์ธ ๊ฐ์ ์ถ๊ฐ ํน์ ํ ํฐ์ ์ง์ ์ ๊ทผํ ์ ์๊ฒ ๋ฉ๋๋ค.
vision_tokenizer = AutoTokenizer.from_pretrained(
"llava-hf/llava-1.5-7b-hf",
extra_special_tokens={"image_token": "<image>", "boi_token": "<image_start>", "eoi_token": "<image_end>"}
)
print(vision_tokenizer.image_token, vision_tokenizer.image_token_id)
("<image>", 32000)
PreTrainedTokenizer[[transformers.PreTrainedTokenizer]]
[[autodoc]] PreTrainedTokenizer - call - add_tokens - add_special_tokens - apply_chat_template - batch_decode - decode - encode - push_to_hub - all
PreTrainedTokenizerFast[[transformers.PreTrainedTokenizerFast]]
[PreTrainedTokenizerFast]๋ tokenizers ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กดํฉ๋๋ค. ๐ค tokenizers ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ป์ ํ ํฌ๋์ด์ ๋
๐ค transformers๋ก ๋งค์ฐ ๊ฐ๋จํ๊ฒ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์ด๋ป๊ฒ ํ๋์ง ์์๋ณด๋ ค๋ฉด Using tokenizers from ๐ค tokenizers ํ์ด์ง๋ฅผ ์ฐธ๊ณ ํ์ธ์.
[[autodoc]] PreTrainedTokenizerFast - call - add_tokens - add_special_tokens - apply_chat_template - batch_decode - decode - encode - push_to_hub - all
BatchEncoding[[transformers.BatchEncoding]]
[[autodoc]] BatchEncoding