
本教程详细阐述了如何利用Hugging Face Transformers库中的GPT-2模型来准确计算词向量和句向量。文章将指导读者完成从模型加载、数据分词、提取词级隐藏状态,到关键的填充词掩码处理,以及最终通过平均池化和长度归一化生成高质量句向量的完整流程。通过实际代码示例,确保读者能够掌握生成有效语义表示的关键技术。
在自然语言处理(NLP)领域,将文本数据转换为数值向量(即词向量和句向量)是许多下游任务(如文本分类、语义搜索、问答系统)的基础。这些向量能够捕捉词语和句子的语义信息,使得计算机能够理解和处理语言。GPT-2作为一种强大的预训练语言模型,其内部的隐藏状态天然地包含了丰富的上下文信息,是提取高质量词向量和句向量的理想选择。本文将详细介绍如何使用Hugging Face transformers库中的GPT-2模型,以规范和准确的方式计算这些语义表示。
首先,我们需要安装必要的库并加载GPT-2的分词器(Tokenizer)和模型。Hugging Face transformers库提供了便捷的接口来完成这些操作。
from transformers import GPT2Tokenizer, GPT2Model
import torch
# 加载GPT-2分词器和模型
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2Model.from_pretrained('gpt2')
# 设置填充令牌:GPT-2默认没有专门的pad_token,通常使用eos_token作为填充。
# 这确保了在处理不同长度序列时,填充部分也能被正确识别和处理。
tokenizer.pad_token = tokenizer.eos_token
# 示例句子列表
captions = [
"example caption",
"example bird",
"the bird is yellow has red wings",
"hi",
"very good"
]注意事项:
为了高效处理多个句子,我们需要将它们进行批量分词,并进行填充(Padding)和截断(Truncation)以确保所有输入序列长度一致。transformers库的分词器提供了非常方便的接口来完成这一系列操作。
# 对句子列表进行分词和填充
# return_tensors='pt' 返回PyTorch张量
# padding=True 启用填充,使所有序列长度一致
# truncation=True 启用截断,如果序列过长则截断
encoded_captions = tokenizer(
captions,
return_tensors='pt',
padding=True,
truncation=True
)
# input_ids 包含分词后的token ID
input_ids = encoded_captions['input_ids']
# attention_mask 标识哪些是真实token,哪些是填充token (1为真实,0为填充)
attention_mask = encoded_captions['attention_mask']
print(f"Input IDs shape: {input_ids.shape}")
print(f"Attention Mask shape: {attention_mask.shape}")input_ids 是一个形状为 [batch_size, sequence_length] 的张量,其中 sequence_length 是批次中最长句子的长度。attention_mask 具有相同的形状,它对于后续正确处理词向量至关重要。
词向量通常对应于模型最后一层隐藏状态的输出。GPT-2模型的前向传播会返回一个包含多个元素的元组,其中 outputs.last_hidden_state 即为我们所需的词向量。
# 在推理模式下运行模型,不需要计算梯度,可以节省内存和计算资源
with torch.no_grad():
outputs = model(input_ids)
# 提取最后一层的隐藏状态作为词向量
# 其形状为 [batch_size, sequence_length, hidden_size]
# 例如,对于gpt2模型,hidden_size通常是768
word_embeddings = outputs.last_hidden_state
print(f"Word Embeddings shape: {word_embeddings.shape}")word_embeddings 的形状为 [batch_size, max_seq_len, hidden_dim]。这意味着批次中的每个句子,其每个词(包括填充词)都有一个对应的 hidden_dim 维度的向量。
由于不同句子长度不一,我们通过填充使得它们长度一致。然而,这些填充词的向量不应参与句向量的计算,否则会引入噪声。因此,我们需要使用 attention_mask 来“掩盖”这些填充词的向量,使其对最终的句向量贡献为零。
# 扩展attention_mask的维度,使其与word_embeddings的维度匹配,以便进行逐元素乘法 # attention_mask的形状从 [batch_size, sequence_length] 变为 [batch_size, sequence_length, 1] # 然后通过广播机制与 word_embeddings (shape: [batch_size, sequence_length, hidden_size]) 相乘 # 这样,填充位置(mask为0)的词向量将被置为0 masked_word_embeddings = word_embeddings * attention_mask.unsqueeze(-1).float()
以上就是使用GPT-2计算词向量与句向量的实践指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号