0

0

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

DDD

DDD

发布时间:2025-11-24 11:29:45

|

227人浏览过

|

来源于php中文网

原创

使用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库的分词器提供了非常方便的接口来完成这一系列操作。

百度MCP广场
百度MCP广场

探索海量可用的MCP Servers

下载
# 对句子列表进行分词和填充
# 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()

相关专题

更多
登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6097

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

807

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1062

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1255

2024.03.01

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1023

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

66

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

447

2025.12.29

css中的padding属性作用
css中的padding属性作用

在CSS中,padding属性用于设置元素的内边距。想了解更多padding的相关内容,可以阅读本专题下面的文章。

133

2023.12.07

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

11

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.9万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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