This is the official repository for Adversarial Math Word Problem Generation . This repository contains the code for generating adversarial math problems, attacking the models, and analyzing the generated adversarial examples.
Install all required packages using pip install -r requirements.txt
.
The original math problems should be formatted in a json file with "Problem"
and "final_ans"
fields:
[
{
"Problem": "<Problem 0>",
"final_ans": "<Answer 0>"
...
},
{
"Problem": "<Problem 1>",
"final_ans": "<Answer 1>"
...
},
...
]
An input data example from GSM8K is provided on data/example/input_example.json
Go to generation
folder and run main.py
to generate adversarial examples. The script will call GPT-4-turbo once (~$0.01) for each original problem to generate python code.
Here is an example command for generating 20
adversarial math problems:
python main.py \
--action generation \
--output_directory ../generated \
--original_question_file ../data/example/input_example.json \
--openai_key_path PATH/TO/OPENAI/APIKEY/IN/TXT \
--code_directory ../data/example/ode \
--m 20
You can specifiy your own generation settings, file structure/path, etc. in config.py
. The final generated adversarial examples will be saved in ../generated/adversarial_example.json
. We release all the generated adversarial examples for our experiments in data/experimental_data
folder.
To attack the models generated adversarial examples, go to attack
folder and run attack.py
. An example command for attacking meta-math/MetaMath-70B-V1.0
is:
python attack.py \
--model meta-math/MetaMath-70B-V1.0 \
--adversarial_data_path ../generated/adversarial_example.json \
--main_output_directory_path ../results
The model outputs are saved in ../results
. The script will generate model output summary and save it in model_output_summary
and all incorrect results in incorrect_problems
.
To analyze the generated adversarial examples, run main.py
in the generation
folder with --action analysis
. The script will compare model's incorrect predictions with the ground truth. An example command for analyzing MetaMath-70B-V1.0
is:
python main.py \
--action analysis \
--output_directory ../analysis \
--model_name MetaMath-70B-V1.0 \
--model_incorrect_file /data/example/incorrect_problems/MetaMath-70B-V1.0.json
You can specifiy your own analysis settings, show plots, etc. in config.py
. The final analysis results will be saved in ../analysis/
If you find this code useful, we'd appreciate it if you cite the following paper:
@misc{xie2024adv,
title={Adversarial Math Word Problem Generation},
author={Roy Xie and Chengxuan Huang and Junlin Wang and Bhuwan Dhingra},
year={2024},
eprint={2402.17916},
archivePrefix={arXiv},
primaryClass={cs.CL}
}