Kolaborasi antara Santosh Gupta, Alex Sheng, dan Junpeng Ye
Unduh model terlatih dan file embedding di sini.
Pemenang Top 6 Finalis ⚡#PoweredByTF 2.0 Challenge! https://devpost.com/software/nlp-toctor. Produk DOC akan disajikan kepada tim TensorFlow Engineering di TensorFlow Connect. Nantikan detailnya.
Kami ingin menggunakan TensorFlow 2.0 untuk mengeksplorasi seberapa baik model pemrosesan bahasa alami yang canggih seperti Bert dan GPT-2 dapat menanggapi pertanyaan medis dengan mengambil dan mengondisikan data medis yang relevan, dan inilah hasilnya.
Tujuan dari proyek ini adalah untuk mengeksplorasi kemampuan model bahasa pembelajaran yang mendalam untuk pengkodean dan pengambilan ilmiah itu tidak boleh digunakan untuk nasihat medis yang dapat ditindaklanjuti.
Sebagai sekelompok teman dengan latar belakang yang beragam mulai dari sarjana yang pecah hingga para ilmuwan data hingga peneliti NLP tingkat atas, kami menarik inspirasi untuk desain kami dari berbagai bidang pembelajaran mesin. Dengan menggabungkan kekuatan arsitektur transformator, pencarian vektor laten, pengambilan sampel negatif, dan pra-pelatihan generatif dalam kerangka pembelajaran mendalam yang fleksibel TensorFlow 2.0, kami dapat membuat solusi baru untuk masalah yang sulit yang pada awalnya tampak seperti tugas yang sangat besar.
Jika Anda tertarik pada keseluruhan cerita tentang bagaimana kami membangun produk DOC dan detail arsitektur kami, lihatlah readme github kami!
Proyek kami ditempa dengan terlalu banyak tantangan untuk dihitung, dari mengompresi kumpulan data yang besar secara astronomis, hingga mengimplementasikan kembali keseluruhan Bert di TensorFlow 2.0, hingga menjalankan GPT-2 dengan 117 juta parameter dalam colaboratory, untuk bergegas untuk mendapatkan bagian terakhir dari proyek kami siap dengan beberapa jam tersisa hingga pembatasan pengiriman. Anehnya, tantangan terbesar sering kali ketika kami memiliki ketidaksepakatan tentang arah proyek yang harus dipimpin. Namun, meskipun kami tidak setuju tentang apa tindakan terbaik, pada akhirnya kami semua memiliki tujuan akhir yang sama untuk membangun sesuatu yang bermakna dan berpotensi berharga bagi banyak orang. Yang sedang berkata, kami pada akhirnya akan dapat duduk dan mencapai kesepakatan dan, dengan dukungan masing-masing dan pembicaraan larut malam tentang Google Hangouts, naik ke tantangan dan mengatasinya bersama.
Meskipun produk DOC tidak siap untuk penggunaan komersial yang meluas, kinerjanya yang sangat baik menunjukkan bahwa kemajuan dalam model bahasa umum seperti BerT dan GPT-2 telah membuat masalah yang sebelumnya tidak dapat diselesaikan seperti pemrosesan informasi medis yang dapat diakses oleh pendekatan berbasis NLP yang dalam. Dengan demikian, kami berharap pekerjaan kami berfungsi untuk menginspirasi orang lain untuk mengatasi masalah ini dan menjelajahi NLP Frontier yang baru terbuka sendiri.
Namun demikian, kami masih berencana untuk terus bekerja pada produk DOC , secara khusus memperluasnya untuk memanfaatkan 345m, 762m, dan versi parameter 1.5B GPT-2 saat OpenAI merilis mereka sebagai bagian dari program rilis bertahap mereka. Kami juga bermaksud untuk terus melatih model, karena kami masih memiliki sedikit lebih banyak data untuk dilalui.
CATATAN: Kami secara bermasalah sedang mengerjakan penelitian dalam NLP ilmiah/medis dan pengambilan informasi. Jika Anda tertarik untuk berkolaborasi, tembak kami email di [email protected]!
Anda dapat menginstal produk DOC langsung dari PIP dan menjalankannya di mesin lokal Anda. Berikut kode untuk menginstal produk DOC , bersama dengan TensorFlow 2.0 dan 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 kami berisi skrip untuk menghasilkan data .tFrefords , melatih produk DOC pada data T&J Anda sendiri, dan menjalankan produk DOC untuk mendapatkan jawaban untuk pertanyaan medis. Silakan lihat bagian Demos Google Colaboratory di bawah ini untuk sampel kode untuk memuat data/bobot dan jalankan model kami.
Lihatlah demo Colab kami! Kami berencana untuk menambahkan lebih banyak demo saat kami pergi, memungkinkan pengguna untuk mengeksplorasi lebih banyak fungsi produk DOC . Semua demo baru akan ditambahkan ke folder Google Drive yang sama.
Demo termasuk kode untuk menginstal produk DOC melalui PIP, mengunduh/memuat bobot pra-terlatih, dan menjalankan fungsi pengambilan produk DOC dan menyempurnakan data T&J Anda sendiri.
https://colab.research.google.com/drive/11har1qo7vcsmijwrefwytfblu2lveh1r
https://colab.research.google.com/drive/1rz2rzkwwrvexcjiqqtxhxzlcw5cxi7xa
Demo produk DOC ujung ke ujung masih eksperimental , tetapi jangan ragu untuk mencobanya! https://colab.research.google.com/drive/1bv7bppxiimsmg4ywb_lwjdrguhvi7pxx
Bert kami telah dilatih untuk menyandikan pertanyaan medis dan informasi medis. Pengguna dapat mengetikkan pertanyaan medis, dan model kami akan mengambil informasi medis yang paling relevan dengan pertanyaan itu.
Kami membuat set data dari beberapa pertanyaan medis dan penjawaban. Forumnya adalah webmd, healthtap, eHealthforums, iclinic, pertanyaan dokter, dan reddit.com/r/askdocs
Arsitekturnya terdiri dari BioBert yang disesuaikan (sama untuk pertanyaan dan jawaban) untuk mengonversi input teks menjadi representasi yang menanamkan. Embedding kemudian dimasukkan ke dalam FCNN (yang berbeda untuk pertanyaan dan jawaban) untuk mengembangkan embedding yang digunakan untuk pencarian kesamaan. Pertanyaan dan jawaban serupa teratas kemudian digunakan oleh GPT-2 untuk menghasilkan jawaban. Arsitektur lengkap ditunjukkan di bawah ini.
Mari kita lihat di paruh pertama diagram di atas secara lebih rinci, pelatihan Bert dan FCNNs. Sosok terperinci dari bagian ini ditunjukkan di bawah ini
Selama pelatihan, kami mengambil sejumlah pertanyaan medis dan jawaban medis yang sesuai, dan mengubahnya menjadi embeddings Biobert. Bobot Bert yang sama digunakan untuk pertanyaan dan jawaban.
Embeddings ini kemudian dimasukkan ke dalam lapisan FCNN. Ada lapisan FCNN terpisah untuk embedding pertanyaan dan jawaban. Untuk merekap, kami menggunakan bobot yang sama di lapisan Bert, tetapi pertanyaan dan jawaban masing -masing memiliki lapisan FCNN yang terpisah.
Sekarang di sinilah segalanya menjadi sedikit rumit. Biasanya menanamkan pelatihan kesamaan melibatkan sampel negatif, seperti bagaimana Word2Vec menggunakan kehilangan NCE. Namun, kami tidak dapat menggunakan kehilangan NCE dalam kasus kami karena embeddings dihasilkan selama setiap langkah, dan bobot berubah selama setiap langkah pelatihan.
Jadi, alih -alih kehilangan NCE, yang kami lakukan adalah menghitung produk DOT untuk setiap kombinasi dari tanya jawab embedding dalam batch kami. Ini ditunjukkan pada gambar di bawah ini
Kemudian, softmax diambil melintasi baris; Untuk setiap pertanyaan, semua kombinasi jawabannya adalah softmaxed.
Akhirnya, kerugian yang digunakan adalah kehilangan entropi silang. Matriks softmaxed dibandingkan dengan matriks kebenaran tanah; Kombinasi pertanyaan dan jawaban yang benar diberi label dengan '1', dan semua kombinasi lainnya diberi label dengan '0'.
Pengumpulan data rumit karena pemformatan semua situs medis yang berbeda sangat berbeda. Pekerjaan khusus perlu dilakukan untuk setiap situs untuk menarik pertanyaan dan jawaban dari bagian yang benar dari tag HTML. Beberapa situs juga memiliki kemungkinan banyak dokter menanggapi satu pertanyaan sehingga kami membutuhkan metode untuk mengumpulkan banyak tanggapan terhadap pertanyaan individu. Untuk menangani ini, kami membuat beberapa baris untuk setiap pasangan pertanyaan. Dari sini kami perlu menjalankan model melalui Bert dan menyimpan output dari salah satu lapisan akhir untuk membuat embeddings biobert, kami dapat melewati lapisan padat jaringan saraf feed-forward kami (FFNN). 768 vektor dimensi disimpan untuk pertanyaan dan jawaban dan digabungkan dengan teks yang sesuai dalam file CSV. Kami mencoba berbagai format berbeda untuk pemuatan dan berbagi yang lebih kompak dan lebih cepat, tetapi CSV akhirnya menjadi metode termudah dan paling fleksibel. Setelah embeddings Biobert dibuat dan disimpan, proses pelatihan kesamaan dilakukan dan kemudian embeddings FFNN dibuat yang akan menangkap kesamaan pertanyaan dengan jawaban. Ini juga disimpan bersama dengan embeddings biobert dan teks sumber untuk visualisasi dan permintaan selanjutnya.
Model embedding dibangun di TF 2.0 yang memanfaatkan fleksibilitas eksekusi TF 2.0 yang bersemangat. Namun, model GPT2 yang kami gunakan dibangun di TF 1.x. Untungnya, kita dapat melatih dua model secara terpisah. Saat inferensi, kita perlu mempertahankan nonaktifkan eksekusi yang bersemangat dengan tf.compat.v1.disable_eager_execution dan memelihara dua sesi terpisah. Kita juga perlu mengurus memori GPU dari dua sesi untuk menghindari OOM.
Salah satu pendekatan yang jelas untuk mengambil jawaban berdasarkan pertanyaan pengguna adalah bahwa kami menggunakan encoder yang kuat (BerT) untuk menyandikan pertanyaan dan pertanyaan input dalam database kami dan melakukan pencarian kesamaan. Tidak ada pelatihan yang melibatkan dan kinerja pendekatan ini benar -benar bergantung pada enkoder. Sebagai gantinya, kami menggunakan jaringan umpan-maju terpisah untuk pertanyaan dan jawaban dan menghitung kesamaan kosinus di antara mereka. Terinspirasi oleh pengambilan sampel negatif dari kertas Word2Vec, kami memperlakukan jawaban lain dalam batch yang sama dengan sampel negatif dan menghitung kehilangan entropi silang. Pendekatan ini membuat pertanyaan embeddings dan menjawab embeddings dalam satu pasangan sedekat mungkin dalam hal jarak Euclidean. Ternyata pendekatan ini menghasilkan hasil yang lebih kuat daripada melakukan pencarian kesamaan secara langsung menggunakan vektor embedding Bert.
Preprocessing Bert rumit dan kami benar -benar memiliki sekitar 333K pasangan QA dan lebih dari 30 juta token. Mempertimbangkan shuffle sangat penting dalam pelatihan kami, kami membutuhkan buffer shuffle yang cukup besar untuk melatih model kami dengan benar. Butuh lebih dari 10 menit untuk data preprocess sebelum mulai melatih model di setiap zaman. Jadi kami menggunakan TF.Data dan TFRECORD untuk membangun pipa input kinerja tinggi. Setelah optimasi, hanya butuh sekitar 20 detik untuk memulai pelatihan dan tidak ada waktu idle GPU.
Masalah lain dengan Bert preprocessing adalah bahwa itu semua data hingga panjang tetap. Oleh karena itu, untuk urutan pendek, banyak perhitungan dan memori GPU terbuang sia -sia. Ini sangat penting terutama dengan model besar seperti Bert. Jadi kami menulis ulang kode preprocessing Bert dan memanfaatkan tf.data.experimental.bucket_by_ceseence_length ke sekuens bucket dengan panjang yang berbeda dan urutan bantalan dinamis. Dengan melakukan ini, kami mencapai panjang urutan maksimal yang lebih panjang dan pelatihan yang lebih cepat.
Setelah beberapa modifikasi, Keras-Beri dapat berjalan di lingkungan TF 2.0. Namun, ketika kami mencoba menggunakan Keras-Bert sebagai sub-model dalam model embedding kami, kami menemukan dua masalah berikut.
Akibatnya, kami memutuskan untuk mengimplementasikan kembali Versi Imperatif dari Bert. Kami menggunakan beberapa komponen Keras-Beri (perhatian multi-kepala, pemuatan berat pos pemeriksaan, dll) dan tulis metode panggilan Bert. Implementasi kami lebih mudah untuk debug dan kompatibel dengan mode Eager yang fleksibel dan mode grafik statis berkinerja tinggi.
Pengguna dapat mengalami banyak gejala dalam berbagai kondisi, yang membuat jawaban yang sempurna mungkin merupakan kombinasi dari banyak jawaban. Untuk mengatasi itu, kami memanfaatkan model GPT2 yang kuat dan memberi makan model pertanyaan dari pengguna bersama dengan jawaban tambahan K yang kami ambil dari data kami. Model GPT2 akan didasarkan pada pertanyaan dan Kop K menjawab dan menghasilkan jawaban yang lebih baik. Untuk melatih model GPT2 dengan benar, kami membuat data pelatihan sebagai berikut: Kami mengambil setiap pertanyaan dalam dataset kami, melakukan pencarian kesamaan untuk mendapatkan jawaban K+1 teratas, menggunakan jawaban asli sebagai target dan jawaban lain sebagai input tambahan. Dengan melakukan ini, kami mendapatkan jumlah data pelatihan GPT2 yang sama dengan data pelatihan model embedding.
Bert sangat fantastis untuk menyandikan pertanyaan dan jawaban medis, dan mengembangkan representasi vektor yang kuat dari pertanyaan/jawaban tersebut.
Kami melatih versi model kami yang disesuaikan yang diinisialisasi dengan Naver's Biobert. Kami juga melatih versi di mana bobot biobert dibekukan, dan hanya melatih dua FCNN untuk pertanyaan dan jawaban. Sementara kami berharap versi yang disetel dengan baik bekerja dengan baik, kami terkejut melihat betapa kuatnya kemudian. Ini menunjukkan bahwa BioBert memiliki kemampuan bawaan untuk dapat menyandikan cara pertanyaan dan jawaban medis.
Jelajahi jika ada penggunaan praktis dari proyek ini di luar tujuan penelitian/eksplorasi. Model seperti ini tidak boleh digunakan di depan umum untuk mendapatkan informasi medis. Tapi mungkin itu dapat digunakan oleh profesional medis terlatih/berlisensi untuk mengumpulkan informasi untuk pemeriksaan.
Jelajahi menerapkan metode yang sama ke domain lain (yaitu pengambilan informasi riwayat, pengambilan informasi teknik, dll.).
Jelajahi bagaimana scibert yang baru dirilis (dari Allen AI) dibandingkan dengan Naver's Biobert.
Kami mengucapkan terima kasih kepada tim TensorFlow karena telah memberikan tantangan #poweredbytf2.0 sebagai platform yang melaluinya kami dapat berbagi pekerjaan kami dengan orang lain, dan terima kasih khusus kepada Dr. Llion Jones, yang wawasan dan bimbingannya memiliki dampak penting pada arah proyek kami.