Colaboración entre Santosh Gupta, Alex Sheng y Junpeng Ye
Descargue modelos capacitados e incrustación de archivo aquí.
¡Ganador Top 6 Finalista del ⚡#PoweredByTF 2.0 Challenge! https://devpost.com/software/nlp-doctor. El producto DOC se presentará al equipo de Ingeniería TensorFlow en TensorFlow Connect. Estén atentos para más detalles.
Queríamos usar TensorFlow 2.0 para explorar qué tan bien modelos de procesamiento de lenguaje natural de última generación como Bert y GPT-2 podrían responder a las preguntas médicas recuperando y acondicionando los datos médicos relevantes, y este es el resultado.
El propósito de este proyecto es explorar las capacidades de los modelos de lenguaje de aprendizaje profundo para la codificación y recuperación científicas, no debe usarse para asesoramiento médico procesable.
Como un grupo de amigos con diversos orígenes que van desde los pregrados en quiebra hasta los científicos de datos hasta los investigadores de PNL de primer nivel, nos inspiramos para nuestro diseño de varias áreas diferentes del aprendizaje automático. Al combinar el poder de las arquitecturas de transformadores, la búsqueda de vectores latentes, el muestreo negativo y el pre-entrenamiento generativo dentro del marco de aprendizaje profundo flexible de TensorFlow 2.0, pudimos encontrar una solución novedosa para un problema difícil que al principio parecía una tarea hercúlea.
Si está interesado en toda la historia de cómo construimos DOC Product y los detalles de nuestra arquitectura, ¡eche un vistazo a nuestro Readme Github!
Nuestro proyecto se realizó con demasiados desafíos para contar, desde la comprimir conjuntos de datos astronómicamente grandes, hasta reimplementar la totalidad de Bert en Tensorflow 2.0, hasta ejecutar GPT-2 con 117 millones de parámetros en Colaboratory, a apresurarse para preparar las últimas partes de nuestro proyecto con unas pocas horas hasta la fecha límite de presentación. Por extraño que parezca, los mayores desafíos eran a menudo cuando teníamos desacuerdos sobre la dirección en que el proyecto debería dirigirse. Sin embargo, aunque no estaríamos de acuerdo sobre cuál era el mejor curso de acción, al final todos teníamos el mismo objetivo final de construir algo significativo y potencialmente valioso para muchas personas. Dicho esto, siempre podríamos sentarnos y llegar a un acuerdo y, con el apoyo del otro y las conversaciones de PEP a altas horas de la noche sobre los lugares de reunión de Google, ascender a los desafíos y superarlos juntos.
Aunque el producto DOC no está listo para un uso comercial generalizado, su rendimiento sorprendentemente bueno muestra que los avances en modelos de idiomas generales como Bert y GPT-2 han hecho problemas previamente intratables como el procesamiento de la información médica accesible para los enfoques basados en PNL profundos. Por lo tanto, esperamos que nuestro trabajo sirva para inspirar a otros a abordar estos problemas y explorar la frontera de la PNL recientemente abierta.
Sin embargo, todavía planeamos continuar trabajando en el producto DOC , expandiéndolo específicamente para aprovechar las versiones de parámetros de 345m, 762m y 1.5B de GPT-2 como OpenAI las libera como parte de su programa de liberación escenificada. También tenemos la intención de continuar entrenando el modelo, ya que todavía tenemos bastante más datos por los que pasar.
Nota: Estamos trabajando en la investigación en PNL científica/médica y recuperación de información. Si está interesado en colaborar, envíenos un correo electrónico a [email protected].
Puede instalar el producto DOC directamente desde PIP y ejecutarlo en su máquina local. Aquí está el código para instalar el producto DOC , junto con TensorFlow 2.0 y 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
Nuestro repositorio contiene scripts para generar datos .Tfrefords , capacitar al producto DOC en sus propios datos de preguntas y respuestas y ejecutar el producto DOC para obtener respuestas para preguntas médicas. Consulte la sección de demostraciones colaboratorias de Google a continuación para ver las muestras de código para cargar datos/pesos y ejecutar nuestros modelos.
¡Echa un vistazo a nuestras demostraciones de Colab! Planeamos agregar más demostraciones a medida que avanzamos, permitiendo a los usuarios explorar más funcionalidades del producto DOC . Todas las demostraciones nuevas se agregarán a la misma carpeta de Google Drive.
Las demostraciones incluyen código para instalar el producto DOC a través de PIP, descargar/cargar pesos previamente capacitados y ejecutar funciones de recuperación del producto DOC y ajustar en sus propios datos de preguntas y respuestas.
https://colab.research.google.com/drive/11har1qo7vcsmijwrefwytfblu2lveh1r
https://colab.research.google.com/drive/1rz2rzkwwrvexcjiqqtxhxzlcw5cxi7xa
La demostración del producto DOC de extremo a extremo sigue siendo experimental , ¡pero no dude en probarlo! https://colab.research.google.com/drive/1bv7bppxiimsmg4ywb_lwjdrguhvi7pxx
Nuestro Bert ha sido capacitado para codificar preguntas médicas e información médica. Un usuario puede escribir una pregunta médica, y nuestro modelo recuperará la información médica más relevante a esa pregunta.
Creamos conjuntos de datos a partir de varios foros de preguntas y contestadores médicos. Los foros son WebMD, HealthTap, EHealthforums, Iclinic, preguntas de los médicos y reddit.com/r/askdocs
La arquitectura consiste en un biobert ajustado (lo mismo para preguntas y respuestas) para convertir la entrada de texto a una representación de incrustación. La incrustación se ingresa en una FCNN (una diferente para las preguntas y respuestas) para desarrollar una incrustación que se usa para la búsqueda de similitud. GPT-2 luego utilizan las mejores preguntas y respuestas similares para generar una respuesta. La arquitectura completa se muestra a continuación.
Echemos un vistazo a la primera mitad del diagrama anterior con más detalle, el entrenamiento del Bert y los FCNNS. A continuación se muestra una figura detallada de esta parte
Durante la capacitación, tomamos un lote de preguntas médicas y sus respuestas médicas correspondientes, y las convirtimos en integridades de BioBert. Los mismos pesos Bert se usan tanto para las preguntas como para las respuestas.
Estas incrustaciones se ingresan en una capa FCNN. Hay capas FCNN separadas tanto para la pregunta como para los incrustaciones de respuesta. Para recapitular, usamos los mismos pesos en la capa Bert, pero las preguntas y respuestas tienen su propia capa separada de FCNN.
Ahora aquí es donde las cosas se ponen un poco complicadas. Por lo general, el entrenamiento de similitud de incrustación implica muestras negativas, como la forma en que Word2Vec usa la pérdida de NCE. Sin embargo, no podemos usar la pérdida de NCE en nuestro caso ya que los incrustaciones se generan durante cada paso, y los pesos cambian durante cada paso de entrenamiento.
Entonces, en lugar de la pérdida de NCE, lo que hicimos fue calcular el producto DOT para cada combinación de la pregunta y responder incrustaciones dentro de nuestro lote. Esto se muestra en la figura a continuación
Luego, se toma un Softmax sobre las filas; Para cada pregunta, todas sus combinaciones de respuestas son suaves.
Finalmente, la pérdida utilizada es la pérdida de entropía cruzada. La matriz suave se compara con una matriz de verdad de tierra; Las combinaciones correctas de preguntas y respuestas se etiquetan con un '1', y todas las otras combinaciones están etiquetadas con un '0'.
La recopilación de datos fue complicado porque el formato de todos los diferentes sitios médicos fue significativamente diferente. Debía realizarse un trabajo personalizado para cada sitio para extraer preguntas y respuestas de la parte correcta de las etiquetas HTML. Algunos de los sitios también tenían la posibilidad de que múltiples médicos respondieran a una sola pregunta, por lo que necesitábamos un método para recopilar múltiples respuestas a preguntas individuales. Para lidiar con esto, creamos múltiples filas para cada par de preguntas y respuestas. Desde aquí necesitábamos ejecutar el modelo a través de Bert y almacenar las salidas de una de las capas finales para hacer que BioBert se incrusten, podríamos pasar a través de las densas capas de nuestra red neuronal de avance (FFNN). Se almacenaron 768 vectores de dimensión tanto para la pregunta como para las respuestas y se concatenaron con el texto correspondiente en un archivo CSV. Probamos varios formatos diferentes para una carga y compartir más compacto y más rápido, pero CSV terminó siendo el método más fácil y flexible. Después de que se crearon y almacenaron los incrustaciones de BioBert, se realizó el proceso de entrenamiento de similitud y luego se crearon incrustaciones de FFNN que capturarían la similitud de las preguntas a las respuestas. Estos también se almacenaron junto con los incrustaciones de BioBert y el texto de origen para visualización y consulta posteriores.
Los modelos de incrustación están construidos en TF 2.0 que utiliza la flexibilidad de la ejecución ansiosa de TF 2.0. Sin embargo, el modelo GPT2 que usamos está construido en TF 1.x. Afortunadamente, podemos entrenar dos modelos por separado. Mientras que la inferencia, necesitamos mantener la ejecución ansiosa con tf.compat.v1.disable_eager_execution y mantener dos sesiones separadas. También debemos cuidar la memoria de GPU de dos sesiones para evitar OOM.
Un enfoque obvio para recuperar respuestas basadas en las preguntas del usuario es que utilizamos un codificador potente (BERT) para codificar preguntas y preguntas de entrada en nuestra base de datos y hacer una búsqueda de similitud. No hay capacitación y el rendimiento de este enfoque depende totalmente del codificador. En cambio, utilizamos redes de alimentación separadas para preguntas y respuestas y calculamos la similitud de coseno entre ellas. Inspirados en el muestreo negativo del papel Word2Vec, tratamos otras respuestas en el mismo lote que las muestras negativas y calculamos la pérdida de entropía cruzada. Este enfoque hace que las preguntas sean incrustaciones y respuestas incrustadas en un par lo más cerca posible en términos de distancia euclidiana. Resulta que este enfoque produce resultados más sólidos que hacer una búsqueda de similitud directamente utilizando Bert Incrusting Vector.
El preprocesamiento de Bert es complicado y tenemos totalmente alrededor de 333k pares de control de calidad y más de 30 millones de fichas. Teniendo en cuenta que Shuffle es muy importante en nuestro entrenamiento, necesitamos el búfer Shuffle lo suficientemente grande como para entrenar adecuadamente nuestro modelo. Le tomó más de 10 minutos los datos del preprocesamiento antes de comenzar a entrenar el modelo en cada época. Entonces usamos los datos TF. y TFRecords para construir una tubería de entrada de alto rendimiento. Después de la optimización, solo tardó alrededor de 20 segundos en comenzar a entrenar y no hay tiempo de inactividad de GPU.
Otro problema con el preprocesamiento de Bert es que se acumula todos los datos a una longitud fija. Por lo tanto, para secuencias cortas, se desperdician muchos cálculos y memoria GPU. Esto es muy importante, especialmente con grandes modelos como Bert. Por lo tanto, reescribimos el código de preprocesamiento de Bert y utilizamos tf.data.experimental.bucket_by_sequence_length para cubrir secuencias con diferentes longitudes y secuencias de relleno dinámicamente. Al hacer esto, logramos una longitud de secuencia máxima más larga y un entrenamiento más rápido.
Después de alguna modificación, el Keras-Bert puede ejecutarse en el entorno TF 2.0. Sin embargo, cuando intentamos usar el Keras-Bert como submodelo en nuestros modelos de incrustación, encontramos los siguientes dos problemas.
Como resultado, decidimos volver a implementar una versión imperativa de Bert. Utilizamos algunos componentes de Keras-Bert (atención de múltiples cabezas, carga de peso del punto de control, etc.) y escribimos el método de llamadas de Bert. Nuestra implementación es más fácil de depurar y compatible con el modo ansioso flexible y el modo de gráfico estático de alto rendimiento.
Los usuarios pueden experimentar múltiples síntomas en diversas condiciones, lo que hace que la respuesta perfecta podría ser una combinación de múltiples respuestas. Para abordar eso, utilizamos el poderoso modelo GPT2 y alimentamos al modelo las preguntas de los usuarios junto con las respuestas auxiliares de K Top K que recuperamos de nuestros datos. El modelo GPT2 se basará en la pregunta y las respuestas de K Top K y generará una mejor respuesta. Para capacitar correctamente el modelo GPT2, creamos los datos de capacitación a continuación: tomamos todas las preguntas en nuestro conjunto de datos, hacemos una búsqueda de similitud para obtener la respuesta superior K+1, usamos la respuesta original como objetivo y otras respuestas como entradas auxiliares. Al hacer esto, obtenemos la misma cantidad de datos de entrenamiento GPT2 que los datos de capacitación del modelo de incrustación.
Bert es fantástico para codificar preguntas y respuestas médicas, y desarrollar representaciones vectoriales sólidas de esas preguntas/respuestas.
Entrenamos una versión ajustada de nuestro modelo que se inicializó con Biobert de Naver. También entrenamos una versión en la que se congelaron los pesos de BioBert, y solo entrenamos los dos FCNN para las preguntas y respuestas. Si bien esperábamos que la versión ajustada funcionara bien, nos sorprendió lo robusta que era más tarde. Esto sugiere que BioBert tiene capacidades innatas para poder codificar los medios de preguntas y respuestas médicas.
Explore si hay algún uso práctico de este proyecto fuera de fines de investigación/exploratorios. Un modelo como este no debe usarse en el público para obtener información médica. Pero tal vez pueda ser utilizado por profesionales médicos capacitados/con licencia para recopilar información para la investigación.
Explore la aplicación del mismo método a otros dominios (es decir, la recuperación de la información del historial, la recuperación de información de ingeniería, etc.).
Explore cómo el recientemente lanzado Scibert (de Allen AI) se compara con el Biobert de Naver.
Agradecemos al equipo de TensorFlow por proporcionar el desafío #PoweredByTF2.0 como una plataforma a través de la cual podríamos compartir nuestro trabajo con otros, y un agradecimiento especial al Dr. Llion Jones, cuyas ideas y orientación tuvieron un impacto importante en la dirección de nuestro proyecto.