> 백엔드 개발 > 파이썬 튜토리얼 > Huggingface 미세 조정 BART의 코드 예: 번역을 위한 새 태그를 훈련하기 위한 WMT16 데이터 세트

Huggingface 미세 조정 BART의 코드 예: 번역을 위한 새 태그를 훈련하기 위한 WMT16 데이터 세트

王林
풀어 주다: 2023-04-10 14:41:06
앞으로
1318명이 탐색했습니다.

사용자 정의 데이터 세트에서 새로운 마커를 훈련하는 등 번역 작업에 대한 새로운 아키텍처를 테스트하려는 경우 처리가 번거로울 수 있으므로 이 글에서는 새로운 마커를 추가하기 위한 전처리 단계를 소개하겠습니다. 모델을 미세 조정하는 방법을 소개합니다.

Huggingface Hub에는 사전 훈련된 모델이 많기 때문에 사전 훈련된 태거를 쉽게 찾을 수 있습니다. 하지만 마커를 추가하는 것은 다소 까다로울 수 있습니다. 먼저 데이터 세트를 로드하고 전처리하는 방법을 완전히 소개하겠습니다.

데이터세트 로드

우리는 WMT16 데이터세트와 루마니아어-영어 하위 세트를 사용합니다. load_dataset() 함수는 Huggingface에서 사용 가능한 데이터 세트를 다운로드하고 로드합니다.

import datasets
 
 dataset = datasets.load_dataset("stas/wmt16-en-ro-pre-processed", cache_dir="./wmt16-en_ro")
로그인 후 복사

Huggingface 미세 조정 BART의 코드 예: 번역을 위한 새 태그를 훈련하기 위한 WMT16 데이터 세트

데이터 세트의 내용은 위의 그림 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에서 볼 수 있듯이 "번역" 차원이 데이터 세트에서 삭제되었습니다.

Huggingface 미세 조정 BART의 코드 예: 번역을 위한 새 태그를 훈련하기 위한 WMT16 데이터 세트

Tagger

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()
로그인 후 복사

이 프로세스도 매우 간단합니다. bart 기본 모델을 로드하고(라인 4), 교육 매개변수를 설정하고(라인 6), Trainer 객체를 사용하여 모든 것을 바인딩합니다(라인 22). 프로세스를 시작합니다(라인 29). 위의 하이퍼파라미터는 테스트용이므로 최상의 결과를 얻으려면 이러한 파라미터를 사용하여 하이퍼파라미터를 설정해야 합니다.

Inference

추론 과정도 매우 간단합니다. 미세 조정된 모델을 로드하고 generate() 메서드를 사용하여 변환하면 되지만 소스(En) 및 대상(RO) 시퀀스에 적절한 토크나이저를 사용하는 것이 중요합니다. .

요약

토큰화는 자연어 처리(NLP)를 사용할 때 기본적인 작업처럼 보일 수 있지만 간과해서는 안 되는 중요한 단계입니다. HuggingFace의 등장으로 사용이 쉬워졌고, 이로 인해 토큰화의 기본 원칙을 잊어버리고 사전 훈련된 모델에만 의존하기가 쉬워졌습니다. 그러나 우리가 새로운 모델을 직접 훈련시키려면 토큰화 프로세스와 그것이 다운스트림 작업에 미치는 영향을 이해하는 것이 필수적이므로 이 기본 작업을 숙지하고 숙달해야 합니다.

이 기사의 코드: https://github.com/AlaFalaki/tutorial_notebooks/blob/main/translation/hf_bart_translation.ipynb

위 내용은 Huggingface 미세 조정 BART의 코드 예: 번역을 위한 새 태그를 훈련하기 위한 WMT16 데이터 세트의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:51cto.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿