이 작업은 신경망 대화 모델(일명 Google 챗봇)의 결과를 재현하려고 시도합니다. 문장 예측을 위해 RNN(seq2seq 모델)을 사용합니다. Python과 TensorFlow를 사용하여 수행됩니다.
프로그램의 로딩 코퍼스 부분은 macournoyer의 Torch neutralconvo에서 영감을 받았습니다.
현재 DeepQA는 다음과 같은 대화 코퍼스를 지원합니다.
--corpus opensubs
플래그를 사용하십시오.--corpus scotus
사용하여 사용할 수 있습니다. 설치 지침을 참조하세요.--corpus ubuntu
사용하여 사용할 수 있습니다. 설치 지침을 참조하세요.훈련 속도를 높이기 위해 사전 훈련된 단어 임베딩을 사용하는 것도 가능합니다(Eschnou 덕분에). 자세한 내용은 여기를 참조하세요.
이 프로그램에는 다음과 같은 종속성이 필요합니다(pip를 사용하여 설치하기 쉽습니다: pip3 install -r requirements.txt
).
nltk가 작동하도록 하려면 추가 데이터를 다운로드해야 할 수도 있습니다.
python3 -m nltk.downloader punkt
Cornell 데이터 세트가 이미 포함되어 있습니다. 다른 데이터세트의 경우 해당 폴더( data/
내부)에 있는 추가 정보 파일을 확인하세요.
웹 인터페이스에는 몇 가지 추가 패키지가 필요합니다.
Docker 설치도 가능합니다. 자세한 지침은 여기를 참조하세요.
모델을 훈련하려면 main.py
실행하면 됩니다. 훈련을 마친 후에는 main.py --test
('save/model/samples_predictions.txt'에 생성된 결과) 또는 main.py --test interactive
(더 재미있음)을 사용하여 결과를 테스트할 수 있습니다.
다음은 유용할 수 있는 몇 가지 플래그입니다. 더 많은 도움말과 옵션을 보려면 python main.py -h
사용하세요.
--modelTag
: 테스트/훈련 시 구별하기 위해 현재 모델에 이름을 지정할 수 있습니다.--keepAll
: 테스트할 때 여러 단계에서 예측을 확인하려는 경우 훈련할 때 이 플래그를 사용합니다(훈련이 진행됨에 따라 프로그램의 이름과 기간이 변경되는 것을 보는 것이 흥미로울 수 있습니다). 경고: --saveEvery
옵션을 늘리지 않으면 저장 공간이 빨리 소모될 수 있습니다.--filterVocab 20
또는 --vocabularySize 30000
: 어휘 크기를 제한하고 성능 및 메모리 사용량을 최적화합니다. 20회 미만 사용된 단어를
토큰으로 대체하고 최대 어휘 크기를 설정합니다.--verbose
: 테스트할 때 계산된 대로 문장을 인쇄합니다.--playDataset
: 데이터 세트의 일부 대화 샘플을 표시합니다(수행하려는 유일한 작업인 경우 --createDataset
와 함께 사용할 수 있음). TensorBoard를 사용하여 계산 그래프와 비용을 시각화하려면 tensorboard --logdir save/
실행하세요.
기본적으로 네트워크 아키텍처는 2개의 LSTM 레이어(숨겨진 크기 256)와 어휘 임베딩 크기 32가 있는 표준 인코더/디코더입니다. 네트워크는 ADAM을 사용하여 훈련됩니다. 최대 문장 길이는 10 단어로 설정되어 있지만 늘릴 수 있습니다.
일단 훈련되면 보다 사용자 친화적인 인터페이스를 사용하여 채팅이 가능합니다. 서버는 save/model-server/model.ckpt
에 복사된 모델을 살펴봅니다. 처음 사용하려면 다음을 사용하여 구성해야 합니다.
export CHATBOT_SECRET_KEY= " my-secret-key "
cd chatbot_website/
python manage.py makemigrations
python manage.py migrate
그런 다음 로컬에서 서버를 시작하려면 다음 명령을 사용하십시오.
cd chatbot_website/
redis-server & # Launch Redis in background
python manage.py runserver
실행 후 http://localhost:8000/에서 인터페이스를 사용할 수 있어야 합니다. 프로그램을 서버에 배포하려면 대신 python manage.py runserver 0.0.0.0
사용하세요. 자세한 내용은 여기를 참조하세요.
놀랍게도 입력 시퀀스를 5개 단어로 대폭 줄이고 출력을 3개( go
및 eos
토큰 포함)로 대폭 줄이고 작은 단어를 사용하여 단 1~2시간의 훈련 후에(GeForce GT 740M에서) 일부 결과를 얻을 수 있습니다. 임베딩 크기(예: 25). 그 이후로 코드를 수정했고 이제 출력 길이가 입력 길이와 일치해야 하지만 이 버전을 사용하면 원래 결과를 계속 재현할 수 있습니다. 물론 네트워크는 실제로 수다스럽지는 않습니다.
Q: Hi
A: Hi.
Q: What is your name ?
A: Laura.
Q: What does that mean ?
A: I dunno.
Q: How old are you ?
A: thirty-five.
Q: Will Google hire me ?
A: No.
Q: Tell me the alphabet
A: Fuck you.
Q: That's not nice
A: Yeah.
실패하는 경우는 다음과 같습니다.
Q: Who is Laura ?
A: My brother.
Q: Say 'goodbye'
A: Alright.
Q: What is cooking ?
A: A channel.
Q: Can you say no ?
A: No.
Q: Two plus two
A: Manny...
문장이 길면 네트워크 학습 속도가 훨씬 느려집니다. maxLength=10으로 250,000번 반복한 후에도 네트워크는 여전히 회피적인 답변을 제공하지만(대부분의 개방형 질문에 '모름'으로 답변) 몇 가지 기본 의미를 통합한 것으로 보입니다.
Q: When are the fireworks ?
A: Tomorrow.
Q: What color ?
A: Gray.
Q: Which apple ?
A: That's the first one.
Q: What time is it ?
A: Eleven o'clock.
Q: Who is Skywalker ?
A: She's a freelance bio-exorcist.
Q: Who is John ?
A: The old man.
Q: Who is Jenny ?
A: The man who killed herself.
Q: When were you born ?
A: Soon.
마지막 질문에서 볼 수 있듯이 네트워크는 여전히 성별과 현재/미래 사이에 약간의 혼란을 겪고 있습니다. 나는 또한 다소간 성공을 거둔 몇 가지 더 깊은 철학적 질문을 시도했습니다.
Q: What is the purpose of being intelligent ?
A: The man are obsolete.
Q: What is immoral ?
A: The truth.
Q: What is morality ?
A: The worst.
Q: What is the purpose of existence ?
A: It 's private.
Q: What happens if machines can think ?
A: I think I'll just lie with you.
내가 훈련한 모델은 내가 넣은 임베딩 크기, 크기, 훈련 코퍼스 크기에 따라 상당히 제한됩니다. 그것의 '사고 벡터'는 아마도 너무 작아서 다음과 같은 종류의 대답을 할 수 없을 것입니다:
Q: My name is David. What is my name ?
A: Debbie.
Q: My name is John. What is my name ?
A: Carl Smith.
Q: How many legs does a cat have ?
A: Four.
Q: How many legs does a spider have ?
A: Four.
Q: Do you prefer football or soccer ?
A: Whiskey.
또한 때로는 질문과 관련 없는 훈련 세트에서 문장을 튀어나오기 때문에 과적합된 것처럼 보입니다. 일부 드롭아웃을 추가하면 문제가 줄어들 것입니다.
Q: I play tennis. What do I play ?
A: I'm going to get laid.
Q: What color is the sky ?
A: One of the deputies is everywhere.
참고: 링크가 더 이상 작동하지 않습니다.
여기에서 사전 훈련된 모델을 찾을 수 있습니다. , 기본 코퍼스에 대해 훈련되었습니다. 그것을 사용하려면:
DeepQA/save/
에서 zip 파일을 추출합니다.save/model-pretrainedv2/dataset-cornell-old-lenght10-filter0-vocabSize0.pkl
에서 사전 처리된 데이터 세트를 data/samples/
에 복사합니다../main.py --modelTag pretrainedv2 --test interactive
실행합니다. Nicholas C. 덕분에 여기(원본)에는 다양한 데이터 세트에 대해 사전 훈련된 몇 가지 추가 모델(TF 1.2와 호환 가능)이 있습니다. 이 폴더에는 Cornell, OpenSubtitles, Ubuntu 및 Scotus에 대한 사전 처리된 데이터세트도 포함되어 있습니다( data/samples/
내부로 이동하기 위해). 이는 데이터세트를 직접 처리하고 싶지 않은 경우에 필요합니다.
고급 GPU를 가지고 있다면 주저하지 말고 초매개변수/코퍼스를 사용해 더 나은 모델을 훈련하세요. 내 실험에 따르면 학습률과 탈락률이 결과에 가장 큰 영향을 미치는 것으로 보입니다. 또한 모델을 공유하고 싶다면 주저하지 말고 연락해 주세요. 여기에 추가하겠습니다.
더 크고 더 깊은 모델을 시도하는 것 외에도 테스트할 수 있는 작은 개선 사항이 많이 있습니다. 그 중 하나를 구현했다면 주저하지 말고 끌어오기 요청을 보내세요. 다음은 몇 가지 아이디어입니다.
tf.nn.seq2seq.rnn_decoder
의 loop_function
인수와 결합하면 추가하기가 그리 어렵지 않습니다. 그 후에는 SoftMax 온도를 사용하여 보다 보수적이거나 특이한 예측을 얻을 수 있습니다.model.py
에서 embedding_rnn_seq2seq
embedding_attention_seq2seq
로 바꾸면 간단해집니다.Q:Sentence 1. Sentence 2. => A:Sentence X. Sentence Y.
우리는 3을 생성할 수 있습니다) 새로운 샘플: Q:Sentence 1. Sentence 2. => A:Sentence X.
, Q:Sentence 2. => A:Sentence X. Sentence Y.
및 Q:Sentence 2. => A:Sentence X.
. 경고: Q:Sentence 1. => A:Sentence X.
와 같은 다른 조합은 작동하지 않습니다. 전환이 중단되기 때문입니다 2 => X
답변)
및
를 추가하여 인코더가 대화 상대가 변경되는 시기를 알 수 있습니다. 간단한 seq2seq 모델이 문장 간의 장기적인 종속성을 포착하는 데 충분할지 확신할 수 없습니다. 유사한 입력 길이를 그룹화하기 위해 버킷 시스템을 추가하면 훈련 속도가 크게 향상될 수 있습니다.