使用GPT-2计算词向量与句向量的实践指南

DDD
发布: 2025-11-24 11:29:45
原创
157人浏览过

使用gpt-2计算词向量与句向量的实践指南

本教程详细阐述了如何利用Hugging Face Transformers库中的GPT-2模型来准确计算词向量和句向量。文章将指导读者完成从模型加载、数据分词、提取词级隐藏状态,到关键的填充词掩码处理,以及最终通过平均池化和长度归一化生成高质量句向量的完整流程。通过实际代码示例,确保读者能够掌握生成有效语义表示的关键技术。

1. 引言:GPT-2与词句向量

自然语言处理(NLP)领域,将文本数据转换为数值向量(即词向量和句向量)是许多下游任务(如文本分类、语义搜索、问答系统)的基础。这些向量能够捕捉词语和句子的语义信息,使得计算机能够理解和处理语言。GPT-2作为一种强大的预训练语言模型,其内部的隐藏状态天然地包含了丰富的上下文信息,是提取高质量词向量和句向量的理想选择。本文将详细介绍如何使用Hugging Face transformers库中的GPT-2模型,以规范和准确的方式计算这些语义表示。

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"
]
登录后复制

注意事项:

  • tokenizer.pad_token = tokenizer.eos_token 是一个关键步骤,它告诉分词器在进行批量处理时,用什么令牌来填充较短的序列,使其与最长序列对齐。对于GPT-2,通常使用其结束符(End-of-Sentence token)作为填充符。

3. 数据准备与分词

为了高效处理多个句子,我们需要将它们进行批量分词,并进行填充(Padding)和截断(Truncation)以确保所有输入序列长度一致。transformers库的分词器提供了非常方便的接口来完成这一系列操作。

绘蛙AI修图
绘蛙AI修图

绘蛙平台AI修图工具,支持手脚修复、商品重绘、AI扩图、AI换色

绘蛙AI修图 279
查看详情 绘蛙AI修图
# 对句子列表进行分词和填充
# 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 具有相同的形状,它对于后续正确处理词向量至关重要。

4. 提取词向量

词向量通常对应于模型最后一层隐藏状态的输出。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 维度的向量。

5. 处理填充词与掩码机制

由于不同句子长度不一,我们通过填充使得它们长度一致。然而,这些填充词的向量不应参与句向量的计算,否则会引入噪声。因此,我们需要使用 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中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号