Word, Character, Subword 토큰화와 BPE
텍스트를 어떤 단위로 쪼갤지에 따라 Word / Character / Subword level 토큰화가 나뉜다. 각각의 장단점과, Subword 방법의 대표적인 BPE의 동작 원리를 정리해봤다.
Word-level 토큰화#
Token을 단어(Word) 단위로 구분하는 방식이다. 일반적으로 단어는 띄어쓰기를 기준으로 나눈다.
- 입력:
The devil is in the details - 출력:
['The', 'devil', 'is', 'in', 'the', 'details']
한국어에서는 띄어쓰기만으로 부족해서 형태소를 기준으로도 단어를 나눈다. 형태소는 의미를 가진 가장 작은 말의 단위다.
- 입력:
나는 밥을 먹었다 - 출력:
['나', '는', ' ', '밥', '을', ' ', '먹', '었다']
단점은 사전에 없는 단어가 등장하면 모두 Unknown 토큰으로 처리된다는 것이다. 이걸 Out-of-vocabulary(OOV) 문제라고 부른다.
Character-level 토큰화#
Token을 철자(Character) 단위로 구분하는 방식이다.
- 입력:
The devil is in the details - 출력:
['T', 'h', 'e', ' ', 'd', 'e', 'v', 'i', 'l', ...]
장점은 두 가지다. 다른 언어라도 같은 철자를 사용하는 경우(가령 영어와 스페인어)에는 같은 Token으로 처리가 가능하다. 그리고 단어 단위 토큰화의 단점이던 OOV 문제가 해결된다. 모든 단어는 결국 철자의 조합이므로 사전에 없는 단어가 없다.
단점은 주어진 텍스트에 대한 Token의 개수가 지나치게 많아지고, 철자 단위 모델들의 성능이 낮다는 것이다. character 단독으로는 유의미한 정보를 가진다고 보기 어렵다. character의 순서에 따른 조합을 봤을 때에야 비로소 의미를 가진다고 볼 수 있다.
Subword-level 토큰화#
Word-level과 Character-level의 절충안이다. 단어보다 작고 철자보다 큰 Subword 단위로 쪼갠다. 문제는 어떻게 사전을 구축할 것인가인데, 대표적인 방법론이 BPE다.
BPE(Byte Pair Encoding)#
BPE는 Subword-level 토큰화의 대표적인 예시다. Pair는 연속된 두 철자를 의미한다. 영어 한 글자는 1 byte이므로 Byte Pair라고 지은 것 같다(원래는 바이트 단위 데이터 압축에서 가장 빈번한 쌍을 새 토큰으로 치환하던 아이디어를 문자 단위로 가져온 것이다).
사전 구축은 두 단계를 반복한다.
- 철자 단위의 단어 목록을 만든다.
- 가장 빈도수가 높은 단어 Pair를 Token으로 추가한다(병합한다).
사전의 최대 크기에 도달할 때까지 2번을 반복한다.
사전 구축 예시#
학습 데이터의 단어와 등장 횟수가 다음과 같다고 하자.
| 단어 | 횟수 |
|---|---|
| low | 5 |
| lower | 2 |
| newest | 6 |
| widest | 3 |
| lost | 1 |
철자 단위로 시작한 초기 사전은 [l, o, w, e, r, n, s, t, i, d]이다(10/14, 14가 사전 최대 크기). 이제 각 Pair의 등장 횟수를 세서 가장 많은 것부터 병합한다.
s, t가 10회로 가장 많다 →st추가 (11/14)e, st가 9회로 가장 많다 →est추가 (12/14)l, o가 8회로 가장 많다 →lo추가 (13/14)lo, w가 7회로 가장 많다 →low추가 (14/14)
사전 최대 크기에 도달했으므로 단어 추가를 중단한다. 최종 사전은 [l, o, w, e, r, n, s, t, i, d, st, est, lo, low]가 된다.
입력 텍스트의 토큰화#
사전을 구축했으면 새 입력 문자열을 토큰화한다. 가장 긴 문자열이 보다 유의미한 정보를 가진다고 판단되기에, 사전에 정의된 단어들 중 가장 긴 단어의 길이를 기준으로, 입력 문자열에서 가장 긴 문자열부터 왼쪽에서부터 차례로 매칭을 시도한다.
newest를 토큰화하면 이렇게 진행된다.
new→ 사전에서 찾을 수 있는 가장 긴 문자열로 시도: 사전에 없음ne→ 다음으로 긴 문자열: 사전에 없음n→ 최소 길이: 사전에 있음 → 토큰화- 남은
ewest에서e→ 토큰화,w→ 토큰화 est→ 사전에 있음 → 토큰화
결과: ['n', 'e', 'w', 'est']
정리#
- Word-level은 띄어쓰기/형태소 기준이고 OOV 문제가 있다. Character-level은 OOV가 없고 언어 간 철자 공유가 되지만 토큰 수가 많고 성능이 낮다.
- Subword-level은 둘의 절충안이고, BPE가 대표적이다.
- BPE 사전 구축은 가장 빈번한 Pair를 반복해서 병합하는 것이고, 토큰화는 사전에서 가장 긴 문자열부터 왼쪽에서 차례로 매칭한다.
댓글