You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用RobertaModel正确计算上下文嵌入?两种方法辨析

关于RobertaModel计算上下文嵌入的正确方式

我尝试使用RobertaModel计算上下文嵌入,但不确定正确的实现方法,目前已尝试两种方式:

第一种方法代码如下:

from transformers import RobertaModel, RobertaTokenizer
import torch

model = RobertaModel.from_pretrained('roberta-base')
tokenizer = RobertaTokenizer.from_pretrained('roberta-base')

captions = ["example caption", "colorful bird"]

tokenized_captions = tokenizer(captions, return_tensors='pt', padding=True)

input_ids = tokenized_captions['input_ids']
attention_mask = tokenized_captions['attention_mask']

output = model(input_ids, attention_mask)
contextualized_embedding = output.last_hidden_state

print(contextualized_embedding)

该方法的输出中,padding token对应非零权重;

第二种方法仅修改输出相关代码:

output = model(input_ids)
contextualized_embedding = output.last_hidden_state * attention_mask.unsqueeze(-1).float()

该方法的输出中,padding token对应零值。请问哪一种方法才是计算上下文嵌入的正确方式?


第一种方法是计算上下文嵌入的正确方式,原因如下:

  • RobertaModel的attention_mask参数核心作用是让模型在注意力计算阶段忽略padding token,模型内部会自动处理padding位置的信息,确保这些位置的注意力权重不会干扰有效token的上下文编码。因此传入attention_mask后,last_hidden_state中padding位置的非零向量是模型合理计算后的输出,并非无效值。
  • 第二种手动将padding位置向量置零的操作多余且不符合模型设计规范:模型已经通过attention_mask屏蔽了padding的注意力影响,手动置零会破坏模型原本输出的向量信息;后续若需对嵌入做池化(如均值池化),正确做法是结合attention_mask计算有效token的均值,而非提前置零。

总结:调用model时必须传入attention_mask,直接使用last_hidden_state作为上下文嵌入即可,无需手动处理padding位置的向量。

内容的提问来源于stack exchange,提问作者user23232264

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 05:55:10