Open naturesphere opened 9 months ago
我们的实现是正确的。孤立的“A”在BPE中指的是非词首的“A”,例如"helloA"里面的A。词首"A",即"_A"才是选项对应。
我们的实现是正确的。孤立的“A”在BPE中指的是非词首的“A”,例如"helloA"里面的A。词首"A",即"_A"才是选项对应。
prompt给的例子里,例如“答案:C”里,冒号和C之间没有空格,是直接连着的。从构造prompt的代码中能看到:
def format_example(line, subject, include_answer=True): example = f"以下是中国关于{task2desc[subject]}考试的单项选择题,请选出其中的正确答案。\n\n" example = example + line["question"] for choice in choices: example += f'\n{choice}. {line[f"{choice}"]}' if include_answer: example += "\n答案:" + line["answer"] + "\n\n" else: example += "\n答案:" return example
example += "\n答案:" + line["answer"] + "\n\n" 这里,“答案:”后面直接接选项。 以“答案:A”为例:
tokenizer("答案:A")['input_ids'] = [1, 29871, 40738, 30383, 29909]
A对应的编码是29909。如果在冒号和A之间加入空格:
tokenizer("答案: A")['input_ids']=[1, 29871, 40738, 30383, 319]
此时,A对应的编码是319,即字符'▁A'对应的编码。
我们的实现是正确的。孤立的“A”在BPE中指的是非词首的“A”,例如"helloA"里面的A。词首"A",即"_A"才是选项对应。
prompt给的例子里,例如“答案:C”里,冒号和C之间没有空格,是直接连着的。从构造prompt的代码中能看到:
def format_example(line, subject, include_answer=True): example = f"以下是中国关于{task2desc[subject]}考试的单项选择题,请选出其中的正确答案。\n\n" example = example + line["question"] for choice in choices: example += f'\n{choice}. {line[f"{choice}"]}' if include_answer: example += "\n答案:" + line["answer"] + "\n\n" else: example += "\n答案:" return example
example += "\n答案:" + line["answer"] + "\n\n" 这里,“答案:”后面直接接选项。 以“答案:A”为例:
tokenizer("答案:A")['input_ids'] = [1, 29871, 40738, 30383, 29909]
A对应的编码是29909。如果在冒号和A之间加入空格:
tokenizer("答案: A")['input_ids']=[1, 29871, 40738, 30383, 319]
此时,A对应的编码是319,即字符'▁A'对应的编码。
他们也许是想直接输出句首A作为答案,而不是答案字符串中的A.
Skywork/eval/文件夹下的evaluate_ceval.py, evaluate_cmmlu.py和evaluate_mmlu.py文件中,获取选项ABCD的概率的关键代码如下:
BCD选项也存在同样的问题。
评估时的一个full_prompt的例子格式如下:
根据full_prompt例子的格式,选项应该填在“答案:”后面,不应该另起一行。 因此选择ABCD选项的id时,应该取“A”“B”“C”"D"字符的概率,而不是“_A”,"_B","_C","_D"字符的概率。