Este repositório contém o código e os dados para o seguinte artigo:
Mixagem: Treinando modelos de linguagem autoregressiva, misturando as entropias cruzadas e reversas
@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}
}
Autor de código: Shiyue Zhang
python -m pip install -r requirements.txtOpcional: para evitar que qualquer versão entre em conflito com os pacotes existentes, convém executar a instalação em um ambiente virtual:
python -m venv yourenv
. yourenv/bin/activate # for bash, might be something else for your particular shell
python -m pip install -r requirements.txtsintético.py é o script para executar experimentos sintéticos. Experimentos de execução é muito simples, basta executar:
python synthetic.py
As configurações (como semente, tamanho do vocabulário, etc.) podem ser especificadas e alteradas dentro do script e if __name__ == '__main__': .
Existem algumas configurações importantes no Synthetic.py que determinam que tipo de experimentos sintéticos você pode executar:
real_dataset : se None , a matriz de transição será inicializada aleatoriamente; ou se for 'webtext' , a matriz de transição será inicializada a partir das matrizes de transição pré-computadas no WebText.
Zero_percent : determina quantos valores na matriz de transição são 0. Por exemplo, se zero_percent==0.5 , então 50% das probabilidades na matriz de transição são 0.
Vocab_size : o tamanho do vocabulário. Testamos 21, 51, 101, 501 ou 1001. Observe que 21 significa que temos 20 tokens normais (incluindo EOS) e 1 token de bloco.
Semente : Executamos 5 sementes (7, 42, 777, 4222, 99999) para cada experimento.
LEST_FUNC : Testamos 4 Funções de perda: (1) 'two_xens' : é indicado como mistura* em nosso artigo e usa a distribuição de dados Gold P e Gumbel Softmax; (2) 'qlogq_mix' : é a nossa função de perda de mistura aproximada; (3) 'two_kls' : a mistura de duas divergências KL; (4) 'js' : JS Divergência.
TRIN_ETA : A taxa de mistura para essas funções de perda. Se train_eta==1.0 para 'two_xens' , é mle. Se train_eta==1.0 para 'two_kls' , é a frente KL (também é igual a Mle). Se train_eta==0.0 para 'two_kls' , é o KL reverso. Utilizamos uma definição geral de JS (consulte este artigo para obter mais detalhes) e JS converge para 0 quando train_eta se aproxima de 0,0 ou 1,0. Quando trens_eta = 0,5, é a definição normal de divergência JS.
Avaliamos o BIGRAM LMS, sintetizados, comparando a matriz de transição aprendida com a matriz de transição de ouro. Usamos duas métricas:
(1) Avg. JS : Nós calculamos a divergência JS entre cada linha do ouro e matrizes de transição aprendidas e a média entre as linhas.
(2) Avg. 0s : obtemos os valores da matriz aprendida na probabilidade de ouro = 0 posições e depois a média.
A função compare_parameters() em sintéticos.py é usada para calcular essas duas métricas.
Todos os modelos serão salvos no synthetic_logs/ diretório. O nome de cada diretório de modelo começa com o tempo de dados que o experimento foi executado. No diretório do modelo, você também encontrará os arquivos de eventos Tensorboard, bem como um all_best_metrics.json que salva as melhores pontuações de métricas para cada taxa de mistura. Veja exemplos em Synthetic_logs/.
A avaliação do modelo é realizada após cada época e o melhor ponto de verificação é selecionado com base na perda no conjunto de desenvolvedores.
Eventualmente, para cada experimento, calculamos a média dos resultados de 5 sementes; E para cada objetivo, escolhemos a melhor taxa de mistura com base no AVG. JS.
get_synthetic_results() em resultados.py é uma função usada para obter resultados médios de 5 sementes e classificar os resultados de diferentes proporções de mistura que acompanham o AVG. JS.
Para usar get_synthetic_results() , você precisa primeiro preparar synthetic_models.json para especificar os diretórios do modelo. Um exemplo é mostrado em synthetic_models.json. Em seguida, você pode obter o resultado do experimento que usa a matriz de transição inicializada da WebText, vocab = 20 e objetiva = dois_kls executando get_synthetic_results('webtext', '20', 'two_kls') .
Detokenizer. Primeiro, você precisa baixar detokenizer.perl de Moisés aqui e colocá -lo sob os data/detokenizer.perl porque os seguintes scripts Python dependem dele.
Então:
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
Os dados pré -processados serão salvos em data/wikitext , data/webtext e data/writingPrompts .
CLONE MODELOS GPT-2 Usando git lfs seguindo as instruções fornecidas abraçando o rosto.
git lfs install
git clone https://huggingface.co/gpt2
O GPT2 é o menor modelo GPT-2. Também experimentamos o GPT2-Medium e o GPT2-Large. O GPT2-Large é usado na computação de Mauve, então faça o download também:
git clone https://huggingface.co/gpt2-medium
git clone https://huggingface.co/gpt2-large
Faça uma cópia do GPT2-Large para Mauve:
cp -r gpt2-large gpt2-large-mauve
Porque escreveremos diretamente para o GPT2-Large, o que afetará a computação de Mauve.
Você pode simplesmente começar a executar experimentos fazendo:
python run.py
As configurações podem ser especificadas manualmente no run.py Veja um exemplo em if __name__ == '__main__' .
Existem algumas configurações importantes em run.py :
Treining_size : o tamanho dos dados de treinamento, testamos '10K' , '25K' , '50K' e '100K' ; Por padrão, usamos '50K' .
Modelo : pode ser 'gpt2' , 'gpt2-meidum' ou 'gpt2-large' .
DataSet : pode ser "wikitext" , "webtext" ou "writingPrompts" .
Mixing_ratio : pesquisamos [0.0, 0.01, 0.1, 0.3, 0.5, 0.7, 0.9, 0.99, 1.0] e escolhemos o melhor mixing_ratio com base na pontuação do Deten Set Mauve.
TRAIN_BATCH_SIZE, acumulação, avaliar_batch_size : essas configurações devem ser determinadas pela plataforma que você usa. Usamos uma única GPU Tesla V100 (memória 32G) e as configurações recomendadas nessa configuração estão em run.py
Há um ditado e três funções em run.py :
data_sets {} : salva os caminhos dos arquivos de dados.
run_no_trainener () : a função usada para treinamento e avaliação de modelos.
run_no_trainener_eval () : a função usada apenas para avaliação do modelo.
run_no_trainener_turn_topp () : a função usada para ajustar p.
Além do run.py , apresento aqui os outros scripts importantes do Python para treinamento e avaliação de modelos:
GPT2.Py (o arquivo mais essencial) contém uma classe de modelo GPT2MIXMODEL que implementa nossa função de perda de mistura .
run_clm_no_trainener.py é o script para treinar e avaliar os modelos GPT-2.
run_clm_no_trainener_tune_topp.py é semelhante a run_clm_no_trainer.py , exceto que ele é usado apenas para ajustar o hyperparâmetro p da amostragem de Pop-P.
Metircs.py contém as métricas que usamos para avaliar as gerações de modelos.
Os modelos serão salvos em train/ diretório.
O nome de cada diretório de modelo começa com o tempo de dados que o experimento foi executado. No diretório do modelo, economizamos o melhor ponto de verificação (selecionado com base na perda de desenvolvimento).
dev/test.sample , dev/test.sample1 , dev/test.sample2 e dev/test.human são 3 gerações de amostragem imparciais e texto humano.
dev/test_results.json economiza os resultados da perplexidade, diversidade e repetição.
Após o ajuste p para amostragem de T TOP-P, dev/test.topp(p=*) são gerações de amostragem de P top com diferentes valores de p.
Após calcular o Mauve e a coerência (consulte a próxima seção para obter detalhes), dev/test_mauve_coherence_*.json tem as pontuações Mauve e Coerência com diferentes comprimentos máximos.
Após a computação de Mauve e a coerência controlados (consulte a próxima seção para obter detalhes), dev/test_controlled_mauve_coherence_*.json são pontuações controladas de Mauve e coerência com diferentes comprimentos máx.
Relatamos as pontuações de 6 métricas em nosso artigo:
A perplexidade é calculada juntamente com o treinamento/avaliação do modelo (consulte RUN_CLM_NO_TRAINER.PY ).
A diversidade é implementada pela função diversity() no METIRCS.PY e também é calculada junto com o treinamento/avaliação do modelo chamando a função compute_diversity_repetition() em run_clm_no_trainer.py . Observe que a repetição é outra métrica que implementamos, mas não relatamos em nosso artigo; Ele verifica qual porcentagem do texto é os loops de repetição e também retorna o comprimento da frase repetitiva.
Mauve e coerência são calculados de maneira post-hoc usando arquivos de geração salva. compute_mauve() e compute_coherence() em métricas.py são duas funções auxiliares para calcular Mauve e coerência. Eles são chamados pela função compute_mauve_coherence() em resultados.py . Para usar compute_mauve_coherence() , você deve primeiro preparar o Models.json para especificar nomes de diretórios de modelo para avaliação.
Da mesma forma, o MAUVE controlado e a coerência controlada também podem ser calculados de maneira post-hoc por compute_controlled_mauve_coherence() função em resultados.py .
| Conjunto de dados | Tamanho do modelo | Tamanho dos dados de treinamento | Objetivo | Hub de rosto abraçando o nome do hub |
|---|---|---|---|---|
| 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 |
| WebText | GPT2-Large | 50k | Mle | shiyue/webtext_train50k_gpt2-arge_mix1.0 |
| WebText | GPT2-Large | 50k | Mixce (ETA = 0,3) | shiyue/webtext_train50k_gpt2-arge_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 |
Experimente modelos pré -ridicularizados das seguintes maneiras:
>>> 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))
Nós contribuições.
Você teve uma boa experiência com este projeto? Por que não compartilhar um pouco de amor e contribuir com código, ou apenas nos informe sobre quaisquer problemas que você teve com ele?
Congratulamo -nos com relatórios de edição aqui; Certifique -se de escolher o modelo de problema adequado para o seu problema, para que possamos ter certeza de que você está nos fornecendo as informações necessárias.
Antes de enviar uma solicitação de tração, leia nossas diretrizes de contribuição.
Os dois arquivos a seguir são emprestados e adotados do repositório transformers e, portanto, mantêm seus direitos autorais originais.
Isso é originalmente escolhido em https://github.com/huggingface/transformers/blob/main/examples/pytorch/language-modeling/run_clm_no_trainener.py. Além disso, aplicamos as seguintes modificações:
--test_file--reduction--mixing_ratio--max_length--prompt_length--eval_prompt_length--cache_dir--do_train--do_evalpush_to_hub ".DataCollatorWithPadding em vez do coletor padrão.do_eval ", a maioria das quais entra na nova função ' evaluate() '. Este arquivo é ainda modificado em run_clm_no_trainer.py (veja acima) alterando como a função generate() é invocada para ativar a opção top_p .
Este projeto adotou um código de conduta. Se você tiver alguma preocupação com o código ou comportamento que você experimentou no projeto, entre em contato conosco em [email protected].