일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 연립일차방정식
- 밑바닥부터 시작하는 딥러닝
- NMT
- 선형대수학
- Python
- SVD
- Linear Algebra
- machine translation
- DataFrame
- Transformer
- 밑바닥부터 시작하는 딥러닝2 2장
- 신경망 학습
- pandas
- NLP
- one-hot vector
- 데이터프레임
- 정칙행렬
- RNN
- 판다스
- word2vec
- 벡터간 유사도
- sigmoid
- ReLU
- word embedding
- 역행렬
- PPMI
- 동시발생 행렬
- 딥러닝
- 프로그래머를 위한 선형대수
- 자연어처리
- Today
- Total
생각하는감자
Tokenization 본문
Tokenization이란, text를 더 작은 조각인 token으로 분리하는 과정을 의미한다.
Tokenizers
- Word based Tokenizer
- Character based Tokenizer
- Subword based Tokenizer
*결과적으로 subword based tokenizer을 사용한다.
Word based Tokenizer
말 그대로 "단어"단위로 쪼개는 것을 의미한다.
예를 들어 input으로 ['The deveil is in the details.']라고 들어온다면
output은 ['The', 'devil', 'is', 'in', 'the', 'details', '.']로 출력된다.
이 tokenizer를 사용하게 되면 메모리 문제가 발생하고 vocabulary size가 작으면 모델 성능이 떨어진다는 단점이 있다. 메모리 문제로 인해 vocab size를 무한대로 늘릴 수가 없다. 또한 신조어와 같은 vocab에 들어가 있지 않은 Unknown 단어들을 맥락상 처리하는 것이 불가능하다. Out-Of-Vocabulary (OOV).
Character based Tokenizer
character 는 문자를 뜻한다. 글자 하나하나 토큰화한 것을 의미한다. 위의 input예를 그대로 사용해 보자면,
['T', 'h', 'e', 'd', 'e', 'v', 'i', 'l', 'i', 's', 'i', 'n', 't', 'h', 'e, 'd', 'e', 't', 'a', 'i', 'l', 's', '.']로 출력된다.
character based tokenizer의 경우 vanishing gradient문제가 발생하기 쉽고 성능이 좋지 않다는 문제점이 있다. 대체적으로 input sequence의 길이가 200을 초과하면 성능이 떨어지기 시작한다고 한다.
Subword based Tokenizer
subword라는 것은 word도 아니고 character도 아닌 그 사이 어딘가를 뜻한다.
['The', 'de', 'vil', 'is', 'in', 'the', 'de', 'tail', 's', '.']로 출력되는 형태이다.
해당 tokenizer은 다른 tokenizer들과 다르게 접두사, 접미사, 어미 등을 처리한다고 생각하면 되는데, 다른 tokenizer들 보다 높은 performance를 보여준다. 또한 거의 OOV로부터 자유롭다.
Subword based Algorithms
Byte-pair Encoding(BPE), Word Piece, Unigram, Sentence Piece가 있는데 이중에 BPE를 정리해보고자 한다. 왜냐하면 BPE는 통계적 방법을 사용하는 알고리즘으로, 자연어처리에서 가장 각광받고 있는 모델 중 하나인, GPT에 사용되기 때문이다.
BPE는 가장 흔한 단어들은 vocabulary에 하나의 토큰으로 표현되어 있는 반면, 흔하지 않은 단어들은 2개 혹은 더 많은 subword로 쪼개져서 vocabulary내에 존재한다는 것을 보장한다. 이 알고리즘이 작동하는 방식도 이와 같다. 코드를 통해 보자면 아래와 같다.
import re, collections
def get_stats(vocab):
pairs = collections.defaultdict(int)
for word, freq in vocab.items():
symbols = word.split()
for i in range(len(symbols)-1):
pairs[symbols[i],symbols[i+1]] += freq
return pairs
def merge_vocab(pair, v_in):
v_out = {}
bigram = re.escape(' '.join(pair))
p = re.compile(r'(?<!\S)' + bigram + r'(?!\S)')
for word in v_in:
w_out = p.sub(''.join(pair), word)
v_out[w_out] = v_in[word]
return v_out
vocab = {'l o w </w>' : 5, 'l o w e r </w>' : 2, 'n e w e s t </w>' : 6, 'w i d e s t </w>' : 3}
num_merges = 10
for i in range(num_merges):
pairs = get_stats(vocab)
best = max(pairs, key=pairs.get)
vocab = merge_vocab(best, vocab)
print(best)
get_stats함수는 vocab이 주어졌을 때, character level로 나누는 것을 의미한다. 바깥쪽 for문을 통해 vocab안에 있는 모든 단어들을 반복하면서 symbol을 통해 단어를 split 하는 것을 확인할 수 있고, 안쪽 for문에서는 pair에 symbol 쌍에 대한 빈도를 계산할 수 있다.
merge_vocab함수는 해당 쌍을 합쳐 새로운 vocab를 생성하는 과정이라고 생각하면 된다. 예를 들어 es가 먼저 하나의 쌍으로 뭉쳐졌다면 'n e w e s t'를 'n e w es t'라고 변경할 수 있을 것이다.
코드의 마지막 부분에 나와있는 for문은 주어지는 vocab에 대해 BPE를 직접적으로 진행하는 부분임을 알 수 있다. 코드에 예시를 들어준 vocab으로 확인해 보자면, 처음 for문을 돌 때에는
(l, o) = 5 + 2 = 7
(o, w) = 5 + 2 = 7
(w, e) = 2 + 6 = 8
(e, r) = 2
(e, s) = 6 + 3 = 9이다.
가장 많은 빈도수를 가지는 쌍부터 병합되므로 가장 큰 빈도수를 가지는 (e, s)가 pair 변수에 들어가게 된다. 따라서 한 번의 update를 하고 난 뒤의 모습은 다음과 같다.(es 묶은 뒤)
{'l o w </w>' : 5, 'l o w e r </w>' : 2, 'n e w es t </w>' : 6, 'w i d es t </w>' : 3}
Data-centric AI
Model-centric AI는 수식적인 것만 변경하고 data에 노이즈가 있더라고 문제없도록 모델을 최적화하는 과정을 통해 기술을 개발하는 것을 의미한다. 하지만 이와 다르게 Data-centric AI는 AI의 성능을 올리기 위해서는 코드나 알고리즘을 개선하는 것도 물론 중요하지만, 이것보다는 데이터를 개선하는 것이 더 중요하다고 인식하는 것이다. 알고리즘은 고정해 둔 채 데이터의 질을 높인다. 질 높은 data라는 것은 input과 output이 균일한 것이고, raw data(정형화되지 않은 날것의 데이터)를 모델에 input 하기 위한 값으로 변환할 때 raw data에 있는 정보를 그대로 유지하는 것이다. 이러한 배경으로 word based나 character based보다 subword based tokenizer가 강점을 가지게 된 것이다.
따라서 Tokenization과 Preprocessing등에도 관심을 가질 필요가 있다.
'NLP' 카테고리의 다른 글
BERT (0) | 2023.01.16 |
---|---|
Transformer (0) | 2023.01.15 |
seq2seq with Attention (0) | 2023.01.12 |
LSTM, GRU (0) | 2023.01.07 |
RNN의 여러가지 형태 (0) | 2023.01.06 |