Santosh Gupta、Alex Sheng、およびJunpeng Yeのコラボレーション
訓練されたモデルと埋め込みファイルをこちらからダウンロードしてください。
The PoweredBytf 2.0チャレンジの優勝者トップ6ファイナリスト! https://devpost.com/software/nlp-doctor。 DOC製品は、Tensorflow ConnectのTensorflow Engineeringチームに提示されます。詳細をお楽しみに。
Tensorflow 2.0を使用して、BERTやGPT-2などの最先端の自然言語処理モデルが、関連する医療データの取得と条件付けにより医学的な質問にどれだけ対応できるかを調査したかったのですが、これが結果です。
このプロジェクトの目的は、科学的エンコーディングと検索のための深い学習言語モデルの能力を調査することです。
壊れた学部生からデータサイエンティスト、一流のNLP研究者に至るまで、さまざまなバックグラウンドを持つ友人のグループとして、さまざまなさまざまな機械学習分野からデザインにインスピレーションを与えました。トランスアーキテクチャ、潜在的なベクトル検索、否定的なサンプリング、Tensorflow 2.0の柔軟なディープラーニングフレームワーク内での生成前トレーニングの力を組み合わせることで、最初はヘラクリアンのタスクのように思われる困難な問題の新しい解決策を考え出すことができました。
ドキュメント製品の構築方法とアーキテクチャの詳細のストーリー全体に興味がある場合は、GitHub Readmeをご覧ください!
私たちのプロジェクトは、天文学的に大きなデータセットの圧縮からTensorflow 2.0のBERT全体の再実装、コラボレータの1億1700万パラメーターでGPT-2を実行すること、プロジェクトの最後の部分を急いで出荷期限までに急いで取得することまで、あまりにも多くの課題を伴いました。奇妙なことに、最大の課題はしばしば、プロジェクトが向かうべき方向について意見の相違があったときでした。しかし、私たちは最善の行動が何であるかについて意見が合いましたが、最終的に私たちは皆、多くの人々にとって意味のある潜在的な価値のあるものを構築するという同じ最終目標を持っていました。そうは言っても、私たちは常に座って合意に達することができ、お互いのサポートと深夜のペップがGoogleのたまり場をめぐる話をして、課題に立ち向かい、一緒に克服することができました。
DOC製品は広範囲にわたる商用利用の準備ができていませんが、その驚くほど優れたパフォーマンスは、BERTやGPT-2などの一般的な言語モデルの進歩が、深いNLPベースのアプローチにアクセスできる医療情報処理など、以前は扱いにくい問題を抱えていることを示しています。したがって、私たちの作品が他の人にこれらの問題に取り組むように促し、新しく開かれたNLPフロンティア自身を探求するのに役立つことを願っています。
それにもかかわらず、私たちはまだDOC製品の作業を継続することを計画しており、特に拡張して、OpenAIが段階的リリースプログラムの一環としてそれらをリリースするため、GPT-2の345m、762m、および1.5bパラメーターバージョンを活用しています。また、モデルのトレーニングを継続する予定です。これは、まだかなりのデータがあるため、モデルのトレーニングを続けるつもりです。
注:私たちは、科学/医療NLPおよび情報検索の研究に近づいています。コラボレーションに興味がある場合は、[email protected]で電子メールを撮影してください!
PIPからDOC製品を直接インストールして、ローカルマシンで実行できます。 Tensorflow 2.0およびFAISSとともに、 DOC製品をインストールするコードは次のとおりです。
!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データを生成するためのスクリプト、独自のQ&AデータでDoc製品のトレーニング、医学的質問に対する回答を得るためのDOC製品を実行するためのスクリプトが含まれています。データ/ウェイトをロードしてモデルを実行するコードサンプルについては、以下のGoogle Colaboratory Demosセクションを参照してください。
私たちのコラブのデモを見てください!私たちは、私たちが行くときにさらにデモを追加することを計画しており、ユーザーがDOC製品のより多くの機能を探索できるようにします。すべての新しいデモが同じGoogleドライブフォルダーに追加されます。
デモには、PIP経由でDOC製品をインストールするためのコード、事前訓練を受けた重量のダウンロード/ロード、 DOC製品の検索機能の実行、独自のQ&Aデータへの微調整が含まれます。
https://colab.research.google.com/drive/11har1qo7vcsmijwrefwytfblu2lveh1r
https://colab.research.google.com/drive/1rz2rzkwwrvexcjqtxhxzlcw5cxi7xa
エンドツーエンドのDOC製品デモはまだ実験的ですが、お気軽にお試しください! https://colab.research.google.com/drive/1bv7bppxiimsmg4ywb_lwjdrguhvi7pxx
私たちのバートは、医学的な質問と医療情報をエンコードするように訓練されています。ユーザーは医学的な質問を入力でき、私たちのモデルはその質問に最も関連する医療情報を取得します。
いくつかの医学的質問と応答フォーラムからデータセットを作成しました。フォーラムは、WebMD、HealthTap、eHealthForums、IClinic、質問医師、reddit.com/r/askdocsです。
アーキテクチャは、テキスト入力を埋め込み表現に変換するための微調整されたバイオバート(質問と回答の両方と同じ)で構成されています。埋め込みは、FCNN(質問と回答とは異なるもの)に入力され、類似性の検索に使用される埋め込みを開発します。その後、GPT-2によって同様の質問と回答が使用され、回答が生成されます。完全なアーキテクチャを以下に示します。
上記の図の前半を詳細に見てみましょう。BERTとFCNNSのトレーニングをご覧ください。この部分の詳細な図を以下に示します
トレーニング中、私たちは多くの医学的質問とそれらの対応する医学的回答を受け取り、それらをバイオベルトの埋め込みに変換します。同じバートウェイトが質問と回答の両方に使用されます。
これらの埋め込みは、FCNN層に入力されます。質問と回答の両方の埋め込みの両方に、個別のFCNNレイヤーがあります。要約するには、Bert層で同じ重みを使用しますが、質問と回答にはそれぞれ独自のFCNN層があります。
ここで、物事が少しトリッキーになります。通常、類似性トレーニングを埋め込むには、Word2vecがNCE損失をどのように使用するかなど、負のサンプルが含まれます。ただし、各ステップ中に埋め込みが生成され、各トレーニングステップ中に重みが変化するため、当社の場合はNCE損失を使用することはできません。
したがって、NCE損失の代わりに、私たちがしたことは、バッチ内の質問と回答の埋め込みのすべての組み合わせのドット製品を計算することでした。これを下の図に示します
次に、列全体にソフトマックスが採取されます。質問ごとに、その回答の組み合わせはすべてソフトマックスされています。
最後に、使用される損失は、クロスエントロピー損失です。ソフトマックスされたマトリックスは、グラウンドトゥルースマトリックスと比較されます。質問と回答の正しい組み合わせには「1」とラベル付けされており、他のすべての組み合わせは「0」でラベル付けされています。
さまざまな医療サイトのすべてのフォーマットが大きく異なっていたため、データ収集は難しいものでした。 HTMLタグの正しい部分から質問と回答を引き出すために、各サイトでカスタム作業を行う必要がありました。一部のサイトには、複数の医師が単一の質問に回答する可能性もあったため、個々の質問に対する複数の回答を収集する方法が必要でした。これに対処するために、質問を回答するたびに複数の行を作成しました。ここから、モデルをBERTを介してモデルを実行し、エンドレイヤーの1つから出力を保存して、フィードフォワードニューラルネットワーク(FFNN)の密な層を通過できるBiobert埋め込みを作成する必要がありました。 768寸法ベクトルは、質問と回答の両方に保存され、CSVファイルの対応するテキストと連結されました。よりコンパクトでより速いロードと共有のためにさまざまな異なる形式を試しましたが、CSVは最終的に最も簡単で最も柔軟な方法になりました。 Biobertの埋め込みが作成され、保存された後、類似性トレーニングプロセスが行われ、質問の類似性を回答の類似性をキャプチャするFFNN埋め込みが作成されました。これらは、後で視覚化とクエリをするために、Biobert EmbeddingsおよびSourceテキストとともに保存されました。
埋め込みモデルは、TF 2.0の熱心な実行の柔軟性を利用するTF 2.0に組み込まれています。ただし、使用するGPT2モデルはTF 1.xで構築されています。幸いなことに、2つのモデルを個別にトレーニングできます。推論中に、TF.compat.v1.disable_eager_executionを使用して熱心な実行を維持し、2つの個別のセッションを維持する必要があります。また、OOMを避けるために、2つのセッションのGPUメモリを処理する必要があります。
ユーザーの質問に基づいて回答を取得するための明らかなアプローチの1つは、強力なエンコーダー(BERT)を使用してデータベースで入力の質問と質問をエンコードし、類似性検索を行うことです。トレーニングは関与しておらず、このアプローチのパフォーマンスはエンコーダーに完全に依存しています。代わりに、質問と回答のために個別のフィードフォワードネットワークを使用し、それらの間のコサインの類似性を計算します。 word2vecペーパーの負のサンプリングに触発されて、私たちは他の答えを負のサンプルと同じバッチで扱い、相互エントロピー損失を計算します。このアプローチは、質問を埋め込みと回答を1つのペアにできるだけ近くのユークリッド距離の観点から、できるだけ近くに埋め込みます。このアプローチは、Bert Embedding Vectorを使用して類似性検索を直接行うよりも、より堅牢な結果をもたらすことがわかります。
BERTの前処理は複雑で、約333kのQAペアと3,000万を超えるトークンが完全にあります。私たちのトレーニングではシャッフルが非常に重要であることを考慮すると、モデルを適切にトレーニングするのに十分な大きさのシャッフルバッファーが必要です。各エポックでモデルのトレーニングを開始する前に、データを前処理するのに10分以上かかりました。そのため、TF.DataとTfrecordsを使用して、高性能入力パイプラインを構築しました。最適化の後、トレーニングを開始するのに約20秒しかかかりませんでした。
Bert Preprocessingのもう1つの問題は、すべてのデータを固定された長さにパッドすることです。したがって、短いシーケンスの場合、多くの計算とGPUメモリが無駄になります。これは、特にBertのような大きなモデルでは非常に重要です。そのため、Bert Preprocessingコードを書き直し、TF.DATA.EXPERIMEMTAL.BUCKET_BY_SEQUENCE_LENGTHを使用して、異なる長さと動的にパディングシーケンスを持つバケットシーケンスになります。これを行うことで、より長い最大シーケンスの長さとより高速なトレーニングを実現しました。
いくつかの変更の後、Keras-BertはTF 2.0環境で実行できます。ただし、Keras-Bertを埋め込みモデルのサブモデルとして使用しようとすると、次の2つの問題が見つかりました。
その結果、Bertの命令版を再実装することにしました。 Keras-Bertのコンポーネント(マルチヘッドの注意、チェックポイントの重量荷重など)のコンポーネントを使用し、Bertのコールメソッドを書き込みました。実装は、柔軟な熱心モードと高性能の静的グラフモードの両方でデバッグし、互換性があります。
ユーザーはさまざまな状態で複数の症状を経験する可能性があります。これにより、完璧な答えは複数の答えの組み合わせになる可能性があります。それに取り組むために、強力なGPT2モデルを利用し、データから取得したトップK補助回答とともに、ユーザーからの質問にモデルにフィードします。 GPT2モデルは質問に基づいており、Top Kは回答し、より良い答えを生成します。 GPT2モデルを適切にトレーニングするために、次のようにトレーニングデータを作成します。データセットですべての質問を実行し、類似性検索を実行してトップK+1の回答を取得し、元の回答をターゲットとして、およびその他の回答を補助入力として使用します。これを行うことにより、埋め込みモデルトレーニングデータと同じ量のGPT2トレーニングデータを取得します。
Bertは、医学的な質問や回答をエンコードし、それらの質問/回答の堅牢なベクトル表現を開発するのに最適です。
NaverのBiobertで初期化されたモデルの微調整バージョンを訓練しました。また、Biobertの重量が凍結されたバージョンを訓練し、質問と回答のために2つのFCNNのみを訓練しました。微調整されたバージョンがうまく機能することを期待していましたが、後の堅牢性に驚きました。これは、Biobertが医学的な質問と回答の手段をエンコードできるという生来の能力を持っていることを示唆しています。
研究/探索的目的以外では、このプロジェクトの実用的な使用があるかどうかを調べてください。このようなモデルは、医療情報を取得するために一般に使用しないでください。しかし、おそらく訓練を受けた/認可された医療専門家が審査のための情報を収集するために使用することができます。
同じ方法を他のドメインに適用することを探索します(つまり、履歴情報検索、エンジニアリング情報の検索など)。
最近リリースされたScibert(Allen AIから)がNaverのBiobertと比較される方法を探ります。
Tensorflowチームに、#PoweredBytf2.0チャレンジを他の人と共有できるプラットフォームとして提供してくれたことに感謝し、プロジェクトの方向に洞察とガイダンスが重要な影響を与えたLlion Jones博士に感謝します。