カスタム データセットで新しいタグをトレーニングするなど、翻訳タスクで新しいアーキテクチャをテストする場合、処理が煩雑になるため、この記事では新しいタグを追加する前処理について紹介します。処理手順とモデルを微調整する方法を紹介します。
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 は、トークナイザーのトレーニングに必要なすべての作業を提供します。これは 4 つの基本コンポーネントで構成されます: (ただし、4 つすべてが必要というわけではありません)
モデル: トークナイザーが各単語をどのように分解するか。たとえば、「playing」という単語が与えられたとします。i) BPE モデルはそれを 2 つのトークン「play」と「ing」に分解します。ii) WordLevel はそれを 1 つのトークンとして扱います。
ノーマライザー: テキスト上で実行する必要があるいくつかの変換。 Unicode、小文字を変更したり、コンテンツを削除したりするためのフィルターがあります。
Pre-Tokenizers: テキスト操作の柔軟性を高める関数。たとえば、数字の扱い方などです。数値 100 は、「100」とみなされるべきですか、それとも「1」、「0」、「0」とみなされるべきですか?
ポストプロセッサー: ポストプロセッサーの具体的な状況は、どのオプションを選択するかによって異なります。事前にトレーニングされたモデル。たとえば、[BOS] (文の始まり) または [EOS] (文の終わり) トークンを BERT 入力に追加します。
以下のコードでは、BPE モデル、小文字のノーマライザー、および空の Pre-Tokenizer を使用しています。次に、主に
1 を含むデフォルト値でトレーナー オブジェクトを初期化します。語彙サイズは、BART の英語タガー
2 と一致するように 50265 を使用します。特別なタグ ( など) および
3. 初期語彙、これは各モデル起動プロセスの事前定義されたリストです。
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 を使用する最後のステップは、トレーナーと 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")
新しいトークナイザーが利用可能になりました。
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 行目)、トレーナーを使用します。オブジェクトを使用してすべてのコンテンツをバインドし (22 行目)、プロセスを開始します (29 行目)。上記のハイパーパラメータはテスト用なので、最良の結果を得たい場合は、ハイパーパラメータを設定する必要があります。これらのパラメータを使用して実行できます。
推論プロセスも非常に簡単です。微調整されたモデルをロードし、generate() メソッドを使用して変換するだけです。ただし、ソース ( En) とターゲット (RO).) は、適切なトークナイザーを使用してシーケンスされます。
自然言語処理 (NLP) を使用する場合、トークン化は基本的な操作のように思えるかもしれませんが、これは見落とすべき重要なステップです。 HuggingFace の登場により使いやすくなったため、トークン化の基本原則を忘れて、事前トレーニングされたモデルのみに依存してしまいがちです。しかし、新しいモデルを自分でトレーニングしたい場合は、トークン化プロセスとその下流タスクへの影響を理解することが不可欠であるため、この基本操作に精通し、習得する必要があります。
この記事のコード: https://github.com/AlaFalaki/tutorial_notebooks/blob/main/translation/hf_bart_translation.ipynb
以上がHuggingface 微調整 BART のコード例: 翻訳用に新しいタグをトレーニングするための WMT16 データ セットの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。