#### [업데이트 2017-03-14]
- Tensorflow v1.0.0으로 업그레이드하십시오.
- 트위터 코퍼스가있는 미리 훈련 된 모델이 추가됩니다
./go_example(또는 내 채팅 예를 미리 봅니다)- 이
go_example스크립트를 추적하여 시작하여 일이 어떻게 작동하는지 알 수 있습니다!
이것은 Tensorflow 예에서 수정 된 SEQ2SEQ 모델입니다.
app.py Facebook Messenger App Backend로 포함되어 있습니다. 기능과 구현 트릭에 대한 세부 사항을 설명했습니다.
git clone github.com/Marsan-Ma/tf_chatbot_seq2seq_antilm.git
Twitter 채팅, 오픈 영화 자막 또는 채팅 코퍼스 저장소에서 PTT 포럼과 같은 코퍼스를 찾을 수 있습니다. 다음과 같은 경로 아래에 넣어야합니다.
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/train/chat.txt
그리고 일부 테스트 문장 (한 줄 당 문장)을 수작업으로 만들어냅니다.
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/test/test_set.txt
python3 main.py --mode train --model_name <MODEL_NAME>
50 세 미만의 당황 스러울 때까지 모델을 훈련 한 후에는 다음을 수행 할 수 있습니다.
python3 main.py --mode test --model_name <MODEL_NAME>
[참고 !!!]이 main.py commmand에 매개 변수를 덮어 쓰는 경우, 기차 및 테스트에 적용하거나 실패한 경우 Lib/Config.py로 수정하십시오.
python3 app.py --model_name <MODEL_NAME>
알려진 버그에 대한 SSL, Webhook 및 Work-Arounds 설정과 같은 자세한 내용은이 최소 FB_Messenger 예제를 볼 수 있습니다.
흥미로운 비교는 다음과 같습니다. 왼쪽 대화를 활성화 한 빔 검색은 Beam = 10으로, 응답은 항상 "내가 모르는 것"보다 훨씬 낫습니다. 올바른 대화는 또한 빔 검색과 추가로 활성화 된 방지 모델을 사용했습니다. 이것은 일반적인 반응을 억제해야하며 반응이 더 좋아 보인다.
[2017-03-09 업데이트] 강화 학습은 현재 작동하지 않습니다. 수정을 기다리십시오.
모델을 더욱 향상시킬 수있는 기회를 원한다면 Li et al.에서 영감을 얻은 강화 학습 아키텍처를 구현했습니다. config.py 에서 renforce_learn 옵션을 활성화하면 lib/seq2seq_mode.py 의 step_rf() 함수에서 자신의 규칙을 추가 할 수 있습니다.
먼저 괜찮은 모델을 얻으려면 일반 모드로 훈련해야합니다! , 강화 학습은이 훈련 된 모델로 용감한 신세계를 탐험 할 것입니다. 나쁜 모델로 시작하면 스스로를 향상시키기 위해 영원히 걸릴 것입니다.
Seq2Seq는 Cho et al., 2014에서 발표 한 훌륭한 모델입니다. 처음에는 기계 번역을 수행하는 데 사용되었으며 곧 사람들은 SEQ2SEQ 모델에 의해 다른 것을 매핑하는 것에 대한 모든 것이 달성 될 수 있다는 것을 알게됩니다. 챗봇은 이러한 기적 중 하나이며, 우리는 연속 대화를 일종의 "매핑"관계로 간주합니다.
다음은 Gmail Auto-Reply 기능에 대한이 블로그 게시물의 인용문 인 Seq2Seq 모델 아키텍처를 보여주는 클래식 소개 사진입니다.
문제는 지금까지 챗봇에 대한 더 나은 객관적인 기능을 찾지 못했다는 것입니다. 우리는 여전히 기계 번역에 적합한 MLE (최대 가능성 추정)를 사용하고 있지만 항상 "나도", "생각하기", "사랑해"와 같은 일반적인 응답을 항상 생성합니다.
이러한 응답은 유익하지는 않지만, 코퍼스 훈련에 여러 번 나타나는 경향이 있기 때문에 확률이 높습니다. 우리는 챗봇이 항상 이러한 비 강력한 답장을하지 않기 때문에 기술적으로 말하면 봇을 더욱 흥미롭게 만들 수있는 방법을 찾아야합니다.
여기서 우리는 Li의 작품을 재현합니다. et al., 2016은이 문제를 해결하려고 노력합니다. 주요 아이디어는 언어 모델과 동일한 SEQ2SEQ 모델을 사용하여 각 디코딩 타임 스탬프에서 반 모델로서 높은 확률을 가진 후보 단어를 얻는 것입니다. 그런 다음이 단어는 항상 모든 입력에 대한 확률이 높습니다. 이 안티 모델로, 우리는 더 특별한 비 지성, 유익한 대응을 얻을 수 있습니다.
Li의 원래 작품. et al et al et al은 상응하는 항-언어 모델의 최상의 확률 가중치 ( λ 및 γ 의 λ 및 γ의 λ 및 γ )를 찾기 위해 메트 (Och, 2003)를 메트릭으로 사용합니다. 그러나 나는 Chat Corpus의 Bleu 점수가 항상 0 인 경향이 있다는 것을 알았으므로 여기서 의미있는 결과를 얻을 수는 없습니다. 누구든지 이것에 대해 알고 있다면 메시지를 보내주세요. 감사합니다!
모델 교육 및 lib/config.py를 예측할 수있는 몇 가지 옵션이 있습니다. 기본적으로 자체 설명되어 있으며 대부분의 경우 기본값으로 작동 할 수 있습니다. 여기에는 구성하는 데 필요한 내용 만 나열합니다.
환경에 대해
| 이름 | 유형 | 설명 |
|---|---|---|
| 방법 | 끈 | 작업 모드 : 기차/테스트/채팅 |
| model_name | 끈 | 모델 이름, 작업 경로에 영향을 미칩니다 (데이터 저장, NN_Model, 결과 폴더) |
| scope_name | 끈 | Tensorflow에서 동시에 두 개의 그래프를로드 해야하는 경우 다른 네임 스페이스에 저장/로드해야합니다. (SEQ2SEQ 모델이 하나만 필요하면 기본값으로 남겨 두십시오) |
| vocab_size | 정수 | 코퍼스 언어에 따라 다릅니다. 영어의 경우 60000이 충분합니다. 중국의 경우 최소 10 만 또는 200000이 필요합니다. |
| gpu_usage | 뜨다 | 텐서 플로우 GPU 메모리 분획, 기본값은 1이고 Tensorflow는 GPU의 100%를 차지합니다. GPU 자원을 공유하는 멀티 작업이있는 경우 2 또는 3 작업에 대해 0.5 또는 0.3으로 만드십시오. |
| 강화 _Learn | int | 강화 학습 모드를 활성화하려면 1을 설정하십시오 |
디코딩에 대해
| 이름 | 유형 | 기본 | 설명 |
|---|---|---|---|
| beam_size | int | 10 | 빔 검색 크기, 1 설정 1은 탐욕스러운 검색과 같습니다 |
| 안틸름 | 뜨다 | 0 (비활성화) | 반 언어 모델의 체중을 처벌하십시오 |
| n_bonus | 뜨다 | 0 (비활성화) | 문장 길이의 보상 무게 |
항 -LM 기능은 기본적으로 비활성화되며, antilm = 0.5 ~ 0.7 및 n_bonus = 0.05를 설정하여 결과의 차이가 마음에 드는지 확인할 수 있습니다.
SEQ2SEQ는 대형 모델이므로 교육을 위해 GPU를 권장합니다. 특히 대형 빔 검색 크기를 설정할 때 교육을 수행하고 효율적으로 예측하려면 특정 컴퓨팅 파워가 필요합니다.
우리는 확률 적 구배를하고 있기 때문에 DRAM 요구 사항은 CPU/GPU로 엄격하지 않습니다.
딥 러닝에 익숙하지 않은 경우 GPU와 같은 설정을 설정하는 경우 파이썬 환경이 성가시다. 여기 내 기계 학습 환경의 도커가있다.
(비 GPU 버전 Docker) / (GPU 버전 Docker)
seq2seq는 많은 예비 예선을 가진 모델이며, 나는 조사하는 데 꽤 많은 시간을 보냈으며 여기에 많은 도움이되는 최고의 자료가 있습니다.
RNN, LSTM, GRU 및 SEQ2SEQ 모델을 설명하는 최고의 블로그 포스트 : Christopher Olah의 LSTM 네트워크 이해.
이 작업 Sherjilozair/char-rnn-tensorflow는 Tensorflow의 언어 모델 및 구현 그래프에 대해 많은 것을 배우는 데 도움이됩니다.
RNN에 대한 더 많은 마술에 관심이 있다면 여기에 반드시 읽어야 할 블로그 포스트가 있습니다. Andrej Karpathy의 재발 신경 네트워크의 불합리한 효과.
바닐라 버전 SEQ2SEQ+주의 : NICOLAS-IVANOV/TF_SEQ2SEQ_CHATBOT. 이것은 바닐라 SEQ2SEQ 모델의 주요 흐름을 파악하는 데 도움이 되며이 작업을 기반 으로이 저장소를 구축합니다.
현재 나는 그래프에서 빔 검색을 구축합니다. 즉, 매우 느립니다. 여기저기서 그래프 내에 건설하는 것에 대한 토론이 있습니다. 그러나 불행히도이 안티 LM 작업과 같이 빔 검색 이상의 것을 추가하려면 빔 검색보다 더 많은 것이 필요합니다.
Bleu의 Mert가 어떻게 Anti-LM 모델의 무게를 최적화 할 수 있는지 알지 못했습니다. 현재 Bleu는 종종 0이기 때문입니다.