Santosh Gupta, Alex Sheng 및 Junpeng Ye 간의 협력
훈련 된 모델과 포함 파일을 여기에서 다운로드하십시오.
⚡#poweredBytf 2.0 챌린지의 우승자 상위 6 개 결선 진출 자! https://devpost.com/software/nlp-doctor. DOC 제품은 TensorFlow Connect의 Tensorflow 엔지니어링 팀에 제공됩니다. 자세한 내용은 계속 지켜봐 주시기 바랍니다.
우리는 Tensorflow 2.0을 사용하여 Bert 및 GPT-2와 같은 최신 자연 언어 처리 모델이 관련 의료 데이터를 검색하고 조절하여 의학적 질문에 얼마나 응답 할 수 있는지 탐구하고 싶었습니다.
이 프로젝트의 목적은 과학 인코딩 및 검색을위한 딥 러닝 언어 모델의 기능을 탐색하는 것입니다. 실행 가능한 의학적 조언에 사용해서는 안됩니다.
우리는 부러진 학부에서 데이터 과학자, 최상위 NLP 연구원에 이르기까지 다양한 배경을 가진 친구 그룹으로서 다양한 기계 학습 영역에서 우리의 디자인에 영감을 얻었습니다. Tensorflow 2.0의 Flexible Deep Learning 프레임 워크 내에서 변압기 아키텍처, 잠재 벡터 검색, 음의 샘플링 및 생성 사전 훈련의 성능을 결합함으로써, 우리는 처음에는 Herculean 과제처럼 보이는 어려운 문제에 대한 새로운 솔루션을 제시 할 수있었습니다.
Doc 제품을 구축 한 방법과 아키텍처의 세부 사항에 대한 전체 이야기에 관심이 있다면 Github Readme를 살펴보십시오!
우리의 프로젝트는 천문학적으로 큰 데이터 세트를 압축하는 것부터 Tensorflow 2.0의 Bert 전체를 재 구현하는 것에서, 공동 작업에서 1 억 1,700 만 개의 매개 변수로 GPT-2를 실행하는 것까지, 제출 마감일까지 몇 시간 동안 우리 프로젝트의 마지막 부분을 준비하기 위해 서두르기 위해 너무 많은 도전 과제를 겪었습니다. 이상하게도, 가장 큰 과제는 종종 프로젝트를 이끌어야 할 방향에 대해 의견이 일치하지 않았을 때였습니다. 그러나 우리는 최선의 행동 과정이 무엇인지에 대해 동의하지 않지만 결국 우리 모두는 많은 사람들에게 의미 있고 잠재적으로 가치있는 것을 구축하는 것과 같은 최종 목표를 가지고있었습니다. 즉, 우리는 항상 결국 앉아서 합의에 도달 할 수 있었고, Google 행 아웃에 대한 서로의 지원과 심야 Pep 대화와 함께 도전 과제를 극복하고 함께 극복했습니다.
Doc Product는 광범위한 상업적 사용을위한 준비가되지 않았지만 놀랍게도 우수한 성능은 Bert 및 GPT-2와 같은 일반 언어 모델의 발전으로 인해 DEP NLP 기반 접근법에 액세스 할 수있는 의료 정보 처리와 같은 이전에 다루기 어려운 문제를 일으켰습니다. 따라서 우리는 우리의 일이 다른 사람들이 이러한 문제를 해결하고 새로 열린 NLP 프론티어를 탐구하도록 영감을주기를 바랍니다.
그럼에도 불구하고, 우리는 여전히 DOC 제품 에 대한 작업을 계속할 계획이며, 특히 GPT-2의 345m, 762m 및 1.5b 매개 변수 버전을 OpenAI로 이용하여 단계적 릴리스 프로그램의 일부로 방출 할 수 있도록 확장 할 계획입니다. 우리는 또한 여전히 더 많은 데이터를 가지고 있기 때문에 모델을 계속 훈련하려고합니다.
참고 : 우리는 과학/의료 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 공동 작업 데모 섹션을 참조하십시오.
Colab 데모를 살펴보십시오! 우리는 갈 때 더 많은 데모를 추가 할 계획이므로 사용자는 DOC 제품 의 기능을 더 많이 탐색 할 수 있습니다. 모든 새로운 데모는 동일한 Google 드라이브 폴더에 추가됩니다.
데모에는 PIP를 통해 DOC 제품 설치, 사전 훈련 된 가중치 다운로드/로드 및 DOC 제품 의 검색 기능 실행 및 자체 Q & A 데이터에서 미세 조정을위한 코드가 포함됩니다.
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, Question Doctors 및 Reddit.com/r/askdocs입니다.
이 아키텍처는 텍스트 입력을 임베딩 표현으로 변환하기 위해 미세 조정 된 바이오 버트 (질문과 답변 모두 동일)로 구성됩니다. 그런 다음 임베딩은 유사성 조회에 사용되는 임베딩을 개발하기 위해 FCNN (질문 및 답변의 다른 것)에 입력됩니다. 그런 다음 유사한 질문과 답변을 GPT-2에서 사용하여 답을 생성합니다. 전체 아키텍처는 다음과 같습니다.
위의 다이어그램의 상반기를 더 자세히 볼 때, Bert 및 FCNN의 훈련을 살펴 보겠습니다. 이 부분의 자세한 그림은 다음과 같습니다
훈련 중에, 우리는 많은 의학적 질문과 그에 해당하는 의학적 답변을 취하여 Biobert 임베딩으로 전환합니다. 질문과 답변 모두에 동일한 버트 가중치가 사용됩니다.
이 내장은 FCNN 층에 입력됩니다. 질문과 답변 임베딩 모두에 대한 별도의 FCNN 층이 있습니다. 요약하기 위해, 우리는 Bert 레이어에서 동일한 가중치를 사용하지만 질문과 답변에는 각각 고유 한 분리 된 FCNN 층이 있습니다.
이제 상황이 조금 까다로워지는 곳이 있습니다. 일반적으로 유사성 훈련은 Word2Vec이 NCE 손실을 사용하는 방식과 같은 음의 샘플을 포함합니다. 그러나 각 단계에서 임베딩이 생성되고 각 훈련 단계에서 가중치가 변하기 때문에 우리는 사례에서 NCE 손실을 사용할 수 없습니다.
따라서 NCE 손실 대신, 우리가 한 일은 배치 내의 질문과 답변 임베딩의 모든 조합에 대한 도트 제품을 계산하는 것이 었습니다. 이것은 아래 그림에 나와 있습니다
그런 다음 SoftMax가 행을 가로 질러 채취됩니다. 각 질문에 대해 모든 답변 조합은 소프트가되었습니다.
마지막으로 사용 된 손실은 교차 엔트로피 손실입니다. SoftMaxed 행렬은 지상 진실 행렬과 비교됩니다. 질문과 답변의 올바른 조합에는 '1'이 표시되며 다른 모든 조합에는 '0'이 표시됩니다.
모든 다른 의료 사이트의 형식이 크게 다르기 때문에 데이터 수집은 까다로웠습니다. HTML 태그의 올바른 부분에서 질문과 답변을 가져 오려면 각 사이트에 대해 맞춤 작업을 수행해야합니다. 일부 사이트는 여러 의사가 단일 질문에 응답 할 가능성이 있었으므로 개별 질문에 대한 여러 응답을 수집하는 방법이 필요했습니다. 이를 다루기 위해 모든 질문 응답 쌍에 대해 여러 행을 만들었습니다. 여기에서 우리는 Bert를 통해 모델을 실행하고 최종 레이어 중 하나에서 출력을 저장하여 Biobert 임베딩을 만들기 위해 FFNN (Feed-Forward Neural Network)의 밀집된 층을 통과 할 수있었습니다. 768 차원 벡터는 질문과 답변 모두에 대해 저장되었고 CSV 파일의 해당 텍스트와 연결되었습니다. 우리는보다 작고 빠른 로딩 및 공유를 위해 다양한 형식을 시도했지만 CSV는 가장 쉽고 가장 유연한 방법이었습니다. Biobert 임베딩이 생성되고 저장된 후 유사성 훈련 과정이 수행 된 다음 질문의 유사성을 대답하는 FFNN 임베딩이 만들어졌습니다. 이것들은 또한 나중에 시각화 및 쿼리를 위해 Biobert 임베드 및 소스 텍스트와 함께 저장되었습니다.
임베딩 모델은 TF 2.0으로 구축되어 TF 2.0의 열망 실행의 유연성을 활용합니다. 그러나 우리가 사용하는 GPT2 모델은 TF 1.X로 구축됩니다. 운 좋게도 두 모델을 별도로 훈련시킬 수 있습니다. 추론하는 동안 tf.compat.v1.disable_eger_execution으로 간절한 실행을 비활성화하고 두 개의 별도 세션을 유지해야합니다. 또한 OOM을 피하기 위해 두 세션의 GPU 메모리를 처리해야합니다.
사용자의 질문에 따라 답을 검색하는 명백한 접근법 중 하나는 강력한 인코더 (BERT)를 사용하여 데이터베이스에서 입력 질문 및 질문을 인코딩하고 유사성 검색을 수행한다는 것입니다. 훈련이 포함되지 않으며이 접근법의 성능은 인코더에 전적으로 의존합니다. 대신, 우리는 질문과 답변을 위해 별도의 피드 포워드 네트워크를 사용하고 그들 사이의 코사인 유사성을 계산합니다. Word2Vec 용지의 음성 샘플링에서 영감을 얻은 우리는 다른 답변을 음성 샘플과 동일한 배치로 처리하고 교차 엔트로피 손실을 계산합니다. 이 접근법은 질문 임베딩 및 답변 임베딩을 유클리드 거리 측면에서 가능한 한 가깝게 만듭니다. 이 접근법은 Bert Embedding Vector를 사용하여 직접 유사성 검색을 수행하는 것보다 더 강력한 결과를 얻는다는 것이 밝혀졌습니다.
Bert의 전처리는 복잡하며 우리는 전적으로 약 333k QA 쌍과 3 천만 개가 넘는 토큰이 있습니다. 셔플이 훈련에서 매우 중요하다는 점을 고려할 때 모델을 올바르게 훈련시키기에 충분히 큰 셔플 버퍼가 필요합니다. 각 에포크에서 모델을 훈련하기 전에 데이터를 전처리하는 데 10 분이 걸렸습니다. 그래서 우리는 tf.data 및 tfrecords를 사용하여 고성능 입력 파이프 라인을 구축했습니다. 최적화 후, 훈련을 시작하는 데 약 20 초 밖에 걸리지 않았으며 GPU 유휴 시간이 없었습니다.
Bert Preprocessing의 또 다른 문제는 모든 데이터를 고정 길이로 채우는 것입니다. 따라서 짧은 시퀀스의 경우 많은 계산 및 GPU 메모리가 낭비됩니다. 이것은 특히 Bert와 같은 큰 모델에서 매우 중요합니다. 따라서 Bert Preprocessing Code를 다시 작성하고 다른 길이와 동적 패딩 시퀀스를 가진 버킷 시퀀스에 tf.data.experimental.bucket_by_sequence_length를 사용합니다. 이렇게함으로써, 우리는 더 긴 최대 시퀀스 길이와 더 빠른 훈련을 달성했습니다.
약간의 수정 후 Keras-Bert는 TF 2.0 환경에서 실행할 수 있습니다. 그러나 우리가 keras-bert를 임베딩 모델에서 서브 모델로 사용하려고 할 때 다음 두 가지 문제를 발견했습니다.
결과적으로, 우리는 Bert의 명령적인 버전을 다시 구현하기로 결정했습니다. 우리는 Keras-Bert (멀티 헤드주의, 체크 포인트 무게 로딩 등)의 일부 구성 요소를 사용하고 Bert의 통화 방법을 작성했습니다. 우리의 구현은 유연한 열심 모드와 고성능 정적 그래프 모드와 함께 디버깅하고 호환됩니다.
사용자는 다양한 상태에서 여러 증상을 경험할 수 있으므로 완벽한 답변은 여러 답변의 조합 일 수 있습니다. 이를 해결하기 위해 강력한 GPT2 모델을 사용하고 데이터에서 검색 한 Top K 보조 답변과 함께 사용자의 질문을 모델에 공급합니다. GPT2 모델은 질문과 상단 K 답변을 기반으로하며 더 나은 답변을 생성합니다. GPT2 모델을 올바르게 교육하려면 다음과 같이 교육 데이터를 만듭니다. 데이터 세트에서 모든 질문을하고 유사성 검색을 수행하여 상단 K+1 답변을 얻고 원래 답변을 대상으로 사용하고 기타 답변을 보조 입력으로 사용합니다. 이를 통해 우리는 임베딩 모델 교육 데이터와 동일한 양의 GPT2 교육 데이터를 얻습니다.
Bert는 의학적 질문과 답변을 인코딩하고 이러한 질문/답변의 강력한 벡터 표현을 개발하는 데 환상적입니다.
우리는 Naver의 Biobert로 초기화 된 미세 조정 버전의 모델을 교육했습니다. 우리는 또한 Biobert weights가 얼어 붙은 버전을 훈련 시켰으며 질문과 답변을 위해 두 FCNN을 훈련 시켰습니다. 우리는 미세 조정 된 버전이 잘 작동 할 것으로 예상했지만 나중에 얼마나 강력한 지 놀랐습니다. 이것은 Biobert가 의학적 질문과 답변의 수단을 인코딩 할 수있는 타고난 능력을 가지고 있음을 시사합니다.
연구/탐색 목적 이외 의이 프로젝트의 실질적인 사용이 있는지 살펴보십시오. 이와 같은 모델은 의료 정보를 얻기 위해 대중에게 사용해서는 안됩니다. 그러나 아마도 훈련/면허가있는 의료 전문가가 검사를위한 정보를 수집하기 위해 사용할 수 있습니다.
다른 도메인에 동일한 방법을 적용하는 것을 탐색합니다 (즉, 기록 정보 검색, 엔지니어링 정보 검색 등).
최근에 발표 된 Scibert (Allen AI의)가 Naver의 Biobert와 어떻게 비교되는지 탐구하십시오.
우리는 #PoweredBytf2.0 챌린지를 다른 사람들과 공유 할 수있는 플랫폼으로 #PoweredBytf2.0 챌린지를 제공 한 Tensorflow 팀에게 감사의 말씀을 전하며 Llion Jones 박사에게 특별한 감사의 말을 전합니다.