WordPiece tokenization
- subword tokenizer의 종류 중 하나
- 구글이 BERT를 사전 훈련(pretrain)시키기 위해 개발한 토큰화 알고리즘
- DistilBERT, MobileBERT, Funnel Transformers 및 MPNET과 같은 BERT 기반의 꽤 많은 Transformer 모델에서 재사용됨
- 학습 과정에서는 BPE와 매우 유사하지만 실제 토큰화는 다르게 수행됨
Training algorithm
- BPE와 마찬가지로 WordPiece는 모델에서 사용하는 special token과 초기 알파벳을 포함하는 작은 어휘(vocabulary)에서 시작함
- BERT의 ##과 같은 접두사를 추가하여 하위 단어를 식별하기 때문에 각 단어는 단어 내부의 모든 문자에 해당 접두사를 추가하여 처음 분할됨
'word' 분할 예시
'w', '##o', '##r', '##d'
⭕ 첫 알파벳은 단어의 시작 부분에 있는 모든 문자와 WordPiece 접두사 앞에 있는 단어 안에 있는 문자를 포함함
WordPiece 점수 계산 공식
score = (freq_of_pair) / (freq_of_first_element×freq_of_second_element)
점수 = (짝(쌍)의 빈도수) / (첫 번째 요소의 빈도수×두 번째 요소의 빈도수)
⭕ 해당 알고리즘은 쌍(pair)의 빈도를 그 쌍(pair)을 이루는 각 부분의 빈도의 곱으로 나누어 계산함으로써, 어휘 사전(vocabulary) 내에서 개별 빈도가 덜 빈번하게 나타나는 쌍을 우선적으로 병합하는 것을 목표로 함.
ex) 두 쌍의 "un"과 "##able"은 각각 다른 단어에서 많이 나타나고 빈도가 높기 때문에 어휘 사전(vocabulary)에서 해당 쌍이 매우 자주 발생하더라도 반드시 병합("un", "##able")되지는 않음
반대로 "hu"와 "#gging"은 개별적으로 덜 자주 발생하기 때문에 ("hugging"이라는 단어가 어휘 사전(vocabulary)에 자주 나타난다고 가정하면) 더 빨리 병합될 것임
예제
("hug", 10), ("pug", 5), ("pun", 12), ("bun", 4), ("hugs", 5)
여기서 분할은 다음과 같다
("h" "##u" "##g", 10), ("p" "##u" "##g", 5), ("p" "##u" "##n", 12), ("b" "##u" "##n", 4), ("h" "##u" "##g" "##s", 5)
⭕ 초기 어휘(vocabulary)는 ["b", "h", "p", "##g", "##n", "##s", "##u"](special token이 없다는 가정)
가장 빈도가 높은 쌍(pair)은 ("##u", "##g")이지만, "##u"의 개별 빈도는 매우 높기 때문에 점수가 가장 높지 않음(1/36, 약 0.027).
"##u"를 가진 모든 쌍은 실제로 동일한 점수(1/36, 약 0.027)를 가지고 있기 때문에
최고 점수는 1/20(약 0.05)에서 쌍("#g", "#s")에게 주어지며, 첫 번째 병합 학습은 ("#g", "#s") ->("#gs")이다.
병합할 때 두 토큰 사이의 ##을 제거하므로 어휘(vocabulary)에 "##gs"를 추가하고 copus의 단어로 병합을 적용함
Vocabulary: ["b", "h", "p", "##g", "##n", "##s", "##u", "##gs"]
Corpus: ("h" "##u" "##g", 10), ("p" "##u" "##g", 5), ("p" "##u" "##n", 12), ("b" "##u" "##n", 4), ("h" "##u" "##gs", 5)
⭕ 여기서 "##u"는 가능한 모든 쌍(pair)이므로, 모두 같은 점수를 받는다.
이 경우 첫 번째 쌍이 병합되므로, ("h", "##u") -> "hu"로 병합이 됨
Vocabulary: ["b", "h", "p", "##g", "##n", "##s", "##u", "##gs", "hu"]
Corpus: ("hu" "##g", 10), ("p" "##u" "##g", 5), ("p" "##u" "##n", 12), ("b" "##u" "##n", 4), ("hu" "##gs", 5)
⭕ ("hu", "#g", "hu", "#gs")와 ("hu", "#gs")가 공유하기 때문에 (다른 모든 짝(쌍)의 경우 1/21과 비교하여) 가장 큰 점수를 받은 첫 번째 쌍(pair)이 병합된다:
Vocabulary: ["b", "h", "p", "##g", "##n", "##s", "##u", "##gs", "hu", "hug"]
Corpus: ("hug", 10), ("p" "##u" "##g", 5), ("p" "##u" "##n", 12), ("b" "##u" "##n", 4), ("hu" "##gs", 5)
⭕ 이러한 과정을 거치고 원하는 vocabulary size에 도달할때 까지 작업을 반복하게 됨
Tokenization algorithm
- WordPiece는 학습된 병합 규칙이 아니라 최종 어휘(vocabulary)만 저장한다는 점에서 WordPiece와 BPE의 토큰화는 다름
- WordPiece는 토큰화할 단어로부터 시작하여 어휘 사전(vocabulary)에서 가장 긴 서브 워드(subword)를 찾은 후 그 위치에서 분할함
ex) 위의 예에서 배운 어휘(vocabulary)를 사용하면, 단어 "hugs"가 단어의 처음부터 시작하는 가장 긴 서브워드(subword)는 "hug"이므로, 거기서 나누어 [hug,"#s"]를 얻고, 어휘 사전(vocabulary)에 있는 "##s"를 계속 사용하므로 "hug"의 토큰화는 ["hug", "##s"]
⭕ BPE를 사용하면 학습된 병합을 순서대로 적용하고 이를 ["hu", "#gs"]로 토큰화했을 것이므로 인코딩이 다름!
"bugs"의 토큰화
- "b"는 어휘 사전(vocabulary)에 있는 단어의 시작 부분에서 시작하는 가장 긴 서브 워드(subword)이므로, 거기서 나누어서 ["b", "#ugs"]를 얻음
- "##u"는 어휘 사전(vocabulary)에 있는 "##ugs"의 시작 부분에서 시작하는 가장 긴 하위 단어이기 때문에, 거기서 나누어 ["b", "##u, "#gs"]를 얻음
- "##gs"는 어휘(vocabulary)에 있으므로, 마지막 요소는 "bugs"의 토큰화
토큰화 과정에서 어휘 사전(vocabulary)에서 서브 워드(subword)를 찾을 수 없는 단계에 도달하면 해당 단어는 'unknown'으로 토큰화됨
ex) "mug"와 같은 경우 "bum"과 마찬가지로 토큰화될 때 ["[UNK]"]로 토큰화 될 것임
"bum"의 경우, "b"와 "##u"로 시작할 수 있다고 해도, "##m"은 어휘(vocabulary)가 아니며, 그에 따른 토큰화는 ["b", "##u", "[UNK]"]가 아니라 ["[UNK]"]로 될 것이다
⭕ 이는 BPE와의 또 다른 차이점인데, BPE에서는 어휘 사전(vocabulary)에 없는 개별 문자만을 "unknown"으로 분류함!
참고문헌 https://huggingface.co/learn/nlp-course/chapter6/6?fw=pt
WordPiece tokenization - Hugging Face NLP Course
WordPiece is the tokenization algorithm Google developed to pretrain BERT. It has since been reused in quite a few Transformer models based on BERT, such as DistilBERT, MobileBERT, Funnel Transformers, and MPNET. It’s very similar to BPE in terms of the
huggingface.co
'자연어처리' 카테고리의 다른 글
4. 워드 임베딩(Word Embedding) (0) | 2023.07.04 |
---|---|
3. 임베딩(Embedding) (0) | 2023.06.29 |
2. 데이터 전처리 (0) | 2023.06.28 |