All Projects → eagle705 → pytorch-transformer-chatbot

eagle705 / pytorch-transformer-chatbot

Licence: other
PyTorch v1.2에서 생긴 Transformer API 를 이용한 간단한 Chitchat 챗봇

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to pytorch-transformer-chatbot

Pytorch Seq2seq
Tutorials on implementing a few sequence-to-sequence (seq2seq) models with PyTorch and TorchText.
Stars: ✭ 3,418 (+7668.18%)
Mutual labels:  transformer, seq2seq, pytorch-nlp
Nlp pytorch project
Embedding, NMT, Text_Classification, Text_Generation, NER etc.
Stars: ✭ 153 (+247.73%)
Mutual labels:  chatbot, text-generation, seq2seq
Tensorflow Ml Nlp
텐서플로우와 머신러닝으로 시작하는 자연어처리(로지스틱회귀부터 트랜스포머 챗봇까지)
Stars: ✭ 176 (+300%)
Mutual labels:  chatbot, transformer, seq2seq
Seq2seqchatbots
A wrapper around tensor2tensor to flexibly train, interact, and generate data for neural chatbots.
Stars: ✭ 466 (+959.09%)
Mutual labels:  chatbot, transformer, seq2seq
tensorflow-ml-nlp-tf2
텐서플로2와 머신러닝으로 시작하는 자연어처리 (로지스틱회귀부터 BERT와 GPT3까지) 실습자료
Stars: ✭ 245 (+456.82%)
Mutual labels:  transformer, seq2seq, korean-nlp
Multiturndialogzoo
Multi-turn dialogue baselines written in PyTorch
Stars: ✭ 106 (+140.91%)
Mutual labels:  chatbot, transformer, seq2seq
Debug seq2seq
[unmaintained] Make seq2seq for keras work
Stars: ✭ 233 (+429.55%)
Mutual labels:  chatbot, seq2seq
Transformer Temporal Tagger
Code and data form the paper BERT Got a Date: Introducing Transformers to Temporal Tagging
Stars: ✭ 55 (+25%)
Mutual labels:  transformer, seq2seq
kospeech
Open-Source Toolkit for End-to-End Korean Automatic Speech Recognition leveraging PyTorch and Hydra.
Stars: ✭ 456 (+936.36%)
Mutual labels:  transformer, seq2seq
transformer
A PyTorch Implementation of "Attention Is All You Need"
Stars: ✭ 28 (-36.36%)
Mutual labels:  transformer, seq2seq
NLP-paper
🎨 🎨NLP 自然语言处理教程 🎨🎨 https://dataxujing.github.io/NLP-paper/
Stars: ✭ 23 (-47.73%)
Mutual labels:  transformer, seq2seq
chatbot
kbqa task-oriented qa seq2seq ir neo4j jena seq2seq tf chatbot chat
Stars: ✭ 32 (-27.27%)
Mutual labels:  chatbot, seq2seq
Embedding
Embedding模型代码和学习笔记总结
Stars: ✭ 25 (-43.18%)
Mutual labels:  transformer, seq2seq
Tensorflow Tutorials
텐서플로우를 기초부터 응용까지 단계별로 연습할 수 있는 소스 코드를 제공합니다
Stars: ✭ 2,096 (+4663.64%)
Mutual labels:  chatbot, seq2seq
Conversational-AI-Chatbot-using-Practical-Seq2Seq
A simple open domain generative based chatbot based on Recurrent Neural Networks
Stars: ✭ 17 (-61.36%)
Mutual labels:  chatbot, seq2seq
keras-chatbot-web-api
Simple keras chat bot using seq2seq model with Flask serving web
Stars: ✭ 51 (+15.91%)
Mutual labels:  chatbot, seq2seq
Xpersona
XPersona: Evaluating Multilingual Personalized Chatbot
Stars: ✭ 54 (+22.73%)
Mutual labels:  chatbot, transformer
fiction generator
Fiction generator with Tensorflow. 模仿王小波的风格的小说生成器
Stars: ✭ 27 (-38.64%)
Mutual labels:  text-generation, seq2seq
Neural Conversation Models
Tensorflow based Neural Conversation Models
Stars: ✭ 29 (-34.09%)
Mutual labels:  chatbot, seq2seq
Seq2seq chatbot new
基于seq2seq模型的简单对话系统的tf实现,具有embedding、attention、beam_search等功能,数据集是Cornell Movie Dialogs
Stars: ✭ 144 (+227.27%)
Mutual labels:  chatbot, seq2seq

PyTorch_Transformer_Chatbot

Simple Korean Generative Chatbot Implementation based on new PyTorch Transformer API (PyTorch v1.2 / Python 3.x)

transformer_fig

ToDo

  • Beam Search
  • Search hyperparams
  • Attention Visualization
  • Char-level transformer

Transformer API core logic

  • Padding masking이 매우 편함
  • decoder input의 future token을 못보게 하기 위한 masking은 함수로 제공함
  • Transformer의 input, output dim 순서는 [Sequnece, Batch, Embedding Dimension]으로 되어있어서 Transpose 해줘야함
  • 아쉽지만 Transformer API에서 Attention weight dict을 제공해주진 않음
def forward(self, enc_input: torch.Tensor, dec_input: torch.Tensor) -> torch.Tensor:
    x_enc_embed = self.input_embedding(enc_input.long())
    x_dec_embed = self.input_embedding(dec_input.long())

    # Masking
    src_key_padding_mask = enc_input == self.vocab.PAD_ID # tensor([[False, False, False,  True,  ...,  True]])
    tgt_key_padding_mask = dec_input == self.vocab.PAD_ID
    memory_key_padding_mask = src_key_padding_mask
    tgt_mask = self.transfomrer.generate_square_subsequent_mask(dec_input.size(1))

    # einsum ref: https://pytorch.org/docs/stable/torch.html#torch.einsum
    # https://obilaniu6266h16.wordpress.com/2016/02/04/einstein-summation-in-numpy/
    x_enc_embed = torch.einsum('ijk->jik', x_enc_embed)
    x_dec_embed = torch.einsum('ijk->jik', x_dec_embed)


    # transformer ref: https://pytorch.org/docs/stable/nn.html#torch.nn.Transformer
    feature = self.transfomrer(src = x_enc_embed,
                               tgt = x_dec_embed,
                               src_key_padding_mask = src_key_padding_mask,
                               tgt_key_padding_mask = tgt_key_padding_mask,
                               memory_key_padding_mask=memory_key_padding_mask,
                               tgt_mask = tgt_mask.to(device)) # src: (S,N,E) tgt: (T,N,E)

    logits = self.proj_vocab_layer(feature)
    logits = torch.einsum('ijk->jik', logits)

    return logits

Experiments

  • train set에 대해서는 Overfit으로 95%의 정확도를 보이지만, val set에 대해서는 낮음 (예시로 공개하기 애매할정도)
  • padding 값은 acc, loss 계산에서 모두 제외함
input:  [['나/NP', '를/JKO', '사랑/NNG', '한/XSA+ETM', '그/MM', '사람/NNG', '에게/JKB', '해/VV+EC', '줄/VX+ETM', '수/NNB', '있/VV', '는/ETM', '것/NNB', '<pad>', '<pad>'], ['맥주/NNG', '한/MM', '잔/NNG', '해야지/VV+EC', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>']]
pred:  [['천천히/MAG', '잊어/NNP', '가/JKS', '요/JX', './SF', '</s>', '들/VV', '노력/NNG', '요/JX', '은/JX', '도/JX', '이/JKS', '도/JX', '이/JKS', '이/JKS'], ['적당히/MAG', '드세요/VV+EP+EF', './SF', '</s>', '에/JKB', '에/JKB', '드세요/VV+EP+EF', '드세요/VV+EP+EF', '구경/NNG', '드세요/VV+EP+EF', '에/JKB', '드세요/VV+EP+EF', '가리/VV', '드세요/VV+EP+EF', '드세요/VV+EP+EF']]
real:  [['천천히/MAG', '잊어/NNP', '가/JKS', '요/JX', './SF', '</s>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>'], ['적당히/MAG', '드세요/VV+EP+EF', './SF', '</s>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>']]
  • Inference test 결과
    • train set에 있는건 잘 대답함
    • 얼추 잘(?) 입력하면 잘 대답함
    • "unk" 뜨거나 토큰 하나 바뀌어도 대답이 바뀜 ㅠ
문장을 입력하세요: 배고파
input:  [['배고파/VA+EC', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>']]
pred:  [['얼른/MAG', '맛난/VA+ETM', '음식/NNG', '드세요/VV+EP+EF', './SF', '</s>']]
pred_str:  얼른 맛난 음식 드세요.

문장을 입력하세요: 너 누구야
input:  [['너/NP', '누구/NP', '야/VCP+EF', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>']]
pred:  [['저/NP', '는/JX', '마음/NNG', '을/JKO', '이어주/VV', '는/ETM', '위/NNG', '로/JKB', '봇/NNG', '입니다/VCP+EF', './SF', '</s>']]
pred_str:  저는 마음을 이어주는 위로봇입니다.

문장을 입력하세요: 안녕
input:  [['안녕/IC', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>']]
pred:  [['안녕/NNG', '하/XSV', '세요/EP+EF', './SF', '</s>']]
pred_str:  안녕하세요.

문장을 입력하세요: 졸리다 이제 자야지
input:  [['<unk>', '다/EF', '이제/MAG', '자/VV', '야지/EC', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>']]
pred:  [['너무/MAG', '걱정/NNG', '하/XSV', '지/EC', '마세요/VX+EP+EF', './SF', '</s>']]
pred_str:  너무 걱정하지 마세요.

실행순서

  • 테스트만 할경우 inference.py만 실행
python build_vocab.py # 사전 구축
python train.py # 학습
python inference.py # 테스트

Requirements

pip install mxnet
pip install gluonnlp
pip install konlpy
pip install python-mecab-ko
pip install chatspace
pip install tb-nightly
pip install future
pip install pathlib

Reference Repositories

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].