理解大型语言模型中 Fine-tuning 和 Further Pretraining 的区别 在自然语言处理(NLP)领域,大型语言模型,如 GPT 和 BERT 的出现,彻底改变了我们处理文本分类、情感分析和问答等任务的方式。在这些模型的应用中,Fine-tuning(微调)和 Further Pretraining(进一步预训练)是两种关键技术。虽然它们看起来相似,但实际上服务于 NLP 流程中的不同需求和场景。
什么是 Fine-tuning? Fine-tuning 是指在特定任务的数据集上进一步训练(或“微调”)一个预训练好的模型的过程。这种方法在数据集相对较小但标注良好的情况下特别有效。
示例场景:情感分析 假设你有一组电影评论数据,每条评论都标记了正面或负面情感。你想创建一个模型来预测评论的情感。
This notebook demonstrates the fine-tuning of a BERT model on the IMDB dataset for sentiment analysis. For detailed code implementation, please refer to the following link:link .
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 from transformers import ( BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments, ) import torchfrom datasets import load_dataset, DatasetDict"""## 1.加载和准备IMDB数据集样本 选取一部分数据用于Fine-tuning。 """ dataset = load_dataset('imdb' , split='train' ) small_dataset = dataset.shuffle(seed=42 ).select(range (10000 )) tokenizer = BertTokenizer.from_pretrained("bert-base-uncased" ) device = "cuda" if torch.cuda.is_available() else "cpu" def encode (examples ): return tokenizer(examples["text" ], padding="max_length" , truncation=True , max_length=512 ) encoded_small_dataset = small_dataset.map (encode, batched=True ) import torchfrom transformers import BertModelimport matplotlib.pyplot as pltdef visualize_attention (sentence, model, tokenizer ): model.to(device) model.eval () inputs = tokenizer(sentence, return_tensors="pt" ).to(device) with torch.no_grad(): outputs = model(**inputs) attentions = outputs.attentions layer = 5 head = 1 attention = attentions[layer][0 , head].cpu().numpy() tokens = tokenizer.convert_ids_to_tokens(inputs["input_ids" ][0 ].cpu()) plt.figure(figsize=(10 , 10 )) plt.matshow(attention, cmap='viridis' ) plt.xticks(range (len (tokens)), tokens, rotation=90 ) plt.yticks(range (len (tokens)), tokens) plt.colorbar() plt.show() """## 2. 可视化一个样本句子的注意力权重(未经Fine-tuning) 选择数据集中的一个句子并展示其原始BERT模型的注意力权重。 """ model = BertModel.from_pretrained("bert-base-uncased" , output_attentions=True ) sample_sentence = "I love this movie, it's fantastic!" visualize_attention(sample_sentence, model, tokenizer) """## 3. Fine-tuning BERT模型 在选取的IMDB样本上进行Fine-tuning。 ### 3.1 准备数据加载器 为了训练模型,我们需要创建PyTorch的DataLoader。这将使我们能够在训练过程中有效地加载数据。 ### 3.2 设置Fine-tuning环境 初始化模型、优化器以及损失函数。 ### 3.3 Fine-tuning模型 执行Fine-tuning的训练循环。执行以上代码将在IMDB数据集的小样本上对BERT模型进行Fine-tuning。这可能需要一些时间,具体取决于您的硬件配置。 """ from torch.utils.data import DataLoaderencoded_small_dataset.set_format('torch' , columns=['input_ids' , 'attention_mask' , 'label' ]) train_loader = DataLoader(encoded_small_dataset, batch_size=8 , shuffle=True ) from transformers import BertConfig, BertForSequenceClassificationimport torch.optim as optimconfig = BertConfig.from_pretrained("bert-base-uncased" , output_attentions=True ) model = BertForSequenceClassification.from_pretrained("bert-base-uncased" , config=config) optimizer = optim.AdamW(model.parameters(), lr=5e-5 ) criterion = torch.nn.CrossEntropyLoss() model.to(device) epochs = 8 for epoch in range (epochs): model.train() total_loss = 0 for batch in train_loader: input_ids = batch['input_ids' ].to(device) attention_mask = batch['attention_mask' ].to(device) labels = batch['label' ].to(device) outputs = model(input_ids, attention_mask=attention_mask) loss = criterion(outputs.logits, labels) optimizer.zero_grad() loss.backward() optimizer.step() total_loss += loss.item() print (f"Epoch: {epoch+1 } , Loss: {total_loss/len (train_loader)} " ) """### 4. 可视化同一句子的注意力权重(经过Fine-tuning) 使用Fine-tuning后的模型再次可视化同一句子的注意力权重。您可以重用之前提供的visualize_attention函数: """ visualize_attention(sample_sentence, model, tokenizer)
在这个例子中,BERT 模型在电影评论数据集上进行了 fine-tuning,用于情感分析。
什么是 Further Pretraining? Further Pretraining(也称为 Domain-adaptive Pretraining,领域适应性预训练)是在一个新的数据集上继续训练一个预训练模型的过程,这个新的数据集与特定的领域更相关,但不一定为特定任务标注。
示例场景:法律文档分析 假设你正在处理法律文档,并希望利用一个在通用文本上训练的语言模型。
Further Pretraining 的代码示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 from transformers import BertModel, BertTokenizermodel = BertModel.from_pretrained('bert-base-uncased' ) tokenizer = BertTokenizer.from_pretrained('bert-base-uncased' ) encoded_input = tokenizer(legal_documents, padding=True , truncation=True , max_length=512 , return_tensors='pt' ) model.train() for batch in encoded_input: outputs = model(**batch)
在这个例子中,BERT 模型在法律文档数据集上进行了进一步的预训练,使其在进行特定法律 NLP 任务的 fine-tuning 之前,更擅长理解法律术语和概念。
关键区别
目的 :Fine-tuning 针对具有标签数据的特定任务进行模型调整,而 Further Pretraining 则是使模型更好地适应特定领域或语言风格。
数据集 :Fine-tuning 使用特定任务的标注数据集。Further Pretraining 使用更大的、特定领域的数据集,这些数据集可能不是为特定任务标注的。
训练目标 :Fine-tuning 涉及调整模型进行特定预测,而 Further Pretraining 侧重于在新领域中的通用语言理解
。
结论 Fine-tuning 和 Further Pretraining 都是 NLP 领域的强大技术。通过理解它们的区别和应用,我们可以更好地利用大型语言模型来解决各种领域中的多样化和复杂任务。无论你是在构建社交媒体帖子的情感分析模型,还是调整模型以理解法律文档,这些技术都为 NLP 领域的不断发展提供了稳健的解决方案。
注意 :提供的代码示例是概念性的,需要适当的环境设置,包括必要的库和数据集,才能执行。