Collaboration entre Santosh Gupta, Alex Sheng et Junpeng Ye
Téléchargez les modèles formés et le fichier d'intégration ici.
Vainqueur Top 6 finaliste du # # PowerEdByTF 2.0 Challenge! https://devpost.com/software/nlp-doctor. Le produit DOC sera présenté à l'équipe d'ingénierie de TensorFlow à Tensorflow Connect. Restez à l'écoute pour plus de détails.
Nous voulions utiliser TensorFlow 2.0 pour explorer à quel point des modèles de traitement du langage naturel de pointe comme Bert et GPT-2 pourraient répondre aux questions médicales en récupérant et en conditionnement des données médicales pertinentes, et c'est le résultat.
Le but de ce projet est d'explorer les capacités des modèles de langage d'apprentissage en profondeur pour l'encodage scientifique et la récupération qu'il ne devrait pas être utilisé pour des conseils médicaux exploitables.
En tant que groupe d'amis avec divers horizons allant des étudiants de premier cycle brisés aux scientifiques des données aux chercheurs de PNL de haut niveau, nous nous sommes inspirés de notre conception dans différents domaines de l'apprentissage automatique. En combinant la puissance des architectures de transformateurs, la recherche de vecteurs latentes, l'échantillonnage négatif et la pré-formation générative dans le cadre flexible d'apprentissage en profondeur de Tensorflow 2.0, nous avons pu trouver une nouvelle solution à un problème difficile qui semblait d'abord être une tâche herculéenne.
Si vous êtes intéressé par toute l'histoire de la façon dont nous avons construit le produit DOC et des détails de notre architecture, jetez un œil à notre réadme GitHub!
Notre projet a été formulé avec trop de défis à compter, de la compression des ensembles de données astronomiquement grands, de réimplémentation de l'intégralité de Bert dans TensorFlow 2.0, à l'exécution de GPT-2 avec 117 millions de paramètres en colaboratoire, pour se précipiter pour que les dernières parties de notre projet soient prêtes à quelques heures jusqu'à la mort de la soumission. Curieusement, les plus grands défis étaient souvent lorsque nous avions des désaccords sur la direction que le projet devrait être dirigé. Cependant, bien que nous soyons en désaccord sur la meilleure ligne de conduite, nous avions finalement le même objectif final de construire quelque chose de significatif et potentiellement précieux pour beaucoup de gens. Cela étant dit, nous pourrions toujours éventuellement nous asseoir et conclure un accord et, avec le soutien de chacun et les discussions de pep de fin de soirée sur Google Hangouts, relever les défis et les surmonter ensemble.
Bien que le produit DOC ne soit pas prêt pour une utilisation commerciale généralisée, ses performances étonnamment bonnes montrent que les progrès dans les modèles de langage généraux comme Bert et GPT-2 ont rendu des problèmes préalables comme un traitement d'information médicale accessible aux approches profondes basées sur la PNL. Ainsi, nous espérons que notre travail servira à inspirer les autres à s'attaquer à ces problèmes et à explorer eux-mêmes la frontière NLP nouvellement ouverte.
Néanmoins, nous prévoyons toujours de continuer à travailler sur le produit DOC , l'élargissant spécifiquement pour profiter des versions de paramètres 345m, 762m et 1,5b de GPT-2, car OpenAI les publie dans le cadre de leur programme de publication. Nous avons également l'intention de continuer à former le modèle, car nous avons encore un peu plus de données à suivre.
Remarque: Nous travaillons en cours sur la recherche sur la PNL scientifique / médicale et la recherche d'informations. Si vous êtes intéressé à collaborer, lancez-nous un e-mail à [email protected]!
Vous pouvez installer le produit DOC directement à partir de PIP et l'exécuter sur votre machine locale. Voici le code pour installer le produit Doc , avec Tensorflow 2.0 et 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
Notre dépôt contient des scripts pour générer des données .tfrefords , former le produit DOC sur vos propres données de questions / réponses et exécuter le produit DOC pour obtenir des réponses pour des questions médicales. Veuillez consulter la section Google Colaboratory Demos ci-dessous pour les échantillons de code pour charger des données / poids et exécuter nos modèles.
Jetez un œil à nos démos Colab! Nous prévoyons d'ajouter plus de démos au fur et à mesure, permettant aux utilisateurs d'explorer davantage les fonctionnalités du produit DOC . Toutes les nouvelles démos seront ajoutées au même dossier Google Drive.
Les démos incluent le code pour l'installation du produit DOC via PIP, le téléchargement / le chargement des poids pré-formés et l'exécution des fonctions de récupération du produit DOC et le réglage fin sur vos propres données de questions-réponses.
https://colab.research.google.com/drive/11har1qo7vcsmijwrefwytfblu2lveh1r
https://colab.research.google.com/drive/1rz2rzkwwrvexcjiqqtxhxzlcw5cxi7xa
La démo du produit DOC de bout en bout est toujours expérimentale , mais n'hésitez pas à l'essayer! https://colab.research.google.com/drive/1bv7bppxiimsmg4ywb_lwjdrguhvi7pxx
Notre Bert a été formé pour coder des questions médicales et des informations médicales. Un utilisateur peut saisir une question médicale et notre modèle récupérera les informations médicales les plus pertinentes à cette question.
Nous avons créé des ensembles de données à partir de plusieurs forums de questions et réponses médicales. Les forums sont WebMD, HealthTap, EHealthForums, Iclinic, Question Doctors et Reddit.com/r/askdocs
L'architecture se compose d'un Biobert affiné (identique à la fois pour les questions et réponses) pour convertir la contribution du texte en une représentation d'intégration. L'intégration est ensuite entrée dans un FCNN (différent pour les questions et réponses) pour développer une intégration qui est utilisée pour la recherche de similitude. Les meilleures questions et réponses similaires sont ensuite utilisées par GPT-2 pour générer une réponse. L'architecture complète est illustrée ci-dessous.
Jetons un coup d'œil à la première moitié du diagramme ci-dessus plus en détail, la formation du Bert et du FCNNS. Un chiffre détaillé de cette partie est illustré ci-dessous
Pendant la formation, nous prenons un lot de questions médicales et leurs réponses médicales correspondantes, et les convertissons en intégres Biobert. Les mêmes poids Bert sont utilisés pour les questions et réponses.
Ces intérêts sont ensuite entrés dans une couche FCNN. Il existe des couches FCNN distinctes pour les intégres de question et de réponse. Pour récapituler, nous utilisons les mêmes poids dans la couche Bert, mais les questions et réponses ont chacune leur propre couche FCNN séparée.
Maintenant, voici où les choses deviennent un peu délicates. Habituellement, l'intégration de la formation de similitude implique des échantillons négatifs, comme la façon dont Word2Vec utilise la perte de NCE. Cependant, nous ne pouvons pas utiliser la perte de NCE dans notre cas, car les intérêts sont générés à chaque étape, et les poids changent à chaque étape de formation.
Ainsi, au lieu de la perte de NCE, ce que nous avons fait était de calculer le produit DOT pour chaque combinaison des intégres de questions et réponses dans notre lot. Ceci est illustré dans la figure ci-dessous
Ensuite, un softmax est pris à travers les rangées; Pour chaque question, toutes ses combinaisons de réponses sont softmaxées.
Enfin, la perte utilisée est une perte d'entropie croisée. La matrice softmaxée est comparée à une matrice de vérité au sol; Les bonnes combinaisons de questions et réponses sont étiquetées avec un «1», et toutes les autres combinaisons sont étiquetées avec un «0».
La collecte de données était délicate car le formatage de tous les différents sites médicaux était significativement différent. Le travail personnalisé devait être effectué pour chaque site afin de retirer les questions et les réponses de la partie correcte des balises HTML. Certains sites avaient également la possibilité que plusieurs médecins répondent à une seule question, nous avions donc besoin d'une méthode pour recueillir plusieurs réponses aux questions individuelles. Pour y faire face, nous avons créé plusieurs lignes pour chaque paire de réponses à des questions. De là, nous devions exécuter le modèle via Bert et stocker les sorties de l'une des couches d'extrémité afin de fabriquer des incorporations Biobert que nous pourrions passer à travers les couches denses de notre réseau neuronal pour les aliments pour animation (FFNN). 768 Les vecteurs de dimension ont été stockés pour la question et les réponses et concaténés avec le texte correspondant dans un fichier CSV. Nous avons essayé différents formats différents pour un chargement et un partage plus compacts et plus rapides, mais CSV a fini par être la méthode la plus facile et la plus flexible. Après la création des intérêts de Biobert et stockés, le processus de formation de similitude a été effectué, puis des intégres FFNN ont été créés qui captureraient la similitude des questions aux réponses. Ceux-ci ont également été stockés avec les incorporations de Biobert et le texte source pour la visualisation et la requête ultérieures.
Les modèles d'incorporation sont construits dans TF 2.0 qui utilise la flexibilité de l'exécution impatient de TF 2.0. Cependant, le modèle GPT2 que nous utilisons est construit en TF 1.x. Heureusement, nous pouvons entraîner deux modèles séparément. Bien que l'inférence, nous devons maintenir une exécution désagréable avec tf.compat.v1.disable_eager_execution et maintenir deux sessions distinctes. Nous devons également prendre soin de la mémoire GPU de deux séances pour éviter l'OOM.
Une approche évidente pour récupérer des réponses en fonction des questions de l'utilisateur est que nous utilisons un puissant codeur (Bert) pour coder les questions et les questions d'entrée dans notre base de données et effectuer une recherche de similitude. Il n'y a pas de formation impliquée et les performances de cette approche reposent totalement sur l'encodeur. Au lieu de cela, nous utilisons des réseaux séparés pour les questions et les réponses et calculons la similitude du cosinus entre elles. Inspirés par l'échantillonnage négatif du papier Word2Vec, nous traitons d'autres réponses dans le même lot que les échantillons négatifs et calculons la perte d'entropie croisée. Cette approche rend les questions d'intégration et de réponses intégrées dans une paire aussi près que possible en termes de distance euclidienne. Il s'avère que cette approche donne des résultats plus robustes que de faire une recherche de similitude directement à l'aide d'un vecteur d'intégration Bert.
Le prétraitement de Bert est compliqué et nous avons totalement environ 333 000 paires d'AQ et plus de 30 millions de jetons. Étant donné que le shuffle est très important dans notre formation, nous avons besoin du tampon Shuffle suffisamment grand pour former correctement notre modèle. Il a fallu plus de 10 minutes pour prétraiter les données avant de commencer à former un modèle à chaque époque. Nous avons donc utilisé le tf.data et les tfrecords pour construire un pipeline d'entrée haute performance. Après l'optimisation, il n'a fallu qu'environ 20 secondes pour commencer l'entraînement et aucun temps d'inactivité GPU.
Un autre problème avec le prétraitement de Bert est qu'il remporte toutes les données sur une longueur fixe. Par conséquent, pour les séquences courtes, beaucoup de calculs et de mémoire GPU sont gaspillés. Ceci est très important surtout avec les grands modèles comme Bert. Nous réécrivons donc le code de prétraitement Bert et utilisons et utilisons Tf.Data.Experimental.Bucket_By_Sequence_Length To Bodet Séquences avec différentes longueurs et séquences de rembourrage dynamiquement. Ce faisant, nous avons réalisé une longueur de séquence maximale plus longue et une formation plus rapide.
Après une certaine modification, le Keras-Bert est capable de fonctionner dans l'environnement TF 2.0. Cependant, lorsque nous essayons d'utiliser le Keras-Bert comme sous-modèle dans nos modèles d'incorporation, nous avons trouvé les deux problèmes suivants.
En conséquence, nous avons décidé de réimplémenter une version impérative de Bert. Nous avons utilisé certains composants de Keras-Bert (attention multi-tête, chargement de poids de point de contrôle, etc.) et écrivez la méthode d'appel de Bert. Notre mise en œuvre est plus facile à déboguer et à compatible avec le mode flexible avide et le mode graphique statique haute performance.
Les utilisateurs peuvent ressentir plusieurs symptômes dans divers conditions, ce qui fait que la réponse parfaite pourrait être une combinaison de réponses multiples. Pour résoudre ce problème, nous utilisons le puissant modèle GPT2 et nourrissons le modèle des questions des utilisateurs ainsi que les réponses auxiliaires Top K que nous avons récupérées à partir de nos données. Le modèle GPT2 sera basé sur la question et les K top K et généreront une meilleure réponse. Pour former correctement le modèle GPT2, nous créons les données de formation comme suit: nous prenons chaque question de notre ensemble de données, effectuons une recherche de similitude pour obtenir la réponse K + 1 supérieure, utilisons la réponse d'origine comme cible et autres réponses comme entrées auxiliaires. Ce faisant, nous obtenons la même quantité de données de formation GPT2 que les données de formation du modèle d'intégration.
Bert est fantastique pour coder des questions et réponses médicales et développer des représentations vectorielles robustes de ces questions / réponses.
Nous avons formé une version affinée de notre modèle qui a été initialisée avec Biobert de Naver. Nous avons également formé une version où les poids de Biobert ont été gelés, et nous avons formé les deux FCNN pour les questions et réponses. Alors que nous nous attendions à ce que la version affinée fonctionne bien, nous avons été surpris de voir à quel point la plus tard était robuste. Cela suggère que Biobert a des capacités innées à pouvoir coder les moyens des questions et réponses médicales.
Explorez s'il y a une utilisation pratique de ce projet en dehors des fins de recherche / exploratoires. Un modèle comme celui-ci ne doit pas être utilisé dans le public pour obtenir des informations médicales. Mais peut-être peut-être que les professionnels de la santé formés / agréés de recueillir des informations pour vérifier le vérification.
Explorez l'application de la même méthode à d'autres domaines (c.-à-d. Récupération des informations sur l'historique, récupération d'informations d'ingénierie, etc.).
Explorez comment le Scibert récemment publié (d'Allen AI) se compare à Biobert de Naver.
Nous remercions l'équipe Tensorflow pour avoir fourni le défi # PoweredByTF2.0 en tant que plate-forme à travers laquelle nous pourrions partager notre travail avec les autres, et un merci spécial au Dr Llion Jones, dont les idées et les conseils ont eu un impact important sur la direction de notre projet.