Santosh Gupta,Alex Sheng和Junpeng Ye之間的合作
在此處下載訓練有素的模型和嵌入文件。
獲勝者的前6名#PoweredByTF 2.0挑戰的決賽入圍者! https://devpost.com/software/nlp-doctor。 DOC產品將展示給TensorFlow Connect的Tensorflow工程團隊。請繼續關注詳細信息。
我們想使用Tensorflow 2.0來探索諸如BERT和GPT-2(GPT-2)的最先進的自然語言處理模型如何通過檢索和調理相關的醫療數據來回答醫療問題,這就是結果。
該項目的目的是探索深度學習語言模型進行科學編碼和檢索的能力,不應將其用於可行的醫療建議。
作為一群具有不同背景的朋友,從破產的本科到數據科學家再到頂級NLP研究人員,我們從機器學習的各個不同領域汲取了靈感。通過結合變壓器體系結構的力量,潛在的向量搜索,負面抽樣以及Tensorflow 2.0的靈活深度學習框架中的生成預訓練,我們能夠提出一個新穎的解決方案,以解決一個困難的問題,這似乎像是一項艱鉅的任務。
如果您對我們如何構建Doc產品的整個故事以及架構的細節感興趣,請查看我們的Github Readme!
從壓縮天文學大型數據集的壓縮到重新實施Tensorflow 2.0中的BERT到以1.17億個參數進行GPT-2進行,我們的項目構成了太多挑戰,從壓縮天文學大型數據集進行了重新實現,到在共同代表的情況下運行GPT-2,再到急於將項目的最後一部分準備好,並剩下幾個小時才能準備好幾個小時,直到提交截止日期為止。奇怪的是,最大的挑戰通常是當我們對項目應採取的方向分歧時。但是,儘管我們不同意最好的行動是什麼,但最終,我們所有人都有相同的最終目標,即為許多人建立有意義的東西和潛在有價值的東西。話雖這麼說,我們始終將始終能夠坐下來達成協議,並在彼此的支持和深夜為Google聚會場面進行談判,並面臨挑戰並共同克服它們。
儘管DOC產品還沒有準備好用於廣泛的商業用途,但其出乎意料的良好性能表明,諸如BERT和GPT-2之類的通用語言模型中的進步已經導致了以前棘手的問題,例如基於Deep NLP的方法可以訪問醫療信息處理。因此,我們希望我們的工作能夠激發他人解決這些問題並探索新開放的NLP邊境。
儘管如此,我們仍然計劃繼續開發DOC產品,特別是將其擴展,以利用GPT-2的345m,762m和1.5b參數版本,因為OpenAI將其作為上演發布程序的一部分發布。我們還打算繼續訓練該模型,因為我們還有更多數據需要通過。
注意:我們正在研究科學/醫學NLP和信息檢索的研究。如果您有興趣合作,請通過[email protected]向我們發送電子郵件!
您可以直接從PIP安裝DOC產品並在本地計算機上運行。這是安裝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
我們的存儲庫包含用於生成.tfrefords數據,根據您自己的問答數據培訓DOC產品的腳本,並運行DOC產品以獲取醫療問題的答案。請參閱下面的Google合同演示部分,以獲取加載數據/權重的代碼樣本並運行我們的模型。
看看我們的COLAB演示!我們計劃隨著時間的流逝添加更多演示,使用戶可以探索更多DOC產品的功能。所有新的演示將添加到同一Google驅動器文件夾中。
演示包括用於通過PIP安裝DOC產品的代碼,下載/加載預訓練的權重,並運行Doc Product的檢索功能以及在您自己的Q&A數據上進行微調。
https://colab.research.google.com/drive/11har1qo7vcsmijwrefwytfblu2lveh1r
https://colab.research.google.com/drive/1rz2rzkkwwrvexcjiqqtxhxhxzlcw5cxi7xa
端到端的DOC產品演示仍然是實驗性的,但請隨時嘗試! https://colab.research.google.com/drive/1bv7bppxiimsmg4wb_lwjdrguhvi7pxx
我們的BERT經過培訓,可以編碼醫療問題和醫療信息。用戶可以輸入醫療問題,我們的模型將檢索到該問題的最相關的醫療信息。
我們從幾個醫學問題和回答論壇中創建了數據集。論壇是WebMD,HealthTap,Ehealthforums,ICLINIC,問題醫生和Reddit.com/R/askdocs
該體系結構由一個微調的生物Biobert(對於問題和答案而言相同),將文本輸入轉換為嵌入表示形式。然後將嵌入到FCNN中(對於問題和答案而言是不同的),以開髮用於相似性查找的嵌入。然後,GPT-2使用頂級類似的問題和答案來產生答案。完整的體系結構如下所示。
讓我們詳細查看上面圖的前半部分,即Bert和FCNN的訓練。該部分的詳細圖形如下所示
在培訓期間,我們採取了一批醫療問題及其相應的醫療答案,並將其轉換為生物植物的嵌入。相同的BERT權重用於問題和答案。
然後將這些嵌入輸入到FCNN層中。問題和答案嵌入都有單獨的FCNN層。回顧一下,我們在Bert層中使用相同的權重,但是問題和答案每個都有自己的單獨的FCNN層。
現在這是事情變得有些棘手的地方。通常,嵌入相似性訓練涉及負樣本,例如Word2Vec如何使用NCE損失。但是,由於在每個步驟中生成嵌入,並且在每個訓練步驟中都會改變權重,因此我們無法使用NCE損失。
因此,我們所做的不是NECE的損失,而是在批處理中計算問題和答案嵌入的每種組合。這在下圖中顯示
然後,在整行上取一個軟磁性。對於每個問題,所有答案組合都是軟及。
最後,所使用的損失是跨熵損失。將軟矩陣與地面真相矩陣進行了比較。問題和答案的正確組合用“ 1”標記,所有其他組合都標有“ 0”。
數據收集很棘手,因為所有不同醫療場所的格式都大不相同。為了從HTML標籤的正確部分提取問題和答案,需要為每個站點完成自定義工作。其中一些網站還有可能對一個問題回答多個醫生,因此我們需要一種收集對個別問題的多種回答的方法。為了解決這個問題,我們為每個提問對生成了多行。從這裡開始,我們需要通過BERT運行模型,並將輸出從一個末端層之一存儲,以使生物Biobert嵌入我們可以通過饋電神經網絡(FFNN)的密集層。為問題和答案存儲了768個尺寸向量,並與CSV文件中的相應文本串聯。我們嘗試了各種不同的格式,以實現更緊湊,更快的加載和共享,但是CSV最終是最簡單,最靈活的方法。在創建生物Biobert嵌入並存儲了相似性訓練過程之後,創建了FFNN嵌入,以捕獲問題與答案的相似性。這些也與生物嵌入和源文本一起存儲,以供以後的可視化和查詢。
嵌入模型構建在TF 2.0中,該模型利用了渴望執行TF 2.0的靈活性。但是,我們使用的GPT2模型是在TF 1.X中構建的。幸運的是,我們可以分別訓練兩種型號。在推斷時,我們需要使用tf.compat.v1.disable_eager_execution維護禁用的急切執行,並維護兩個單獨的會話。我們還需要照顧兩個會話的GPU記憶,以避免OOM。
根據用戶問題檢索答案的一種明顯的方法是,我們使用功能強大的編碼器(BERT)來編碼數據庫中的輸入問題和問題,並進行相似性搜索。沒有培訓涉及,這種方法的性能完全取決於編碼器。取而代之的是,我們使用單獨的饋送網絡來解決問題和答案,併計算它們之間的餘弦相似性。受Word2Vec紙的負抽樣的啟發,我們將其他答案與負樣品相同的其他答案處理,併計算橫熵損失。這種方法使問題的嵌入和答案嵌入一對中,就歐幾里得距離而言盡可能近。事實證明,這種方法比使用BERT嵌入向量直接進行相似性搜索可以產生更強的結果。
BERT的預處理很複雜,我們完全擁有約333K QA對和超過3000萬個令牌。考慮到混車在我們的培訓中非常重要,我們需要足夠大的洗牌緩衝液以適當訓練我們的模型。在每個時期開始訓練模型之前,預處理數據花費了10分鐘以上。因此,我們使用TF.DATA和TFRECORD來構建高性能輸入管道。優化之後,只需20秒即可開始訓練,而沒有GPU空閒時間。
BERT預處理的另一個問題是將所有數據粘貼到固定的長度。因此,對於簡短的序列,大量的計算和GPU存儲器浪費了。這非常重要,尤其是在伯特(Bert)等大型模型中。因此,我們將BERT預處理代碼重寫,並使用tf.data.experiment.bucket_by_sequence_length將其轉換為具有不同長度和動態填充序列的存儲序列。通過這樣做,我們實現了更長的最大序列長度和更快的訓練。
經過一些修改後,Keras-Bert能夠在TF 2.0環境中運行。但是,當我們嘗試將Keras-Bert用作嵌入模型中的子模型時,我們發現了以下兩個問題。
結果,我們決定重新實現BERT的命令式版本。我們使用了Keras-Bert(多頭注意,檢查點重量加載等)的一些組件,並寫下BERT的呼叫方法。我們的實現更容易進行調試,並且與靈活的急切模式和高性能靜態圖模式兼容。
用戶可能會在各種情況下遇到多種症狀,這使得完美的答案可能是多個答案的組合。為了解決這個問題,我們利用功能強大的GPT2模型,並為用戶提供的問題以及我們從數據中檢索到的頂級K輔助答案。 GPT2模型將基於問題和頂部K答案,並產生更好的答案。要適當訓練GPT2模型,我們創建的培訓數據如下:我們在數據集中提取每個問題,進行相似性搜索以獲取頂級K+1答案,將原始答案用作目標,將其他答案作為輔助輸入。通過這樣做,我們獲得了與嵌入模型培訓數據相同的GPT2培訓數據。
伯特(Bert)非常適合編碼醫療問題和答案,並開發這些問題/答案的強大矢量表示。
我們培訓了模型的微調版本,該版本是用Naver的Biobert初始化的。我們還訓練了一個版本,其中生物重物被冷凍,並且僅培訓了兩個FCNN的問題和答案。雖然我們希望微調版本運行良好,但我們對以後的強勁性感到驚訝。這表明生物伯特在能夠編碼醫療問題和答案的手段方面具有天生的能力。
探索在研究/探索目的之外是否有任何實際使用該項目。這樣的模型不應在公眾中用於獲取醫療信息。但是,也許訓練有素/有執照的醫療專業人員可以使用它來收集審查信息。
探索將相同的方法應用於其他域(即歷史信息檢索,工程信息檢索等)。
探索最近發布的Scibert(來自Allen AI)與Naver的Biobert進行了比較。
我們感謝Tensorflow團隊提供#PoweredBytf2.0挑戰作為一個平台,我們可以與他人分享我們的工作,並特別感謝Llion Jones博士,他的見解和指導對我們項目的方向產生了重要影響。