Llama3 Tokenizer
논문 정보
- Date: 2024-07-02
- Reviewer: 준원 장
- Property: Tokenizer
Llama3의 개선사항
-
Llama3은 전작인 Llama2에 비해서 (1) 학습 데이터 증가 (2) 컨텍스트 길이 증가 (3) tokenizer 교체 (4) GQA등을 적용해서 성능을 향상시켰다고 알려져 있습니다.
-
이 글에서는 (3)에 대해서 보다 깊게 다뤄보고자 합니다.
Tokenizer의 역할
- [’FileExistsError:’]라는 string이 있을때 더 많은 token이 있는 Tokenizer는 ‘FileExistsError:’를 하나의 token으로 처리할 수 있는 반면, 적은 token이 있는 Tokenizer는 [’File’, ‘Exists’, ‘Error’, ‘:’]로 나누어서 해당 정보를 언어모델에게 처리시킵니다.
Llama3 Tokenizer의 개선 사항
Tokenizer의 교체
-
Llama3부터는 BPE(Byte Pair Encoding)기반의 https://github.com/openai/tiktoken?tab=readme-ov-file 라이브러리로 교체를 했다고 합니다. (효율성과 확장성 때문이지 않을까라고 사료됩니다)
-
ti-tokn 라이브러리는 token당 4 bytes의 압축률을 보인다고 합니다.
-
SentencePiece Tokenizer는 일본어,중국어와 같이 whitespace로 구분이 안되는 기존 언어들이 BPE(Byte Pair Encoding)나 Word Piece Tokenization 로 효과적으로 Tokenizing되지 않는 문제를 해결하기 위해 고안된 알고리즘입니다.
-
language-agnostic하게 정보의 손실이 없는 tokenizer를 만들어주기 위해 whitespace에 를 추가해줌으로써 알아서 전체 문장 내에 ‘’가 공백이라는 정보를 학습시켜줍니다.
-
‘_’는
detok = ’’.join(tokens).replace(’_’, ’ ’)
를 통해 디코딩 과정중에 제거시켜줍니다. -
Sentencepiece는 하나의 프레임워크이기에 BPE, WordPiece Tokenization도 지원합니다.
- (e.g., 엄마가방에있다 → 엄머가 방에 있다.)
-
-
다른 Tokenization 알고리즘은 어떻게 동작할까요?
-
BPE(Byte Pair Encoding)
-
this is the hugging face course. this chapter is about tokenization. this section shows several tokenizer algorithms.
과 같은 text가 있다고 할때, 대부분의 상용 tokenizer들은 **whitespace를 기준으로 pre-tokenizing **과정을 거칩니다.['this', 'is', 'the', 'hugging', 'face', 'course.', 'this', 'chapter', 'is', 'about', 'tokenization.', 'this', 'section', 'shows', 'several', 'tokenizer', 'algorithms.']
-
그럼 아래와 같은 frequency Corpus를 얻게되고, corpus내에 있는 unique한 vocab을 byte(character) 단위로 나누어서 unique한 Splits을 만듭니다.
-
UTF-8
-
영어 알파벳과 숫자: 1byte
-
유럽 언어의 일부 문자: 2byte
-
한글, 한자, 일본어 등 대부분의 비라틴 문자: 3byte
-
-
-
Pairs frequencies 기준으로 Vocab쌍에 원하는 Vocab쌍에 추가해나가는 방식입니다.
-
-

…. On Going ….

-
Word Piece Tokenization
-
BPE랑 거의 유사하지만, Splits가 만들어지는 방식과 Pairs frequencies가 상이합니다.
-
특히 Pairs frequencies의 경우 각 Splits의 frequencies과 Pairs의 frequencies를 통해 likelihood를 통해 score를 계산한 후 vocab을 추가합니다.
-

Token수의 확장 및 이를 통한 효용
-
Tokenizer를 변경해 32K개의 토큰에서 128K개의 토큰으로 Vocab Size를 확장했습니다.
- 내부적으로 128K까지 확장했을때 다양한 task에서 성능 향상을 관찰했다고 합니다.
-
Compression Ratio = Number of Tokens/(Number of characters to encode & Number of bytes)
-
A 토크나이저 (30K vocab):
-
“The quick brown fox jumps over the lazy dog.” → [“The”, “quick”, “brown”, “fox”, “jumps”, “over”, “the”, “lazy”, “dog”]
-
토큰 수: 9 tokens
-
Compression Ratio = \frac{9 \ tokens}{44 \ bytes} ≈0.2045
-
-
B 토크나이저 (100K vocab):
-
더 큰 vocabulary를 사용하여 단어들을 더 큰 단위로 처리할 수 있습니다.
-
“The quick brown fox jumps over the lazy dog.” → [“The”, “quick”, “brown”, “fox jumps”, “over”, “the lazy”, “dog”]
-
토큰 수: 7 tokens (더 큰 단위로 토큰화됨)
-
Compression Ratio = \frac{7 \ tokens}{44 \ bytes} ≈0.1591
-
-

-
그렇다면 Vocab Size 확장은 왜 중요할까요?
-
하나의 문장을 표현하는 Token 수가 압도적으로 줄어듭니다. (향상된 압축 비율)
- Research Scientist에 따르면, 영어문장 기준으로 보수적으로 잡을 때 Llama2 대비 15%이상 적은 token으로 같은 문장을 생성할 수 있다고 합니다. (다른 언어는 50% 이상 높은 압축 비율을 보이기 한다고 언급합니다.)
-
Pre-Training시에도 더 높은 Token 수는 도움이 됩니다.
-
Pre-Training의 목적은 Knowledge에 대한 Recall을 높히는 것입니다. 이런 관점에서 생각해볼 때, 같은 광범위한 데이터셋이라도 더 향상된 압축 비율(여러 token들로 굳이 나눠서 표현할 수 있는 것 대비 필요한 token들로만 나누어서)로 학습하는게 도움이 된다고 합니다.
-
영상에 직접적으로 언급은 없지만, vocab이 많기 때문에 다양한 corpus에 빠르게 fitting되는 경향이 있어 loss가 상대적으로 빠르게 수렴된다는 연구 및 실험 reporting도 많이 접했습니다.
-
-
당연한 이야기지만, 기술 용어와 고유 명사와 같은 특정 도메인 언어를 처리하는데 sub-word도 분리하는거보다 도움이 된다고 합니다.
-
Input과 Ouput에 적은 Token이 사용된다는 말은 Inference시에도 적은 cost를 가지고 generate() 용이하게 해 모델을 실제 환경에 배포하는 데 더 실용적이고 효율적으로 만듭니다.
-
Token수의 확장은 Not Free Lunch
-
이미 눈치채셨겠지만, Vocab Size를 4배 가량 확장했다는 의미는 Embedding Layer, lm_head(Research Scientist는 Debedding Layer라구하더라구요!ㅋㅋ)도 그만큼 확장해야 한다는 의미입니다.
-
실제로 이 이유가 Llama3가 7B가 아니라 8B로 끝난 이유라고 합니다..!
-
특히나 lm_head가 증가하면 inference 속도에 직접적인 영향을 주기 때문에 GQA를 줘서 완화를 했다고 합니다.
-
GQA는 MHA와 MQA 사이의 sweet spot이라고 하는데요, 조만간 다른글 혹은 해당 글의 연장선으로 찾아뵙도록 하겠습니다.
References
https://www.youtube.com/watch?v=qpv6ms_t_1A
https://github.com/openai/tiktoken?tab=readme-ov-file
https://discuss.pytorch.kr/t/llama-3-tokenizer-youtube/4899
https://www.youtube.com/watch?v=Tmdk_H2WDj4&utm_source=pytorchkr&ref=pytorchkr
https://medium.com/codex/sentencepiece-a-simple-and-language-independent-subword-tokenizer-and-detokenizer-for-neural-text-ffda431e704e