请问PoNet如何获取mask位置的top k个token?

您好,本人huggingface用户,初到贵宝地,有一个问题想请教。
我有一个需求需要获取填入mask位置的top k个候选token,在huggingface上一般会有xxxxforMaksedLM,我可以获取到每个token被填入的logits,PoNet在huggingface虽然也发布了,但是我看了一下似乎没有xxxxforMaksedLM的功能;在modelscope倒是有fill-mask的pipeline,但是使用这个pipeline只能得到一个已经填入的完整句子,无法获取每个token的logits。
我目前正在探索魔改modelscope包的源代码来实现,但总感觉这么做心里不踏实,请问有没有优雅的写法?

展开
收起
aliyun1947508984 2023-07-09 11:57:20 322 分享 版权
3 条回答
写回答
取消 提交回答
  • 在PoNet中,要获取mask位置的top k个token,您可以使用以下步骤:

    1. 准备输入数据:将需要进行推断的文本序列准备好,并在其中选择一个或多个位置作为mask。确保你知道哪些位置是mask。

    2. 生成模型的输入:将文本序列编码为模型所需的输入格式。这通常涉及将文本转换为对应的token IDs,并在 mask 位置插入一个特殊的 mask token ID。

    3. 运行推理:使用预训练的 PoNet 模型来进行推理。将准备好的输入数据提供给模型,并获得模型对于 mask 位置的输出。

    4. 获取 top k 个 token:从模型的输出中,选择概率最高的 k 个 token。这些 token 的概率值可以用来衡量它们在给定上下文中合适的可能性。

    请注意,具体代码实现和调整会根据您使用的框架和工具而有所不同。这里只提供了高层次的步骤说明。建议您参考相关的深度学习框架文档和示例代码,以获取更具体的实现细节和代码示例。

    2023-07-10 14:07:52
    赞同 展开评论
  • 北京阿里云ACE会长

    使用 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")

    设置生成参数,包括 top-k 个候选词和返回 logits

    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],
    )

    获取每个填充位置的 top-k 个候选词及其对应的概率分数

    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] 的位置。

    2023-07-10 07:51:10
    赞同 展开评论
  • 已解决,见链接:link

    2023-07-09 23:08:07
    赞同 展开评论

包含命名实体识别、文本分类、分词、关系抽取、问答、推理、文本摘要、情感分析、机器翻译等多个领域

热门讨论

热门文章

还有其他疑问?
咨询AI助理