日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Transformer: Training and fine-tuning(六)

發布時間:2025/3/21 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Transformer: Training and fine-tuning(六) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Transformer: Training and fine-tuning(六)

語譯分西?2020-12-09 19:43:43??73??收藏?1

分類專欄:?文本挖掘,情感分類

?

文章目錄

  • 1.Fine-tuning in native本地 PyTorch
    • 1.1 Freezing the encoder 凍結編碼器
  • 2.在tensorflow上微調
  • 3.Trainer

?

1.Fine-tuning in native本地 PyTorch

模型類model class不是以TF開頭的都是以Pytorch來運行的。

接下來考慮微調fine-tune一個BERT模型來做句子分類任務。當我們使用from_pretrained()實例化一個模型時,所指定模型的配置configuration 和預訓練的權重會被用于初始化模型,這個庫library也會包含一些指定任務(task-specific)的最后一層final layer或者頭head。當final layers 和head 沒有出現在指定的預訓練模型中時,會隨機分配權重給它們。

舉例:實例化一個模型,用的是
BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2)
就會創建一個實例,這個實例會帶有來自bert-base-uncased?模型的encoder weights,編碼權重。并且隨機初始化句子分類頭(sequence classification head)在encoder上,output size是2。
模型是默認在eval模式下進行初始化的。我們可以用model.train()?來將其放進訓練模式中(to put it in train mode)

from transformers import BertForSequenceClassification model = BertForSequenceClassification.from_pretrained('bert-base-uncased') model.train()
  • 1
  • 2
  • 3

這是有用的,因為這允許我們利用預訓練的BERT編碼器(encoder),簡單地在任何我們選擇的分類數據集上進行訓練。我們可以用任何Pytorch的優化器optimizer。同時我們也提供了AdamW()優化器,其實現梯度偏差校正以及權重衰減。

from transformers import AdamW optimizer = AdamW(model.parameters(), lr=1e-5)
  • 1
  • 2

優化器允許我們為特定的參數組應用不同的超參數。 例如,我們可以將權重衰減應用于除bias和layer歸一化以外的所有參數:

no_decay = ['bias', 'LayerNorm.weight'] optimizer_grouped_parameters = [{'params': [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)], 'weight_decay': 0.01},{'params': [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)], 'weight_decay': 0.0} ] optimizer = AdamW(optimizer_grouped_parameters, lr=1e-5)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

接下來我們可以設置一個極其簡單的training batch,使用__call__()?,也就是對其本身進行調用。返回BatchEncoding()實例,這個實例準備好了任何我們想傳進模型的東西。

from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') text_batch = ["I love Pixar.", "I don't care for Pixar."] encoding = tokenizer(text_batch, return_tensors='pt', padding=True, truncation=True) input_ids = encoding['input_ids'] attention_mask = encoding['attention_mask']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

當我們召喚一個帶有labels參數的分類模型,返回的第一個元素就是預測值和傳進去的標簽值之間的Cross Entropy loss交叉熵損失。設置好我們的優化器optimizer后,我們可以就可以做后向傳播并更新權重了。

labels = torch.tensor([1,0]).unsqueeze(0) outputs = model(input_ids, attention_mask=attention_mask, labels=labels) loss = outputs.loss loss.backward() optimizer.step()
  • 1
  • 2
  • 3
  • 4
  • 5

或者,你可以只獲取logits并計算自己的損失值,下面的代碼跟上面等價

from torch.nn import functional as F labels = torch.tensor([1,0]) outputs = model(input_ids, attention_mask=attention_mask) loss = F.cross_entropy(outputs.logits, labels) loss.backward() optimizer.step()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

當然,可以通過召喚to('cuda')來用GPU訓練

我們還提供了一些學習率的調節工具。 通過以下內容,我們可以設置一個調節程序,該調節程序為num_warmup_steps預熱,然后在訓練結束前線性衰減為0。

from transformers import get_linear_schedule_with_warmup scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps, num_train_steps)
  • 1
  • 2

然后只要在optimizer.step()之后召喚scheduler.step()

loss.backward() optimizer.step() scheduler.step()
  • 1
  • 2
  • 3

我們強烈推薦使用**Trainer()**會在下面討論,很方便的訓練Transformer模型,

1.1 Freezing the encoder 凍結編碼器

在有些情況下,你需要保持預訓練編碼器的權重凍結,只對head layers的權重進行優化,要這么做的話,只需要在encoder 參數上設置requires_grad?為 False,這樣就可以使庫中任何task-specific model上的base_model子模塊來訪問它:

for param in model.base_model.parameters():param.requires_grad = False
  • 1
  • 2

2.在tensorflow上微調

3.Trainer

我們也提供了簡單,但功能完善的訓練和評估接口:Trainer()?和?TFTrainer(),你可以用于訓練,微調,評估任何Transformer模型,有這非常多的訓練options可供選擇,還有許多內建的屬性比如?logging, gradient accumulation, and mixed precision.

from transformers import BertForSequenceClassification, Trainer, TrainingArgumentsmodel = BertForSequenceClassification.from_pretrained("bert-large-uncased")training_args = TrainingArguments(output_dir='./results', # output directorynum_train_epochs=3, # total # of training epochsper_device_train_batch_size=16, # batch size per device during trainingper_device_eval_batch_size=64, # batch size for evaluationwarmup_steps=500, # number of warmup steps for learning rate schedulerweight_decay=0.01, # strength of weight decaylogging_dir='./logs', # directory for storing logs )trainer = Trainer(model=model, # the instantiated 🤗 Transformers model to be trainedargs=training_args, # training arguments, defined abovetrain_dataset=train_dataset, # training dataseteval_dataset=test_dataset # evaluation dataset )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

接下來,簡單的使用trainer.train()?來訓練,使用?trainer.evaluate()?來評估,你也可以是用你自己的模塊,但是第一個從forward返回的參數必須是損失值,這個損失值是用來優化的

Trainer()使用的是內建的函數來收集batches并準備好將它們傳進模型中,如果需要,也可以使用data_collator參數來傳你自己的collator function(校對函數),這個校對函數傳進以你提供的數據集的格式的數據,返回可以傳進模型的batch。

要計算除損失之外的其他指標,您還可以定義自己的compute_metrics函數并將其傳遞給Trainer。

from sklearn.metrics import accuracy_score, precision_recall_fscore_supportdef compute_metrics(pred):labels = pred.label_idspreds = pred.predictions.argmax(-1)precision, recall, f1, _ = precision_recall_fscore_support(labels, preds, average='binary')acc = accuracy_score(labels, preds)return {'accuracy': acc,'f1': f1,'precision': precision,'recall': recall}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

最后,您可以通過在指定的logging_dir目錄中啟動tensorboard來查看結果,包括所有計算的指標。、

一個輕量化的colab demo,展示IMDb電影情感分析,使用的Trainer,鏈接

from transformers import BertForSequenceClassification, BertTokenizerFast, Trainer, TrainingArguments from nlp import load_dataset import torch import numpy as np from sklearn.metrics import accuracy_score, precision_recall_fscore_support
  • 1
  • 2
  • 3
  • 4
  • 5
model = BertForSequenceClassification.from_pretrained('bert-base-uncased') tokenizer = BertTokenizerFast.from_pretrained('bert-base-uncased')
  • 1
  • 2
def tokenize(batch):return tokenizer(batch['text'], padding=True, truncation=True)train_dataset, test_dataset = load_dataset('imdb', split=['train', 'test']) train_dataset = train_dataset.map(tokenize, batched=True, batch_size=len(train_dataset)) test_dataset = test_dataset.map(tokenize, batched=True, batch_size=len(train_dataset)) train_dataset.set_format('torch', columns=['input_ids', 'attention_mask', 'label']) test_dataset.set_format('torch', columns=['input_ids', 'attention_mask', 'label'])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
def compute_metrics(pred):labels = pred.label_idspreds = pred.predictions.argmax(-1)precision, recall, f1, _ = precision_recall_fscore_support(labels, preds, average='binary')acc = accuracy_score(labels, preds)return {'accuracy': acc,'f1': f1,'precision': precision,'recall': recall}training_args = TrainingArguments(output_dir='./results',num_train_epochs=1,per_device_train_batch_size=16,per_device_eval_batch_size=64,warmup_steps=500,weight_decay=0.01,evaluate_during_training=True,logging_dir='./logs', )trainer = Trainer(model=model,args=training_args,compute_metrics=compute_metrics,train_dataset=train_dataset,eval_dataset=test_dataset )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
trainer.train()
  • 1
trainer.evaluate()
  • 1
{'epoch': 1.0,'eval_accuracy': 0.93552,'eval_f1': 0.9362089434111595,'eval_loss': 0.18167165885476963,'eval_precision': 0.926311667971809,'eval_recall': 0.94632}

總結

以上是生活随笔為你收集整理的Transformer: Training and fine-tuning(六)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。