subword tokenizing, byte pair encoding 간단하게 알아보기

1. tokenizing

 

긴 text가 들어왔을 때 token단위로 text를 나누는 기술

 

가장 simple하게는 띄어쓰기 단위로 나누는 방법이 있는데 요즘에는 비효율적이라는 인식이 많다

 

띄어쓰기에서 더 나아가 형태소나 subword 형태로 tokenizing하는 경우가 많아

 

 

2. subword tokenizing

 

자주 쓰이는 글자 조합은 한단어로 취급하고 그렇지 않은 조합은 subword로 더욱 쪼갠다

 

 

 

‘아버지 가방에 들어가신다’를 만약 띄어쓰기 기준으로 tokenizing을 하면

 

‘아버지’, ‘가방에’, ‘들어가신다’인데 단어가 너무 커져 단어끼리 비교가 어렵대

 

그래서 조금 더 잘게 잘라서 하나의 단어를 1번 더 들어가 자르는 subword tokenizing을 함

 

‘아버지’, ‘가’, ‘##방’, ‘##에’, ‘들어’, ‘##가’, ‘##신’, ‘##다’

 

단순히 1글자씩 길이 기반으로 자른 것이 아니라(아버지는 3글자, 들어는 2글자거든) 자주 나오는 단어 조합인지 아닌지로 잘랐다고 하는데

 

여기서 재밌는 점은 ##이 붙은 token은 만약 tokenizing을 한 리스트를 원래 문장으로 복원한다면 바로 이전 token과 붙여쓴다는 의미임

 

예를 들어 ‘가’, ‘##방’은 가와 방이 한단어였는데 2개 혹은 그 이상으로 나뉘어졌다는 의미

 

##을 써서 원래 문장으로 recover하기 쉽게 만들었다

 

subword tokenizing은 원래 BERT에서 제안되었음

 

model에 해당하는 특별한 tokenizer가 존재하고 해당 model을 학습할 때 쓴 tokenizer 방법을 똑같이 써야 성능을 발휘할 수 있어

 

tokenizer 방법론도 model의 일부라고 보아야함

 

위의 코드에서 ‘bert-base-multilingual-cased’라는 pretrain model에서 사용한 berttokenizer를 불러온다는 것

 

 

3. byte pair encoding

 

subword tokenizing은 근본적으로 byte pair encoding에 기반을 두고 있다

 

단어를 나누는 방식이 data쪽으로 간게 byte pair encoding임

 

데이터를 압축하는 방식을 제안한 알고리즘

 

자주 나오는 bigram 단위의 data를 하나의 data로 치환함

 

aaabdaaabac라는 sequence에서 aa라는 bigram이 반복해서 나오므로 Z=aa라고 치환함

 

치환하고나서 ZabdZabac에서 ab라는 bigram이 반복해서 나오므로 Y=ab라고 치환함

 

치환하고나서 ZYdZYac를 보면 ZY라는 bigram이 반복해서 나오므로 X=ZY라고 치환함

 

최종적으로 XdXac인데 X라는 token?은 사실 aaab라는 4글자로 이루어진 하나의 단어라고 해야할까

 

마치 위의 subword tokenizing에서 ‘아버지’라는 3글자를 하나로 자른것처럼

 

어떤 경우는 d,a,c처럼 1글자로 자르는데 위의 subword tokenizing의 예시를 보면 ‘가’, ‘##방’,’##에’ 이런식으로 1글자로 자름

 

 

 

 

이전에는 regular expression같은 사람이 직접 고안한 rule을 활용한 tokenizing을 했는데 사람이 rule을 짜야하므로 한계가 있었음

 

그래서 요새는 byte pair의 data driven 방식으로 접근하는 것이 일반적인 방법이다.

 

 

TAGS.

Comments