토큰과 토크나이저 정리
토크나이저와 모델의 역할 비교:
토크나이저(Tokenizer)의 역할:
- 입력 텍스트를 모델이 이해할 수 있는 작은 단위(토큰)로 분할합니다.
- 텍스트를 숫자 형태의 인덱스나 임베딩으로 변환합니다.
- 어휘 사전(vocabulary)을 관리하고, 알 수 없는 단어를 처리하는 방법을 제공합니다.
- 특수 토큰(시작, 끝, 패딩 등)을 추가하여 모델의 입력 형식을 표준화합니다.
모델(Model)의 역할:
- 토크나이저가 변환한 숫자 입력을 받아 처리합니다.
- 신경망 구조를 통해 입력 데이터의 패턴과 의미를 학습합니다.
- 특정 NLP 작업(번역, 분류, 생성 등)을 수행합니다.
- 내부 가중치를 조정하여 성능을 개선합니다.
데이터 처리 일련의 과정:
- 전처리 단계:
- 원본 텍스트 입력
- 텍스트 정제 (특수 문자 제거, 대소문자 통일 등)
- 토크나이징 단계:
- 텍스트를 토큰으로 분할
- 각 토큰을 고유한 정수 인덱스로 변환
- 토큰 시퀀스 생성 (예: [101, 2054, 2175, 3284, 102])
- 임베딩 단계:
- 토큰 인덱스를 밀집 벡터 표현으로 변환
- 각 토큰에 대한 의미론적 벡터 생성
- 모델 입력 준비:
- 패딩 적용 (고정 길이로 만들기)
- 어텐션 마스크 생성 (실제 토큰과 패딩 구분)
- 모델 처리:
- 신경망 레이어를 통과
- 내부 가중치 계산
- 작업별 출력 생성 (분류, 생성 등)
- 디코딩 단계
- 모델의 숫자 출력을 다시 텍스트로 변환
- 토큰 인덱스를 원래 단어나 서브워드로 복원
- 생성된 시퀀스를 의미 있는 텍스트로 재구성
- 후처리 과정
- 특수 토큰 제거 (예: [CLS], [SEP])
- 연속된 서브워드 토큰을 원래 단어로 병합
- 텍스트 정제 및 포맷팅
- 출력 최적화
- 생성된 텍스트의 문법적 일관성 확인
- 불필요한 토큰 필터링
- 최종 출력 텍스트 다듬기
입출력 예시
- 기계 번역 모델: 생성된 토큰 인덱스를 원래 언어의 단어로 변환
- 텍스트 생성 모델: 모델 출력을 읽을 수 있는 텍스트로 변환
- 감성 분석: 분류 결과와 함께 핵심 토큰 하이라이트
서브워드 토큰화 개요
서브워드 토큰화(Subword Tokenization)는 단어보다 작은 단위로 텍스트를 분할하는 방법입니다.
서브워드 토큰화의 장점:
- 어휘 크기 축소
- 미등록 단어 처리 가능
- 형태적으로 유사한 단어 간 정보 공유
- 다국어 처리에 효과적
형태소 분석과 서브워드 토큰화 차이점
형태소 분석은 언어학적 규칙에 따라 의미 단위로 분할하지만, 서브워드 토큰화는 데이터 기반으로 빈도나 우도를 고려하여 분할합니다. 특히 신조어, 외래어, 복합어에서 차이가 두드러집니다.
예시1) 코로나바이러스:
- 형태소 분석: '코로나' + '바이러스'
- 서브워드: '코로', '나', '바이', '러스'와 같이 더 작은 단위로 분할 가능
예시2) 레이어드:
- 형태소 분석: 외래어로 분석하기 어려울 수 있음
- 서브워드: '레이', '어드'와 같이 자동으로 분할 가능
예시3) 자연어처리:
- 형태소 분석: '자연어' + '처리'
- 서브워드: '자연', '어', '처리'로 분할 가능
주요 토큰화 알고리즘
1. BPE (Byte Pair Encoding)
BPE는 텍스트에서 가장 자주 등장하는 문자 쌍을 새로운 단일 토큰으로 병합
2. WordPiece
BPE와 유사하지만 병합 결정 기준이 빈도가 아닌 우도(likelihood)
3. SentencePiece
BPE 알고리즘을 개선 및 응용한 모델. 언어에 구애받지 않는 토큰화
실습
# 실습: 다양한 토크나이저 비교해보기
import numpy as np
import re
from collections import Counter, defaultdict
import matplotlib.pyplot as plt
from transformers import AutoTokenizer, BertTokenizer, GPT2Tokenizer, T5Tokenizer
import sentencepiece as spm
def load_tokenizers():
tokenizers = {
# 토크나이저의 어휘사전과 모델의 어휘사전이 같아야 한다.
'BERT': AutoTokenizer.from_pretrained('bert-base-uncased'), # 워드피스 알고리즘.
'GPT-2': AutoTokenizer.from_pretrained('gpt2'),
'T5': AutoTokenizer.from_pretrained('t5-small'),
'RoBERTa': AutoTokenizer.from_pretrained('roberta-base'),
# 한국어 특화 토크나이저 추가
'KoBERT': AutoTokenizer.from_pretrained('skt/kobert-base-v1'),
'KoGPT': AutoTokenizer.from_pretrained('skt/kogpt2-base-v2'),
'KoBART': AutoTokenizer.from_pretrained('gogamza/kobart-base-v1'),
'KLUE-BERT': AutoTokenizer.from_pretrained('klue/bert-base')
}
# GPT-2 토크나이저는 BOS/EOS 토큰 추가하지 않도록 설정
tokenizers['GPT-2'].add_special_tokens({'pad_token': '[PAD]'})
return tokenizers
# @title encode 및 decode 메소드
sentence = "너는 누구니"
sel_tokenizer = tokenizers['BERT']
result_tokenize = sel_tokenizer.tokenize(sentence)
result_encode = sel_tokenizer.encode(sentence)
result_decode = sel_tokenizer.decode(result_encode)
print(result_tokenize)
print(result_encode)
print(result_decode)
# 여러 토크나이저를 비교
sentence = "Hello. My name is sangdo nam" # 토큰화할 문장
# 각 토크나이저를 사용하여 문장 토큰화
def output_token(tokenizers, sentence):
for name, tokenizer in tokenizers.items():
tokens = tokenizer.tokenize(sentence)
print(f"{name} Tokens({len(tokens)}): {tokens}")
print([len(token) for token in tokens])
print(sentence)
result_encode = sel_tokenizer.encode(sentence)
result_decode = sel_tokenizer.decode(result_encode)
print(result_decode)
print()
Tags:
AI개발_교육