Este repositorio contiene el código y los datos para el siguiente documento:
Mixce: entrenamiento de modelos de lenguaje autorregresivo mezclando las entropas transversales hacia adelante e inversa
@inproceedings{zhang2023mixce,
title={MixCE: Training Autoregressive Language Models by Mixing Forward and Reverse Cross-Entropies},
author={Zhang, Shiyue and Wu, Shijie and İrsoy, Ozan and Lu, Steven and Bansal, Mohit and Dredze, Mark and Rosenberg, David},
booktitle={Proceedings of the 61th Annual Meeting of the Association for Computational Linguistics},
year={2023}
}
Código Autor: Shiyue Zhang
python -m pip install -r requirements.txtOpcional: para evitar los enfrentamientos de la versión con los paquetes existentes, es posible que desee realizar la instalación en un entorno virtual:
python -m venv yourenv
. yourenv/bin/activate # for bash, might be something else for your particular shell
python -m pip install -r requirements.txtSynthetic.py es el script para ejecutar experimentos sintéticos. Ejecutar experimentos es muy simple, solo ejecute:
python synthetic.py
Las configuraciones (como la semilla, el tamaño de vocabulario, etc.) se pueden especificar y cambiar dentro del script y debajo de if __name__ == '__main__': .
Hay algunas configuraciones importantes dentro de Synthetic.py que determinan qué tipo de experimentos sintéticos puede ejecutar:
Real_DataSet : si es None , la matriz de transición se inicializará aleatoriamente; O si es 'webtext' , la matriz de transición se inicializará a partir de las matrices de transición precomputadas en WebText.
Zero_Percent : determina cuántos valores en la matriz de transición son 0. Por ejemplo, si zero_percent==0.5 , entonces 50% de probabilidades en la matriz de transición son 0.
VOCAB_SIZE : el tamaño del vocabulario. Probamos 21, 51, 101, 501 o 1001. Tenga en cuenta que 21 significa que tenemos 20 tokens normales (incluidos EOS) y 1 token de almohadilla.
Semilla : corremos 5 semillas (7, 42, 777, 4222, 99999) para cada experimento.
Loss_func : probamos 4 funciones de pérdida: (1) 'two_xens' : se denota como mixce* en nuestro documento y usa la distribución de datos Gold P y Gumbel Softmax; (2) 'qlogq_mix' : es nuestra función de pérdida de mixce aproximada; (3) 'two_kls' : la mezcla de dos divergencias KL; (4) 'js' : JS Divergencia.
Train_eta : la relación de mezcla para esas funciones de pérdida. Si train_eta==1.0 para 'two_xens' , es MLE. Si train_eta==1.0 para 'two_kls' , es KL (también es igual a MLE). Si train_eta==0.0 para 'two_kls' , es el kl inverso. Utilizamos una definición general de JS (ver este documento para obtener más detalles), y JS converge a 0 cuando train_eta se acerca a 0.0 o 1.0. Cuando Train_eta = 0.5, es la definición normal de divergencia JS.
Evaluamos BigRam LMS entrenados sintéticamente comparando la matriz de transición aprendida con la matriz de transición de oro. Usamos dos métricas:
(1) AVG. JS : Calculamos la divergencia JS entre cada fila del oro y aprendimos matrices de transición y promedio en las filas.
(2) AVG. 0s : obtenemos los valores de la matriz aprendida en posiciones de probabilidad de oro = 0 y luego los promedian.
La función compare_parameters() en Synthetic.py se usa para calcular estas dos métricas.
Todos los modelos se guardarán en el directorio synthetic_logs/ . El nombre de cada directorio de modelo comienza con la fecha y hora de que se ejecutó el experimento. En el directorio de modelos, también encontrará los archivos de eventos TensorBoard, así como un all_best_metrics.json que guarda los mejores puntajes de métricas para cada relación de mezcla. Ver ejemplos bajo sintetic_logs/.
La evaluación del modelo se realiza después de cada época, y el mejor punto de control se selecciona en función de la pérdida en el conjunto de desarrollo.
Finalmente, para cada experimento, promediamos los resultados de 5 semillas; Y para cada objetivo, elegimos la mejor relación de mezcla basada en AVG. js.
get_synthetic_results() en Results.py es una función utilizada para promediar los resultados de 5 semillas y clasificar los resultados de diferentes relaciones de mezcla que acordan a AVG. js.
Para usar get_synthetic_results() , primero debe preparar sinthetic_models.json para especificar los directorios de modelos. Se muestra un ejemplo en sintetic_models.json. Luego, puede obtener el resultado del experimento que utiliza la matriz de transición inicializada WebText, VOCAB = 20 y Objective = two_kls ejecutando get_synthetic_results('webtext', '20', 'two_kls') .
Datekenizer. Primero debe descargar detokenizer.perl de Moisés aquí, y colocarlo debajo de la ruta data/detokenizer.perl porque los siguientes scripts de Python dependen de ello.
Entonces:
cd data
python wikitext_data.py
python webtext_data.py
curl https://dl.fbaipublicfiles.com/fairseq/data/writingPrompts.tar.gz | tar xvzf -
python writingprompts_data.py
Los datos preprocesados se guardarán en data/wikitext , data/webtext y data/writingPrompts .
Modelos Clone GPT-2 que usan git lfs siguiendo la instrucción proporcionada por la cara de abrazo.
git lfs install
git clone https://huggingface.co/gpt2
GPT2 es el modelo GPT-2 más pequeño. También experimentamos con GPT2-Medium y GPT2-Large. GPT2-LARGE se usa en la computación de Mauve, así que descargue también:
git clone https://huggingface.co/gpt2-medium
git clone https://huggingface.co/gpt2-large
Haga una copia de GPT2-Large para Mauve:
cp -r gpt2-large gpt2-large-mauve
Porque escribiremos directamente a GPT2-Large, lo que afectará el cálculo de Mauve.
Simplemente puede comenzar a ejecutar experimentos haciendo:
python run.py
Las configuraciones se pueden especificar manualmente en run.py Vea un ejemplo en if __name__ == '__main__' .
Hay algunas configuraciones importantes en run.py :
Training_Size : el tamaño de los datos de entrenamiento, probamos '10K' , '25K' , '50K' y '100K' ; Por defecto, usamos '50K' .
Modelo : puede ser 'gpt2' , 'gpt2-meidum' o 'gpt2-large' .
DataSet : puede ser "wikitext" , "webtext" o "writingPrompts" .
MEXING_RATIO : Buscamos a través de [0.0, 0.01, 0.1, 0.3, 0.5, 0.7, 0.9, 0.99, 1.0] y elegimos la mejor puntuación mixing_ratio basada en la puntuación MAUVE de desarrollo de desarrollo.
Train_batch_size, Acumulación, eval_batch_size : estas configuraciones deben determinarse por la plataforma que usa. Utilizamos un solo TESLA V100 GPU (memoria 32G), y las configuraciones recomendadas en esta configuración están en run.py
Hay una dict y tres funciones en run.py :
data_sets {} : guarda las rutas de los archivos de datos.
run_no_trainer () : la función utilizada para entrenamiento y evaluación de modelos.
run_no_trainer_eval () : la función utilizada solo para la evaluación del modelo.
run_no_trainer_turn_topp () : la función utilizada para ajustar el muestreo de Top-P p.
Además de Run.py , presento aquí los otros scripts importantes de Python para el entrenamiento y la evaluación de modelos:
GPT2.PY (el archivo más esencial) contiene una clase de modelo GPT2MIXMODEL que implementa nuestra función de pérdida de mixce .
run_clm_no_trainer.py es el script para entrenar y evaluar los modelos GPT-2.
run_clm_no_trainer_tune_topp.py es similar a run_clm_no_trainer.py , excepto que solo se usa para sintonizar el hiperparámetro P del muestreo TOP-P.
Metircs.py contiene las métricas que utilizamos para evaluar las generaciones de modelos.
Los modelos se guardarán en train/ directorio.
El nombre de cada directorio de modelo comienza con la fecha y hora de que se ejecutó el experimento. En el directorio de modelos, guardamos el mejor punto de control (seleccionado en función de la pérdida de dev).
dev/test.sample , dev/test.sample1 , dev/test.sample2 y dev/test.human son 3 generaciones de muestreo imparciales y texto humano.
dev/test_results.json guarde los resultados de la perplejidad, la diversidad y la repetición.
Después de sintonizar P para el muestreo Top-P, dev/test.topp(p=*) son generaciones de muestreo TOP-P con diferentes valores de P.
Después de calcular Mauve y Coherence (consulte la siguiente sección para más detalles), dev/test_mauve_coherence_*.json tiene los puntajes MAUVE y coherencia con diferentes longitudes máximas.
Después de calcular la mauva y la coherencia controladas (consulte la siguiente sección para más detalles), dev/test_controlled_mauve_coherence_*.json son puntajes controlados y de coherencia controlados con diferentes longitudes máximas.
Reportamos los puntajes de 6 métricas en nuestro artículo:
La perplejidad se calcula junto con la capacitación/evaluación del modelo (ver run_clm_no_trainer.py ).
La función de diversidad se implementa mediante la función diversity() en Metircs.py , y también se calcula junto con la capacitación/evaluación del modelo llamando a la función compute_diversity_repetition() en run_clm_no_trainer.py . Tenga en cuenta que la repetición es otra métrica que implementamos pero no informamos en nuestro documento; Comprueba qué porcentaje del texto es bucles de repetición y también devuelve la longitud de la frase repetitiva.
Mauve y la coherencia se calculan de manera post-hoc utilizando archivos de generación guardados. compute_mauve() y compute_coherence() en Metrics.py son dos funciones a ayuda de ayuda para calcular la mauva y la coherencia. Los llaman por la función compute_mauve_coherence() en Results.py . Para usar compute_mauve_coherence() , primero debe preparar los modelos.json para especificar los nombres de los directorio de modelos para la evaluación.
Del mismo modo, el mauve controlado y la coherencia controlada también se pueden calcular de manera post-hoc mediante la función compute_controlled_mauve_coherence() en Results.py .
| Conjunto de datos | Tamaño del modelo | Tamaño de datos de entrenamiento | Objetivo | Nombre del centro de la cara abrazando |
|---|---|---|---|---|
| wikitext | GPT2-Large | 50k | Mle | shiyue/wikitext_train50k_gpt2-large_mix1.0 |
| wikitext | GPT2-Large | 50k | MIXCE (ETA = 0.1) | shiyue/wikitext_train50k_gpt2-large_mix0.1 |
| Teatro web | GPT2-Large | 50k | Mle | shiyue/webText_train50k_gpt2-large_mix1.0 |
| Teatro web | GPT2-Large | 50k | MIXCE (ETA = 0.3) | shiyue/webText_train50k_gpt2-large_mix0.3 |
| WritingPrompts | GPT2-Large | 50k | Mle | shiyue/writingprompts_train50k_gpt2-large_mix1.0 |
| WritingPrompts | GPT2-Large | 50k | MIXCE (ETA = 0.7) | shiyue/writingprompts_train50k_gpt2-large_mix0.7 |
Pruebe los modelos previos a la aparición de las siguientes maneras:
>>> from gpt2 import GPT2MIXModel
>>> from transformers import GPT2Tokenizer
>>> model = GPT2MIXModel.from_pretrained("shiyue/wikitext_train50K_gpt2-large_mix1.0")
>>> tokenizer = GPT2Tokenizer.from_pretrained('shiyue/wikitext_train50K_gpt2-large_mix1.0')
>>> text = "Hey, how are you?"
>>> encoded_input = tokenizer(text, return_tensors='pt')
>>> model.eval()
>>> out_ids = model.lm.generate(inputs=encoded_input["input_ids"], max_length=50, do_sample=True)
>>> print(tokenizer.batch_decode(out_ids, skip_special_tokens=True))
Nosotros ❤️ Contribuciones.
¿Has tenido una buena experiencia con este proyecto? ¿Por qué no compartir un poco de amor y contribuir con código, o simplemente hacernos saber sobre cualquier problema que tuviera con él?
Damos la bienvenida a los informes de emisión aquí; Asegúrese de elegir la plantilla de problema adecuada para su problema, para que podamos estar seguros de que nos está proporcionando la información necesaria.
Antes de enviar una solicitud de extracción, asegúrese de leer nuestras pautas de contribución.
Los siguientes dos archivos se toman y adoptan del repositorio transformers y, por lo tanto, conservan sus derechos de autor originales.
Esto se recoge originalmente de https://github.com/huggingface/transformers/blob/main/examples/pytorch/language-modeling/run_clm_no_trainer.py. Además, hemos aplicado las siguientes modificaciones:
--test_file--reduction--mixing_ratio--max_length--prompt_length--eval_prompt_length--cache_dir--do_train--do_evalpush_to_hub ".DataCollatorWithPadding en lugar del colatador predeterminado.do_eval ", la mayoría de las cuales entra en la nueva función ' evaluate() '. Este archivo se modifica aún más desde run_clm_no_trainer.py (ver arriba) cambiando cómo se invoca la función generate() para habilitar la opción top_p .
Este proyecto ha adoptado un código de conducta. Si tiene alguna inquietud sobre el código o el comportamiento que ha experimentado en el proyecto, contáctenos en [email protected].