최근의 NLP 논문과 여러 자료들을 읽다보면, Bytepair encoding, Wordpiece, Sentencepiece 등의 여러가지 용어가 나온다. 그리고, Bytepair encoding을 character 단위로 했는지, byte 단위로 했는지도 다르다. 대충 비슷한거 같은 용어들이 어떻게 다른지 정리해보려고 한다.
1. Bytepair encoding
기본적인 원리가 딥 러닝을 이용한 자연어처리 입문 위키독스 에 잘 설명되어 있다.
원래 압축 알고리즘으로 쓰이던 bytepair encoding을 자연어 처리 분야에 적용하여 vocabulary를 만드는 데 쓰였다. 이를 처음 적용한 논문은 sennrich의 번역 논문이다. BPE 알고리즘을 쓴 대표적인 논문이 GPT이다.
GPT 논문에서는 unicode 단위가 아닌 byte 단위 BPE를 사용했다고 한다. RoBERTa 논문에 따르면 그 이유는 유니코드 하나하나를 독립적인 단위로 취급하면 유니코드들이 vocabulary의 상당 부분을 차지하기 때문(unicode characters can account for a sizeable portion of this vocabulary when modeling large and diverse corpora, such as the ones considered in this work.)이라고 한다. 유니코드 캐릭터 중에는 복수의 byte로 이루어진 캐릭터들이 많기 때문에 byte단위로 subword를 구성할 경우 같은 byte sequence를 공유하는 unicode들끼리는 묶일 수가 있다.
스택오버플로 문답 참고
2. Wordpiece model
구글에서 BERT 모델을 학습할 때 쓴 subword 모델이다. BERT에서는 구글이 번역 시스템에서 만들었던 embedding을 가져온 것으로 보인다. 이 시스템에 쓰인 알고리즘인 wordpiece model은 BPE와 거의 비슷하다고 언급되어 있으며, 구글의 음성 인식 연구에서 처음 제안되었다.
Bytepair encoding이 count만을 이용하여 가장 많이 등장하는 character pair를 합쳤다면, wordpiece model은 likelihood를 기준으로 character pair를 합쳐나갔다. 학습 데이터에 대한 likelihood를 최대화하는 character pair를 합쳐나가는 것인데, huggingface tokenizer 에 간단한 예시와 설명이 있다. 옮겨 적어보면, "a"와 "b"를 합치려면 "ab"가 character pair 중 가장 많이 등장하는 것이 아닌, P("ab") / P("a")P("b") 값이 가장 커야 한다 - P("a")는 데이터에서 "a"가 등장하는 빈도이다.
3. Sentencepiece
구글이 만든 tokenizer 라이브러리이다. 가장 큰 특징은 모든 언어를 다 다루기 위해 띄어쓰기까지 하나의 문자로 취급하여 tokenize한다는 것이다. 깃헙을 보면 알 수 있듯이, tokenize하는 여러 방법이 있으며, subword 단위 tokenizer인 BPE, unigram lanugage model과 character 단위, word 단위 tokenizer를 지원한다. 추가적으로 subword regularization도 지원한다. 이름을 보면 햇갈릴 수 있는데, wordpiece 알고리즘을 지원하지는 않는다.
정리 끄읕!