이것은 seq2seq 와 강화학습 으로 훈련된 챗봇입니다.
seq2seq
Seq2seq는 구조화된 학습을 위한 고전적인 모델이며 입력과 출력이 모두 시퀀스입니다.
바닐라 seq2seq 모델은 NIPS '14 논문 Sequence to Sequence Learning with Neural Networks에 설명되어 있으며 인코더와 디코더는 분리되어 있습니다.
이 저장소의 seq2seq 모델은 ICCV '15 논문 Sequence to Sequence - Video to Text에 설명된 것과 유사한 2개의 LSTM으로 구성됩니다. 인코더와 디코더는 동일한 가중치를 공유합니다.
RL
충분한 에포크(epoch)로 챗봇을 훈련시킨 후, 정책 경사(Policy Gradient)라는 RL 기술을 사용하여 챗봇을 더욱 개선합니다.
이를 통해 챗봇은 보상 기능과 관련하여 보다 흥미로운 반응을 생성할 수 있습니다.
내 보상 기능은 EMNLP '16 논문 Deep Reinforcement Learning for Dialogue Generation에 설명된 기능과 유사합니다.
챗봇의 결과를 보여드리겠습니다.
결과 1 (A와 B는 모두 훈련된 챗봇입니다)
A: 부탁 하나만 들어주실 수 있나요?
B: 뭐든지.
A: 아버지를 구부렸으면 좋겠어요.
B: 물론이죠.
A: 무례하게 굴려고 한 건 아니지만 정말 죄송해요.
B: 적어도 내가 할 수 있는 만큼은 이해하지 마세요.
결과 2 (A와 B는 모두 훈련된 챗봇입니다)
A: 내가 한 게 아니야! 난 총이 없어요!
B: 거짓말쟁이야. 당신은 여전히 돈을 돌려받고 싶어합니다.
A: 사실과 뭔가 잘못된 것 같습니다.
B: 난 돈을 별로 원하지 않아요. 조금이라도 돈을 벌 수 없을 것 같아요.
답: 무슨 일이에요?
B: 내 말 좀 들어봐. 나는 지금 무서워요.
A: 아, 당신의 도움이 필요하면 돈이 모두 필요할 것 같아요.
결과 3 (A와 B는 모두 훈련된 챗봇입니다)
A: 코카콜라 사는 것을 깜빡했어요.
B: 머리에 뭔가가 걸렸어요.
A: 괜찮아요. 그런 일이 정말 흔한 일인 것 같아요.
B: 내 말은, 우리는 어렸을 때부터 이 모든 것을 함께 해 왔다는 뜻이에요.
A: 더 많은 이유가 있습니다.
B: 그 사람이 아니라 그 사람 잘못이고 신 때문에 눈이 먼 거야.
A: 그리고 이상한 이야기네요.
이 디렉토리에서 챗봇의 더 많은 결과를 찾을 수 있습니다
해당 결과의 신경망 구성은 파일 이름에 설명되어 있습니다.
챗봇의 결과에 놀라셨나요? :디
당신은 스스로 놀라운 대화를 생성할 수 있습니다!
아래 지침을 따르십시오.
pip 설치 -r 요구사항.txt
./script/download.sh
./script/simulate.sh <모델 경로> <시뮬레이트 유형> <입력 파일> <출력 파일>
<모델 경로>
seq2seq 대화 상자를 생성하려면 " model/Seq2Seq/model-77 "을 입력하십시오.
RL 대화 상자를 생성하려면 " model/RL/model-56-3000 "을 입력하십시오.
<시뮬레이트 유형>
1 또는 2가 될 수 있습니다
숫자는 챗봇이 고려하는 이전 문장의 개수를 나타냅니다.
1을 선택하면 챗봇은 마지막 문장만 고려합니다.
2를 선택하면 챗봇은 마지막 두 문장(사용자 문장과 챗봇 자체 문장)을 고려합니다.
<입력 파일>
result/sample_input_new.txt를 살펴보세요.
챗봇의 입력 형식으로, 각 줄은 대화의 시작 문장입니다.
편의상 예제 파일을 사용해도 됩니다.
<출력 파일>
출력 파일에서 원하는 파일 이름을 입력하세요.
각 질문에 대해 챗봇이 단일 응답만 생성하도록 하려면
아래 지침을 따르십시오.
pip 설치 -r 요구사항.txt
./script/download.sh
./script/run.sh <유형> <입력 파일> <출력 파일>
<유형>
seq2seq 응답을 생성하려면 " S2S "를 입력하세요.
강화 학습 응답을 생성하려면 " RL "을 입력하세요.
<입력 파일>
result/sample_input_new.txt를 살펴보세요.
챗봇의 입력 형식으로, 각 줄은 대화의 시작 문장입니다.
편의상 예제 파일을 사용해도 됩니다.
<출력 파일>
출력 파일에서 원하는 파일 이름을 입력하세요.
저는 Python2.7로 챗봇을 훈련시켰습니다.
챗봇을 처음부터 훈련시키고 싶다면
아래 지침을 따를 수 있습니다.
python/config.py를 살펴보세요. 학습을 위한 모든 구성이 여기에 설명되어 있습니다.
일부 학습 하이퍼 매개변수를 변경하거나 원래 매개변수를 그대로 유지할 수 있습니다.
저는 Cornell Movie-Dialogs Corpus를 사용합니다.
다운로드하고 압축을 푼 다음 모든 *.txt 파일을 data/ 디렉터리로 이동해야 합니다.
그런 다음 pip를 사용하여 일부 라이브러리를 다운로드합니다.
pip 설치 -r 요구사항.txt
./script/parse.sh
./script/train.sh
seq2seq 모델의 일부 결과를 보여드리겠습니다 :)
./script/test.sh <모델 경로> <입력 파일> <출력 파일>
그리고 seq2seq 모델의 일부 대화 상자 결과를 보여주세요!
./script/simulate.sh <모델 경로> <시뮬레이트 유형> <입력 파일> <출력 파일>
<시뮬레이트 유형>
1 또는 2가 될 수 있습니다
숫자는 챗봇이 고려하는 이전 문장의 개수를 나타냅니다.
1을 선택하면 챗봇은 사용자의 발언만 고려합니다.
2를 선택하면 챗봇은 사용자의 발화와 챗봇의 마지막 발화를 고려합니다.
python/config.py에서 training_type 매개변수를 변경해야 합니다.
seq2seq 훈련의 경우 'normal', 정책 기울기의 경우 'pg'
안정될 때까지 일부 에포크 동안 먼저 '정상'으로 훈련해야 합니다(최소 30개의 에포크가 적극 권장됨).
그런 다음 방법을 'pg'로 변경하여 보상 기능을 최적화합니다.
./script/train_RL.sh
정책 기울기(pg)로 훈련하는 경우
반전 모델이 필요할 수도 있습니다
역방향 모델도 Cornell Movie-Dialogs 데이터 세트로 학습되지만 소스와 타겟이 반전됩니다.
사전 훈련된 역모델을 다운로드할 수 있습니다.
./script/download_reversed.sh
아니면 스스로 훈련할 수도 있어요
사전 학습된 역방향 모델을 사용하는 경우 역방향 모델에 대한 설정을 변경할 필요가 없습니다.
RL 모델의 일부 결과를 생성하고 seq2seq 모델과 다른 점을 찾아보겠습니다. :)
./script/test_RL.sh <모델 경로> <입력 파일> <출력 파일>
그리고 RL 모델의 대화 상자 결과를 보여주세요!
./script/simulate.sh <모델 경로> <시뮬레이트 유형> <입력 파일> <출력 파일>
<시뮬레이트 유형>
1 또는 2가 될 수 있습니다
숫자는 챗봇이 고려하는 이전 문장의 개수를 나타냅니다.
1을 선택하면 챗봇은 마지막 문장만 고려합니다.
2를 선택하면 챗봇은 마지막 두 문장(사용자 문장과 챗봇 자체 문장)을 고려합니다.
OS: CentOS Linux 릴리스 7.3.1611(코어)
CPU: 인텔(R) 제온(R) CPU E3-1230 v3 @ 3.30GHz
GPU: 지포스 GTX 1070 8GB
메모리: 16GB DDR3
Python3(data_parser.py용) 및 Python2.7(기타용)
포치 황 / @pochih