Zusammenarbeit zwischen Santosh Gupta, Alex Sheng und Junpeng Ye
Laden Sie hier geschulte Modelle und Einbettungsdatei herunter.
Gewinner der Top 6 Finalist der ⚡##PoweredBytf 2.0 Challenge! https://devpost.com/software/nlp-doctor. Das DOC -Produkt wird dem TensorFlow Engineering Team bei TensorFlow Connect vorgelegt. Bleiben Sie für Details dran.
Wir wollten TensorFlow 2.0 verwenden, um zu untersuchen, wie gut hochmoderne Modelle für natürliche Sprache wie Bert und GPT-2 auf medizinische Fragen reagieren können, indem sie auf relevanten medizinischen Daten abrufen und konditionieren, und dies ist das Ergebnis.
Ziel dieses Projekts ist es, die Fähigkeiten von Deep -Learning -Sprachmodellen für die wissenschaftliche Codierung und Abruf zu untersuchen. Es sollte nicht für umsetzbare medizinische Beratung verwendet werden.
Als eine Gruppe von Freunden mit unterschiedlichem Hintergrund, von gebrochenen Studenten bis hin zu Datenwissenschaftlern bis hin zu erstklassigen NLP-Forschern, haben wir uns für unser Design aus verschiedenen Bereichen des maschinellen Lernens inspirieren lassen. Durch die Kombination der Kraft der Transformatorarchitekturen, der latenten Vektorsuche, der negativen Abtastung und des generativen Vorbildners innerhalb von TensorFlow 2.0s flexibles Deep-Lern-Framework konnten wir eine neuartige Lösung für ein schwieriges Problem entwickeln, das zunächst wie eine herkulische Aufgabe schien.
Wenn Sie an der ganzen Geschichte interessiert sind, wie wir das DOC -Produkt erstellt haben und die Details unserer Architektur, sehen Sie sich unseren Github Readme an!
Unser Projekt war mit zu vielen Herausforderungen für die Komprimierung astronomisch großer Datensätze bis hin zur Neuimplementierung der Gesamtheit von Bert in Tensorflow 2.0 bis hin zur Durchführung von GPT-2 mit 117 Millionen Parametern in Colaboratory, um die letzten Teile unseres Projekts mit wenigen Stunden bis zum Unterwerfer-Deadline vorzubereiten. Seltsamerweise bestand die größten Herausforderungen oft, wenn wir Meinungsverschiedenheiten über die Richtung hatten, in die das Projekt geleitet werden sollte. Obwohl wir uns darüber nicht einig waren, was die beste Vorgehensweise war, hatten wir am Ende das gleiche Endziel, um etwas Sinnvolles und Potenziell für viele Menschen zu bauen. Davon abgesehen können wir uns immer schließlich hinsetzen und uns einig machen und mit der Unterstützung des anderen und der Nachteil über Google-Hangouts zu den Herausforderungen steigen und sie gemeinsam überwinden.
Obwohl das DOC-Produkt nicht für den weit verbreiteten kommerziellen Gebrauch bereit ist, zeigt seine überraschend gute Leistung, dass Fortschritte in allgemeinen Sprachmodellen wie Bert und GPT-2 bisher schwer zugängliche Probleme wie medizinische Informationsverarbeitung für tiefgreifende NLP-basierte Ansätze gemacht haben. Wir hoffen daher, dass unsere Arbeit dazu dient, andere dazu zu inspirieren, diese Probleme anzugehen und die neu offene NLP -Grenze selbst zu erkunden.
Trotzdem planen wir weiterhin, die Arbeit an DOC-Produkten fortzusetzen, und erweitern es speziell, um die 345 m-, 762 m- und 1,5B-Parameterversionen von GPT-2 zu nutzen, während OpenAI sie als Teil ihres inszenierten Release-Programms freigibt. Wir beabsichtigen auch, das Modell weiter auszubilden, da wir noch einige mehr Daten zu tun haben.
HINWEIS: Wir arbeiten Strömung an Forschung in wissenschaftlichem/medizinischem NLP und Informationsabruf. Wenn Sie an der Zusammenarbeit interessiert sind, schießen Sie uns eine E-Mail unter [email protected]!
Sie können das DOC -Produkt direkt von PIP von PIP installieren und auf Ihrem lokalen Computer ausführen. Hier ist der Code zum Installieren von DOC -Produkten zusammen mit TensorFlow 2.0 und 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
Unser Repo enthält Skripte zum Generieren von .tfrefords -Daten, Schulungsdokumentationsprodukte in Ihren eigenen Q & A -Daten und Ausführen von DOC -Produkten , um Antworten auf medizinische Fragen zu erhalten. In dem Abschnitt Google Colaboratory Demos finden Sie unten Code -Beispiele zum Laden von Daten/Gewichten und zum Ausführen unserer Modelle.
Schauen Sie sich unsere Colab -Demos an! Wir planen, mehr Demos hinzuzufügen, während wir gehen, damit Benutzer mehr der Funktionen des DOC -Produkts erkunden können. Alle neuen Demos werden demselben Google Drive -Ordner hinzugefügt.
Die Demos enthalten Code für die Installation von DOC-Produkten über PIP, Herunterladen/Laden von Gewichten vor ausgebildeten und ausführen von DOC- Produktfunktionen und Feinabstimmung in Ihren eigenen Q & A-Daten.
https://colab.research.google.com/drive/11har1qo7vcsmijwrefwytfblu2lveh1r
https://colab.research.google.com/drive/1rz2rzkwwrvexcjiqqtxhxzlcw5cxi7xa
Die End-to-End -DOC-Produktdemo ist immer noch experimentell , probiert es jedoch gerne aus! https://colab.research.google.com/drive/1bv7bppxiimsmg4YWB_LWJDRGUHVI7PXX
Unser Bert wurde ausgebildet, um medizinische Fragen und medizinische Informationen zu codieren. Ein Benutzer kann eine medizinische Frage eingeben, und unser Modell wird die relevantesten medizinischen Informationen zu dieser Frage abrufen.
Wir haben Datensätze aus mehreren medizinischen Fragen und Beantwortung von Foren erstellt. Die Foren sind WebMD, HealthTap, EHealthforen, Iclinic, Fragedoctors und Reddit.com/r/askdocs
Die Architektur besteht aus einem fein abgestimmten Biobert (gleiche für Fragen und Antworten), um die Texteingabe in eine Einbettungsdarstellung umzuwandeln. Die Einbettung wird dann in einen FCNN (eine andere für die Fragen und Antworten) eingegeben, um eine Einbettung zu entwickeln, die für die Überprüfung der Ähnlichkeit verwendet wird. Die obersten ähnlichen Fragen und Antworten werden dann von GPT-2 verwendet, um eine Antwort zu generieren. Die vollständige Architektur ist unten gezeigt.
Schauen wir uns die erste Hälfte des oben oben genannten Diagramms ausführlicher an, das Training der Bert und die FCNNs. Eine detaillierte Abbildung dieses Teils ist unten dargestellt
Während des Trainings nehmen wir eine Menge medizinischer Fragen und ihre entsprechenden medizinischen Antworten und konvertieren sie in Biobert -Einbettungen. Die gleichen Bert -Gewichte werden sowohl für die Fragen als auch für Antworten verwendet.
Diese Einbettungen werden dann in eine FCNN -Schicht eingegeben. Es gibt separate FCNN -Schichten sowohl für die Frage als auch für die Antworteinbettung. Zusammenfassend verwenden wir die gleichen Gewichte in der Bert -Schicht, aber die Fragen und Antworten haben jeweils eine eigene separate FCNN -Schicht.
Hier werden die Dinge ein wenig schwierig. In der Regel beinhaltet das Einbettungsähnlichkeitstraining negative Stichproben, z. B. wie Word2VEC den NCE -Verlust verwendet. In unserem Fall können wir jedoch keinen NCE -Verlust verwenden, da die Einbettungen in jedem Schritt erzeugt werden und die Gewichte während jedes Trainingsschritts ändern.
Anstelle von NCE -Verlust berechnet wir das DOT -Produkt für jede Kombination der Frage und Antworteinbettungen in unserer Charge. Dies ist in der Abbildung unten dargestellt
Dann wird ein Softmax über die Reihen gezogen; Für jede Frage sind alle Antwortkombinationen weichmaxiert.
Schließlich ist der verwendete Verlust der Cross -Entropie -Verlust. Die weichmaschinierte Matrix wird mit einer Bodenwahrheitsmatrix verglichen. Die richtigen Kombinationen von Fragen und Antworten werden mit einem '1' gekennzeichnet, und alle anderen Kombinationen werden mit einem '0' gekennzeichnet.
Die Datenerfassung war schwierig, da die Formatierung aller verschiedenen medizinischen Stellen signifikant unterschiedlich war. Für jeden Standort mussten benutzerdefinierte Arbeiten durchgeführt werden, um Fragen und Antworten aus dem richtigen Teil der HTML -Tags zu ziehen. Einige der Websites hatten auch die Möglichkeit, dass mehrere Ärzte auf eine einzige Frage antworteten, sodass wir eine Methode zum Sammeln mehrerer Antworten auf individuelle Fragen benötigten. Um damit umzugehen, haben wir für jedes Frage-Antwortenpaar mehrere Zeilen erstellt. Von hier aus mussten wir das Modell über Bert ausführen und die Ausgänge von einer der Endschichten aus speichern, um Biobert-Einbettungen durch die dichten Schichten unseres Feed-Forward Neural Network (FFNN) durchzuführen. 768 Dimensionsvektoren wurden sowohl für die Frage als auch für die Antworten gespeichert und mit dem entsprechenden Text in einer CSV -Datei verkettet. Wir haben verschiedene Formate für kompaktere und schnellere Lade- und Teilen ausprobiert, aber CSV war die einfachste und flexibelste Methode. Nachdem die Biobert -Einbettungen erstellt und gespeichert wurden, wurde der Ähnlichkeitstrainingsprozess durchgeführt, und dann wurden FFNN -Einbettungen erstellt, die die Ähnlichkeit von Fragen zu Antworten erfassen würden. Diese wurden auch zusammen mit den Biobert -Einbettungen und Quellentext für die spätere Visualisierung und Abfrage gespeichert.
Die Einbettungsmodelle sind in TF 2.0 eingebaut, wodurch die Flexibilität der eifrigen Ausführung von TF 2.0 verwendet wird. Das von uns verwendete GPT2 -Modell werden jedoch in TF 1.x gebaut. Zum Glück können wir zwei Modelle getrennt trainieren. Während der Inferenz müssen wir die deaktivierte Ausführung mit tf.compat.v1.disable_eAger_execution beibehalten und zwei separate Sitzungen beibehalten. Wir müssen uns auch um die GPU -Erinnerung von zwei Sitzungen kümmern, um OOM zu vermeiden.
Ein offensichtlicher Ansatz zum Abrufen von Antworten auf der Grundlage der Fragen des Benutzers besteht darin, dass wir einen leistungsstarken Encoder (Bert) verwenden, um Eingabestellfragen und Fragen in unserer Datenbank zu codieren und eine Ähnlichkeitssuche durchzuführen. Es gibt kein Training und die Leistung dieses Ansatzes beruht völlig auf den Encoder. Stattdessen verwenden wir separate Feed-Forward-Netzwerke für Fragen und Antworten und berechnen die Ähnlichkeit der Kosinus zwischen ihnen. Inspiriert von der negativen Probenahme von Word2VEC -Papier behandeln wir andere Antworten in derselben Stapel wie negative Proben und berechnen den Verlust von Kreuzentropie. In diesem Ansatz werden die Fragen einbettet und Antworten in einem Paar in einem euklidischen Abstand in einem Paar so nah wie möglich. Es stellt sich heraus, dass dieser Ansatz robustere Ergebnisse liefert als mit Bert -Einbettungsvektor direkt bei Ähnlichkeitssuche.
Die Vorverarbeitung von Bert ist kompliziert und wir haben insgesamt rund 333.000 QS -Paare und über 30 Millionen Token. Wenn man bedenkt, dass Shuffle in unserem Training sehr wichtig ist, brauchen wir den Shuffle -Puffer ausreichend groß, um unser Modell richtig zu trainieren. Es dauerte mehr als 10 Minuten, um Daten vorzubereiten, bevor das Modell in jeder Epoche mit dem Training begann. Deshalb haben wir die TF.Data und Tffrecords verwendet, um eine Hochleistungs-Eingangspipeline zu erstellen. Nach der Optimierung dauerte es nur etwa 20 Sekunden, um mit dem Training zu beginnen, und keine GPU -Leerlaufzeit.
Ein weiteres Problem bei der Bert -Vorverarbeitung ist, dass alle Daten auf eine feste Länge padelt. Daher werden für kurze Sequenzen viel Berechnung und GPU -Speicher verschwendet. Dies ist sehr wichtig, insbesondere bei großen Modellen wie Bert. Deshalb schreiben wir den Bert -Vorverarbeitungscode neu und verwenden tf.data.experimental.bucket_by_sequence_length an Bucket -Sequenzen mit unterschiedlichen Längen und dynamisch -padding -Sequenzen. Auf diese Weise haben wir eine längere Max -Sequenzlänge und ein schnelleres Training erreicht.
Nach einiger Modifikation kann der Keras-Bert in der TF 2.0-Umgebung ausgeführt werden. Wenn wir jedoch versuchen, den Keras-Bert als Untermodell in unseren Einbettungsmodellen zu verwenden, fanden wir die folgenden zwei Probleme.
Infolgedessen haben wir beschlossen, eine imperative Version von Bert erneut zu implementieren. Wir haben einige Komponenten von Keras-Bert (Multihead-Aufmerksamkeit, Kontrollpunkt-Gewichtbelastung usw.) verwendet und die Anrufmethode von Bert geschrieben. Unsere Implementierung ist einfacher zu debuggen und kompatibel mit dem flexiblen Eager-Modus als auch mit dem statischen Graphenmodus mit hoher Leistung.
Benutzer können mehrere Symptome in einem verschiedenen Zustand erleben, was die perfekte Antwort darstellt, möglicherweise eine Kombination aus mehreren Antworten. Um dies anzugehen, verwenden wir das leistungsstarke GPT2 -Modell und füttern das Modell die Fragen von Benutzern zusammen mit Top -K -Auxiliary -Antworten, die wir aus unseren Daten abgerufen haben. Das GPT2 -Modell basiert auf der Frage und den Top K -Antworten und generiert eine bessere Antwort. Um das GPT2 -Modell ordnungsgemäß zu trainieren, erstellen wir die Schulungsdaten wie folgt: Wir nehmen jede Frage in unserem Datensatz und führen eine Ähnlichkeitssuche durch, um die Top K+1 -Antwort zu erhalten. Verwenden Sie die ursprüngliche Antwort als Ziel und andere Antworten als Hilfseingänge. Auf diese Weise erhalten wir die gleiche Menge an GPT2 -Trainingsdaten wie die Einbettungsmodell -Trainingsdaten.
Bert ist fantastisch, um medizinische Fragen und Antworten zu kodieren und robuste Vektordarstellungen dieser Fragen/Antworten zu entwickeln.
Wir haben eine fein abgestimmte Version unseres Modells trainiert, die mit Navers Biobert initialisiert wurde. Wir haben auch eine Version ausgebildet, in der die Biobert -Gewichte gefroren waren, und die beiden FCNNs nur für die Fragen und Antworten ausgebildet. Während wir erwarteten, dass die fein abgestimmte Version gut funktioniert, waren wir überrascht, wie robust später war. Dies deutet darauf hin, dass Biobert in der Lage ist, die Mittel von medizinischen Fragen und Antworten zu kodieren.
Untersuchen Sie, ob dieses Projekt außerhalb von Forschungs-/Erkundungszwecken praktisch verwendet wird. Ein solches Modell sollte in der Öffentlichkeit nicht zur Erlangung medizinischer Informationen verwendet werden. Aber vielleicht kann es von ausgebildeten/lizenzierten medizinischen Fachkräften verwendet werden, um Informationen zum Überprüfen zu sammeln.
Erforschen Sie die gleiche Methode auf andere Domänen (dh Abruf von History Information, technische Informationen usw.).
Erforschen Sie, wie der kürzlich veröffentlichte Scibert (von Allen AI) mit Navers Biobert verglichen wird.
Wir bedanken uns dem TensorFlow -Team für die Bereitstellung der #PoweredByTF2.0 -Herausforderung als Plattform, über die wir unsere Arbeit mit anderen teilen konnten, und einem besonderen Dank an Dr. Llion Jones, dessen Erkenntnisse und Anleitungen einen wichtigen Einfluss auf die Richtung unseres Projekts hatten.