微调大型语言模型:7步指南实现特定任务优化

2024年04月01日 由 daydream 发表 497 0

在过去的一年半里,自然语言处理(NLP)领域发生了显著的变化,这主要归功于像OpenAI的GPT系列这样的大型语言模型(LLMs)的崛起。


这些强大的模型彻底改变了我们处理自然语言任务的方式,在翻译、情感分析和自动文本生成方面提供了前所未有的能力。它们理解和生成类似人类文本的能力,打开了曾经被认为无法实现的可能性。


然而,尽管这些模型功能强大,但训练它们的过程充满了挑战,如需要投入大量的时间和资金。


这让我们不得不重视LLM微调的关键作用。


通过精炼这些预训练模型,使其更好地适应特定的应用或领域,我们可以显著增强它们在特定任务上的表现。这一步骤不仅提升了它们的质量,还扩展了它们在众多领域的实用性。


本指南旨在将这一过程分解为7个简单步骤,以便任何LLM都能为特定任务进行微调。


了解预训练的大型语言模型


LLMs是一种专门设计的机器学习算法类别,旨在根据前面单词提供的上下文来预测序列中的下一个单词。这些模型建立在Transformer架构之上,这是机器学习技术的一项突破,并在谷歌的“All you need is attention”文章中首次得到解释。


像GPT(生成式预训练Transformer)这样的模型是预训练语言模型的例子,它们已经接触过大量的文本数据。这种广泛的训练使它们能够捕获语言使用的潜在规则,包括单词如何组合成连贯的句子。


微信截图_20240401111123


这些模型的一个关键优势在于它们不仅能够理解自然语言,还能够基于给定的输入产生类似于人类写作的文本。


那么,这些模型最大的优势是什么呢?


这些模型已经通过API向大众开放。


微调是什么,为什么它很重要?


微调是一个过程,即选择一个预训练模型,并使用特定领域的数据集对其进行进一步训练以改进其性能。


大多数LLM模型在自然语言技能和通用知识表现方面都非常出色,但在特定的任务导向型问题上却表现不佳。微调过程提供了一种方法,可以在不必从头开始构建模型的情况下,提高模型在特定问题上的性能,同时降低计算成本。


微信截图_20240401111134


简而言之,微调可以调整模型以更好地执行特定任务,使其在现实应用中更加有效和灵活。对于改进特定任务或领域的现有模型而言,这一步骤至关重要。


微调LLM的逐步指南


让我们通过一个实例,仅在7个步骤中微调一个真实的模型来阐明这个概念。


第一步:明确具体目标


假设我们想要推断任何文本的情感,并决定尝试使用GPT-2来完成这项任务。


我确信,我们很快就会发现它在执行这项任务时表现相当糟糕。然后,一个自然的问题是:


我们能做些什么来改进它的性能吗?


当然,答案是肯定的!我们可以做到!


通过利用微调,我们将使用Hugging Face Hub上预训练的GPT-2模型和一个包含推文及其对应情感的数据集进行训练,以提高性能。


因此,我们的最终目标是拥有一个擅长从文本中推断情感的模型。


第二步:选择预训练模型和数据集


第二步是选择一个作为基准模型的模型。在我们的案例中,我们已经选择了模型:GPT-2。因此,我们将对它进行一些简单的微调。


微信截图_20240401111158


始终牢记要选择适合你的任务的模型。


第三步:加载要使用的数据


现在我们有了模型和主要任务,我们需要一些数据来工作。


但不用担心,Hugging Face已经安排好了!


这就是他们的数据集库发挥作用的地方。


在本例中,我们将利用Hugging Face数据集库导入一个包含标有相应情感(积极、中性或消极)的推文的数据集。


from datasets import load_dataset

dataset = load_dataset("mteb/tweet_sentiment_extraction")
df = pd.DataFrame(dataset['train'])

 

数据如下:


微信截图_20240401111215


第四步:分词器


现在我们有了模型和要微调的数据集。因此,接下来的自然步骤是加载一个分词器。由于LLM使用令牌(而不是单词!),我们需要一个分词器将数据发送到我们的模型。


我们可以很容易地通过利用map方法来对整个数据集进行分词来做到这一点。


from transformers import GPT2Tokenizer

# Loading the dataset to train our model
dataset = load_dataset("mteb/tweet_sentiment_extraction")
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
tokenizer.pad_token = tokenizer.eos_token

def tokenize_function(examples):
return tokenizer(examples["text"], padding="max_length", truncation=True)

tokenized_datasets = dataset.map(tokenize_function, batched=True)


额外奖励:为了提高我们的处理性能,我们生成了两个较小的子集:


  • 训练集:用于微调我们的模型。
  • 测试集:用于评估模型。

small_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(1000))
small_eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(1000))


第五步:初始化基础模型


一旦我们有了要使用的数据集,我们就加载模型并指定预期标签的数量。从推文的情感数据集中,你可以知道有三种可能的标签:


  • 0 或 消极
  • 1 或 中立
  • 2 或 积极


from transformers import GPT2ForSequenceClassification

model = GPT2ForSequenceClassification.from_pretrained("gpt2", num_labels=3)

 

第六步:评估方法


Transformers库提供了一个名为“Trainer”的类,用于优化我们的模型的训练和评估。因此,在实际训练开始之前,我们需要定义一个函数来评估微调后的模型。


import evaluate

metric = evaluate.load("accuracy")

def compute_metrics(eval_pred):
logits, labels = eval_pred
predictions = np.argmax(logits, axis=-1)
return metric.compute(predictions=predictions, references=labels)

 

第七步:使用Trainer方法进行微调


最后一步是微调模型。为此,我们设置训练参数以及评估策略,并执行Trainer对象。


要执行Trainer对象,我们只需使用train()命令。


from transformers import TrainingArguments, Trainer

training_args = TrainingArguments(
output_dir="test_trainer",
#evaluation_strategy="epoch",
per_device_train_batch_size=1, # Reduce batch size here
per_device_eval_batch_size=1, # Optionally, reduce for evaluation as well
gradient_accumulation_steps=4
)


trainer = Trainer(
model=model,
args=training_args,
train_dataset=small_train_dataset,
eval_dataset=small_eval_dataset,
compute_metrics=compute_metrics,

)

trainer.train()

 

一旦我们的模型被微调,我们使用测试集来评估其性能。Trainer对象已经包含了一个优化的evaluate()方法。


import evaluate

trainer.evaluate()

 

这是一个对任何LLM进行微调的基本过程。


此外,请记住,微调LLM的过程对计算资源的需求很大,因此你的本地计算机可能没有足够的算力来执行它。


主要结论


如今,对像GPT这样的大型预训练语言模型进行特定任务的微调,对于提升LLM在特定领域的性能至关重要。它允许我们利用它们的自然语言处理能力,同时提高它们的效率和定制潜力,使该过程变得易于访问且成本效益高。


遵循这七个简单步骤——从选择合适的模型和数据集到训练和评估微调后的模型——我们可以在特定领域实现更出色的模型性能。

文章来源:https://www.kdnuggets.com/7-steps-to-mastering-large-language-model-fine-tuning
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消