大模型微调实战演练:使用代码剖析 Transformers Pipelines工作原理

文摘   2024-08-15 07:38   湖南  
在自然语言处理(NLP)领域,Transformers 模型已经成为了主流技术之一。无论是文本分类、情感分析,还是机器翻译,Transformers 都展现了强大的性能。今天,我们来详细解析一下 Transformers Pipelines 的运行原理,帮助大家更好地理解其内部机制。

一、基本流程

Transformers Pipeline 的运行流程主要分为四个阶段:Tokenization、Model Inference、Post-Processing 和 Prediction。下面我们详细讲解每一个阶段的具体作用,并通过代码示例进行演示。


1. Tokenization(分词)

原始文本(Raw Text)首先会经过Tokenizer进行处理。Tokenizer的任务是将输入的自然语言文本转换为模型能够理解的输入格式。这一过程包括:
  • 分词:将句子拆分成一个个单词或子词。

  • 映射到ID:将这些单词或子词映射到预定义的词汇表中的唯一标识符(Token IDs)。

代码示例:

from transformers import BertTokenizer
# 初始化BERT的Tokenizertokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
# 输入句子sentence = "This course is amazing!"
# 使用Tokenizer进行分词和映射到Token IDsinput_ids = tokenizer.encode(sentence, add_special_tokens=True)
print(f"Token IDs: {input_ids}")

在这个示例中,我们使用BERT的Tokenizer对句子进行处理,得到的Token IDs如下:

Token IDs: [101, 2023, 2607, 2003, 6429, 999, 102]

2. Model Inference(模型推理)

接下来,Token IDs 会被输入到预训练的Transformers模型中。这一阶段的主要任务是通过模型的多层神经网络结构,计算出每个Token的特征表示。模型的输出通常是Logits,即每个类别的未归一化的概率值。

代码示例:

import torchfrom transformers import BertModel
# 初始化BERT模型model = BertModel.from_pretrained('bert-base-uncased')
# 将Token IDs转化为Tensorinput_ids = torch.tensor([input_ids])
# 模型推理,得到输出with torch.no_grad(): outputs = model(input_ids)
# 获取最后一层的隐状态last_hidden_states = outputs.last_hidden_state
print(f"Last Hidden States: {last_hidden_states}")
在这个示例中,我们将Token IDs输入到BERT模型中,得到最后一层的隐状态(即Logits)。


3. Post-Processing(后处理)

在得到Logits之后,需要对其进行后处理。在大多数情况下,后处理过程包括将Logits转化为实际的概率值(通过Softmax函数),并根据具体任务进行进一步的处理。

代码示例:

from torch.nn.functional import softmax
# 假设模型的输出是logitslogits = torch.tensor([-4.3630, 4.6859])
# 对logits进行Softmax处理probabilities = softmax(logits, dim=-1)
print(f"Probabilities: {probabilities}")

在这个示例中,我们对Logits进行Softmax处理,得到每个类别的概率值。


4. Prediction(生成结果)

最后一步是生成最终的预测结果。根据后处理得到的概率值,选择概率最高的类别作为最终的预测结果。例如,对于情感分析任务,可能会输出正面和负面情感的概率值:
  • POSITIVE: 99.89%

  • NEGATIVE: 0.11%

代码示例:

from torch.nn.functional import softmax
# 假设模型的输出是logitslogits = torch.tensor([-4.3630, 4.6859])
# 对logits进行Softmax处理probabilities = softmax(logits, dim=-1)
print(f"Probabilities: {probabilities}")
在这个示例中,我们根据概率值选择了概率最高的类别作为最终的预测结果。


二、具体示例

让我们通过一个具体的例子来更好地理解这个过程:
  1. 输入句子:"This course is amazing!"

  2. 经过Tokenizer处理,得到Token IDs [101, 2023, 2607, 2003, 6429, 999, 102]。

  3. 将Token IDs输入模型,得到Logits [-4.3630, 4.6859]。

  4. 通过后处理,将Logits转化为概率值。

  5. 最终预测结果:POSITIVE 99.89%,NEGATIVE 0.11%。

完整代码示例:

from transformers import BertTokenizer, BertForSequenceClassificationimport torchfrom torch.nn.functional import softmax
# 初始化BERT的Tokenizer和模型tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2)
# 输入句子sentence = "This course is amazing!"
# 分词和映射到Token IDsinput_ids = tokenizer.encode(sentence, add_special_tokens=True)input_ids = torch.tensor([input_ids])
# 模型推理,得到logitswith torch.no_grad(): outputs = model(input_ids)logits = outputs.logits
# 对logits进行Softmax处理probabilities = softmax(logits, dim=-1)
# 定义类别labels = ["NEGATIVE", "POSITIVE"]
# 获取概率最高的类别predicted_label = labels[torch.argmax(probabilities)]
print(f"Prediction: {predicted_label}")

在这个完整的代码示例中,我们一步步地完成了从原始文本到最终预测结果的整个过程。


三、总结

通过以上详细解析和代码示例,我们可以看出Transformers Pipelines的运行过程是高度模块化的,每个阶段都承担着特定的任务。理解这些过程不仅能帮助我们更好地使用这些模型,还能为我们在实际应用中优化模型提供指导。
希望这篇文章能帮助您更好地理解Transformers Pipelines的运行原理,如果您有任何问题或需要进一步探讨,欢迎在评论区留言!

智能体AI
1、大模型只有结合业务才有意义,做出有价值的应用才是王道。2、基于大模型的开发要和传统程序结合。3、程序员的价值暴跌。4、产品经理的价值暴增。你需要及时更新自己的认知,帮大模型产品找到合理的价值主张。提供项目管理和AI应用的咨询服务。
 最新文章