Colaboração entre Santosh Gupta, Alex Sheng e Junpeng Ye
Faça o download de modelos treinados e incorporando o arquivo aqui.
O finalista do vencedor do Top 6 do desafio ⚡#PowerEdBytf 2.0! https://devpost.com/software/nlp-doctor. O produto do DOC será apresentado à equipe de engenharia do TensorFlow na TensorFlow Connect. Fique ligado para obter detalhes.
Queríamos usar o TensorFlow 2.0 para explorar o quão bem os modelos de processamento de idiomas naturais de última geração como BERT e GPT-2 poderia responder a perguntas médicas recuperando e condicionando os dados médicos relevantes, e esse é o resultado.
O objetivo deste projeto é explorar as capacidades dos modelos de idiomas de aprendizado profundo para a codificação e recuperação científica, ele não deve ser usado para aconselhamento médico acionável.
Como um grupo de amigos com diversas origens que variam de graduação quebrada a cientistas de dados a pesquisadores de PNL de primeira linha, inspiramos nosso design em várias áreas diferentes de aprendizado de máquina. Ao combinar o poder das arquiteturas de transformadores, pesquisa vetorial latente, amostragem negativa e pré-treinamento generativo dentro da estrutura flexível de aprendizado profundo do Tensorflow 2.0, fomos capazes de apresentar uma nova solução para um problema difícil que, a princípio, parecia uma tarefa hercúlica.
Se você estiver interessado em toda a história de como construímos o produto Doc e os detalhes de nossa arquitetura, dê uma olhada no nosso Github Readme!
Nosso projeto foi feito com muitos desafios a serem contados, desde os conjuntos de dados astronomicamente grandes, até a reimplementação da totalidade de Bert no Tensorflow 2.0, até a execução do GPT-2 com 117 milhões de parâmetros no colaboratório, para apressar para preparar as últimas partes do nosso projeto, com algumas horas restantes até o prazo final. Curiosamente, os maiores desafios eram frequentemente quando tínhamos discordâncias sobre a direção em que o projeto deveria ser seguido. No entanto, embora discordemos sobre qual era o melhor curso de ação, no final, todos tínhamos o mesmo objetivo final de construir algo significativo e potencialmente valioso para muitas pessoas. Dito isto, sempre poderíamos se sentar e chegar a um acordo e, com o apoio um do outro e as conversas de PEP sobre o Google Hangouts, subirem aos desafios e superá-los juntos.
Embora o produto do DOC não esteja pronto para uso comercial generalizado, seu desempenho surpreendentemente bom mostra que os avanços em modelos gerais de idiomas como BERT e GPT-2 causaram problemas previamente intratáveis, como processamento de informações médicas acessível a abordagens profundas baseadas em PNL. Assim, esperamos que nosso trabalho sirva para inspirar outras pessoas a enfrentar esses problemas e explorar a fronteira recém -aberta da PNL.
No entanto, ainda planejamos continuar trabalhando no produto DOC , expandindo-o especificamente para aproveitar as versões de parâmetros de 345m, 762m e 1,5b do GPT-2, enquanto o OpenAI os libera como parte de seu programa de liberação encenada. Também pretendemos continuar treinando o modelo, pois ainda temos um pouco mais de dados para passar.
NOTA: Estamos trabalhando em pesquisa em pesquisa científica/médica e recuperação de informações. Se você estiver interessado em colaborar, envie-nos um e-mail em [email protected]!
Você pode instalar o produto Doc diretamente a partir do PIP e executá -lo em sua máquina local. Aqui está o código para instalar o produto DOC , juntamente com o Tensorflow 2.0 e o FAISS:
!wget https://anaconda.org/pytorch/faiss-cpu/1.2.1/download/linux-64/faiss-cpu-1.2.1-py36_cuda9.0.176_1.tar.bz2
#To use GPU FAISS use
# !wget https://anaconda.org/pytorch/faiss-gpu/1.2.1/download/linux-64/faiss-gpu-1.2.1-py36_cuda9.0.176_1.tar.bz2
!tar xvjf faiss-cpu-1.2.1-py36_cuda9.0.176_1.tar.bz2
!cp -r lib/python3.6/site-packages/* /usr/local/lib/python3.6/dist-packages/
!pip install mkl
!pip install tensorflow-gpu==2.0.0-alpha0
import tensorflow as tf
!pip install https://github.com/Santosh-Gupta/DocProduct/archive/master.zip
Nosso repositório contém scripts para gerar dados .tfrefords , treinamento de produtos do DOC em seus próprios dados de perguntas e respostas e executando o produto DOC para obter respostas para perguntas médicas. Consulte a seção Demonstrações do Google Colaboratory abaixo para obter amostras de código para carregar dados/pesos e executar nossos modelos.
Dê uma olhada nas nossas demos colab! Planejamos adicionar mais demos à medida que avançamos, permitindo que os usuários explorem mais as funcionalidades do produto DOC . Todas as novas demos serão adicionadas à mesma pasta do Google Drive.
As demos incluem código para instalar o produto do documento via PIP, baixar/carregar pesos pré-treinados e executar as funções de recuperação do produto Doc e ajustar seus próprios dados de perguntas e respostas.
https://colab.research.google.com/drive/11har1qo7vcsmijwrefwytfblu2lveh1r
https://colab.research.google.com/drive/1rz2rzkwwrvexcjiqqtxhxzlcw5cxi7xa
A demonstração do produto de ponta a ponta do documento ainda é experimental , mas fique à vontade para experimentá-lo! https://colab.research.google.com/drive/1bv7bppxiimsmg4ywb_lwjdrguhvi7pxx
Nosso Bert foi treinado para codificar questões médicas e informações médicas. Um usuário pode digitar uma questão médica e nosso modelo recuperará as informações médicas mais relevantes para essa pergunta.
Criamos conjuntos de dados de vários fóruns de perguntas médicas e resposta. Os fóruns são WebMD, Healthtap, eHealthForums, Iclinic, questions Doctors e Reddit.com/r/askdocs
A arquitetura consiste em um biobert de ajuste fino (o mesmo para perguntas e respostas) para converter a entrada de texto em uma representação de incorporação. A incorporação é então inserida em um FCNN (um diferente para as perguntas e respostas) para desenvolver uma incorporação usada para pesquisa de similaridade. As principais perguntas e respostas semelhantes são usadas pelo GPT-2 para gerar uma resposta. A arquitetura completa é mostrada abaixo.
Vamos dar uma olhada na primeira metade do diagrama acima acima com mais detalhes, o treinamento do Bert e dos FCNNs. Uma figura detalhada desta parte é mostrada abaixo
Durante o treinamento, tomamos um lote de perguntas médicas e suas respostas médicas correspondentes e as convertemos em incorporações de biobert. Os mesmos pesos Bert são usados para as perguntas e respostas.
Essas incorporações são então inseridas em uma camada FCNN. Existem camadas FCNN separadas para a pergunta e as incorporações de resposta. Para recapitular, usamos os mesmos pesos na camada Bert, mas as perguntas e respostas têm sua própria camada separada do FCNN.
Agora é aqui que as coisas ficam um pouco complicadas. Geralmente, a incorporação de treinamento de similaridade envolve amostras negativas, como como o Word2Vec usa a perda de NCE. No entanto, não podemos usar a perda de NCE em nosso caso, pois as incorporações são geradas durante cada etapa e os pesos mudam durante cada etapa de treinamento.
Então, em vez de perda de NCE, o que fizemos foi calcular o produto DOT para todas as combinações da pergunta e da resposta incorporadas em nosso lote. Isso é mostrado na figura abaixo
Em seguida, um softmax é levado através das fileiras; Para cada pergunta, todas as suas combinações de respostas são softmaxed.
Finalmente, a perda usada é a perda de entropia cruzada. A matriz softmaxada é comparada a uma matriz de verdade no solo; As combinações corretas de perguntas e respostas são rotuladas com um '1' e todas as outras combinações são rotuladas com um '0'.
A coleta de dados foi complicada porque a formatação de todos os diferentes locais médicos era significativamente diferente. Trabalho personalizado necessário para cada site para obter perguntas e respostas da parte correta das tags HTML. Alguns dos sites também tinham a possibilidade de vários médicos responderem a uma única pergunta, por isso precisávamos de um método de reunir várias respostas a perguntas individuais. Para lidar com isso, criamos várias linhas para todos os pares de perguntas e respostas. A partir daqui, precisávamos executar o modelo através do BERT e armazenar as saídas de uma das camadas finais, a fim de criar incorporações BioBert, poderíamos passar pelas densas camadas de nossa rede neural de feed-forward (FFNN). 768 Os vetores de dimensão foram armazenados para a pergunta e respostas e concatenados com o texto correspondente em um arquivo CSV. Tentamos vários formatos diferentes para carga e compartilhamento mais compactos e mais rápidos, mas o CSV acabou sendo o método mais fácil e flexível. Depois que as incorporações BioBert foram criadas e armazenadas, o processo de treinamento de similaridade foi realizado e, em seguida, foram criadas incorporações da FFNN que capturariam a semelhança de perguntas às respostas. Estes também foram armazenados junto com as incorporações BioBert e o texto de origem para visualização e consulta posteriores.
Os modelos de incorporação são incorporados no TF 2.0, que utilizam a flexibilidade de execução ansiosa do TF 2.0. No entanto, o modelo GPT2 que usamos é construído em TF 1.x. Felizmente, podemos treinar dois modelos separadamente. Embora a inferência, precisamos manter a execução ansiosa com tf.compat.v1.disable_eager_execution e manter duas sessões separadas. Também precisamos cuidar da memória da GPU de duas sessões para evitar a OOM.
Uma abordagem óbvia para recuperar respostas com base nas perguntas do usuário é que usamos um poderoso codificador (BERT) para codificar perguntas e perguntas de entrada em nosso banco de dados e fazer uma pesquisa de similaridade. Não há treinamento e o desempenho dessa abordagem depende totalmente do codificador. Em vez disso, usamos redes de feed-forward separadas para perguntas e respostas e calculamos a similaridade de cosseno entre elas. Inspirado na amostragem negativa do artigo Word2Vec, tratamos outras respostas no mesmo lote que amostras negativas e calculamos a perda de entropia cruzada. Essa abordagem torna incorporadas as perguntas e respostas em um par o mais próximo possível em termos de distância euclidiana. Acontece que essa abordagem gera resultados mais robustos do que fazer pesquisa de similaridade diretamente usando o vetor de incorporação do BERT.
O pré -processamento de Bert é complicado e temos totalmente cerca de 333 mil pares de controle de qualidade e mais de 30 milhões de tokens. Considerando que o Shuffle é muito importante em nosso treinamento, precisamos do buffer de Shuffle suficientemente grande para treinar adequadamente nosso modelo. Demorou mais de 10 minutos para pré -processamento de dados antes de começar a treinar o modelo em cada época. Por isso, usamos o TF.Data e o TFRecords para criar um pipeline de entrada de alto desempenho. Após a otimização, levou apenas 20 segundos para começar a treinar e sem tempo ocioso da GPU.
Outro problema com o pré -processamento de Bert é que ele encaixa todos os dados para um comprimento fixo. Portanto, para seqüências curtas, muita computação e memória da GPU são desperdiçadas. Isso é muito importante, especialmente com grandes modelos como Bert. Por isso, reescrevemos o código de pré -processamento do BERT e utilizamos tf.data.experimental.bucket_by_sequence_length para sequências de bucket com diferentes comprimentos e sequências de preenchimento dinamicamente. Ao fazer isso, alcançamos um comprimento mais longo da sequência máxima e um treinamento mais rápido.
Após alguma modificação, o Keras-Bert é capaz de executar no ambiente TF 2.0. No entanto, quando tentamos usar o Keras-Bert como um submodelo em nossos modelos de incorporação, encontramos os dois problemas a seguir.
Como resultado, decidimos reimplementar uma versão imperativa de Bert. Utilizamos alguns componentes de Keras-Bert (atenção múltipla, carga de peso do ponto de verificação, etc.) e escrevemos o método de chamada de Bert. Nossa implementação é mais fácil de depurar e compatível com o modo ALIGADO flexível e o modo gráfico estático de alto desempenho.
Os usuários podem experimentar vários sintomas em várias condições, o que faz a resposta perfeita pode ser uma combinação de várias respostas. Para enfrentar isso, fazemos uso do poderoso modelo GPT2 e alimentamos o modelo as perguntas dos usuários, juntamente com as principais respostas auxiliares que recuperamos de nossos dados. O modelo GPT2 será baseado na pergunta e nas principais respostas K e gerará uma resposta melhor. Para treinar adequadamente o modelo GPT2, criamos os dados de treinamento como seguintes: Tomamos todas as perguntas do nosso conjunto de dados, fazemos uma pesquisa de similaridade para obter a melhor resposta K+1, usamos a resposta original como destino e outras respostas como entradas auxiliares. Ao fazer isso, obtemos a mesma quantidade de dados de treinamento do GPT2 que os dados de treinamento de modelos de incorporação.
Bert é fantástico para codificar perguntas e respostas médicas e desenvolver representações vetoriais robustas dessas perguntas/respostas.
Treinamos uma versão ajustada do nosso modelo que foi inicializada com o Naver's BioBert. Também treinamos uma versão em que os pesos da BioBert estavam congelados e apenas treinamos os dois FCNNs para as perguntas e respostas. Enquanto esperávamos que a versão ajustada funcionasse bem, ficamos surpresos com o quão robusto foi mais tarde. Isso sugere que a BioBert possui recursos inatos para poder codificar os meios de perguntas e respostas médicas.
Explore se houver algum uso prático deste projeto fora dos propósitos de pesquisa/exploratório. Um modelo como esse não deve ser usado em público para obter informações médicas. Mas talvez possa ser usado por profissionais médicos treinados/licenciados para coletar informações para a verificação.
Explore a aplicação do mesmo método a outros domínios (ou seja, recuperação de informações do histórico, recuperação de informações de engenharia, etc.).
Explore como o Scibert recentemente lançado (de Allen AI) se compara ao Naver's BioBert.
Agradecemos à equipe Tensorflow por fornecer o #PowerEdByTf2.0 Challenge como uma plataforma através da qual poderíamos compartilhar nosso trabalho com outras pessoas e um agradecimento especial ao Dr. Llion Jones, cujas idéias e orientações tiveram um impacto importante na direção do nosso projeto.