التعاون بين سانتوش غوبتا ، أليكس شينغ ، وجونبنغ يي
تنزيل النماذج المدربة وملف التضمين هنا.
الفائز أفضل 6 نهائيات لتحدي ⚡#poweredbytf 2.0! https://devpost.com/software/nlp-doctor. سيتم تقديم منتج DOC إلى فريق TensorFlow Engineering في TensorFlow Connect. ترقبوا التفاصيل.
أردنا استخدام TensorFlow 2.0 لاستكشاف مدى جودة نماذج معالجة اللغة الطبيعية الحديثة مثل BERT و GPT-2 يمكن أن تستجيب للأسئلة الطبية من خلال استرداد البيانات الطبية ذات الصلة والتكييف ، وهذه هي النتيجة.
الغرض من هذا المشروع هو استكشاف قدرات نماذج لغة التعلم العميقة للترميز العلمي واسترجاعه لا ينبغي استخدامه للمشورة الطبية القابلة للتنفيذ.
كمجموعة من الأصدقاء ذوي الخلفيات المتنوعة التي تتراوح بين الطلاب الجامعيين إلى علماء البيانات إلى باحثو NLP من الدرجة الأولى ، استلهمنا تصميمنا من مختلف مجالات التعلم الآلي المختلفة. من خلال الجمع بين قوة بنية المحولات ، والبحث في المتجهات الكامنة ، وأخذ العينات السلبية ، والتدريب المسبق التوليدي في إطار التعلم العميق المرن في TensorFlow 2.0 ، تمكنا من التوصل إلى حل جديد لمشكلة صعبة بدا في البداية وكأنها مهمة هرنية.
إذا كنت مهتمًا بالقصة الكاملة لكيفية قيامنا ببناء منتج DOC وتفاصيل بنيةنا ، فقم بإلقاء نظرة على github readme لدينا!
تم توجيه مشروعنا مع الكثير من التحديات التي يتعين عليهم العد ، من ضغط مجموعات البيانات الكبيرة الفلكية ، إلى إعادة تنفيذ مجمل Bert في Tensorflow 2.0 ، إلى تشغيل GPT-2 مع 117 مليون معلمة في Colaboratory ، إلى التسرع في الحصول على الأجزاء الأخيرة من مشروعنا مع مرور بضع ساعات حتى الموعد النهائي للخطوط. ومن الغريب أن أكبر التحديات كانت في كثير من الأحيان عندما كان لدينا خلافات حول الاتجاه الذي ينبغي أن يتجه إليه المشروع. ومع ذلك ، على الرغم من أننا لا نواجه ما هو أفضل مسار للعمل ، في النهاية كان لدينا نفس الهدف النهائي المتمثل في بناء شيء ذي معنى وربما قيمة لكثير من الناس. ومع ذلك ، سنكون دائمًا قادرين على الجلوس والتوصل إلى اتفاق ، وبدعم بعضنا البعض ومحادثات PEP في وقت متأخر من الليل حول Google Hangouts ، وارتفع إلى التحديات والتغلب عليها معًا.
على الرغم من أن منتج DOC ليس جاهزًا للاستخدام التجاري على نطاق واسع ، إلا أن أدائه الجيد المثير للدهشة يدل على أن التطورات في نماذج اللغة العامة مثل BERT و GPT-2 جعلت مشكلات مستعصية مسبقًا مثل معالجة المعلومات الطبية التي يمكن الوصول إليها إلى الأساليب القائمة على NLP العميقة. وبالتالي ، نأمل أن يعمل عملنا على إلهام الآخرين لمعالجة هذه المشكلات واستكشاف حدود NLP المفتوحة حديثًا.
ومع ذلك ، ما زلنا نخطط لمواصلة العمل على منتج DOC ، وتوسيعه على وجه التحديد للاستفادة من إصدارات المعلمة 345M و 762M و 1.5B من GPT-2 حيث تصدرها Openai كجزء من برنامج الإصدار المرحلي. نعتزم أيضًا مواصلة تدريب النموذج ، نظرًا لأننا لا يزال لدينا المزيد من البيانات التي نمر بها.
ملاحظة: نحن نعمل بشكل عام على الأبحاث في NLP العلمي/الطبي واسترجاع المعلومات. إذا كنت مهتمًا بالتعاون ، فقم بإطلاق رسالة بريد إلكتروني لنا على [email protected]!
يمكنك تثبيت منتج DOC مباشرة من PIP وتشغيله على جهازك المحلي. إليك الرمز لتثبيت منتج DOC ، إلى جانب TensorFlow 2.0 و 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
يحتوي Repo الخاص بنا على برامج نصية لتوليد بيانات .tfrefords ، وتدريب منتج DOC على بيانات الأسئلة والأجوبة الخاصة بك ، وتشغيل منتج DOC للحصول على إجابات للأسئلة الطبية. يرجى الاطلاع على قسم تجديد Google Colaboratory أدناه لعينات التعليمات البرمجية لتحميل البيانات/الأوزان وتشغيل نماذجنا.
ألق نظرة على عروض كولاب لدينا! نحن نخطط لإضافة المزيد من العروض التوضيحية مع تقدمنا ، مما يسمح للمستخدمين باستكشاف المزيد من وظائف منتج DOC . سيتم إضافة جميع العروض التوضيحية الجديدة إلى مجلد Google Drive نفسه.
تتضمن العروض التوضيحية رمزًا لتثبيت منتج DOC عبر PIP ، وتنزيل/تحميل الأوزان التي تم تدريبها مسبقًا ، وتشغيل وظائف استرجاع منتج DOC وضبط بيانات الأسئلة والأجوبة الخاصة بك.
https://colab.research.google.com/drive/11har1qo7vcsmijwrefwytfblu2lveh1r
https://colab.research.google.com/drive/1rz2rzkwwrvexcjiqtxhxzlcw5cxi7xa
لا يزال عرض منتج DOC من طرف إلى طرف تجريبيًا ، لكن لا تتردد في تجربته! https://colab.research.google.com/drive/1bv7bppxiimsmg4ywb_lwjdrguhvi7pxx
تم تدريب BERT لدينا على تشفير الأسئلة الطبية والمعلومات الطبية. يمكن للمستخدم كتابة سؤال طبي ، وسيقوم نموذجنا باسترداد المعلومات الطبية الأكثر صلة بهذا السؤال.
لقد أنشأنا مجموعات بيانات من العديد من الأسئلة الطبية والإجابة على المنتديات. المنتديات هي WebMD و HealthTap و eHealthForums و Iclinic و أسئلة الأطباء ، و Reddit.com/r/askdocs
تتكون الهندسة المعمارية من bioBert المضبوط (نفسه لكل من الأسئلة والإجابات) لتحويل إدخال النص إلى تمثيل التضمين. ثم يتم إدخال التضمين في FCNN (أحدهما مختلف للأسئلة والأجوبة) لتطوير تضمين يتم استخدامه للبحث عن التشابه. ثم يتم استخدام أفضل الأسئلة والأجوبة المماثلة بواسطة GPT-2 لإنشاء إجابة. يتم عرض الهندسة المعمارية الكاملة أدناه.
دعنا نلقي نظرة على النصف الأول من الرسم البياني أعلاه أعلاه بمزيد من التفصيل ، وتدريب Bert و FCNNs. يظهر أدناه شخصية مفصلة لهذا الجزء
أثناء التدريب ، نأخذ مجموعة من الأسئلة الطبية وإجاباتها الطبية المقابلة ، ونحولها إلى تضمينات BioBert. يتم استخدام نفس أوزان بيرت لكل من الأسئلة والأجوبة.
ثم يتم إدخال هذه التضمينات في طبقة FCNN. هناك طبقات FCNN منفصلة لكل من السؤال والإجابة. لتلخيص ، نستخدم نفس الأوزان في طبقة Bert ، لكن الأسئلة والأجوبة لها طبقة FCNN الخاصة بها.
الآن هنا تصبح الأمور صعبة بعض الشيء. عادة ما ينطوي دمج التدريب على التشابه عينات سلبية ، مثل كيفية استخدام Word2VEC فقدان NCE. ومع ذلك ، لا يمكننا استخدام فقدان NCE في حالتنا منذ أن يتم إنشاء التضمينات خلال كل خطوة ، وتتغير الأوزان خلال كل خطوة تدريب.
لذا ، بدلاً من فقدان NCE ، كان ما فعلناه هو حساب منتج DOT لكل مجموعة من السؤال والإجابة على التضمينات داخل دفعة لدينا. يظهر هذا في الشكل أدناه
ثم ، يتم أخذ softmax عبر الصفوف. لكل سؤال ، كل مجموعات الإجابة هي softmaxed.
أخيرًا ، الخسارة المستخدمة هي فقدان الانتروبيا. تتم مقارنة مصفوفة SoftMaxed بمصفوفة الحقيقة الأرضية ؛ يتم تسمية المجموعات الصحيحة من الأسئلة والأجوبة بـ "1" ، ويتم تصنيف جميع المجموعات الأخرى بـ "0".
كان جمع البيانات صعبًا لأن تنسيق جميع المواقع الطبية المختلفة كان مختلفًا بشكل كبير. يجب القيام بالعمل المخصص لكل موقع لسحب الأسئلة والأجوبة من الجزء الصحيح من علامات HTML. كان لدى بعض المواقع أيضًا إمكانية رد أطباء متعددين على سؤال واحد ، لذلك كنا بحاجة إلى طريقة لجمع ردود متعددة على الأسئلة الفردية. من أجل التعامل مع هذا ، أنشأنا صفوفًا متعددة لكل زوج من الإجابات. من هنا ، كنا بحاجة إلى تشغيل النموذج من خلال Bert وتخزين المخرجات من إحدى الطبقات النهائية من أجل إجراء تضمينات BioBert يمكننا المرور عبر الطبقات الكثيفة من شبكتنا العصبية التغذية (FFNN). تم تخزين ناقلات Dimension 768 لكل من السؤال والإجابات وتسلسلها مع النص المقابل في ملف CSV. لقد جربنا العديد من التنسيقات المختلفة لمزيد من التحميل والمشاركة بشكل أسرع ، لكن CSV انتهى به الأمر إلى أن تكون الأسهل والأكثر مرونة. بعد إنشاء التضمينات الحيوية وتخزين عملية التدريب على التشابه ، ثم تم إنشاء تضمينات FFNN التي من شأنها أن تلتقط تشابه الأسئلة إلى الإجابات. تم تخزين هذه أيضا جنبا إلى جنب مع التضمينات biobert والنص المصدر لتصور في وقت لاحق والاستعلام.
تم تصميم نماذج التضمين في TF 2.0 والتي تستخدم مرونة التنفيذ المتحمس لـ TF 2.0. ومع ذلك ، تم تصميم نموذج GPT2 الذي نستخدمه في TF 1.x. لحسن الحظ ، يمكننا تدريب نموذجين بشكل منفصل. أثناء الاستدلال ، نحتاج إلى الحفاظ على تعطيل التنفيذ المتحمس باستخدام tf.compat.v1.disable_eager_execution والحفاظ على جلستين منفصلتين. نحتاج أيضًا إلى الاهتمام بذكرى GPU لجلستين لتجنب OOM.
يتمثل أحد الأساليب الواضحة لاسترداد الإجابات بناءً على أسئلة المستخدم في أننا نستخدم مشفرًا قويًا (BERT) لتشفير أسئلة الإدخال والأسئلة في قاعدة البيانات الخاصة بنا والبحث عن التشابه. لا يوجد تدريب ينطوي على أداء هذا النهج يعتمد تمامًا على المشفر. بدلاً من ذلك ، نستخدم شبكات التغذية المنفصلة للأسئلة والأجوبة وحساب تشابه جيب التمام بينهما. مستوحى من أخذ العينات السلبية لورق Word2Vec ، نتعامل مع الإجابات الأخرى في نفس الدفعة مثل العينات السلبية وحساب فقدان الانتروبيا المتقاطع. هذا النهج يجعل الأسئلة تضمينًا وإجابات التضمينات في زوج واحد أقرب ما يمكن من حيث المسافة الإقليدية. اتضح أن هذا النهج ينتج عنه نتائج أكثر قوة من إجراء البحث عن التشابه مباشرة باستخدام ناقل تضمين BERT.
المعالجة المسبقة لـ Bert معقدة ولدينا حوالي 333 ألف زوج من QA وأكثر من 30 مليون رمز. النظر في خلط ورق اللعب أمر مهم للغاية في تدريبنا ، نحتاج إلى المخزن المؤقت المخلل بشكل كبير بما فيه الكفاية لتدريب نموذجنا بشكل صحيح. استغرق الأمر أكثر من 10 دقائق للبيانات المسبقة قبل البدء في تدريب النموذج في كل فترة. لذلك استخدمنا tf.data و tfrecords لبناء خط أنابيب إدخال عالي الأداء. بعد التحسين ، استغرق الأمر حوالي 20 ثانية فقط للبدء في التدريب وعدم وجود وقت الخمول في GPU.
هناك مشكلة أخرى مع معالجة Bert Preprocess في أنه يقوم بوسادات جميع البيانات إلى طول ثابت. لذلك ، بالنسبة للتسلسلات القصيرة ، تضيع الكثير من الحساب وذاكرة GPU. هذا مهم للغاية خاصة مع النماذج الكبيرة مثل بيرت. لذلك نعيد كتابة رمز Bert Preprocessing ونستخدم tf.data.experimental.bucket_by_sephences_length إلى تسلسل دلو بأطوال مختلفة وتسلسل حشوة ديناميكيًا. من خلال القيام بذلك ، حققنا طول تسلسل Max أطول وتدريب أسرع.
بعد بعض التعديل ، يمكن لـ Keras-Bert تشغيله في بيئة TF 2.0. ومع ذلك ، عندما نحاول استخدام Keras-Bert كنموذج فرعي في نماذج التضمين لدينا ، وجدنا المشكلتين التاليتين.
نتيجة لذلك ، قررنا إعادة تنفيذ نسخة ضرورية من Bert. استخدمنا بعض مكونات keras-bert (اهتمام متعدد الرأس ، تحميل وزن نقطة التفتيش ، إلخ) وكتابة طريقة استدعاء Bert. من الأسهل تصحيح تنفيذنا وتوافق مع كل من الوضع المتشوق المرن ووضع الرسم البياني الثابت عالي الأداء.
قد يواجه المستخدمون أعراض متعددة في حالة مختلفة ، مما يجعل الإجابة المثالية قد تكون مزيجًا من الإجابات المتعددة. لمعالجة ذلك ، نستفيد من نموذج GPT2 القوي وتغذية النموذج من الأسئلة من المستخدمين إلى جانب Top K الإجابات التي استعدناها من بياناتنا. سيستند نموذج GPT2 إلى السؤال وأعلى الإجابات K وتوليد إجابة أفضل. لتدريب نموذج GPT2 بشكل صحيح ، نقوم بإنشاء بيانات التدريب على النحو التالي: نأخذ كل سؤال في مجموعة البيانات الخاصة بنا ، ونقوم بإجراء بحث عن التشابه للحصول على إجابة أعلى K+1 ، ونستخدم الإجابة الأصلية كهدف وإجابات أخرى كمدخلات مساعدة. من خلال القيام بذلك ، نحصل على نفس القدر من بيانات تدريب GPT2 كبيانات تدريب نموذج التضمين.
Bert رائع لترميز الأسئلة والإجابات الطبية ، وتطوير تمثيلات متجهة قوية لتلك الأسئلة/الإجابات.
لقد قمنا بتدريب نسخة صريحة من نموذجنا والتي تمت تهيئتها باستخدام Naver's Biobert. لقد قمنا أيضًا بتدريب نسخة حيث تم تجميد الأوزان الحيوية ، وقمنا بتدريب اثنين فقط من fcnns على الأسئلة والأجوبة. بينما توقعنا أن تعمل النسخة المضبوطة بشكل جيد ، فقد فوجئنا بمدى قوة لاحقًا. هذا يشير إلى أن BioBert لديها قدرات فطرية في القدرة على تشفير وسائل الأسئلة والأجوبة الطبية.
استكشف ما إذا كان هناك أي استخدام عملي لهذا المشروع خارج أغراض البحث/الاستكشافية. لا ينبغي استخدام نموذج مثل هذا في الجمهور للحصول على المعلومات الطبية. ولكن ربما يمكن استخدامه من قبل المهنيين الطبيين المدربين/المرخصين لجمع المعلومات للفحص.
استكشف تطبيق نفس الطريقة على المجالات الأخرى (أي استرجاع معلومات السجل واسترجاع المعلومات الهندسية ، إلخ).
استكشف كيف يقارن Scibert (من Allen AI) الذي تم إصداره مؤخرًا مع Naver's Biobert.
نقدم شكرنا لفريق TensorFlow على توفير التحدي #poweredbytf2.0 كمنصة يمكننا من خلالها مشاركة عملنا مع الآخرين ، وشكر خاص للدكتور Llion Jones ، الذي كان له رؤى وتوجيهات تأثير مهم على اتجاه مشروعنا.