Il s'agit davantage d'un projet expérimental / de recherche. Il met en œuvre un pipeline d'incitation combiné à un emballage pour les étapes et les recherches en décomposition automatique dans le "STEP SPACE" (par exemple par la recherche de faisceau, les MCT, etc.) guidés par l'auto-évaluation.
Certains des codes Data-Extraction / Response-Extraction ( utils.py
et answer_extraction.py
) sont adaptés de: https://github.com/agi-edgerunners/plan-and-solve-pompting
Références de l'ensemble de données:
@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
(les principales bibliothèques Big 3 sont des transformateurs, VllM et Pytorch - les autres étant principalement des dépendances.)La base de code est principalement configurée pour travailler avec des modèles compatibles VLLM.
model.py
(voir le constructeur de la classe du générateur). J'utilise des chemins de contrôle téléchargés localement afin qu'il ne fonctionnera pas hors de la boîte à moins que vous ne téléchargeiez les points de contrôle dans un chemin similaire ou ne modifiera pas le chemin.Si vous souhaitez ajouter un nouveau modèle (compatible VLLM), faites ce qui suit:
argparser.py
pour l'option model
.prompt.py
(voir des exemples à la fin du fichier de code) (facultatif; il y a une invite par défaut mais ne serait probablement pas optimale).model.py
(voir le constructeur de la classe de générateur dans ce fichier pour des exemples).C'est un modèle général pour l'exécution du code:
python main.py --search_style=MultiSearch --model=LLAMA30_instruct --gpu_ids="0,1" --prompt_style=cot --dataset=gsm8k --reward_types=confidence+correctness
Cela exécuterait l'invite LLAMA 30B avec une invite de chaîne de pensées ( cot
) à zéro-tir en utilisant MultiSearch
(à expliquer ci-dessous) comme une stratégie de recherche sur GSM8K
en utilisant une fonction de récompense ( confidence+correctness
- à expliquer ci-dessous) pour des conseils de recherche . Les poids du modèle seront distribués à CUDA: 0 et CUDA: 1 (étant donné gpu_ids="0,1"
).
Quelques autres arguments saillants:
checkpoint
- Définissez-le True si vous chargez des points de contrôle enregistrés précédents (les points de contrôle sont automatiquement enregistrés)SC
- Réglez-le True pour activer l'auto-cohérence [1]. Uniquement pertinent si search_style=none
. Les options disponibles pour chaque argument et les valeurs par défaut peuvent être trouvées dans argparser.py
.
Vous trouverez des journaux d'exécution dans logs/
Dans ce projet, nous utilisons diverses stratégies de recherche au niveau des étapes de raisonnement (chaque étape de raisonnement compte comme "un seul mouvement dans le jeu"). Cela soulève également la question de savoir comment décomposer la génération en une série d'étapes. Une façon de le faire consiste à créer n'importe quel modèle d'invite arbitraire avec une structure claire (qui peut être utilisée pour les étapes d'analyse), puis à utiliser quelques exemples de tir avec le modèle pour amorcer le modèle pour suivre la structure. Ici, cependant, je suis intéressé par le régime zéro-shot. J'essaie d'utiliser des instructions invites à tirs zéro de manière spécifique pour inciter différentes formes de décomposition automatique des étapes. Ci-dessous, je discute de tous les styles rapides utilisés dans ce projet et de leur méthodologie de décomposition correspondante.
Chaîne de réflexion ( cot
) - Ceci utilise l'invite de lit de lit nulle standard Let's think step by step.
[2]. Pour la décomposition de pas n
(nouvelle ligne) est utilisée. Il existe des configurations supplémentaires pour ignorer correctement les nouvelles lignes vides et autres. En fin de compte, ce n'est pas nécessairement un moyen idéal de décomposer les étapes de raisonnement, toutes les nouvelles lignes dans les résultats du COT ne seraient pas des étapes de raisonnement complètes, mais c'est un point de départ de base qui peut être fait de manière nul.
Étape de la chaîne de réflexion ( cot_step
) - Il s'agit d'une simple extension de Cot zéro: Let's think step by step. Step 1:
. Cela a automatiquement mis en œuvre le modèle linguistique pour organiser sa chaîne de raisonnement dans les étapes numérotées (étape 1: XYZ Étape2: ABC ...). Cette structure peut ensuite être facilement utilisée pour la décomposition des étapes.
PS + ( ps
) - Il s'agit du plan zéro-shot et de l'invite de résolution (version PS +) introduite dans [3]. Une nouvelle décomposition de ligne est utilisée similaire au cot
.
Chaîne de pensées tabulaires ( cot_tab
) - Il s'agit de l'invite de lit tabulaire à tirs zéro introduite dans [4] - n|step|subquestion|process|result|n
. C'est un moyen simple de produire des étapes de raisonnement de format tabulaire structuré. Nous utilisons à nouveau Newline pour la décomposition, mais contrairement à la décomposition de la nouvelle ligne ne sont plus significatives ici - car chaque nouvelle ligne décomposée correspondra à une étape du tableau.
Struct ( struct
) - Cette invite utilise des éléments de nombreuses invites ci-dessus. Il fournit des instructions détaillées pour décomposer la solution / réponse en étapes et sous-étapes (avec identification de sous-problèmes, faits pertinents et solution). Cela produit des résultats hautement structurés et peut être décomposé en fonction de la structure similaire au cot
. Les détails de l'invite peuvent être trouvés dans prompt.py
et le code de décomposition peut être trouvé dans node_transition.py
.
Struct minimal ( struct_min
) - il est similaire à struct avec un sous-étage de moins. Détails dans prompt.py
. Je n'ai pas exécuté cette variante - il pourrait y avoir des bugs.
Vous pouvez modifier prompt.py
pour ajouter quelques invites de tir.
Tous les codes de recherche peuvent être trouvés dans Search/
.
none
- Cette méthode n'applique aucune stratégie de recherche particulière en plus du décodage gourmand autorégressif standard. Cela peut être combiné avec SC=True
pour l'auto-cohérence avec un échantillonnage multiple.MultiSearch
- Cette stratégie utilise le multi-échantillonnage. Ensuite, les récompenses pour chaque échantillon (récompense accumulative pour chaque étape décomposée) sont générées après coup. Les récompenses sont utilisées pour voter de diverses manières à décrire plus tard.MultiGreedy
- Cette stratégie utilise une recherche gourmand mais au niveau des étapes (contrairement à none
). À chaque itération, compte tenu de la chaîne d'histoire des étapes de raisonnement, le modèle génère des candidats de la prochaine étape du raisonnement. Chacun des k candidats est ensuite noté (attribué une récompense). Ensuite, le candidat à score maximum est sélectionné. Cette stratégie est utilisée en parallèle pour plusieurs échantillons d'étapes de raisonnement initiales qui conduisent à plusieurs résultats de recherche qui peuvent être utilisés pour l'auto-cohérence. Cette stratégie de recherche peut être considérée comme similaire à DFS de Tree of Thought [5] mais sans aucun retour en arrière.BeamSearch
- Il s'agit de la version de recherche de faisceau de ce qui précède. L'implémentation est inspirée par [6]. De plus, cette méthode peut être considérée comme similaire à la méthode BFS (avec des frontières tronquées) utilisées dans Tree of Thought [5].DivBeamSearch
- C'est la même chose que la recherche de faisceau, mais encourage plus de diversité dans la génération en restreignant les frères et sœurs. Dans chaque itération, un maximum de m (m << taille du faisceau (j'utilise m = 2)) les frères et sœurs sont autorisés. S'il y a de l'espace dans la taille du faisceau après avoir choisi tous les candidats qui suivent cette restriction, les candidats résiduels sont ajoutés en fonction de leurs récompenses. L'idée est similaire en esprit à [7] mais nous ne modifions pas strictement l'équation du score avec une pénalité - mais utilisons plus de contrainte dure comme décrit.MCTS
- Ceci est la recherche de Monte Carlo Tree. La mise en œuvre suit à peu près la structure ici. Il faut un peu inspirer de [8].SPMCTS
- Cette implémentation (Semi-parallèle Monte Carlo Recherche) parallélise un peu plus MCTS. Il sélectionne plusieurs feuilles à la fois et déploie plusieurs chemins à la fois. En tant que tel, il faut moins d'itérations séquentielles. Le résultat final est un nombre similaire d'échantillons que MCTS. Les implémentations ne sont cependant pas équivalentes en calcul et ne sont pas destinées à l'être.Remarque Bien que certaines des méthodes soient inspirées par les travaux antérieurs, ils ne sont pas tentés d'être parfaitement fidèles de ces articles.
Semblable à [6,8], la récompense pour chaque étape est calculée en fonction de l'auto-évaluation et de la confiance de la génération de l'étape (basée sur les logprobes). La technique d'auto-évaluation utilise les LLM pour évaluer ses propres générations en posant des questions multi-choix (MCQ) sur la l'aide / l'exactitude de l'étape (les questions d'auto-évaluation peuvent être trouvées dans rewards.py
).
Différents types de types de récompenses et de combos sont disponibles sous forme d'arguments dans argparse.py
.
confidence
- Utilise uniquement la confiance (basée sur LogProbs) comme récompense.correctness
- utilise uniquement les probabilités de réponse à partir d'un SCQ lié à l'exactitude étape comme récompense.helpfulness
- utilise uniquement les probabilités de réponse à partir d'une étape MCM liée à la protection comme récompenseboth
- utilisent à la fois correctness
et helpfulness
.confidence+correctness
- utilise à la fois confidence
et correctness
.confidence+helpfulness
- utilise à la fois confidence
et helpfulness
.confidence+both
- utilise toute confidence
, correctness
et helpfulness
. NB: Styles Prompt struct
et struct-min
suivent différentes règles. Ils ont des structures sous-étages à grain fin et utilisent des récompenses appropriées pour celles-ci. L'identification des sous-problèmes sous-étape n'utilise que la récompense liée à la protection (car il n'est techniquement pas une étape de raisonnement pour être correcte / incorrecte) et l'étape de la solution utilise uniquement la question liée à l'exactitude (car vraisemblablement, la utile de sous-problème sera en corrélation avec l'utilité de la solution).
Les MCQ utilisés pour différentes invites et différents types de récompense pour l'auto-évaluation peuvent être trouvés dans reward.py
.
Plusieurs types de mécanismes de vote de réponse sont mis en œuvre et suivis automatiquement simultanément dans main.py
(non lié aux options argparse.py
). Ils sont:
Voted Answer
dans les journaux) - Juste simple vote majoritaire [1].Reward Voted Answer
dans les journaux) - similaire au vote majoritaire, mais la valeur de chaque vote est la récompense ( Top K Reward Voted Answer
dans les journaux) - Sélectionnez Top K (nous utilisons K = 5) les réponses récompensées les plus élevées, puis appliquez le vote de récompense parmi eux. Cela permet de filtrer les réponses potentiellement "mauvaises" à faible récompense qui peuvent potentiellement s'ajouter aux votes.Max Reward Answer
dans les journaux) - Sélectionnez la réponse avec la récompense maximale.node_transition.py
un peu plus (en particulier le calcul de récompense) mais je n'ai pas bénéficié de beaucoup de coûts temporels empiriques.none
(ce qui est actuellement le plus rapide). Mais cela peut nécessiter de modifier les transformateurs VLLM et HuggingFace.[1] L'auto-cohérence améliore le raisonnement de la chaîne de pensée dans les modèles de langue
@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] Les grands modèles de langue sont des raisonneurs à tirs zéro
@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] Plan-et-résolution d'incitation: amélioration du raisonnement de chaîne de pensée zéro par des modèles de grande langue
@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: chaîne de pensée tabulaire zéro
@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] Arbre de pensées: résolution de problèmes délibérée avec de grands modèles de langue
@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] La décomposition améliore le raisonnement via le décodage guidé d'auto-évaluation
@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] Un algorithme de décodage simple et rapide pour la génération neuronale
@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] Le raisonnement avec le modèle de langue est la planification avec le modèle mondial
@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}
}