Este es más un proyecto experimental/de investigación. Implementa una tubería de solicitud combinada con un envoltorio para los pasos de descomposición automática y las búsquedas a través del "espacio de paso" (por ejemplo, por búsqueda de haz, MCTS, etc.) guiado por la autoevaluación.
Algunos de los códigos de Data-Extraction/Respuesta-Extraction ( utils.py
y answer_extraction.py
) están adaptados de: https://github.com/agi-edgerunners/plan-and-solve-prompting
Referencias del conjunto de datos:
@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
.La base de código está configurada principalmente para funcionar con modelos compatibles con VLLM.
model.py
(consulte el constructor de la clase Generator). Utilizo rutas de puntos de control descargadas localmente para que no funcione fuera de la casilla a menos que descargue los puntos de control en una ruta similar o cambie la ruta.Si desea agregar un nuevo modelo (VLLM Compatible), haga lo siguiente:
argparser.py
para la opción model
.prompt.py
(consulte Ejemplos al final del archivo de código) (opcional; hay un mensaje predeterminado pero probablemente no sería óptimo).model.py
(consulte el constructor de la clase Generator en ese archivo para ver ejemplos).Esta es una plantilla general para la ejecución del código:
python main.py --search_style=MultiSearch --model=LLAMA30_instruct --gpu_ids="0,1" --prompt_style=cot --dataset=gsm8k --reward_types=confidence+correctness
Esto ejecutaría un indicador de Llama 30B con la cadena de pensamiento cero ( cot
) utilizando MultiSearch
(que se explicará a continuación) como una estrategia de búsqueda en GSM8K
utilizando una función de recompensa ( confidence+correctness
-a continuación) para la guía de búsqueda . Los pesos del modelo se distribuirán a CUDA: 0 y CUDA: 1 (dado gpu_ids="0,1"
).
Algunos otros argumentos sobresalientes:
checkpoint
: configure verdadero si está cargando algunos puntos de control guardados anteriores (los puntos de control se guardan automáticamente)SC
- Establecerlo para habilitar la autoconsistencia [1]. Solo relevante si search_style=none
. Las opciones disponibles para cada argumento y los valores predeterminados se pueden encontrar en argparser.py
.
Encontrará registros de ejecución en logs/
En este proyecto, empleamos varias estrategias de búsqueda en el nivel de los pasos de razonamiento (cada paso de razonamiento cuenta como "un solo movimiento en el juego"). Esto también plantea la cuestión de cómo descomponer la generación en una serie de pasos. Una forma de hacerlo es crear cualquier plantilla de inmediato arbitraria con una estructura clara (que se puede usar para pasos de análisis) y luego usar algunos ejemplos de disparos con la plantilla para preparar el modelo para seguir la estructura. Aquí, sin embargo, estoy interesado en el régimen de disparo cero. Intento usar instrucciones de inmediato de disparo cero en formas específicas para incitar diferentes formas de descomposición automática de pasos. A continuación, analizo todos los estilos rápidos utilizados en este proyecto y su metodología de descomposición correspondiente.
Cadena de pensamientos ( cot
): esto utiliza el indicador de cot cero estándar Let's think step by step.
[2]. Para la descomposición de pasos n
(nueva línea) se utiliza. Hay algunas configuraciones adicionales para ignorar adecuadamente las nuevas líneas vacías y demás. En última instancia, esta no es necesariamente una forma ideal de descomponer los pasos de razonamiento, no todas las líneas nuevas en los resultados de la cuna serían pasos de razonamiento completos, pero es un punto de partida de base que se puede hacer de manera cero.
Paso de la cadena de pensamientos ( cot_step
): esta es una extensión simple de cot cero cero: Let's think step by step. Step 1:
. Esto impide automáticamente el modelo de idioma para organizar su cadena de razonamiento en pasos numerados (Paso 1: XYZ Paso 2: ABC ...). Esta estructura se puede usar fácilmente para la descomposición de pasos.
PS+ ( ps
): este es el plan de disparo cero y resuelve el indicador (versión de PS+) introducido en [3]. La nueva descomposición de la línea se usa similar a cot
.
Cadena de pensamientos tabulares ( cot_tab
)-Este es el indicador de cuna tabular de tiro cero introducido en [4]- n|step|subquestion|process|result|n
. Es una forma simple de producir un formato tabular estructurado pasos de razonamiento. Usamos Newline para la descomposición nuevamente, pero a diferencia de antes de que la descomposición de Newline sea más significativa aquí, porque cada nueva línea descompuesta corresponderá a un paso en la tabla.
Struct ( struct
): este mensaje utiliza elementos de muchas de las indicaciones anteriores. Proporciona instrucciones detalladas para descomponer la solución/respuesta en pasos y subpacios (con identificación de subproblemas, hechos relevantes y solución). Esto produce resultados altamente estructurados y puede descomponerse de acuerdo con la estructura similar a cot
. Los detalles del aviso se pueden encontrar en prompt.py
y el código de descomposición se puede encontrar en node_transition.py
.
Struct Minimal ( struct_min
): es similar a la estructura con un substep menos. Detalles en prompt.py
No he ejecutado esta variante, podría haber errores.
Puede modificar prompt.py
para agregar algunas indicaciones de disparo.
Todos los códigos de búsqueda se pueden encontrar en Search/
.
none
: este método no aplica ninguna estrategia de búsqueda en particular además de la decodificación codiciosa codegresiva estándar. Esto se puede combinar con SC=True
para la autoconsistencia con un muestreo múltiple.MultiSearch
: esta estrategia utiliza múltiples muestras. Luego, las recompensas para cada muestra (recompensa acumulada para cada paso descompuesto) se generan después del hecho. Las recompensas se utilizan para las respuestas de votación de varias maneras para describirse más adelante.MultiGreedy
: esta estrategia utiliza búsqueda codiciosa pero en el nivel de pasos (a diferencia de none
). En cada iteración, dada la cadena de historia de los pasos de razonamiento, el modelo genera algunos candidatos a los próximos pasos de razonamiento. Cada uno de los K candidatos se califica (se asigna una recompensa). Luego se selecciona el candidato de puntuación máxima. Esta estrategia se usa en paralelo para múltiples muestras de pasos de razonamiento iniciales que conducen a múltiples resultados de búsqueda que pueden usarse para la autoconsistencia. Esta estrategia de búsqueda puede considerarse similar a DFS del árbol de pensamiento [5] pero sin ningún retroceso.BeamSearch
: esta es la versión de búsqueda de haz de lo anterior. La implementación está inspirada en [6]. Además, este método puede considerarse como similar al método BFS (con fronteras truncadas) utilizado en el árbol de pensamiento [5].DivBeamSearch
: esto es lo mismo que la búsqueda del haz, pero fomenta más diversidad en la generación al restringir los hermanos. En cada iteración se permiten un máximo de los hermanos M (m << tamaño del haz (yo uso m = 2)). Si hay espacio en el tamaño del haz después de elegir todos los candidatos después de esto que restringe los candidatos residuales se agregan en función de sus recompensas. La idea es similar en espíritu a [7], pero no modificamos estrictamente la ecuación de la puntuación con una penalización, sino que usamos una restricción más dura como se describe.MCTS
- Esta es la búsqueda de árboles de Monte Carlo. La implementación sigue la estructura aquí aproximadamente. Se necesita un poco de inspiración de [8].SPMCTS
: esta implementación (búsqueda semi -paralela de árbol de Monte Carlo) es un poco más a MCTS. Selecciona múltiples hojas a la vez y lanza múltiples rutas a la vez. Como tal, se requieren menos iteraciones secuenciales. El resultado final es un número similar de muestras que MCTS. Sin embargo, las implementaciones no son computacionalmente equivalentes y no pretenden ser.Nota Si bien algunos de los métodos están inspirados en el trabajo previo, no se intentan ser implementaciones perfectamente fieles de esos documentos.
Similar a [6,8] la recompensa para cada paso se calcula en función de la autoevaluación y la confianza de la generación del paso (basado en LogProbs). La técnica de autoevaluación utiliza LLM para evaluar sus propias generaciones haciendo preguntas múltiples (MCQ) sobre la ayuda/corrección del paso (las preguntas de autoevaluación se pueden encontrar en rewards.py
).
Los diferentes tipos de tipos de recompensas y combos están disponibles como argumentos en argparse.py
.
confidence
: solo usa confianza (basada en logprobs) como recompensa.correctness
: solo utiliza probabilidades de respuesta de un paso MCQ relacionado con la corrección como recompensa.helpfulness
: solo utiliza probabilidades de respuestas de un paso de MCQ relacionado con la ayuda como recompensaboth
: usa correctness
y helpfulness
.confidence+correctness
: usa confidence
y correctness
.confidence+helpfulness
: utiliza tanto confidence
como helpfulness
.confidence+both
: usa toda la confidence
, correctness
y helpfulness
. NB: los estilos rápidos struct
y struct-min
siguen diferentes reglas. Tienen estructuras subestimales de grano fino y usan recompensas apropiadas para ellas. El subproceso de identificación de subproblema solo utiliza una recompensa relacionada con la ayuda (porque técnicamente no es un paso de razonamiento para ser correcto/incorrecto) y el paso de la solución solo usa la pregunta relacionada con la corrección (porque presumiblemente, la ayuda del subproblema se correlacionará con la ayuda de la ayuda de la solución).
Los MCQ utilizados para diferentes indicaciones y diferentes tipos de recompensas para la autoevaluación se pueden encontrar en reward.py
.
Varios tipos de mecanismos de votación de respuesta se implementan y se rastrean automáticamente simultáneamente en main.py
(no relacionados con ninguna opción argparse.py
). Ellos son:
Voted Answer
en los registros): solo votación de la mayoría simple [1].Reward Voted Answer
en los registros), similar a la votación mayoritaria, pero el valor de cada voto es la recompensa ( Top K Reward Voted Answer
en los registros) - Seleccione Top K (usamos K = 5) respuestas más altas recompensadas y luego aplique la votación de recompensa entre ellos. Esto permite filtrar respuestas potencialmente "malas" de baja recompensa que pueden sumar votos.Max Reward Answer
en registros): seleccione la respuesta con la recompensa máxima.node_transition.py
un poco más (particularmente el cálculo de recompensas) pero no obtuve mucho beneficio en el costo de tiempo empírico.none
(que actualmente es la más rápida). Pero esto puede requerir modificar los transformadores VLLM y Huggingface.[1] La autoconsistencia mejora el razonamiento de la cadena de pensamiento en los modelos de idiomas
@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] Los modelos de idiomas grandes son razonadores de disparo cero
@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] Significación de planificación y resuelto: Mejora del razonamiento de la cadena de pensamiento cero 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: cadena de pensamiento tabular de disparo cero
@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] Árbol de pensamientos: resolución deliberada de problemas con modelos de idiomas grandes
@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 descomposición mejora el razonamiento a través de la decodificación guiada por autoevaluación
@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 algoritmo de decodificación simple y rápido para la generación neuronal
@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] El razonamiento con el modelo de idioma es planificar con el 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}
}