Search
✳️

Llama3 - Tokenizer

Category
BlogPost
Venue
ARXIV
Backbone
LLAMA3
Text
PPT
Writer: Joonwon Jang

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의 교체

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 = 9 tokens44 bytes0.2045\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 = 7 tokens44 bytes0.1591\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이라고 하는데요, 조만간 혹은 해당 글의 연장선으로 찾아뵙도록 하겠습니다.  Grouped Query Attention (Llama3)

References