How to use tokenizers and models to replicate the pipeline API's behavior
How to load and save models and tokenizers
Different tokenization approaches, such as word-based, character-based, and subword-based
How to handle multiple sentences of varying lengths
Transformer library를 통해 쉽고, 유동적인 사용을 할 수 있도록 하고자 하였다.
이번 챕터를 통해 model과 tokenizer의 사용에 대해 시작부터 끝까지 배워보는 시간을 가진다.
2. Behind the pipeline
학습과정은 위와 같이 주어진 Raw Text를 Tokenizer로 가공하고 Model 학습을 진행하고 예측결과를 출력하는 단계로 이루어져 있다. 이 과정에 대해 살펴보도록 하자.
2.1. Preprocessing with a Tokenizer
학습 모델은 주어진 문장을 가지고 바로 학습을 진행할 수 있다. 그렇기에 우선 raw text를 token화 하는 작업을 진행하게 되는데 이를 Tokenization 이라고 한다.
Splitting the input into words, subwords, or symbols (like punctuation) that are called tokens
Mapping each token to an integer
Adding additional inputs that may be useful to the model
Pre-Trained Model과 동일한 Preprocessing 과정을 거쳐야하므로 Model Hub에서 해당 정보를 다운로드 받아야한다. 아래 예시 코드를 참고하자.
from transformers import AutoTokenizercheckpoint ="distilbert-base-uncased-finetuned-sst-2-english"tokenizer = AutoTokenizer.from_pretrained(checkpoint)
AutoTokenizer 클래스의 from_pretrained 함수를 사용하여 해당 pipeline의 토큰화 방법을 가져온다.
raw_inputs = ["I've been waiting for a HuggingFace course my whole life.","I hate this so much!",]inputs =tokenizer(raw_inputs, padding=True, truncation=True, return_tensors="pt")print(inputs)
from transformers import AutoTokenizertokenizer = AutoTokenizer.from_pretrained("bert-base-cased")sequence ="Using a Transformer network is simple"tokens = tokenizer.tokenize(sequence)print(tokens)
import torchfrom transformers import AutoTokenizer, AutoModelForSequenceClassificationcheckpoint ="distilbert-base-uncased-finetuned-sst-2-english"tokenizer = AutoTokenizer.from_pretrained(checkpoint)model = AutoModelForSequenceClassification.from_pretrained(checkpoint)sequence ="I've been waiting for a HuggingFace course my whole life."tokens = tokenizer.tokenize(sequence)ids = tokenizer.convert_tokens_to_ids(tokens)input_ids = torch.tensor(ids)# This line will fail.model(input_ids)
그 이유는 model의 parameter로 input_ids 즉 list가 들어와야 하기 때문이다.
input_ids = torch.tensor([ids])
위에서는 입력문장이 1개여서 변환이 필요했지만, 여러 문장을 가지고 생각하면 더 간단하게 느껴질 수 있다. 모델이 처리할 문장을 batch에 담아서 input parameter로 전달한다고 생각하면 된다.
너무 문장의 길이가 긴 경우, 긴 문장을 감당할 수 있는 모델을 사용하거나 최고 길이 만큼 잘라서 사용하기도 한다.
6. Putting it all together
6.1. Tokenizer
from transformers import AutoTokenizercheckpoint ="distilbert-base-uncased-finetuned-sst-2-english"tokenizer = AutoTokenizer.from_pretrained(checkpoint)sequence ="I've been waiting for a HuggingFace course my whole life."model_inputs =tokenizer(sequence)
sequences = ["I've been waiting for a HuggingFace course my whole life.","So have I!"]model_inputs =tokenizer(sequences)
# Will pad the sequences up to the maximum sequence lengthmodel_inputs =tokenizer(sequences, padding="longest")# Will pad the sequences up to the model max length# (512 for BERT or DistilBERT)model_inputs =tokenizer(sequences, padding="max_length")# Will pad the sequences up to the specified max lengthmodel_inputs =tokenizer(sequences, padding="max_length", max_length=8)
sequences = ["I've been waiting for a HuggingFace course my whole life.","So have I!"]# Will truncate the sequences that are longer than the model max length# (512 for BERT or DistilBERT)model_inputs =tokenizer(sequences, truncation=True)# Will truncate the sequences that are longer than the specified max lengthmodel_inputs =tokenizer(sequences, max_length=8, truncation=True)
sequences = ["I've been waiting for a HuggingFace course my whole life.","So have I!"]# Returns PyTorch tensorsmodel_inputs =tokenizer(sequences, padding=True, return_tensors="pt")# Returns TensorFlow tensorsmodel_inputs =tokenizer(sequences, padding=True, return_tensors="tf")# Returns NumPy arraysmodel_inputs =tokenizer(sequences, padding=True, return_tensors="np")
6.2. Special tokens
sequence ="I've been waiting for a HuggingFace course my whole life."model_inputs =tokenizer(sequence)print(model_inputs["input_ids"])tokens = tokenizer.tokenize(sequence)ids = tokenizer.convert_tokens_to_ids(tokens)print(ids)