我收集了大量文档,每个文档由大约 10 个句子组成。对于每个文档,我希望找到最大化困惑度的句子,或者等效于微调因果 LM 的损失。我决定使用 Hugging Face 和distilgpt2模型来实现此目的。当尝试以有效(矢量化)方式进行操作时,我遇到两个问题:
分词器需要填充才能在批处理模式下工作,但是在计算填充的损失时,input_ids这些填充标记会造成损失。因此,给定句子的损失取决于批次中最长句子的长度,这显然是错误的。
当我将一批输入 ID 传递给模型并计算损失时,我得到一个标量,因为它(意思是?)跨批次池化。相反,我需要的是每件物品的损失,而不是汇总的损失。
我制作了一个逐句运行的版本,虽然正确,但速度非常慢(我想总共处理约 2500 万个句子)。有什么建议吗?
下面的最小示例:
# Init
tokenizer = AutoTokenizer.from_pretrained("distilgpt2")
tokenizer.pad_token = tokenizer.eos_token
model = AutoModelForCausalLM.from_pretrained("clm-gpu/checkpoint-138000")
segmenter = spacy.load('en_core_web_sm')
# That's the part I need to vectorise, surely within a document (bsize ~ 10)
# and ideally across documents (bsize as big as my GPU can handle)
def select_sentence(sentences):
"""We pick the sentence that maximizes perplexity"""
max_loss, best_index = 0, 0
for i, sentence in …Run Code Online (Sandbox Code Playgroud) python nlp huggingface-transformers large-language-model huggingface-evaluate