成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Huggingface微調BART的代碼示例:WMT16數據集訓練新的標記進行翻譯

開發 前端
BART模型是用來預訓練seq-to-seq模型的降噪自動編碼器(autoencoder)。它是一個序列到序列的模型,具有對損壞文本的雙向編碼器和一個從左到右的自回歸解碼器,所以它可以完美的執行翻譯任務。

如果你想在翻譯任務上測試一個新的體系結構,比如在自定義數據集上訓練一個新的標記,那么處理起來會很麻煩,所以在本文中,我將介紹添加新標記的預處理步驟,并介紹如何進行模型微調。

因為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可以看到,已經從數據集中刪除了“translation”維度。

標記器

標記器提供了訓練標記器所需的所有工作。它由四個基本組成部分:(但這四個部分不是所有的都是必要的)

Models:標記器將如何分解每個單詞。例如,給定單詞“playing”:i) BPE模型將其分解為“play”+“ing”兩個標記,ii) WordLevel將其視為一個標記。

Normalizers:需要在文本上發生的一些轉換。有一些過濾器可以更改Unicode、小寫字母或刪除內容。

Pre-Tokenizers:為操作文本提供更大靈活性處理的函數。例如,如何處理數字。數字100應該被認為是“100”還是“1”、“0”、“0”?

Post-Processors:后處理具體情況取決于預訓練模型的選擇。例如,將 [BOS](句首)或 [EOS](句尾)標記添加到 BERT 輸入。

下面的代碼使用BPE模型、小寫Normalizers和空白Pre-Tokenizers。然后用默認值初始化訓練器對象,主要包括

1、詞匯量大小使用50265以與BART的英語標記器一致

2、特殊標記,如<s><pad>

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的最后一步是連接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微調

現在可以使用使用新的標記器了。

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行)。上述超參數都是測試目的,所以如果要得到最好的結果還需要進行超參數的設置,我們使用這些參數是可以運行的。

推理

推理過程也很簡單,加載經過微調的模型并使用generate()方法進行轉換就可以了,但是需要注意的是對源 (En) 和目標 (RO) 序列使用適當的分詞器。

總結

雖然在使用自然語言處理(NLP)時,標記化似乎是一個基本操作,但它是一個不應忽視的關鍵步驟。HuggingFace的出現可以方便的讓我們使用,這使得我們很容易忘記標記化的基本原理,而僅僅依賴預先訓練好的模型。但是當我們希望自己訓練新模型時,了解標記化過程及其對下游任務的影響是必不可少的,所以熟悉和掌握這個基本的操作是非常有必要的。

本文代碼:https://github.com/AlaFalaki/tutorial_notebooks/blob/main/translation/hf_bart_translation.ipynb

責任編輯:華軒 來源: DeepHub IMBA
相關推薦

2023-08-21 10:20:03

開源模型

2024-05-23 12:57:59

2024-02-19 00:12:50

AI代碼

2022-12-19 15:16:46

機器學習模型

2022-07-13 16:09:19

模型AI訓練

2024-03-01 09:00:00

大型語言模型數據集LLM

2024-01-24 13:37:36

大型語言模型人工智能

2024-04-19 12:50:58

人工智能OpenAI

2024-04-15 12:50:00

大型語言模型ReFT

2024-11-04 14:42:12

2023-02-19 15:26:51

深度學習數據集

2023-12-28 11:59:26

Zephyr語言模型微調版本

2021-09-08 07:44:26

人工智能keras神經網絡

2023-08-15 16:20:42

Pandas數據分析

2020-10-11 22:05:22

機器翻譯谷歌AI

2022-10-25 08:00:00

Huggingfac開源庫數據倉庫

2024-02-26 07:46:54

Markdown語法標記語言有序列表

2023-12-11 21:35:48

2024-01-30 01:12:37

自然語言時間序列預測Pytorch

2024-09-14 13:50:00

AI訓練
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩一 | 范冰冰一级做a爰片久久毛片 | 在线一区视频 | 99亚洲国产精品 | 亚洲精品久久久久久下一站 | 亚洲中国字幕 | 亚洲欧美在线观看 | 欧美精品电影一区 | 国产美女视频 | 在线免费看黄 | 国产精品美女久久久久久久久久久 | 四虎成人免费电影 | 拍戏被cao翻了h承欢 | 日韩伦理一区二区 | a在线视频 | 久草中文在线 | 伊人网影院| 久久乐国产精品 | 91精品国产91久久久 | 91精品久久久久久久 | 亚洲人成网亚洲欧洲无码 | 日一日操一操 | 欧美精品一区二区三区视频 | 国产中文字幕网 | 成人午夜在线 | 国产精品久久久久久亚洲调教 | 久久精品黄色 | 亚洲精品一区二三区不卡 | 天天射网站| 国产精品免费在线 | 亚洲视频免费观看 | 无码一区二区三区视频 | 亚洲天堂男人的天堂 | 国产精品揄拍一区二区 | 久久综合一区 | 成人亚洲精品 | 亚洲精品乱码久久久久久9色 | 美女视频网站久久 | 天堂中文字幕av | 91一区| 日韩高清成人 |