当前位置:   article > 正文

如何在大模型中加入思维链进行推理_大模型数据集训练与思维链的关系

大模型数据集训练与思维链的关系

这期主要讲讲如何让大模型在某一个对话维度上有更好的性能。我在这里使用的方法是思维链技术,当然提升大模型性能的方法有很多,但是思维链是真的简单又好用啊!

1 相关定义

定义:思维链(Chain-of-thought,CoT) 的概念是在 Google 的论文 "Chain-of-Thought Prompting Elicits Reasoning in Large Language Models" 中被首次提出。思维链(CoT)是一种改进的提示策略,用于提高LLM 在复杂推理任务中的性能,如算术推理、常识推理和符号推理思维链是一种离散式提示学习,相比于传统的上下文学习(即通过作为输入来让大模型补全输出,思维链多了中间的推导提示,以下图为例:

带有思维链的模型输出给出了正确答案,而直接给出答案的传统提示学习,结果是错的。事实说明,带有推理过程的思维链模型具有更好的性能。

2 实验

这次的实验依然以悟道(Aquila)模型为基座模型。

我们现在的任务主要分两步:第一步:构造思维链训练集。第二步:在悟道预训练模型的基础上做SFT。

2.1构造思维链数据集

{'content''问题''summary''因为。。。,所以。。。'}

思维链的构造方式目前还没有一个明确的格式,但是只要遵循<问题,推理,结果>,这样的形式就可以。

2.2 SFT

关于模型微调的话,我直接用的huggingface的一个训练器,用LoRa的方式来做SFT。这里网上可以找到很多参考,我的也是借鉴,贴在下面供大家参考吧。

from transformers import Seq2SeqTrainer, Seq2SeqTrainingArguments#直接用huggingface的一个训练器class SFTTrainer(Seq2SeqTrainer):    def prediction_step(self, model, inputs, prediction_loss_only, ignore_keys=None, **gen_kwargs):        prompt_len, label_len = inputs['input_ids'].size(-1), inputs['labels'].size(-1)        if prompt_len > label_len:            inputs['labels'] = self._pad_tensors_to_target_len(inputs['labels'], inputs['input_ids'])        if label_len > prompt_len:            inputs['input_ids'] = self._pad_tensors_to_target_len(inputs['input_ids'], inputs['labels'])            if 'attention_mask' in inputs:                inputs['attention_mask'] = self._pad_tensors_to_target_len(inputs['attention_mask'], inputs['labels'])            if 'position_ids' in inputs:                inputs['position_ids'] = self._pad_tensors_to_target_len(inputs['position_ids'], inputs['labels'])        loss, generated_tokens, labels = super().prediction_step(            model, inputs, prediction_loss_only=prediction_loss_only, ignore_keys=ignore_keys)        generated_tokens = (generated_tokens[:, max(prompt_len, label_len):] if generated_tokens is not None else None)        return loss, generated_tokens, labels    def _pad_tensors_to_target_len(self, left, right):        if self.tokenizer.pad_token_id is None:            raise ValueError('Pad_token_id must be set in the configuration of the model.')        padded_tensor = self.tokenizer.pad_token_id * torch.ones_like(right)        if self.tokenizer.padding_side == 'left':            padded_tensor[:, -left.shape[-1]:] = left        else:            padded_tensor[:, :left.shape[-1]] = left        return padded_tensortraining_args = Seq2SeqTrainingArguments(        'output_dir',        do_train=True,        num_train_epochs=20,        logging_steps=50,        do_eval=False,        bf16=True,        per_device_train_batch_size=2,    )

3 结论

CoT对复杂任务有奇效。

CoT方法目前的局限:

1.如何设计思维链。

2.手工构建CoT的成本很高。

3.无法保证正确的推理路径,只能通过实验结果来验证。

最后,欢迎大家关注微信公众号:图灵智能实验室。不定期更新人工智能前沿算法与应用!

参考:

https://arxiv.org/pdf/2201.11903.pdf

CoT 开山之作:Chain-of-Thought Prompting Elicits Reasoning in Large Language Models,NeurIPS2022

Zero-Shot-CoT:Large language models are zero-shot reasoners. NeurIPS2022

AuTo-CoT:Automatic Chain of Thought Prompting in Large Language Models,ICLR2023

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/375942
推荐阅读
相关标签
  

闽ICP备14008679号