[THUDM/ChatGLM-6B]训练的时候为啥labels都是100,只显示第一个的回答的input和labels

2024-05-20 450 views
2

input_ids [65326, 108258, 67164, 130001, 130004, 5, 80842, 6, 87361, 66810, 64709, 6, 66284, 66810, 64165, 64426, 65120, 68938, 85536, 11943, 63850, 67077, 63823, 72457, 63826, 65077, 63891, 64219, 64884, 6, 69735, 63963, 6, 66975, 64279, 104030, 69009, 65114, 64572, 63823, 130005, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] inputs 问题,回答。 labelids [-100, -100, -100, -100, 130004, 5, 80842, 6, 87361, 66810, 64709, 6, 66284, 66810, 64165, 64426, 65120, 68938, 85536, 11943, 63850, 67077, 63823, 72457, 63826, 65077, 63891, 64219, 64884, 6, 69735, 63963, 6, 66975, 64279, 104030, 69009, 65114, 64572, 63823, 130005, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100] labels <image-100> 您好,xxxxxxxxxxxxxxxxxxx。

OS: Ubuntu 20.04 Python: 3.8 Transformers: 4.26.1 PyTorch: 1.12 CUDA Support: True

bash train.sh

train.sh如下 PRE_SEQ_LEN=128 LR=2e-2

CUDA_VISIBLE_DEVICES=1 python3 main.py \ --do_train \ --train_file mydata/train.json \ --validation_file mydata/dev.json \ --prompt_column content \ --response_column summary \ --overwrite_cache \ --model_name_or_path THUDM/chatglm-6b \ --output_dir output/adgen-chatglm-6b-pt-12-$PRE_SEQ_LEN-$LR \ --overwrite_output_dir \ --max_source_length 64 \ --max_target_length 128 \ --per_device_train_batch_size 1 \ --per_device_eval_batch_size 1 \ --gradient_accumulation_steps 16 \ --predict_with_generate \ --max_steps 300 \ --logging_steps 50 \ --save_steps 10 \ --learning_rate $LR \ --pre_seq_len $PRE_SEQ_LEN \ --quantization_bit 4

Environment
- OS:
- Python:
- Transformers:
- PyTorch:
- CUDA Support (`python -c "import torch; print(torch.cuda.is_available())"`) :

回答

6

这是打印了一个例子吧

 def print_dataset_example(example):
        print("input_ids",example["input_ids"])
        print("inputs", tokenizer.decode(example["input_ids"]))
        print("label_ids", example["labels"])
        print("labels", tokenizer.decode(example["labels"]))
4

<image_-10

-100是因为不够字数,自动补-100吗

2

可能是这个,我也是问chatgpt的,我也不懂。在/ptuning/main.py里面 看到了这段代码

 input_ids = tokenizer.build_inputs_with_special_tokens(a_ids, b_ids)

context_length = input_ids.index(tokenizer.bos_token_id)
mask_position = context_length - 1
labels = [-100] * context_length + input_ids[mask_position+1:]

pad_len = max_seq_length - len(input_ids)
input_ids = input_ids + [tokenizer.pad_token_id] * pad_len
labels = labels + [tokenizer.pad_token_id] * pad_len
if data_args.ignore_pad_token_for_loss:
    labels = [(l if l != tokenizer.pad_token_id else -100) for l in labels]

model_inputs["input_ids"].append(input_ids)
model_inputs["labels"].append(labels)

ChatGPT 这段代码片段展示了对输入序列进行处理的过程,主要是为了构建用于训练的输入和标签。

首先,build_inputs_with_special_tokens函数使用tokenizer将a_ids和b_ids两个序列组合起来,并添加了特殊标记(如起始标记、终止标记等),生成input_ids。

然后,通过查找特殊标记(这里是bos_token_id)在input_ids中的位置,得到上下文的长度context_length。mask_position表示需要被预测的标记的位置,这里设置为context_length-1。

接下来,将labels初始化为context_length个-100,用于对上下文部分进行填充。之后,将剩余的input_ids(即需要被预测的标记之后的部分)添加到labels中。

根据最大序列长度max_seq_length对input_ids和labels进行填充,使用tokenizer的pad_token_id进行填充,使它们的长度达到max_seq_length。

如果设置了data_args.ignore_pad_token_for_loss为True,将labels中的pad_token_id替换为-100,以在计算损失时忽略pad标记。

总的来说,这段代码用于生成模型训练所需的input_ids和labels。input_ids是模型的输入序列,labels是模型的目标序列,其中包含了需要进行预测的标记。其他部分根据具体的上下文和需求进行填充和处理,以满足模型的输入要求。

User ignore_pad_token_for_loss 啥意思 ChatGPT ignore_pad_token_for_loss是一个布尔值参数,用于控制在计算损失时是否忽略填充标记(pad token)。

在使用填充标记对序列进行填充以达到相同长度时,通常会将填充标记的位置与实际需要预测的标记进行对齐。然而,填充标记并不具有实际的意义,因此在计算损失时将其考虑在内可能会干扰模型的训练。

当ignore_pad_token_for_loss参数设置为True时,表示希望在计算损失时忽略填充标记。具体做法是将labels中的填充标记对应的标签值替换为-100(通常用于表示忽略该标记),这样模型在计算损失时就不会将填充标记考虑在内。

这种处理方式有助于提高训练效果,避免填充标记对损失计算的影响。但需要确保填充标记在labels中的位置与输入序列中的填充标记位置保持一致,以便正确地计算损失和评估模型的性能。

8

非常感谢! 我过了一下代码,明白了这个流程。我还有一个问题想和您请教一下,就是在main函数中,config.prefix_projection = model_args.prefix_projectionmodel_args.prefix_projection是 False,而且后续的 ` if model_args.ptuning_checkpoint is not None:

Evaluation
    # Loading extra state dict of prefix encoder
    model = AutoModel.from_pretrained(model_args.model_name_or_path, config=config, trust_remote_code=True)
    prefix_state_dict = torch.load(os.path.join(model_args.ptuning_checkpoint, "pytorch_model.bin"))
    new_prefix_state_dict = {}
    for k, v in prefix_state_dict.items():
        if k.startswith("transformer.prefix_encoder."):
            new_prefix_state_dict[k[len("transformer.prefix_encoder."):]] = v
    model.transformer.prefix_encoder.load_state_dict(new_prefix_state_dict)
else:
    #  怎么设置prefix?
    model = AutoModel.from_pretrained(model_args.model_name_or_path, config=config, trust_remote_code=True)`  model_args.ptuning_checkpoint是None,这个确定是进行了P-Tuningv2的微调方式吗
0

请问这段代码,为什么在训练的时候,把问题+答案作为训练的input了呢?而不是单独把问题作为input,答案作为label呢?

7

请问这里的"build_inputs_with_special_tokens"方法,为什么要将问题和答案拼接起来作为输入呢?

9

请问这段代码,为什么在训练的时候,把问题+答案作为训练的input了呢?而不是单独把问题作为input,答案作为label呢?

我猜可能和prompt tuning有关系,就是prefixencoder.可以查查看

3

请问这段代码,为什么在训练的时候,把问题+答案作为训练的input了呢?而不是单独把问题作为input,答案作为label呢?

你好 请问你知道为什么了么?我也有这个疑问。

4

@PrimSun #551 作者给出了解释 autoregressive generation model 应该都是这样给的

2

那请问这个问题是该忽略掉还是需要做出更改吗

2

@starplatinum3 请教一下,这里

context_length = input_ids.index(tokenizer.bos_token_id)
mask_position = context_length - 1
labels = [-100] * context_length + input_ids[mask_position+1:]

这里就对bos_token_id这个token也计算loss了,这个位置的lable不是-100

是不是应该是

context_length = input_ids.index(tokenizer.bos_token_id) + 1
labels = [-100] * context_length + input_ids[context_length:]