您好,本人huggingface用户,初到贵宝地,有一个问题想请教。
我有一个需求需要获取填入mask位置的top k个候选token,在huggingface上一般会有xxxxforMaksedLM,我可以获取到每个token被填入的logits,PoNet在huggingface虽然也发布了,但是我看了一下似乎没有xxxxforMaksedLM的功能;在modelscope倒是有fill-mask的pipeline,但是使用这个pipeline只能得到一个已经填入的完整句子,无法获取每个token的logits。
我目前正在探索魔改modelscope包的源代码来实现,但总感觉这么做心里不踏实,请问有没有优雅的写法?
在PoNet中,要获取mask位置的top k个token,您可以使用以下步骤:
准备输入数据:将需要进行推断的文本序列准备好,并在其中选择一个或多个位置作为mask。确保你知道哪些位置是mask。
生成模型的输入:将文本序列编码为模型所需的输入格式。这通常涉及将文本转换为对应的token IDs,并在 mask 位置插入一个特殊的 mask token ID。
运行推理:使用预训练的 PoNet 模型来进行推理。将准备好的输入数据提供给模型,并获得模型对于 mask 位置的输出。
获取 top k 个 token:从模型的输出中,选择概率最高的 k 个 token。这些 token 的概率值可以用来衡量它们在给定上下文中合适的可能性。
请注意,具体代码实现和调整会根据您使用的框架和工具而有所不同。这里只提供了高层次的步骤说明。建议您参考相关的深度学习框架文档和示例代码,以获取更具体的实现细节和代码示例。
使用 PoNet 模型的 generate 方法来获取每个填充位置的 top-k 个候选词及其对应的概率分数:
python
Copy
from transformers import PoNetTokenizer, PoNetForCausalLM
tokenizer = PoNetTokenizer.from_pretrained("pocket/poetrynet")
model = PoNetForCausalLM.from_pretrained("pocket/poetrynet")
input_text = "我喜欢[MASK]。"
mask_token_index = input_text.index("[MASK]")
input_ids = tokenizer.encode(input_text, return_tensors="pt")
generate_kwargs = {
"do_sample": False,
"top_k": 5,
"return_dict_in_generate": True,
"output_scores": True,
}
outputs = model.generate(
input_ids,
**generate_kwargs,
attention_mask=input_ids.ne(tokenizer.pad_token_id),
mask_token_id=tokenizer.mask_token_id,
mask_token_indices=[mask_token_index],
)
mask_logits = outputs.sequences_logits[0, mask_token_index]
mask_top_k_indices = mask_logits.topk(k=5).indices.tolist()
mask_top_k_tokens = [tokenizer.convert_ids_to_tokens([index])[0] for index in mask_top_k_indices]
mask_top_k_scores = mask_logits[mask_top_k_indices].softmax(dim=-1).tolist()
print(mask_top_k_tokens)
print(mask_top_k_scores)
在这个示例中,我们首先使用 PoNetTokenizer 对输入文本进行编码,并找到 [MASK] 的位置。