ความร่วมมือระหว่าง Santosh Gupta, Alex Sheng และ Junpeng Ye
ดาวน์โหลดโมเดลที่ผ่านการฝึกอบรมและไฟล์ฝังที่นี่
ผู้ชนะ 6 อันดับสุดท้ายของการแข่งขัน⚡#PoweredBytf 2.0! https://devpost.com/software/nlp-doctor ผลิตภัณฑ์ DOC จะถูกนำเสนอให้กับทีมวิศวกรรม Tensorflow ที่ Tensorflow Connect คอยติดตามรายละเอียด
เราต้องการใช้ TensorFlow 2.0 เพื่อสำรวจว่ารูปแบบการประมวลผลภาษาธรรมชาติที่ทันสมัยเช่น BERT และ GPT-2 สามารถตอบคำถามทางการแพทย์ได้อย่างไรโดยการดึงและปรับอากาศข้อมูลทางการแพทย์ที่เกี่ยวข้องและนี่คือผลลัพธ์
วัตถุประสงค์ของโครงการนี้คือการสำรวจความสามารถของแบบจำลองภาษาการเรียนรู้เชิงลึกสำหรับการเข้ารหัสทางวิทยาศาสตร์และการดึงข้อมูลไม่ควรใช้สำหรับคำแนะนำทางการแพทย์ที่สามารถดำเนินการได้
ในฐานะกลุ่มเพื่อนที่มีภูมิหลังที่หลากหลายตั้งแต่ปริญญาตรีที่ยากจนไปจนถึงนักวิทยาศาสตร์ด้านข้อมูลไปจนถึงนักวิจัยระดับสูงของ NLP เราได้รับแรงบันดาลใจจากการออกแบบของเราจากการเรียนรู้ของเครื่องจักรที่แตกต่างกัน ด้วยการรวมพลังของสถาปัตยกรรมหม้อแปลงการค้นหาเวกเตอร์แฝงการสุ่มตัวอย่างเชิงลบและการฝึกอบรมก่อนกำเนิดภายในกรอบการเรียนรู้เชิงลึกที่ยืดหยุ่นของ Tensorflow 2.0 เราสามารถหาวิธีแก้ปัญหาใหม่ ๆ
หากคุณสนใจเรื่องราวทั้งหมดของวิธีที่เราสร้าง ผลิตภัณฑ์ DOC และรายละเอียดของสถาปัตยกรรมของเราลองดูที่ GitHub Readme ของเรา!
โครงการของเราเกิดขึ้นด้วยความท้าทายมากเกินไปที่จะนับตั้งแต่การบีบอัดชุดข้อมูลขนาดใหญ่ทางดาราศาสตร์ไปจนถึงการปรับปรุงทั้งหมดของเบิร์ตใน Tensorflow 2.0 ไปจนถึงการรัน GPT-2 ด้วยพารามิเตอร์ 117 ล้านตัว ผิดปกติพอความท้าทายที่ยิ่งใหญ่ที่สุดมักจะเกิดขึ้นเมื่อเราไม่เห็นด้วยเกี่ยวกับทิศทางที่โครงการควรมุ่งหน้าไป อย่างไรก็ตามแม้ว่าเราจะไม่เห็นด้วยกับสิ่งที่ดีที่สุดในการดำเนินการ แต่ในที่สุดเราทุกคนมีเป้าหมายสุดท้ายในการสร้างสิ่งที่มีความหมายและมีคุณค่าสำหรับผู้คนจำนวนมาก ที่ถูกกล่าวว่าในที่สุดเราก็จะสามารถนั่งลงและทำข้อตกลงและด้วยการสนับสนุนของกันและกันและการพูดคุยเกี่ยวกับการพูดคุยของ Google ตอนดึกเกี่ยวกับ 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 เพื่อรับคำตอบสำหรับคำถามทางการแพทย์ โปรดดูส่วน การสาธิต Google Colaboratory ด้านล่างสำหรับตัวอย่างรหัสเพื่อโหลดข้อมูล/น้ำหนักและเรียกใช้โมเดลของเรา
ลองดูการสาธิต colab ของเรา! เราวางแผนที่จะเพิ่มการสาธิตมากขึ้นในขณะที่เราไปช่วยให้ผู้ใช้สามารถสำรวจฟังก์ชันการทำงานของ ผลิตภัณฑ์ DOC ได้มากขึ้น การสาธิตใหม่ทั้งหมดจะถูกเพิ่มลงในโฟลเดอร์ Google Drive เดียวกัน
การสาธิตรวมถึงรหัสสำหรับการติดตั้ง ผลิตภัณฑ์ DOC ผ่าน PIP การดาวน์โหลด/โหลดน้ำหนักที่ผ่านการฝึกอบรมมาล่วงหน้าและการเรียกใช้ฟังก์ชั่นการดึงข้อมูลของ DOC และการปรับแต่งข้อมูลคำถามและคำตอบของคุณเอง
https://colab.research.google.com/drive/11har1qo7vcsmijwrefwytfblu2lveh1r
https://colab.research.google.com/drive/1rz2rzkwwrvexcjiqqtxhxzlcw5cxi7xa
การสาธิต ผลิตภัณฑ์ DOC แบบ end-to-end ยังคง ทดลองอยู่ แต่อย่าลังเลที่จะลองใช้! https://colab.research.google.com/drive/1bv7bppxiimsmg4ywb_lwjdrguhvi7pxx
เบิร์ตของเราได้รับการฝึกฝนให้เข้ารหัสคำถามทางการแพทย์และข้อมูลทางการแพทย์ ผู้ใช้สามารถพิมพ์คำถามทางการแพทย์และแบบจำลองของเราจะดึงข้อมูลทางการแพทย์ที่เกี่ยวข้องมากที่สุดไปยังคำถามนั้น
เราสร้างชุดข้อมูลจากคำถามทางการแพทย์และฟอรัมตอบคำถาม ฟอรัมคือ webmd, HealthTap, eHealthforums, iclinic, คำถามแพทย์และ reddit.com/r/askdocs
สถาปัตยกรรมประกอบด้วย biobert ที่ปรับแต่งอย่างละเอียด (เหมือนกันสำหรับทั้งคำถามและคำตอบ) เพื่อแปลงอินพุตข้อความเป็นการแสดงการฝัง การฝังจะถูกป้อนเข้าสู่ FCNN (คำถามที่แตกต่างกันสำหรับคำถามและคำตอบ) เพื่อพัฒนาการฝังที่ใช้สำหรับการค้นหาความคล้ายคลึงกัน คำถามและคำตอบที่คล้ายกันด้านบนจะถูกใช้โดย GPT-2 เพื่อสร้างคำตอบ สถาปัตยกรรมเต็มแสดงด้านล่าง
มาดูครึ่งแรกของแผนภาพด้านบนในรายละเอียดเพิ่มเติมการฝึกอบรมของ Bert และ FCNNs ตัวเลขโดยละเอียดของส่วนนี้แสดงด้านล่าง
ในระหว่างการฝึกอบรมเราใช้ชุดคำถามทางการแพทย์และคำตอบทางการแพทย์ที่เกี่ยวข้องและแปลงเป็น biobert embeddings น้ำหนักเบิร์ตเดียวกันนี้ใช้สำหรับทั้งคำถามและคำตอบ
การฝังตัวเหล่านี้จะถูกป้อนเข้าสู่เลเยอร์ FCNN มีเลเยอร์ FCNN แยกต่างหากสำหรับทั้งคำถามและคำตอบฝังตัว ในการสรุปเราใช้น้ำหนักเดียวกันในเลเยอร์เบิร์ต แต่คำถามและคำตอบแต่ละข้อมีเลเยอร์ FCNN แยกต่างหากของตัวเอง
ตอนนี้นี่คือสิ่งที่ยุ่งยากเล็กน้อย โดยปกติแล้วการฝึกอบรมความคล้ายคลึงกันจะเกี่ยวข้องกับตัวอย่างเชิงลบเช่นวิธีที่ Word2vec ใช้การสูญเสีย NCE อย่างไรก็ตามเราไม่สามารถใช้การสูญเสีย NCE ในกรณีของเราเนื่องจากการฝังตัวถูกสร้างขึ้นในแต่ละขั้นตอนและน้ำหนักเปลี่ยนไปในแต่ละขั้นตอนการฝึกอบรม
ดังนั้นแทนที่จะสูญเสีย NCE สิ่งที่เราทำคือคำนวณผลิตภัณฑ์ DOT สำหรับการรวมกันของคำถามและคำตอบที่ฝังอยู่ภายในชุดของเรา สิ่งนี้แสดงในรูปด้านล่าง
จากนั้นจะมีการใช้ซอฟต์แม็กซ์ข้ามแถว สำหรับคำถามแต่ละข้อชุดคำตอบทั้งหมดจะถูก softmaxed
ในที่สุดการสูญเสียที่ใช้คือการสูญเสียเอนโทรปีข้าม เมทริกซ์ softmaxed ถูกเปรียบเทียบกับเมทริกซ์ความจริงภาคพื้นดิน การรวมกันของคำถามและคำตอบที่ถูกต้องจะถูกระบุด้วย '1' และชุดค่าผสมอื่น ๆ ทั้งหมดจะถูกระบุด้วย '0'
การรวบรวมข้อมูลนั้นยุ่งยากเนื่องจากการจัดรูปแบบของเว็บไซต์ทางการแพทย์ที่แตกต่างกันทั้งหมดนั้นแตกต่างกันอย่างมาก ต้องทำงานที่กำหนดเองสำหรับแต่ละไซต์เพื่อดึงคำถามและคำตอบจากส่วนที่ถูกต้องของแท็ก HTML เว็บไซต์บางแห่งมีความเป็นไปได้ที่แพทย์หลายคนที่ตอบคำถามเดียวดังนั้นเราจึงต้องการวิธีการรวบรวมคำตอบหลายข้อสำหรับแต่ละคำถาม เพื่อที่จะจัดการกับสิ่งนี้เราได้สร้างหลายแถวสำหรับคำตอบคำถามทุกคู่ จากที่นี่เราจำเป็นต้องเรียกใช้โมเดลผ่านเบิร์ตและเก็บเอาต์พุตจากชั้นหนึ่งในชั้นหนึ่งเพื่อสร้างการฝังตัว biobert เราสามารถผ่านชั้นหนาแน่นของเครือข่ายนิวรัลฟีดไปข้างหน้า (FFNN) 768 มิติเวกเตอร์ถูกเก็บไว้สำหรับทั้งคำถามและคำตอบและเชื่อมต่อกับข้อความที่เกี่ยวข้องในไฟล์ CSV เราลองใช้รูปแบบต่าง ๆ ที่แตกต่างกันเพื่อการโหลดและการแชร์ที่เร็วขึ้นและเร็วขึ้น แต่ CSV กลายเป็นวิธีที่ง่ายที่สุดและยืดหยุ่นที่สุด หลังจากที่การฝังตัวของ Biobert ถูกสร้างขึ้นและเก็บกระบวนการฝึกอบรมความคล้ายคลึงกันแล้วก็ถูกสร้างขึ้นจากนั้น FFNN embeddings ถูกสร้างขึ้นเพื่อจับภาพความคล้ายคลึงกันของคำถามกับคำตอบ สิ่งเหล่านี้ยังถูกเก็บไว้พร้อมกับ Biobert Embeddings และข้อความต้นฉบับสำหรับการสร้างภาพและการสืบค้นในภายหลัง
แบบจำลองการฝังอยู่ใน TF 2.0 ซึ่งใช้ความยืดหยุ่นของการดำเนินการที่กระตือรือร้นของ TF 2.0 อย่างไรก็ตามรุ่น GPT2 ที่เราใช้ถูกสร้างขึ้นใน TF 1.x โชคดีที่เราสามารถฝึกฝนสองรุ่นแยกกัน ในขณะที่การอนุมานเราจำเป็นต้องรักษาปิดใช้งานการดำเนินการที่กระตือรือร้นด้วย tf.compat.v1.disable_eager_eager_execution และรักษาสองเซสชันแยกกัน นอกจากนี้เรายังต้องดูแลหน่วยความจำ GPU ของสองเซสชันเพื่อหลีกเลี่ยง oom
วิธีหนึ่งที่ชัดเจนในการดึงคำตอบตามคำถามของผู้ใช้คือเราใช้ตัวเข้ารหัสที่ทรงพลัง (BERT) เพื่อเข้ารหัสคำถามและคำถามที่ป้อนเข้าในฐานข้อมูลของเราและทำการค้นหาความคล้ายคลึงกัน ไม่มีการฝึกอบรมที่เกี่ยวข้องและประสิทธิภาพของวิธีการนี้ขึ้นอยู่กับตัวเข้ารหัส แต่เราใช้เครือข่ายฟีดไปข้างหน้าแยกต่างหากสำหรับคำถามและคำตอบและคำนวณความคล้ายคลึงกันของโคไซน์ระหว่างพวกเขา แรงบันดาลใจจากการสุ่มตัวอย่างเชิงลบของกระดาษ Word2vec เราปฏิบัติต่อคำตอบอื่น ๆ ในชุดเดียวกันกับตัวอย่างเชิงลบและคำนวณการสูญเสียเอนโทรปีข้าม วิธีการนี้ทำให้คำถามฝังตัวและคำตอบฝังอยู่ในคู่เดียวใกล้ที่สุดเท่าที่จะทำได้ในแง่ของระยะทางยุคลิด ปรากฎว่าวิธีการนี้ให้ผลลัพธ์ที่แข็งแกร่งกว่าการค้นหาความคล้ายคลึงกันโดยตรงโดยใช้เวกเตอร์ฝังเบิร์ต
การประมวลผลล่วงหน้าของเบิร์ตนั้นซับซ้อนและเรามีคู่ QA ประมาณ 333K และโทเค็นมากกว่า 30 ล้านโท การพิจารณาการสับเปลี่ยนเป็นสิ่งสำคัญมากในการฝึกอบรมของเราเราต้องการบัฟเฟอร์สับเปลี่ยนขนาดใหญ่พอที่จะฝึกอบรมแบบจำลองของเราอย่างเหมาะสม ใช้เวลานานกว่า 10 นาทีในการประมวลผลข้อมูลก่อนเริ่มฝึกอบรมแบบจำลองในแต่ละยุค ดังนั้นเราจึงใช้ tf.data และ tfrecords เพื่อสร้างไปป์ไลน์อินพุตประสิทธิภาพสูง หลังจากการเพิ่มประสิทธิภาพใช้เวลาประมาณ 20 วินาทีในการเริ่มการฝึกอบรมและไม่มีเวลาว่าง GPU
ปัญหาอีกประการหนึ่งเกี่ยวกับการประมวลผลล่วงหน้าของ Bert ก็คือมันแผ่นข้อมูลทั้งหมดให้มีความยาวคงที่ ดังนั้นสำหรับลำดับสั้น ๆ การคำนวณจำนวนมากและหน่วยความจำ GPU จะสูญเปล่า สิ่งนี้สำคัญมากโดยเฉพาะกับรุ่นใหญ่เช่นเบิร์ต ดังนั้นเราจึงเขียนรหัสการประมวลผลล่วงหน้า Bert ใหม่และใช้ประโยชน์จาก tf.data.experimental.bucket_by_sequence_length เป็นลำดับที่มีความยาวแตกต่างกันและลำดับการขยายแบบไดนามิก ด้วยการทำเช่นนี้เราได้รับความยาวสูงสุดของลำดับสูงสุดและการฝึกอบรมที่เร็วขึ้น
หลังจากการดัดแปลงบางอย่าง Keras-Bert สามารถทำงานในสภาพแวดล้อม TF 2.0 ได้ อย่างไรก็ตามเมื่อเราพยายามใช้ Keras-Bert เป็นรุ่นย่อยในรูปแบบการฝังของเราเราพบปัญหาสองประการต่อไปนี้
เป็นผลให้เราตัดสินใจที่จะนำเสนอรุ่นที่จำเป็นของ Bert อีกครั้ง เราใช้ส่วนประกอบบางอย่างของ Keras-Bert (ความสนใจแบบหลายหัว, การโหลดน้ำหนักจุดตรวจสอบ ฯลฯ ) และเขียนวิธีการโทรของ Bert การใช้งานของเรานั้นง่ายต่อการดีบักและเข้ากันได้กับทั้งโหมดกระตือรือร้นที่ยืดหยุ่นและโหมดกราฟคงที่ประสิทธิภาพสูง
ผู้ใช้อาจมีอาการหลายอย่างในสภาพต่าง ๆ ซึ่งทำให้คำตอบที่สมบูรณ์แบบอาจเป็นการผสมผสานระหว่างคำตอบหลายคำ เพื่อจัดการกับสิ่งนั้นเราใช้ประโยชน์จากโมเดล GPT2 ที่ทรงพลังและป้อนแบบจำลองคำถามจากผู้ใช้พร้อมกับคำตอบเสริม K อันดับต้น ๆ ที่เราดึงมาจากข้อมูลของเรา โมเดล GPT2 จะขึ้นอยู่กับคำถามและคำตอบ K อันดับต้น ๆ และสร้างคำตอบที่ดีกว่า ในการฝึกอบรมโมเดล GPT2 อย่างถูกต้องเราสร้างข้อมูลการฝึกอบรมดังต่อไปนี้: เราใช้คำถามทุกข้อในชุดข้อมูลของเราทำการค้นหาความคล้ายคลึงกันเพื่อให้ได้คำตอบ K+1 บนสุดให้ใช้คำตอบดั้งเดิมเป็นเป้าหมายและคำตอบอื่น ๆ เป็นอินพุตเสริม ด้วยการทำเช่นนี้เราจะได้รับข้อมูลการฝึกอบรม GPT2 จำนวนเท่ากันกับข้อมูลการฝึกอบรมแบบจำลองการฝัง
เบิร์ตเป็นสิ่งที่ยอดเยี่ยมสำหรับการเข้ารหัสคำถามและคำตอบทางการแพทย์และการพัฒนาการเป็นตัวแทนเวกเตอร์ที่แข็งแกร่งของคำถาม/คำตอบเหล่านั้น
เราได้รับการฝึกอบรมรุ่นที่ปรับแต่งอย่างละเอียดซึ่งเริ่มต้นด้วย Bibert ของ Naver นอกจากนี้เรายังได้รับการฝึกฝนให้กับเวอร์ชันที่น้ำหนัก Biobert ถูกแช่แข็งและฝึกเพียงสอง FCNNs สำหรับคำถามและคำตอบ ในขณะที่เราคาดว่าเวอร์ชันที่ปรับแต่งจะทำงานได้ดีเรารู้สึกประหลาดใจที่ความแข็งแกร่งในภายหลัง สิ่งนี้ชี้ให้เห็นว่า Biobert มีความสามารถโดยธรรมชาติในการเข้ารหัสคำถามและคำตอบทางการแพทย์
สำรวจว่ามีการใช้งานจริงของโครงการนี้นอกวัตถุประสงค์ด้านการวิจัย/สำรวจ แบบจำลองเช่นนี้ไม่ควรใช้ในที่สาธารณะเพื่อรับข้อมูลทางการแพทย์ แต่บางทีมันอาจจะสามารถใช้งานได้โดยผู้เชี่ยวชาญทางการแพทย์ที่ผ่านการฝึกอบรม/ได้รับใบอนุญาตเพื่อรวบรวมข้อมูลสำหรับการตรวจสอบ
สำรวจการใช้วิธีเดียวกันกับโดเมนอื่น ๆ (เช่นการดึงข้อมูลประวัติ, การดึงข้อมูลวิศวกรรม ฯลฯ )
สำรวจว่า Scibert ที่เพิ่งเปิดตัว (จาก Allen AI) เปรียบเทียบกับ Biobert ของ Naver ได้อย่างไร
เราขอขอบคุณทีม Tensorflow สำหรับการให้ความท้าทาย #PoweredByTf2.0 เป็นแพลตฟอร์มที่เราสามารถแบ่งปันงานของเรากับผู้อื่นและขอขอบคุณดร. Llion Jones ซึ่งมีข้อมูลเชิงลึกและคำแนะนำที่สำคัญต่อทิศทางของโครงการของเรา