BPE / WPE


BPE (Byte Pair Encoding) ?

BPE(Byte Pair Encoding)는 정보를 압축하는 알고리즘 중 하나로, 자연어 처리모델에서는 토큰화(Tokenization) 기법으로 널리 쓰이고 있습니다. GPT 모델에서도 BPE기법으로 토큰화를 수행하고 있습니다.

기존의 BPE 알고리즘은 1994년에 제안되었으며, 데이터에서 가장 많이 등장한 문자열을 병합해서 하나의 문자로 치환하는 기법입니다. 아래 예시를 봅시다.

- aaabbaaaccaaaddaaaee 

BPE 알고리즘은 데이터에 등장한 글자 (a, b, c, d, e)를 초기 사전으로 구성한 후, 우선 연속된 두 글자를 한 글자로 병합합니다. 위 예시에서는 aa가 가장 많이 등장했으므로 aaA로 치환합니다.

- AabbAaccAaddAaee

추가로, 다른 연속된 두 글자들도(bb, cc, dd, ee) 치환합니다.

- AaBAaCAaDAaE

다음으로, Aa도 자주 나오므로 X로 치환합니다.

- XBXCXDXE

이처럼, BPE를 수행하고 나니 훨씬 간결해진 모습입니다. BPE를 적용하기 전에는 데이터를 표현하기 위한 사전 크기가 5개(a,b,c,d,e)였고, 데이터의 길이는 20개였습니다. BPE를 적용하고 나니 사전의 크기는 4개(X, B, C, E), 데이터의 길이는 8개로 줄었습니다. 위와 같은 과정을 반복하며 원하는 사전 크기가 될 때까지 조정할 수 있습니다.

조금 더 구체적으로는, n-gram 쌍을 이용하여 문자열을 나눈 후 빈도에 따라 압축할 문자의 우선순위를 정해서 처리합니다. 이와 관련한 자세한 내용은 ratsgo님의 NLP book을 참고하시기 바랍니다.

결론적으로는, 어휘 집합(vocab.json)과 병합 우선순위(merge.txt)가 있으면 BPE 토큰화를 수행할 수 있습니다.

WPE(Wordpiece Encoding)

WPE(Wordpiece Encoding) 방법은 BPE 방식과 유사하지만, 문자열을 병합하는 기준이 다릅니다.

WPE는 문자열의 빈도를 기준으로 병합하는것이 아니라, 병합했을때 Corpus(말뭉치)의 우도(Likelihood)를 가장 높이도록 병합합니다. WPE 방식은 Google이 BERT를 사전 학습하기 위해 개발한 토큰화 알고리즘입니다.

병합이 될 문자열 후보 a, b 가 있다고 할때, 말뭉치의 우도는 아래와 같이 계산됩니다.

\[\frac{\frac{\#ab}{n}}{\frac{\#a}{n} \times \frac{\#b}{n}}\]
#ab: 문자열 ab가 나오는 빈도수
#a: 문자열 a가 독립적으로 나오는 빈도수
#b: 문자열 b가 독립적으로 나오는 빈도수
n: 전체 글자 수 

위의 식이 큰 값을 가지려면 (높은 우도를 가지려면) 문자열 a,b가 각각 따로 나오는 경우보다 문자열 ab가 나오는 경우가 훨씬 많아야 합니다. WPE방식에서는 병합 후보에 오른 문자열 쌍들의 likelihood를 계산하여 가장 높은 liklihood값을 가진 문자열쌍을 최종적으로 병합합니다.

참고로, WPE 방식에서는 분석 대상 어절에 어휘 집합 안에 있는 subword가 포함되어있을 경우 해당 subword를 분리합니다. 이를 subword segmentation이라고 합니다 (예, 안녕하세요 = 안녕 + 하세요). Subword 후보 중 장 긴 subword 후보를 우선적으로 분리하며 subword 후보가 없어질때까지 이 작업을 반복합니다. 분석 대상 어절에 더 이상 subword 후보가 없으면 해당 문자열 전체를 미등록 단어로 취급합니다. 이 과정을 통해 보다 효율적인 토큰화를 진행할 수 있습니다.

Reference

ratsgo님의 NLP book

Categories:

Updated:

Comments