사용자 정의 데이터 세트에서 새로운 마커를 훈련하는 등 번역 작업에 대한 새로운 아키텍처를 테스트하려는 경우 처리가 번거로울 수 있으므로 이 글에서는 새로운 마커를 추가하기 위한 전처리 단계를 소개하겠습니다. 모델을 미세 조정하는 방법을 소개합니다.
Huggingface Hub에는 사전 훈련된 모델이 많기 때문에 사전 훈련된 태거를 쉽게 찾을 수 있습니다. 하지만 마커를 추가하는 것은 다소 까다로울 수 있습니다. 먼저 데이터 세트를 로드하고 전처리하는 방법을 완전히 소개하겠습니다.
우리는 WMT16 데이터세트와 루마니아어-영어 하위 세트를 사용합니다. load_dataset() 함수는 Huggingface에서 사용 가능한 데이터 세트를 다운로드하고 로드합니다.
import datasets dataset = datasets.load_dataset("stas/wmt16-en-ro-pre-processed", cache_dir="./wmt16-en_ro")
데이터 세트의 내용은 위의 그림 1에서 볼 수 있습니다. 데이터에 더 잘 액세스하고 하드 드라이브에 저장할 수 있도록 이를 "평면화"해야 합니다.
def flatten(batch): batch['en'] = batch['translation']['en'] batch['ro'] = batch['translation']['ro'] return batch # Map the 'flatten' function train = dataset['train'].map( flatten ) test = dataset['test'].map( flatten ) validation = dataset['validation'].map( flatten ) # Save to disk train.save_to_disk("./dataset/train") test.save_to_disk("./dataset/test") validation.save_to_disk("./dataset/validation")
아래 그림 2에서 볼 수 있듯이 "번역" 차원이 데이터 세트에서 삭제되었습니다.
Tagger는 토크나이저를 훈련하는 데 필요한 모든 작업을 제공합니다. 이는 네 가지 기본 구성요소로 구성됩니다. (그러나 네 가지 모두가 필요한 것은 아닙니다.)
모델: 토크나이저가 각 단어를 분해하는 방법. 예를 들어, "playing"이라는 단어가 주어지면: i) BPE 모델은 이를 "play" + "ing"이라는 두 개의 토큰으로 분해하고, ii) WordLevel은 이를 하나의 토큰으로 처리합니다.
Normalizers: 텍스트에서 발생해야 하는 일부 변형입니다. 유니코드, 소문자를 변경하거나 콘텐츠를 제거하는 필터가 있습니다.
Pre-Tokenizers: 텍스트 조작에 더 큰 유연성을 제공하는 기능입니다. 예를 들어 숫자 작업 방법. 숫자 100을 "100" 또는 "1", "0", "0"으로 간주해야 합니까?
Post-Processors: 사후 처리 세부 사항은 사전 훈련된 모델의 선택에 따라 다릅니다. 예를 들어 BERT 입력에 [BOS](문장 시작) 또는 [EOS](문장 끝) 토큰을 추가합니다.
아래 코드는 BPE 모델, 소문자 노멀라이저 및 빈 사전 토크나이저를 사용합니다. 그런 다음 주로
1을 포함한 기본값으로 트레이너 객체를 초기화합니다. 어휘 크기는 BART의 영어 태거
2와 일치하도록 50265입니다. 각 모델 출시 프로세스에 대해 사전 정의된 목록인 수량입니다. from tokenizers import normalizers, pre_tokenizers, Tokenizer, models, trainers
# Build a tokenizer
bpe_tokenizer = Tokenizer(models.BPE())
bpe_tokenizer.normalizer = normalizers.Lowercase()
bpe_tokenizer.pre_tokenizer = pre_tokenizers.Whitespace()
trainer = trainers.BpeTrainer(
vocab_size=50265,
special_tokens=["<s>", "<pad>", "</s>", "<unk>", "<mask>"],
initial_alphabet=pre_tokenizers.ByteLevel.alphabet(),
)
Huggingface 사용의 마지막 단계는 Trainer와 BPE 모델을 연결하고 데이터 세트를 전달하는 것입니다. 데이터 소스에 따라 다양한 훈련 기능을 사용할 수 있습니다. train_from_iterator()를 사용하겠습니다.
def batch_iterator(): batch_length = 1000 for i in range(0, len(train), batch_length): yield train[i : i + batch_length]["ro"] bpe_tokenizer.train_from_iterator( batch_iterator(), length=len(train), trainer=trainer ) bpe_tokenizer.save("./ro_tokenizer.json")BART Spinner
from transformers import AutoTokenizer, PreTrainedTokenizerFast en_tokenizer = AutoTokenizer.from_pretrained( "facebook/bart-base" ); ro_tokenizer = PreTrainedTokenizerFast.from_pretrained( "./ro_tokenizer.json" ); ro_tokenizer.pad_token = en_tokenizer.pad_token def tokenize_dataset(sample): input = en_tokenizer(sample['en'], padding='max_length', max_length=120, truncation=True) label = ro_tokenizer(sample['ro'], padding='max_length', max_length=120, truncation=True) input["decoder_input_ids"] = label["input_ids"] input["decoder_attention_mask"] = label["attention_mask"] input["labels"] = label["input_ids"] return input train_tokenized = train.map(tokenize_dataset, batched=True) test_tokenized = test.map(tokenize_dataset, batched=True) validation_tokenized = validation.map(tokenize_dataset, batched=True)
위 코드의 5번째 줄에서 루마니아어 태거에 대한 패딩 태그 설정은 매우 필요합니다. 9행에서 사용될 것이므로 토크나이저는 모든 입력의 크기가 동일하도록 패딩을 사용합니다.
다음은 교육 프로세스입니다.
from transformers import BartForConditionalGeneration from transformers import Seq2SeqTrainingArguments, Seq2SeqTrainer model = BartForConditionalGeneration.from_pretrained("facebook/bart-base" ) training_args = Seq2SeqTrainingArguments( output_dir="./", evaluation_strategy="steps", per_device_train_batch_size=2, per_device_eval_batch_size=2, predict_with_generate=True, logging_steps=2,# set to 1000 for full training save_steps=64,# set to 500 for full training eval_steps=64,# set to 8000 for full training warmup_steps=1,# set to 2000 for full training max_steps=128, # delete for full training overwrite_output_dir=True, save_total_limit=3, fp16=False, # True if GPU ) trainer = Seq2SeqTrainer( model=model, args=training_args, train_dataset=train_tokenized, eval_dataset=validation_tokenized, ) trainer.train()
Inference
추론 과정도 매우 간단합니다. 미세 조정된 모델을 로드하고 generate() 메서드를 사용하여 변환하면 되지만 소스(En) 및 대상(RO) 시퀀스에 적절한 토크나이저를 사용하는 것이 중요합니다. .
요약
토큰화는 자연어 처리(NLP)를 사용할 때 기본적인 작업처럼 보일 수 있지만 간과해서는 안 되는 중요한 단계입니다. HuggingFace의 등장으로 사용이 쉬워졌고, 이로 인해 토큰화의 기본 원칙을 잊어버리고 사전 훈련된 모델에만 의존하기가 쉬워졌습니다. 그러나 우리가 새로운 모델을 직접 훈련시키려면 토큰화 프로세스와 그것이 다운스트림 작업에 미치는 영향을 이해하는 것이 필수적이므로 이 기본 작업을 숙지하고 숙달해야 합니다.
위 내용은 Huggingface 미세 조정 BART의 코드 예: 번역을 위한 새 태그를 훈련하기 위한 WMT16 데이터 세트의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!