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' 두 단어로 인코딩함
💡 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
'KDT > 과제' 카테고리의 다른 글
[파이썬, Python] 알고리즘 - 1️⃣ 재귀호출(recursive call) (0) | 2023.06.29 |
---|---|
[파이썬, Python] 서브워드분리(subword segmentation) - WordPiece Tokenizer (0) | 2023.06.29 |
[파이썬, Python] 파일 입출력 - 영어 단어장을 만들어보자! 📖 (0) | 2023.03.15 |
[파이썬, Python] 주민등록번호 유효성 검사하기 ✅ (0) | 2023.03.10 |
[파이썬, Python] 랜덤한 로또 번호를 뽑아보자🍀 (0) | 2023.03.10 |