使用DistilBert做下一词预测时始终输出句号的问题求助
问题排查:DistilBert预测下一词持续输出句号
你的代码存在三个核心问题,导致预测结果始终偏向句号:
1. 错误使用模型类型
你选用的DistilBertForMaskedLM是掩码语言模型(MLM),它的预训练任务是预测被掩码的token(比如[MASK]),而非自回归式的下一词预测。这类模型会同时关注上下文的前后信息,不适合做从左到右的序列延续任务,看到序列末尾时容易优先预测句子结束标记(句号)。
2. 输入格式不符合任务要求
你在输入序列末尾添加了[SEP] token,这是BERT用于句子配对、分类等任务的结束标记。模型看到[SEP]会判定当前句子已结束,自然会倾向于预测句号收尾,而非延续序列。
3. 未遵循自回归任务的输入逻辑
自回归下一词预测不需要[CLS]和[SEP]这类特殊标记,只需输入原始文本的token序列即可,模型会基于左侧已有的内容预测下一个token。
修正后的代码示例
换成专门用于自回归任务的distilgpt2模型(DistilGPT2是GPT2的轻量化版本,专为下一词预测优化):
import torch from transformers import DistilGPT2Tokenizer, DistilGPT2ForCausalLM # 加载自回归模型与分词器 model_name = 'distilgpt2' tokenizer = DistilGPT2Tokenizer.from_pretrained(model_name) model = DistilGPT2ForCausalLM.from_pretrained(model_name) # 示例句子 sentence = "I want to go to the" # 直接编码句子,无需手动添加特殊标记 input_ids = tokenizer.encode(sentence, return_tensors='pt') # 预测下一个词 with torch.no_grad(): outputs = model(input_ids) predictions = outputs.logits[0, -1] # 取最后一个位置的预测结果 # Top-k采样获取候选词 top_k = 5 probabilities = torch.softmax(predictions, dim=-1) top_k_predictions = torch.topk(probabilities, k=top_k) predicted_token_ids = top_k_predictions.indices.tolist() # 转换为可读单词 predicted_words = tokenizer.convert_ids_to_tokens(predicted_token_ids) # 输出结果 print(f"原句: {sentence}") print("预测的下一个候选词:") for word in predicted_words: print(word)
内容的提问来源于stack exchange,提问作者steve landiss
相关产品推荐
相关产品推荐

