Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

你好,请问怎么进行中文数据集的有监督训练?输入命令是怎么样的? #12

Open
cjp756333828 opened this issue Aug 20, 2021 · 12 comments

Comments

@cjp756333828
Copy link

你好,请问怎么进行中文数据集的有监督训练?输入命令是怎么样的?

@yym6472
Copy link
Owner

yym6472 commented Aug 20, 2021

你好,中文有监督训练因为不是之前的工作重心,所以我们还没进行过相关的实验。目前的代码也还需要做一些更改才能跑起来,同时一些模型超参、使用何种损失效果最好也需要做一些探索(我会在这周末尽快更新、做一些实验)。

如果你想尽快跑起来中文数据集的有监督训练,可以对代码做以下更改:

  1. 如下更改data_utils.py的第231-235行:

            if split == "train":
                all_samples.append(InputExample(texts=[sent1, sent2], label=int(label)))
            else:
                all_samples.append(InputExample(texts=[sent1, sent2], label=float(label)))
  2. 更改main.py第203行第277行,去掉第三个参数(表示使用全数据集做训练和验证):

            train_samples = load_chinese_tsv_data(args.chinese_dataset, "train")
            dev_samples = load_chinese_tsv_data(args.chinese_dataset, "dev")
  3. 使用如下命令启动训练:

    python3 main.py --model_name_or_path ./chinese-roberta-wwm-ext/ --seed 1 --use_apex_amp --apex_amp_opt_level O1 --batch_size 96 --max_seq_length 64 --evaluation_steps 200 --concatenation_sent_max_square --model_save_path ./output/sup-base-atec_ccks --force_del --chinese_dataset atec_ccks
    

    如果要结合对比损失,可以参考scripts/sup-consert-joint-base.sh进一步加入以下参数:

    --add_cl --cl_rate 0.15 --temperature 0.1 --data_augmentation_strategy cutoff --cutoff_direction row --cutoff_rate 0.1
    

    这样做之后,训练时使用的监督损失形式是句子对分类交叉熵损失(与NLI训练时相同),如果要使用其他形式的损失,还需要进一步修改损失层的代码

@cjp756333828
Copy link
Author

好的,谢谢

@cjp756333828
Copy link
Author

cjp756333828 commented Aug 20, 2021

您好,请问这样修改后是按照论文里面哪种联合模式进行训练,体现在代码哪个地方?还是说变成使用传统交叉熵的训练方式(只使用AdvCLoftmaxLoss.py代码里面371行,而没有其他联合信息)?

@yym6472
Copy link
Owner

yym6472 commented Aug 21, 2021

您好,请问这样修改后是按照论文里面哪种联合模式进行训练,体现在代码哪个地方?还是说变成使用传统交叉熵的训练方式(只使用AdvCLoftmaxLoss.py代码里面371行,而没有其他联合信息)?

是的,这样就只是传统交叉熵损失训练。

@cjp756333828
Copy link
Author

您好,请问这样修改后是按照论文里面哪种联合模式进行训练,体现在代码哪个地方?还是说变成使用传统交叉熵的训练方式(只使用AdvCLoftmaxLoss.py代码里面371行,而没有其他联合信息)?

是的,这样就只是传统交叉熵损失训练。

感谢您的回答,受益良多

@HL0718
Copy link

HL0718 commented Nov 16, 2021

你好,中文有监督训练因为不是之前的工作重心,所以我们还没进行过相关的实验。目前的代码也还需要做一些更改才能跑起来,同时一些模型超参、使用何种损失效果最好也需要做一些探索(我会在这周末尽快更新、做一些实验)。

如果你想尽快跑起来中文数据集的有监督训练,可以对代码做以下更改:

  1. 如下更改data_utils.py的第231-235行:

            if split == "train":
                all_samples.append(InputExample(texts=[sent1, sent2], label=int(label)))
            else:
                all_samples.append(InputExample(texts=[sent1, sent2], label=float(label)))
  2. 更改main.py第203行第277行,去掉第三个参数(表示使用全数据集做训练和验证):

            train_samples = load_chinese_tsv_data(args.chinese_dataset, "train")
            dev_samples = load_chinese_tsv_data(args.chinese_dataset, "dev")
  3. 使用如下命令启动训练:

    python3 main.py --model_name_or_path ./chinese-roberta-wwm-ext/ --seed 1 --use_apex_amp --apex_amp_opt_level O1 --batch_size 96 --max_seq_length 64 --evaluation_steps 200 --concatenation_sent_max_square --model_save_path ./output/sup-base-atec_ccks --force_del --chinese_dataset atec_ccks
    

    如果要结合对比损失,可以参考scripts/sup-consert-joint-base.sh进一步加入以下参数:

    --add_cl --cl_rate 0.15 --temperature 0.1 --data_augmentation_strategy cutoff --cutoff_direction row --cutoff_rate 0.1
    

    这样做之后,训练时使用的监督损失形式是句子对分类交叉熵损失(与NLI训练时相同),如果要使用其他形式的损失,还需要进一步修改[损失层的代码](https://github.com/yym6472/ConSERT/blob/master/sentence_transformers/losses/AdvCLSoftmaxLoss.py#L454

您好,我在按照您的所说的方法,在修改了main.py文件和data_utils.py的相关内容后进行中文数据集stsb的有监督训练,但是会出现下面的错误:
Traceback(most recent call last):
File "main.py", line 327 , in
main(args)
File "main.py", line 297 , in main
early_stop_patience=args.patience)
File "/sentence_transformers/SentenceTransformer.py", line 595, in fit
self.tensorboard_writer.add_scalar(f"train_loss_{train_idx}", loss_value.item(), global_step=self.global_step)
RuntimeError: Cuda error:device-side assert triggered
CUDA kernel errors might be asynchronously reportrd at some other API call, so the stacktrace below might be incorrect
For debugging consider passing CUDA_LAUNCH_BLOCKING=1
exit status 1
如果我换成了是atec_ccks这个数据集的话,倒是正常可以跑通的,请问一下您知道具体是什么问题吗?

@HL0718
Copy link

HL0718 commented Nov 16, 2021

您好,请问这样修改后是按照论文里面哪种联合模式进行训练,体现在代码哪个地方?还是说变成使用传统交叉熵的训练方式(只使用AdvCLoftmaxLoss.py代码里面371行,而没有其他联合信息)?

是的,这样就只是传统交叉熵损失训练。

感谢您的回答,受益良多

请问一下,您有尝试使用stsb这个中文数据集进行有监督的训练吗?

@yym6472
Copy link
Owner

yym6472 commented Nov 16, 2021

@HL0718 在main.py里把num_classes改成6,因为STSB包含0~5的评分,而其他的数据集基本都是二分类(0或者1)。

@HL0718
Copy link

HL0718 commented Nov 16, 2021

@HL0718 在main.py里把num_classes改成6,因为STSB包含0~5的评分,而其他的数据集基本都是二分类(0或者1)。
能再请教一下吗?我没有在main.py文件里面找到您所说的num_classes参数,请问具体是在哪一行吗?

@yym6472
Copy link
Owner

yym6472 commented Nov 16, 2021

@HL0718 说错了,是num_labels,在254-265行

@HL0718
Copy link

HL0718 commented Nov 16, 2021

@HL0718 说错了,是num_labels,在254-265行

非常感谢!

@cjp756333828
Copy link
Author

cjp756333828 commented Nov 20, 2021 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants