
Mal o barulho sobre a rede neural BERT do Google, que mostrou resultados avançados em várias tarefas de conversação (PNL) em aprendizado de máquina, como a OpenAI lançou um novo desenvolvimento: GPT-2. Essa rede neural com um número recorde de parâmetros no momento (1,5 bilhão, contra os 100-300 milhões comumente usados nesses casos) conseguiu gerar páginas inteiras de texto conectado.
É tão bom gerar que a OpenAI se recusou a publicar a versão completa, temendo que eles usassem essa rede neural para criar notícias falsas, comentários e críticas indistinguíveis das reais.
No entanto, no OpenAI, uma versão reduzida da rede neural GPT-2 foi compartilhada com 117 milhões de parâmetros. Vamos lançá-lo através do serviço Google Colab e experimentar com ele.
Um pouco de fundo
Para aqueles que não acompanharam o desenvolvimento do progresso no processamento natural da fala (PNL).
No verão de 2018, a OpenAI pré-treinou em um grande volume de texto uma rede neural da GPT construída na arquitetura Transformer. Descobriu-se que, se você substituir algumas das últimas camadas e treiná-la novamente para uma tarefa específica (essa abordagem é chamada de Ajuste fino e é amplamente usada no aprendizado de máquina), ela quebra imediatamente os registros anteriores em uma ampla variedade de tarefas de conversação.
Com base nesse desenvolvimento, no final de 2018, o Google criou sua própria rede neural BERT . Eles melhoraram seriamente o resultado, tornando a rede neural bidirecional, ao contrário da GPT.
Não querendo desistir, em fevereiro de 2019, o OpenAI imediatamente aumentou sua GPT em 10 vezes e a treinou em uma quantidade ainda maior de texto - em 8 milhões de páginas da Web (um total de 40 GB de texto). A rede GPT-2 resultante é atualmente a maior rede neural, com um número sem precedentes de parâmetros de 1,5 bilhão (o BERT tinha 340 milhões no maior modelo e 110 milhões no BERT padrão).
Como resultado, o GPT-2 conseguiu gerar páginas inteiras de texto coerente. Com referências repetidas aos nomes dos personagens no decorrer da narrativa, citações, referências a eventos relacionados e assim por diante. Não darei exemplos aqui, mas refiro aqueles que desejam o artigo original no blog da OpenAI: Melhores modelos de linguagem e suas implicações ou os links no final do artigo.
A geração de um texto coerente dessa qualidade é impressionante por si só, mas a coisa mais interessante é diferente. O GPT-2 sem nenhum treinamento adicional mostrou imediatamente resultados próximos do estado da arte em várias tarefas de conversação. Repito, quem perdeu a importância do momento - sem nenhum treinamento adicional para uma tarefa específica!
Como eles conseguiram isso? Apenas perguntando às redes neurais as perguntas certas.
Arquitetura GPT-2
O GPT-2 é treinado para prever a próxima palavra em uma frase. Essa é uma abordagem clássica para gerar texto. A princípio, as redes de recorrência (RNN), em particular a LSTM, mantinham o primado nessa área. Mas após a invenção da arquitetura Transformer no verão de 2017, ela gradualmente começou a prevalecer em tarefas de conversação. Embora o Transformer original tenha um problema ao armazenar sequências longas (os LSTMs lembram as mais longas), a velocidade do treinamento e a profundidade da rede mais do que compensaram isso. A propósito, várias modificações do transformador já apareceram - com a introdução de recorrência ( Universal Transformers ), uma modificação para sequências mais longas ( Transformer-XL ) e outras, mas até agora apenas um Transformer original ligeiramente ajustado é usado no Google e OpenAI.
Lembro-me que o BERT do Google aprendeu um pouco diferente: prever não a próxima palavra em uma frase, mas as palavras perdidas (mascaradas) em uma frase. E também para determinar se duas sentenças consecutivas são uma continuação lógica uma da outra ou se não estão de forma alguma conectadas por significado. Isso permitiu que o BERT fosse um modelo de linguagem que entendesse o significado das palavras, dependendo do ambiente (contexto). O que determinou o sucesso do BERT nas tarefas de NPL. Mas somente após a reciclagem (Ajuste fino) para uma tarefa específica. Apenas prever palavras no modelo base não funciona muito bem nele. Você pode jogar com o BERT no seu navegador (via Google Colab): https://habr.com/en/post/436878 .
GPT-2 não é necessário treinar novamente. Este não é apenas um modelo de linguagem como o BERT, é um gerador de texto. Apenas dê a ela o início da frase e ela complementará sua palavra por palavra.
Um detalhe interessante: a pesquisa da OpenAI mostrou que matrizes de textos da Wikipedia e livros literários (que o BERT estudou em particular) têm um estilo tendencioso. Portanto, treinados apenas nessas redes neurais não geram texto muito bem. Para diversificar os dados e estilos de entrada, a OpenAI usou o GPT-2 para treinamento em páginas regulares da Web coletadas em 8 milhões de sites (um total de 40 GB de texto). E, para descartar sites de publicidade e spammer, eles incluíram nos sites de amostra cujos links no reddit têm uma boa classificação. Ou seja, sites que exibem usuários que contêm informações úteis.
A pergunta correta contém metade da resposta.
Assim, o GPT-2, graças ao seu tamanho sem precedentes, conseguiu gerar páginas de texto coerente. Mas o mais surpreendente é que, ao fazer a pergunta certa (ou seja, o início correto de uma frase), ela conseguiu responder a várias perguntas! Só porque a continuação desse começo é a mais natural.
Por exemplo, para obter uma resposta para a pergunta "O que é a Terra?", Você pode aplicar à entrada dessa rede neural o início da frase: "A Terra é ...". E ela completará esta frase até o fim. Porque a resposta será uma continuação natural deste começo.
Além disso, ao formar o início da frase da maneira correta, você pode obter explicações para diferentes públicos-alvo, levando em consideração sua inteligência, idade e escolaridade. Imagine frases contínuas: "Eu, como cientista, acredito que a Terra é ...". Ou: "Eu, como lavrador de terras, afirmo que a Terra é ...". Ou: "Eu, como professora de um jardim de infância, agora vou explicar para vocês, crianças, que a Terra é ...".
Como você pode ver, formando as perguntas certas (o começo correto da frase), você pode obter respostas de níveis completamente diferentes e detalhes diferentes. De certa forma, algo semelhante acontece nas pessoas. O médico deve explicar ao paciente o curso da doença para que ele entenda. No nível do paciente. Se você perguntar a uma criança de cinco anos por que ele fez isso, ela não poderá responder imediatamente (que, naturalmente, as crianças convivem com sentimentos e emoções). Mas, para dar a resposta que se espera dele, a criança começa a inventá-la - a gerar texto. Com base no fato de que a resposta combina com os pais e que pelo menos de alguma forma corresponde ao que aconteceu. A princípio, como muitos pais sabem, essas serão respostas ridículas. Mas, incentivando e punindo ("conte-me mais", "não invente desculpas"), a criança aprenderá a dar respostas detalhadas e completas.
Esse desenvolvimento do OpenAI e a capacidade da rede GPT-2 de fornecer respostas para tarefas de conversação sem treinamento adicional especial para uma tarefa específica abrem duas questões interessantes:
1) A interpretabilidade das redes neurais pode ser alcançada por um gerador de texto tão elementar e pelo início correto de uma frase. Onde a resposta será uma extensão natural. Suponha, por exemplo, que uma rede neural não indique selos em uma fotografia pelos números das coordenadas x-y, mas explique sua posição em texto simples. Então, no decorrer do esclarecimento, fazendo a pergunta certa, por exemplo: "Cheguei a essa conclusão porque ...", em teoria, você pode obter uma explicação de como ela encontrou o gato na foto. E essa explicação no caso extremo não pode ser pior que a humana. O que resolve o problema global de interpretabilidade das redes neurais.
2) Uma rede neural pré-treinada em grandes volumes de texto pode ser universal, ter bom senso e não exigir treinamento adicional para tarefas específicas. Isso significa que, ao tentar imitar a fala humana (respostas humanas a perguntas), a rede neural deve inevitavelmente aprender o bom senso, a fim de fornecer respostas muito semelhantes às humanas. Dar respostas fictícias monossilábicas, em geral, não é típico para as pessoas. Na maioria das vezes, as pessoas fornecem respostas adequadas detalhadas, o que significa que a rede deve aprender a fazer o mesmo.
Ambas as questões permanecem em aberto, mas o primeiro passo em sua aprovação foi definitivamente dado.
Ou melhor?
Se você está de pé agora, é melhor sentar. Porque é assim que o OpenAI, usando a rede neural GPT-2, obteve seus resultados em tarefas de conversação para diferentes domínios:
Respostas a perguntas no texto
Bem, isso é fácil. Ou alimentou a rede com alguns parágrafos com uma descrição incluída em algum lugar no meio, por exemplo, “a maçã está sobre a mesa” e, no final, foi atribuída: “a maçã está ligada ...” e a rede foi adicionada à “mesa”. Porque é capaz de lembrar o contexto de vários parágrafos.
Ou alimentou a rede como uma frase inicial de alguns exemplos do tipo "Pergunta: alguma pergunta, resposta: alguma resposta" e, no final, após a pergunta real, eles adicionaram: "Resposta:" E a rede neural anexou a resposta! Uma vez que revelou a estrutura do documento na pergunta-resposta anterior. Isso é incrível.
Versão curta (resumo) do texto
A entrada é um texto longo de vários parágrafos ou até páginas, e a rede neural deve escrever um conteúdo curto. Como você conseguiu esse comportamento do GPT-2? Logo após o texto, eles adicionaram "TL; DR". E isso é tudo! Isso acabou sendo suficiente para o GPT-2 adicionar um resumo do artigo após esses caracteres! Porque esses símbolos na Internet frequentemente denotam o resumo da publicação.
Tradução de texto
A entrada GPT-2 recebeu o texto no formato: "olá = olá, cachorro = cachorro, vento = vento, gato = ...". E a rede neural acrescentou a tradução da última palavra: "gato" (no original em francês). Porque revelou a estrutura do documento e simplesmente a complementou com a continuação mais lógica. Se sua mandíbula ainda não caiu de tudo isso, tenho duas novidades para você e ambas são ruins =).
Lançamento do GPT-2 através do Google Colab
Infelizmente, a versão completa do GPT-2 no OpenAI foi recusada para ser compartilhada. Motivando isso pelo fato de que, usando essa rede neural, será muito fácil gerar notícias e críticas falsas nas lojas. A julgar pela declaração, a discussão sobre a adequação do layout desse modelo continuará pelos próximos 6 meses. Após o OpenAI, eles decidirão se devem enviá-lo ou não. No entanto, para uma grande organização, não é difícil repetir o modelo (parece que eles o treinaram para 256 TPU por vários dias e, de acordo com estimativas preliminares, isso lhes custou cerca de US $ 45 mil)
No entanto, eles publicaram uma versão reduzida do GPT-2 com 117 milhões de parâmetros (em vez de 1,5 bilhão, como no modelo completo): https://github.com/openai/gpt-2 . Vamos tentar executá-lo e brincar com este modelo.
Atualização em 9 de novembro de 2019: finalmente, foi apresentada toda a linha de modelos, incluindo 1,5 bilhão de arquivos e instruções para o lançamento atualizado.
A maneira mais fácil de fazer isso é através do Google Colab:
- Abra o link
http://colab.research.google.com/github/blade1780/bert/blob/master/Gpt-2.ipynb
- No menu Tempo de Execução , selecione Executar Tudo , para que pela primeira vez todas as células sejam iniciadas, o modelo é baixado e as bibliotecas necessárias estão conectadas. Concorde em redefinir todo o tempo de execução, se necessário. Digite o texto após o aparecimento de "Prompt do modelo >>>" e pressione Enter.
Preste atenção à linha logo no início:
model_name = '117M'
Aqui você pode especificar o tamanho do modelo GPT-2 a ser usado. Os seguintes modelos estão disponíveis (sujeitos a atualização):
117M
124M
355M
774M
1558M
Aqui, 117M é o menor modelo que era o único disponível no momento em que este artigo foi escrito. Mais tarde, a OpenAI estabeleceu modelos cada vez maiores, até 5 de novembro de 2019, estabeleceu o máximo de 1558M (com 1,5 bilhões de parâmetros).
Se algo desse errado ...Verifique se GPU e Python 3 estão selecionados no menu Tempo de execução -> Alterar tipo de tempo de execução
Se o botão de conexão não estiver ativo, clique nele para se conectar.
Ou crie todo o código manualmente:
- Acesse https://colab.research.google.com
- Pressione o botão azul NEW PYTHON 3 NOTEBOOK
- No menu Tempo de execução -> Alterar tipo de tempo de execução, selecione Python 3 e a GPU (a última para executar a rede neural na GPU)
- Na primeira célula, digite:
model_name = '117M' !git clone https://github.com/openai/gpt-2 %cd gpt-2 !pip3 install -r requirements.txt !python3 download_model.py $model_name
Em vez de 117M (o menor), você pode especificar qualquer modelo intermediário ou maior: 1558M.
E clique no ícone preto Play à esquerda da célula. Isso fará o download da rede neural GPT-2 selecionada e instalará as dependências necessárias.
Na segunda célula (você pode adicioná-lo através do menu Inserir -> Código da célula ou passando o mouse sob o centro da célula atual, os botões de adição serão exibidos):
!python3 src/interactive_conditional_samples.py --model_name=$model_name
Isso iniciará o modo interativo. Aguarde até que a rede neural seja inicializada e uma janela para inserir texto apareça com a inscrição “Model Model >>>”. Digite o início da frase e pressione Enter. Após algum tempo, o texto gerado aparecerá sob o cabeçalho SAMPLE.
Você também pode iniciar o modo de gerar texto completamente aleatório. O texto será gerado infinitamente em pequenos pedaços de AMOSTRA 1, AMOSTRA 2 e assim por diante, até você clicar no botão Parar na célula. Para fazer isso, crie uma nova célula com o código:
!python3 src/generate_unconditional_samples.py --model_name=$model_name | tee samples.txt
O resultado será salvo no arquivo samples.txt. Pode ser baixado com os seguintes comandos (crie uma nova célula novamente e execute-a após gerar o texto):
from google.colab import files files.download('samples.txt')
Você pode alterar os parâmetros para gerar texto (coeficiente de aleatoriedade etc., veja a descrição no trabalho original ):
!python3 src/generate_unconditional_samples.py --model_name=$model_name --top_k 40 --temperature 0.7 | tee samples.txt
Como o 117M é um modelo bastante reduzido, não espere milagres (atualização: no momento da redação deste artigo, apenas ele estava disponível. Agora tudo está disponível, incluindo o maior 1558M original, veja acima). A maioria das amostras geradas será absurda. Mas também existem seções significativas. O texto deve estar em inglês, enquanto em outros idiomas o GPT-2 ainda não pode funcionar.
Exemplos de texto gerado
Amostras do texto gerado pelo modelo completo : https://blog.openai.com/better-language-models/#sample1 (na parte superior da barra por 8 histórias).
Há também um enorme arquivo de texto de 2,4 Mb com amostras geradas aleatoriamente: https://raw.githubusercontent.com/openai/gpt-2/master/gpt2-samples.txt
E mais um, 2,27 Mb, com outras configurações de aleatoriedade: https://raw.githubusercontent.com/openai/gpt-2/master/gpt2-topk40-samples.txt
Referências