Isso é mais um projeto experimental/de pesquisa. Ele implementa um pipeline de estimulação combinado com um invólucro para etapas de decomposição automática e pesquisas através do "espaço de passo" (por exemplo, por pesquisa de feixes, MCTs, etc.) guiada pela autoavaliação.
Alguns dos códigos de Exigação de Dados/Exigação de Dados ( utils.py
e answer_extraction.py
) são adaptados de: https://github.com/agi-edgerunners/plan-and-solve-prompting
Referências de conjunto de dados:
@misc{cobbe2021training,
title={Training Verifiers to Solve Math Word Problems},
author={Karl Cobbe and Vineet Kosaraju and Mohammad Bavarian and Mark Chen and Heewoo Jun and Lukasz Kaiser and Matthias Plappert and Jerry Tworek and Jacob Hilton and Reiichiro Nakano and Christopher Hesse and John Schulman},
year={2021},
eprint={2110.14168},
archivePrefix={arXiv},
primaryClass={cs.LG}}
@inproceedings{patel-etal-2021-nlp,
title = "Are {NLP} Models really able to Solve Simple Math Word Problems?",
author = "Patel, Arkil and
Bhattamishra, Satwik and
Goyal, Navin",
booktitle = "Proceedings of the 2021 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies",
month = jun,
year = "2021",
address = "Online",
publisher = "Association for Computational Linguistics",
url = "https://aclanthology.org/2021.naacl-main.168",
doi = "10.18653/v1/2021.naacl-main.168",
pages = "2080--2094",
abstract = "The problem of designing NLP solvers for math word problems (MWP) has seen sustained research activity and steady gains in the test accuracy. Since existing solvers achieve high performance on the benchmark datasets for elementary level MWPs containing one-unknown arithmetic word problems, such problems are often considered {``}solved{''} with the bulk of research attention moving to more complex MWPs. In this paper, we restrict our attention to English MWPs taught in grades four and lower. We provide strong evidence that the existing MWP solvers rely on shallow heuristics to achieve high performance on the benchmark datasets. To this end, we show that MWP solvers that do not have access to the question asked in the MWP can still solve a large fraction of MWPs. Similarly, models that treat MWPs as bag-of-words can also achieve surprisingly high accuracy. Further, we introduce a challenge dataset, SVAMP, created by applying carefully chosen variations over examples sampled from existing datasets. The best accuracy achieved by state-of-the-art models is substantially lower on SVAMP, thus showing that much remains to be done even for the simplest of the MWPs.",
}
@inproceedings{ling-etal-2017-program,
title = "Program Induction by Rationale Generation: Learning to Solve and Explain Algebraic Word Problems",
author = "Ling, Wang and
Yogatama, Dani and
Dyer, Chris and
Blunsom, Phil",
booktitle = "Proceedings of the 55th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)",
month = jul,
year = "2017",
address = "Vancouver, Canada",
publisher = "Association for Computational Linguistics",
url = "https://aclanthology.org/P17-1015",
doi = "10.18653/v1/P17-1015",
pages = "158--167",
abstract = "Solving algebraic word problems requires executing a series of arithmetic operations{---}a program{---}to obtain a final answer. However, since programs can be arbitrarily complicated, inducing them directly from question-answer pairs is a formidable challenge. To make this task more feasible, we solve these problems by generating answer rationales, sequences of natural language and human-readable mathematical expressions that derive the final answer through a series of small steps. Although rationales do not explicitly specify programs, they provide a scaffolding for their structure via intermediate milestones. To evaluate our approach, we have created a new 100,000-sample dataset of questions, answers and rationales. Experimental results show that indirect supervision of program learning via answer rationales is a promising strategy for inducing arithmetic programs.",}
@inproceedings{talmor-etal-2019-commonsenseqa,
title = "{C}ommonsense{QA}: A Question Answering Challenge Targeting Commonsense Knowledge",
author = "Talmor, Alon and
Herzig, Jonathan and
Lourie, Nicholas and
Berant, Jonathan",
booktitle = "Proceedings of the 2019 Conference of the North {A}merican Chapter of the Association for Computational Linguistics: Human Language Technologies, Volume 1 (Long and Short Papers)",
month = jun,
year = "2019",
address = "Minneapolis, Minnesota",
publisher = "Association for Computational Linguistics",
url = "https://aclanthology.org/N19-1421",
doi = "10.18653/v1/N19-1421",
pages = "4149--4158",
abstract = "When answering a question, people often draw upon their rich world knowledge in addition to the particular context. Recent work has focused primarily on answering questions given some relevant document or context, and required very little general background. To investigate question answering with prior knowledge, we present CommonsenseQA: a challenging new dataset for commonsense question answering. To capture common sense beyond associations, we extract from ConceptNet (Speer et al., 2017) multiple target concepts that have the same semantic relation to a single source concept. Crowd-workers are asked to author multiple-choice questions that mention the source concept and discriminate in turn between each of the target concepts. This encourages workers to create questions with complex semantics that often require prior knowledge. We create 12,247 questions through this procedure and demonstrate the difficulty of our task with a large number of strong baselines. Our best baseline is based on BERT-large (Devlin et al., 2018) and obtains 56{%} accuracy, well below human performance, which is 89{%}.",
}
@article{geva-etal-2021-aristotle,
title = "Did Aristotle Use a Laptop? A Question Answering Benchmark with Implicit Reasoning Strategies",
author = "Geva, Mor and
Khashabi, Daniel and
Segal, Elad and
Khot, Tushar and
Roth, Dan and
Berant, Jonathan",
journal = "Transactions of the Association for Computational Linguistics",
volume = "9",
year = "2021",
address = "Cambridge, MA",
publisher = "MIT Press",
url = "https://aclanthology.org/2021.tacl-1.21",
doi = "10.1162/tacl_a_00370",
pages = "346--361",
abstract = "A key limitation in current datasets for multi-hop reasoning is that the required steps for answering the question are mentioned in it explicitly. In this work, we introduce StrategyQA, a question answering (QA) benchmark where the required reasoning steps are implicit in the question, and should be inferred using a strategy. A fundamental challenge in this setup is how to elicit such creative questions from crowdsourcing workers, while covering a broad range of potential strategies. We propose a data collection procedure that combines term-based priming to inspire annotators, careful control over the annotator population, and adversarial filtering for eliminating reasoning shortcuts. Moreover, we annotate each question with (1) a decomposition into reasoning steps for answering it, and (2) Wikipedia paragraphs that contain the answers to each step. Overall, StrategyQA includes 2,780 examples, each consisting of a strategy question, its decomposition, and evidence paragraphs. Analysis shows that questions in StrategyQA are short, topic-diverse, and cover a wide range of strategies. Empirically, we show that humans perform well (87{%}) on this task, while our best baseline reaches an accuracy of ∼ 66{%}.",
}
requirements.txt
(As principais bibliotecas Big 3 são Transformers Huggingface, VLLM e Pytorch - o restante é principalmente dependências.)A base de código é configurada principalmente para trabalhar com modelos compatíveis com VLLM.
model.py
(consulte o construtor da classe geradora). Eu uso os caminhos dos pontos de verificação baixados localmente para que ele não funcione fora da caixa, a menos que você faça o download dos pontos de verificação em um caminho semelhante ou altere o caminho.Se você deseja adicionar um novo modelo (VLLM Compatible), faça o seguinte:
argparser.py
para a opção model
.prompt.py
(consulte Exemplos no final do arquivo de código) (opcional; existe um prompt padrão, mas provavelmente não seria o ideal).model.py
(consulte o construtor da classe geradora nesse arquivo para obter exemplos).Este é um modelo geral para execução de código:
python main.py --search_style=MultiSearch --model=LLAMA30_instruct --gpu_ids="0,1" --prompt_style=cot --dataset=gsm8k --reward_types=confidence+correctness
Isso executaria o LLAMA 30B Instruct com o prompt de cadeia de pensamento com tiro zero ( cot
) usando MultiSearch
(a ser explicado abaixo) como uma estratégia de pesquisa no GSM8K
usando uma função de recompensa ( confidence+correctness
-a ser explicada abaixo) para orientação de pesquisa . Os pesos do modelo serão distribuídos para CUDA: 0 e CUDA: 1 ( gpu_ids="0,1"
).
Alguns outros argumentos salientes:
checkpoint
- Defina -o verdadeiro se você estiver carregando alguns pontos de verificação salvos anteriores (os pontos de verificação são salvos automaticamente)SC
- Defina -o verdadeiro para ativar a autoconsistência [1]. Somente relevante se search_style=none
. As opções disponíveis para cada argumento e os padrões podem ser encontrados no argparser.py
.
Você encontrará logs de execução em logs/
Neste projeto, empregamos várias estratégias de pesquisa no nível das etapas de raciocínio (cada etapa de raciocínio conta como "um único movimento no jogo"). Isso também levanta a questão de como decompor a geração em uma série de etapas. Uma maneira de fazer isso é criar qualquer modelo de prompt arbitrário com uma estrutura clara (que possa ser usada para analisar as etapas) e, em seguida, usar alguns exemplos de tiro com o modelo para iniciar o modelo para seguir a estrutura. Aqui, no entanto, estou interessado no regime de tiro zero. Eu tento usar instruções de prompt de tiro zero de maneiras específicas para incitar diferentes formas de descomposição automática das etapas. Abaixo, discuto todos os estilos rápidos usados neste projeto e sua metodologia de decomposição correspondente.
Cadeia de Thoughts ( cot
)-Isso usa o prompt padrão de tiro com tiro zero padrão Let's think step by step.
[2]. Para a decomposição da etapa n
(nova linha) é usada. Existem algumas configurações adicionais para ignorar adequadamente novas linhas vazias e tal. Por fim, essa não é necessariamente uma maneira ideal de decompor as etapas de raciocínio, nem todas as novas linhas nos resultados do COT seriam etapas completas de raciocínio, mas é um ponto de partida da linha de base que pode ser feito de maneira zero.
Etapa da cadeia de Thoughts ( cot_step
)-Esta é uma extensão simples do berço zero: Let's think step by step. Step 1:
. Isso representa automaticamente o modelo de idioma para organizar sua cadeia de raciocínio em etapas numeradas (Etapa 1: XYZ Etapa2: ABC ...). Essa estrutura pode ser usada facilmente para decompor as etapas.
PS+ ( ps
) - Este é o plano de tiro zero e o prompt de resolução (versão PS+) introduzida em [3]. A nova decomposição de linha é usada semelhante ao cot
.
Tabular Cadeia de Thoughts ( cot_tab
)-Este é o prompt de COT do Tabular Zero-Shot introduzido em [4]- n|step|subquestion|process|result|n
. É uma maneira simples de produzir etapas de raciocínio de formato tabular estruturado. Utilizamos a Newline para decomposição novamente, mas diferentemente antes que a decomposição da Newline seja mais significativa aqui - porque cada Newline decomposta corresponderá a uma etapa na tabela.
Estrutura ( struct
) - Este prompt usa elementos de muitos dos pedidos acima. Ele fornece instruções detalhadas para decompor a solução/resposta em etapas e substaus (com identificação de subproblem, fatos relevantes e solução). Isso produz resultados altamente estruturados e pode ser decomposto de acordo com a estrutura semelhante à cot
. Os detalhes do prompt podem ser encontrados no prompt.py
e o código de decomposição pode ser encontrado em node_transition.py
.
Estrutura mínima ( struct_min
) - é semelhante à estrutura com uma subestégita a menos. Detalhes em prompt.py
. Eu não executei essa variante - pode haver bugs.
Você pode modificar prompt.py
para adicionar alguns prompts de tiro.
Todos os códigos de pesquisa podem ser encontrados na Search/
.
none
- Este método não aplica nenhuma estratégia de pesquisa específica além da decodificação gananciosa autorregressiva padrão. Isso pode ser combinado com SC=True
para autoconsistência com múltiplas amostragem.MultiSearch
- Essa estratégia usa multi -amostragem. Em seguida, as recompensas para cada amostra (recompensa acumulativa por cada etapa decomposta) são geradas após o fato. As recompensas são usadas para votar respostas de várias maneiras a serem descritas posteriormente.MultiGreedy
- Essa estratégia usa pesquisa gananciosa, mas no nível das etapas (ao contrário de none
). Em todas as iterações, dada a cadeia de histórias de etapas de raciocínio, o modelo gera alguns candidatos a etapa de raciocínio K. Cada um dos K candidatos é então pontuado (atribuído uma recompensa). Em seguida, o candidato de pontuação máxima é selecionado. Essa estratégia é usada em paralelo para várias amostras de etapas iniciais de raciocínio que levam a vários resultados de pesquisa que podem ser usados para autoconsistência. Essa estratégia de pesquisa pode ser considerada semelhante ao DFS da Árvore do Pensamento [5], mas sem qualquer retrocesso.BeamSearch
- Esta é a versão de pesquisa de feixe do acima. A implementação é inspirada em [6]. Além disso, esse método pode ser considerado semelhante ao método BFS (com fronteiras truncadas) usadas na Árvore do Pensamento [5].DivBeamSearch
- É o mesmo que a pesquisa de feixe, mas incentiva mais diversidade na geração, restringindo os irmãos. Em cada iteração, é permitido um máximo de M (m << tamanho do feixe (eu uso m = 2)). Se houver espaço no tamanho do feixe depois de escolher todos os candidatos após a restrição dos candidatos residuais, são adicionados com base em suas recompensas. A idéia é semelhante em espírito a [7], mas não modificamos estritamente a equação da pontuação com uma penalidade - mas usamos mais uma restrição difícil, conforme descrito.MCTS
- Esta é a pesquisa de árvores de Monte Carlo. A implementação segue a estrutura aqui aproximadamente. É preciso alguma inspiração de [8].SPMCTS
- Esta implementação (pesquisa semi -paralela de Monte Carlo Tree) paraleliza um pouco mais os MCTs. Ele seleciona várias folhas de uma só vez e é lançado vários caminhos de uma só vez. Como tal, é preciso menos iterações seqüenciais. O resultado final é um número semelhante de amostras como o MCTS. As implementações não são computacionalmente equivalentes e não pretendem ser.Nota, embora alguns dos métodos sejam inspirados por trabalhos anteriores, eles não são tentados para serem implementações perfeitamente fiéis desses documentos.
Semelhante a [6,8], a recompensa para cada etapa é calculada com base na auto-avaliação e na confiança da geração da etapa (com base em logProbs). A técnica de auto-avaliação usa o LLMS para avaliar suas próprias gerações, fazendo perguntas com várias escolhas (MCQ) sobre a utilidade/correção da etapa (as perguntas de auto-avaliação podem ser encontradas no rewards.py
).
Diferentes tipos de tipos de recompensa e combos estão disponíveis como argumentos no argparse.py
.
confidence
- usa apenas a confiança (com base em logProbs) como recompensa.correctness
- usa apenas probabilidades de resposta a partir de um MCQ relacionado à correção da etapa como recompensa.helpfulness
- usa apenas as probabilidades de resposta de uma etapa MCQ relacionada à utilidade como recompensaboth
- usa correctness
e helpfulness
.confidence+correctness
- usa confidence
e correctness
.confidence+helpfulness
- usa confidence
e helpfulness
.confidence+both
- usa toda a confidence
, correctness
e helpfulness
. NB: Estilos de prompt struct
e struct-min
seguem regras diferentes. Eles têm estruturas substanciais de grão fino e usam recompensas apropriadas para elas. A subestep de identificação de subproblemas usa apenas uma recompensa relacionada à utilidade (porque tecnicamente não é uma etapa de raciocínio para estar correta/incorreta) e a etapa da solução usa apenas a questão relacionada à correção (porque presumivelmente, o subproblema é a ajuda a solução).
Os MCQs usados para diferentes instruções e diferentes tipos de recompensa para auto-avaliação podem ser encontrados em reward.py
.
Vários tipos de mecanismos de votação de resposta são implementados e rastreados automaticamente simultaneamente em main.py
(não relacionados a nenhuma opção argparse.py
). Eles são:
Voted Answer
em toras) - apenas votação de maioria simples [1].Reward Voted Answer
em toras) - semelhante ao voto da maioria, mas o valor de cada voto é a recompensa ( Top K Reward Voted Answer
em toras) - Selecione K Top K (usamos K = 5) Respostas mais altas e depois apliquem a votação de recompensa entre elas. Isso permite filtrar respostas potencialmente "ruins" de baixa recompensa que podem potencialmente aumentar os votos.Max Reward Answer
em logs) - selecione a resposta com a recompensa máxima.node_transition.py
um pouco mais (particularmente o cálculo da recompensa), mas não obtive muito benefício no custo de tempo empírico.none
(que atualmente é a mais rápida). Mas isso pode exigir transformadores de vllm e huggingface de modificação.[1] A autoconsistência melhora a cadeia de raciocínio de pensamento em modelos de linguagem
@inproceedings{
wang2023selfconsistency,
title={Self-Consistency Improves Chain of Thought Reasoning in Language Models},
author={Xuezhi Wang and Jason Wei and Dale Schuurmans and Quoc V Le and Ed H. Chi and Sharan Narang and Aakanksha Chowdhery and Denny Zhou},
booktitle={The Eleventh International Conference on Learning Representations },
year={2023},
url={https://openreview.net/forum?id=1PL1NIMMrw}
}
[2] Modelos de idiomas grandes são raciocinadores de tiro zero
@inproceedings{NEURIPS2022_8bb0d291,
author = {Kojima, Takeshi and Gu, Shixiang (Shane) and Reid, Machel and Matsuo, Yutaka and Iwasawa, Yusuke},
booktitle = {Advances in Neural Information Processing Systems},
editor = {S. Koyejo and S. Mohamed and A. Agarwal and D. Belgrave and K. Cho and A. Oh},
pages = {22199--22213},
publisher = {Curran Associates, Inc.},
title = {Large Language Models are Zero-Shot Reasoners},
url = {https://proceedings.neurips.cc/paper_files/paper/2022/file/8bb0d291acd4acf06ef112099c16f326-Paper-Conference.pdf},
volume = {35},
year = {2022}
}
[3] Promoção de plano e solução: Melhorando o raciocínio da cadeia de pensamento zero por modelos de idiomas grandes
@inproceedings{wang-etal-2023-plan,
title = "Plan-and-Solve Prompting: Improving Zero-Shot Chain-of-Thought Reasoning by Large Language Models",
author = "Wang, Lei and
Xu, Wanyu and
Lan, Yihuai and
Hu, Zhiqiang and
Lan, Yunshi and
Lee, Roy Ka-Wei and
Lim, Ee-Peng",
booktitle = "Proceedings of the 61st Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)",
month = jul,
year = "2023",
address = "Toronto, Canada",
publisher = "Association for Computational Linguistics",
url = "https://aclanthology.org/2023.acl-long.147",
pages = "2609--2634",
abstract = "Large language models (LLMs) have recently been shown to deliver impressive performance in various NLP tasks. To tackle multi-step reasoning tasks, Few-shot chain-of-thought (CoT) prompting includes a few manually crafted step-by-step reasoning demonstrations which enable LLMs to explicitly generate reasoning steps and improve their reasoning task accuracy. To eliminate the manual efforts, Zero-shot-CoT concatenates the target problem statement with {``}textit{Let{'}s think step by step}{''} as an input prompt to LLMs. Despite the success of Zero-shot-CoT, it still suffers from three pitfalls: calculation errors, missing-step errors, and semantic misunderstanding errors. To address the missing-step errors, we propose Plan-and-Solve (PS) Prompting. It consists of two components: first, devising a plan to divide the entire task into smaller subtasks, and then carrying out the subtasks according to the plan. To address the calculation errors and improve the quality of generated reasoning steps, we extend PS prompting with more detailed instructions and derive PS+ prompting. We evaluate our proposed prompting strategy on ten datasets across three reasoning problems. The experimental results over GPT-3 show that our proposed zero-shot prompting consistently outperforms Zero-shot-CoT across all datasets by a large margin, is comparable to or exceeds Zero-shot-Program-of-Thought Prompting, and has comparable performance with 8-shot CoT prompting on the math reasoning problem. The code can be found at https://github.com/AGI-Edgerunners/Plan-and-Solve-Prompting.",
}
[4] Tab-Cot: cadeia tabular de pensamento zero tiro
@inproceedings{ziqi-lu-2023-tab,
title = "Tab-{C}o{T}: Zero-shot Tabular Chain of Thought",
author = "Ziqi, Jin and
Lu, Wei",
booktitle = "Findings of the Association for Computational Linguistics: ACL 2023",
month = jul,
year = "2023",
address = "Toronto, Canada",
publisher = "Association for Computational Linguistics",
url = "https://aclanthology.org/2023.findings-acl.651",
pages = "10259--10277",
abstract = "The chain-of-though (CoT) prompting methods were successful in various natural language processing (NLP) tasks thanks to their ability to unveil the underlying complex reasoning processes.Such reasoning processes typically exhibit highly structured steps.Recent efforts also started investigating methods to encourage more structured reasoning procedures to be captured (cite least to most).In this work, we propose Tab-CoT, a novel tabular-format CoT prompting method, which allows the complex reasoning process to be explicitly modeled in a highly structured manner.Despite its simplicity, we show that our approach is capable of performing reasoning across multiple dimensions (i.e., both rows and columns).We demonstrate our approach{'}s strong zero-shot and few-shot capabilities through extensive experiments on a range of reasoning tasks.",
}
[5] Árvore dos pensamentos: resolução deliberada de problemas com grandes modelos de linguagem
@misc{yao2023tree,
title={Tree of Thoughts: Deliberate Problem Solving with Large Language Models},
author={Shunyu Yao and Dian Yu and Jeffrey Zhao and Izhak Shafran and Thomas L. Griffiths and Yuan Cao and Karthik Narasimhan},
year={2023},
eprint={2305.10601},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
[6] A decomposição aumenta o raciocínio por meio de decodificação guiada por auto-avaliação
@misc{xie2023decomposition,
title={Decomposition Enhances Reasoning via Self-Evaluation Guided Decoding},
author={Yuxi Xie and Kenji Kawaguchi and Yiran Zhao and Xu Zhao and Min-Yen Kan and Junxian He and Qizhe Xie},
year={2023},
eprint={2305.00633},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
[7] Um algoritmo de decodificação simples e rápido e rápido para geração neural
@misc{li2016simple,
title={A Simple, Fast Diverse Decoding Algorithm for Neural Generation},
author={Jiwei Li and Will Monroe and Dan Jurafsky},
year={2016},
eprint={1611.08562},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
[8] O raciocínio com o modelo de idioma está planejando com o modelo mundial
@misc{hao2023reasoning,
title={Reasoning with Language Model is Planning with World Model},
author={Shibo Hao and Yi Gu and Haodi Ma and Joshua Jiahua Hong and Zhen Wang and Daisy Zhe Wang and Zhiting Hu},
year={2023},
eprint={2305.14992},
archivePrefix={arXiv},
primaryClass={cs.CL}
}