赞
踩
这期主要讲讲如何让大模型在某一个对话维度上有更好的性能。我在这里使用的方法是思维链技术,当然提升大模型性能的方法有很多,但是思维链是真的简单又好用啊!
定义:思维链(Chain-of-thought,CoT) 的概念是在 Google 的论文 "Chain-of-Thought Prompting Elicits Reasoning in Large Language Models" 中被首次提出。思维链(CoT)是一种改进的提示策略,用于提高LLM 在复杂推理任务中的性能,如算术推理、常识推理和符号推理。思维链是一种离散式提示学习,相比于传统的上下文学习(即通过作为输入来让大模型补全输出,思维链多了中间的推导提示,以下图为例:
带有思维链的模型输出给出了正确答案,而直接给出答案的传统提示学习,结果是错的。事实说明,带有推理过程的思维链模型具有更好的性能。
这次的实验依然以悟道(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_tensor
training_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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。