본문 바로가기
KDT/과제

[파이썬, Python] 서브워드분리(subword segmentation) - BPE 알고리즘

by coding-choonsik 2023. 6. 27.
728x90
반응형
SMALL

1. 서브워드 분리(Subword segmenation) 작업

  • 하나의 단어를 여러 서브워드로 분리해서 단어를 인코딩 및 임베딩하겠다는 의도를 가진 전처리 작업
  • OOV나 희귀 단어, 신조어와 같은 문제를 완화
  • 서브워드 분리 알고리즘인 BPE(Byte Pair Encoding) 알고리즘

 

 

2. BPE 인코딩(Byte Pair Encoding)

  • 2016년 Neural Machine Translation of Rare Words with Subword Units 논문에서 제안
  • 코퍼스 내 단어의 등장 빈도에 따라 서브워드를 구축하는데 사용
  • 글자(charcter) 단위에서 점차적으로 단어 집합(vocabulary)을 만들어 내는 Bottom up 방식의 접근을 사용
  • 기계는 모르는 단어가 등장하면 그 단어를 단어 집합에 없는 단어란 의미에서 해당 토큰을 UNK(Unknown Token)라고 표현
  • 모르는 단어로 인해 문제를 푸는 것이 까다로워지는 상황을 OOV(Out-Of-Vocabulary) 문제라고 함
  • BPE은 기본적으로 연속적으로 가장 많이 등장한 글자의 쌍을 찾아서 하나의 글자로 병합하는 방식을 수행

[허깅페이스 페이지](https://huggingface.co/learn/nlp-course/chapter6/5?fw=pt)

 

Byte-Pair Encoding tokenization - Hugging Face NLP Course

Byte-Pair Encoding (BPE) was initially developed as an algorithm to compress texts, and then used by OpenAI for tokenization when pretraining the GPT model. It’s used by a lot of Transformer models, including GPT, GPT-2, RoBERTa, BART, and DeBERTa. 💡

huggingface.co


aaabdaaabac

 

✅ 위의 문자열 중 가장 자주 등장하고 있는 바이트의 쌍(byte pair)은 'aa'  'aa'라는 바이트의 쌍을 하나의 바이트인 'Z'로 치환

ZabdZabac
Z=aa

가장 많이 등장하고 있는 바이트의 쌍은 'ab' ➡ 'ab' 'Y'로 치환

ZYdZYac
Y=ab
Z=aa

 

 

가장 많이 등장하고 있는 바이트의 쌍은 'ZY'이를 'X'로 치환

XdXac
X=ZY
Y=ab
Z=aa

더 이상 병합할 바이트의 쌍은 없으므로 BPE는 위의 결과를 최종 결과로 하여 종료


2-1. 예시 

  • 어떤 훈련 데이터로부터 각 단어들의 빈도수를 카운트
  • 각 단어와 각 단어의 빈도수가 기록되어져 있는 해당 결과는 임의로 딕셔너리(dictionary) 라고 칭함
# dictionary
# 훈련 데이터에 있는 단어와 등장 빈도수
low : 5, lower : 2, newest : 6, widest : 3

📍 이 훈련 데이터에는 'low'란 단어가 5회 등장하였고, 'lower'란 단어는 2회 등장하였으며, 'newest'란 단어는 6회, 'widest'란 단어는 3회 등장하였다는 의미

 

# vocabulary
low, lower, newest, widest

📍 단어 집합(vocabulary)은 중복을 배제한 단어들의 집합을 의미하므로 기존에 배운 단어 집합의 정의라면, 이 훈련 데이터의 단어 집합에는 'low', 'lower', 'newest', 'widest'라는 4개의 단어가 존재.  그리고 이 경우 테스트 과정에서 'lowest'란 단어가 등장한다면 기계는 이 단어를 학습한 적이 없으므로 해당 단어에 대해서 제대로 대응하지 못하는 OOV 문제가 발생

 

 

✅ BPE 알고리즘을 사용하여 OOV 문제를 해결하기!

 

1️⃣ 우선 딕셔너리의 모든 단어들을 글자(chracter) 단위로 분리

# dictionary
l o w : 5,  l o w e r : 2,  n e w e s t : 6,  w i d e s t : 3

2️⃣ 초기 구성은 글자 단위로 분리된 상태

# vocabulary
l, o, w, e, r, n, s, t, i, d

📍 BPE의 특징은 알고리즘의 동작을 몇 회 반복할 것인지를 사용자가 정함!

 

이 예시에서는 10회 반복을 한다고 가정.

가장 빈도수가 높은 유니그램의 쌍을 하나의 유니그램으로 통합하는 과정을 총 10회 반복

 

위 딕셔너리에 따르면 빈도수가 현재 가장 높은 유니그램의 쌍은 (e, s)

 

3️⃣ 1회 - 빈도수가 9로 가장 높은 (e, s)의 쌍을 es로 통합 후 dictionary, vocabularyupdate

# dictionary update!
l o w : 5,
l o w e r : 2,
n e w es t : 6,
w i d es t : 3
# vocabulary update!
l, o, w, e, r, n, s, t, i, d, es

 

4️⃣ 2회 - 빈도수가 9로 가장 높은 (es, t)의 쌍을 est로 통합

# dictionary update!
l o w : 5,
l o w e r : 2,
n e w est : 6,
w i d est : 3
# vocabulary update!
l, o, w, e, r, n, s, t, i, d, es, est

 

5️⃣ 같은 방식으로 10회 반복하였을 때 나오는 dictionary와 vocabulary

# dictionary update!
low : 5,
low e r : 2,
newest : 6,
widest : 3
# vocabulary update!
l, o, w, e, r, n, s, t, i, d, es, est, lo, low, ne, new, newest, wi, wid, widest

6️⃣ 이 경우 테스트 과정에서 'lowest'란 단어가 등장한다면, 기계는 우선 'lowest'를 전부 글자 단위로 분할하여 'l, o, w, e, s, t'가 됨

 

7️⃣  기계는 위의 단어 집합을 참고로 하여 'low'와 'est'를 찾아내어 'lowest'를 기계는 'low'와 'est' 두 단어로 인코딩함

 

▲ 출처: https://wikidocs.net/22592

 

 

💡 WordPiece Tokenizer에 대해 궁금하다면? ⬇⬇⬇

 

[파이썬, Python] 서브워드분리(subword segmentation) - WordPiece Tokenizer

1. WordPiece Tokenizer 구글이 2016년 Google's Neural Machine Translation System Bridging the Gap between Human and Machine Translation논문에 처음 공개한 BPE의 변형 알고리즘 병합할 두 문자가 있을 때, 각각의 문자가 따로

coding-yesung.tistory.com

 

 

728x90
반응형
LIST