Skip to content

thu-coai/seq2seq-pytorch

Repository files navigation

Main Repo This Repo Coverage Status Build Status

Seq2Seq (PyTorch)

Seq2seq with attention mechanism is a basic model for single turn dialog. In addition, batch normalization and dropout has been applied. You can also choose beamsearch, greedy, random sample, random sample from top-k when decoding.

You can refer to the following paper for details:

Sutskever, I., Vinyals, O., & Le, Q. V. (2014). Sequence to sequence learning with neural networks. In Advances in neural information processing systems (pp. 3104-3112).

Bahdanau, D., Cho, K., & Bengio, Y. (2015). Neural machine translation by jointly learning to align and translate. In International Conference on Learning Representation.

Require Packages

  • python3
  • cotk
  • pytorch == 1.0.0
  • tensorboardX >= 1.4

Quick Start

  • Using cotk download thu-coai/seq2seq-pytorch/master to download codes.
  • Execute python run.py to train the model.
    • The default dataset is OpenSubtitles. You can use --dataset to specify other dataloader class and --dataid to specify other data path (can be a local path, a url or a resources id). For example: --dataset OpenSubtitles --dataid resources://OpenSubtitles
    • It doesn't use pretrained word vector by default setting. You can use --wvclass to specify wordvector class and --wvpath to specify pretrained word embeddings. For example: --wvclass gloves. For example: --dataset Glove --dataid resources://Glove300
    • If you don't have GPUs, you can add --cpu for switching to CPU, but it may cost very long time for either training or test.
  • You can view training process by tensorboard, the log is at ./tensorboard.
    • For example, tensorboard --logdir=./tensorboard. (You have to install tensorboard first.)
  • After training, execute python run.py --mode test --restore best for test.
    • You can use --restore filename to specify checkpoints files, which are in ./model. For example: --restore pretrained-opensubtitles for loading ./model/pretrained-opensubtitles.model
    • --restore last means last checkpoint, --restore best means best checkpoints on dev.
    • --restore NAME_last means last checkpoint with model named NAME. The same as--restore NAME_best.
  • Find results at ./output.

Arguments

    usage: run.py [-h] [--name NAME] [--restore RESTORE] [--mode MODE] [--lr LR]
                  [--eh_size EH_SIZE] [--dh_size DH_SIZE] [--droprate DROPRATE]
                  [--batchnorm] [--decode_mode {max,sample,gumbel,samplek,beam}]
                  [--top_k TOP_K] [--length_penalty LENGTH_PENALTY]
                  [--dataset DATASET] [--dataid DATAID] [--epoch EPOCH]
                  [--batch_per_epoch BATCH_PER_EPOCH] [--wvclass WVCLASS]
                  [--wvid WVID] [--out_dir OUT_DIR] [--log_dir LOG_DIR]
                  [--model_dir MODEL_DIR] [--cache_dir CACHE_DIR] [--cpu]
                  [--debug] [--cache] [--seed SEED]

    A seq2seq model with GRU encoder and decoder. Attention, beamsearch, dropout
    and batchnorm is supported.

    optional arguments:
      -h, --help            show this help message and exit
      --name NAME           The name of your model, used for tensorboard, etc.
                            Default: runXXXXXX_XXXXXX (initialized by current
                            time)
      --restore RESTORE     Checkpoints name to load. "NAME_last" for the last
                            checkpoint of model named NAME. "NAME_best" means the
                            best checkpoint. You can also use "last" and "best",
                            by default use last model you run. Attention:
                            "NAME_last" and "NAME_best" are not guaranteed to work
                            when 2 models with same name run in the same time.
                            "last" and "best" are not guaranteed to work when 2
                            models run in the same time. Default: None (don't load
                            anything)
      --mode MODE           "train" or "test". Default: train
      --lr LR               Learning rate. Default: 0.001
      --eh_size EH_SIZE     Size of encoder GRU
      --dh_size DH_SIZE     Size of decoder GRU
      --droprate DROPRATE   The probability to be zerod in dropout. 0 indicates
                            for don't use dropout
      --batchnorm           Use bathnorm
      --decode_mode {max,sample,gumbel,samplek,beam}
                            The decode strategy when freerun. Choices: max,
                            sample, gumbel(=sample), samplek(sample from topk),
                            beam(beamsearch). Default: beam
      --top_k TOP_K         The top_k when decode_mode == "beam" or "samplek"
      --length_penalty LENGTH_PENALTY
                            The beamsearch penalty for short sentences. The
                            penalty will get larger when this becomes smaller.
      --dataset DATASET     Dataloader class. Default: OpenSubtitles
      --dataid DATAID       Resource id for data set. It can be a resource name or
                            a local path. Default: resources://OpenSubtitles
      --epoch EPOCH         Epoch for training. Default: 100
      --batch_per_epoch BATCH_PER_EPOCH
                            Batches per epoch. Default: 1500
      --wvclass WVCLASS     Wordvector class, none for not using pretrained
                            wordvec. Default: Glove
      --wvid WVID           Resource id for pretrained wordvector. Default:
                            resources://Glove300d
      --out_dir OUT_DIR     Output directory for test output. Default: ./output
      --log_dir LOG_DIR     Log directory for tensorboard. Default: ./tensorboard
      --model_dir MODEL_DIR
                            Checkpoints directory for model. Default: ./model
      --cache_dir CACHE_DIR
                            Checkpoints directory for cache. Default: ./cache
      --cpu                 Use cpu.
      --debug               Enter debug mode (using ptvsd).
      --cache               Use cache for speeding up load data and wordvec. (It
                            may cause problems when you switch dataset.)
      --seed SEED           Specify random seed. Default: 0

TensorBoard Example

Execute tensorboard --logdir=./tensorboard, you will see the plot in tensorboard pages:

tensorboard_plot_example

Following plot are shown in this model:

  • gen/loss (gen means training process)

  • gen/perplexity (=exp(gen/word_loss))

  • gen/word_loss (=gen/loss in this model)

  • dev/loss

  • dev/perplexity_avg_on_batch

  • test/loss

  • test/perplexity_avg_on_batch

And text output:

tensorboard_plot_example

Following text are shown in this model:

  • args
  • dev/show_str%d (%d is according to args.show_sample in run.py)

Case Study of Model Results

Execute python run.py --mode test --restore best

The following output will be in ./output/[name]_[dev|test].txt:

perplexity:     48.194050
bleu:    0.320098
post:   my name is josie .
resp:   <unk> <unk> , pennsylvania , the <unk> state .
gen:    i' m a teacher .
post:   i put premium gasoline in her .
resp:   josie , i told you .
gen:    i don' t know .
post:   josie , dont hang up
resp:   they do it to aii the new kids .
gen:    aii right , you guys , you know what ?
post:   about playing a part .
resp:   and thats the theme of as you like it .
gen:    i don' t know .
......

Experiment

Subset Experiment

Based on OpenSubtitles_small (a smaller version of OpenSubtitles), we did the following experiments.

encoder decoder batchnorm learning rate droprate dev perplexity test perplexity
175 175 no 0.0001 0.2 88.971 94.698
128 128 no 0.0001 0 95.207 100.676
128 128 no 0.0001 0.2 93.559 99.287
128 128 yes 0.0001 0 105.649 112.818
128 128 yes 0.0001 0.2 95.894 102.243
150 150 no 0.0001 0.2 90.153 95.072
256 256 no 0.0001 0.2 89.374 94.272
175 175 yes 0.0001 0.2 97.704 102.851
175 175 no 0.0001 0.1 90.149 95.310
175 175 no 0.0001 0.3 89.750 95.042
175 175 no 0.0005 0.2 88.688 93.421

The following experiments are based on the parameters of the first experiment.

To reproduce the experiment, run the following command to train the model:

python run.py --dataset=OpenSubtitles --dataid resources://OpenSubtitles_small --eh_size 175 --dh_size 175 --droprate 0.2 --epoch 35 --lr 0.0001

Based on the best parameters, we did another five experiments in order to analyze the model's performance totally.

seed dev perplexity test perplexity dev bleu(x1e-3) test bleu(x1e-3)
7913 89.123 93.898 3.24 2.82
1640 88.224 94.019 4.51 4.13
3739 87.969 92.730 2.37 2.15
972 88.083 93.515 2.99 2.34
3594 87.933 94.258 4.22 3.44
Average 88.266 ± 0.440 93.684 ± 0.534 3.47 ± 7.92 2.98 ± 7.29

Run the following command to test the trained model:

python run.py --dataset=OpenSubtitles --dataid resources://OpenSubtitles_small --eh_size 175 --dh_size 175 --decode_mode samplek --droprate 0.2 --epoch 35 --mode test --restore [model name] --seed [seed value]

Fullset experiment

Based on the result of subset experiment, we did the following experiment on OpenSubtitles.

Parameters Value
encoder 256
decoder 256
batchnorm no
learning rate 0.0003
droprate 0.2
epoch 200
seed 0
decode mode dev perplexity test perplexity dev bleu(x1e-3) test bleu(x1e-3)
samplek 41.457 43.868 3.24 2.82
beam 41.457 43.868 11.5 10.4

To reproduce the experiment, run the following command to train the model:

python run.py --dataset=OpenSubtitles --dataid resources://OpenSubtitles --eh_size 256 --dh_size 256 --droprate 0.2 --lr 0.0003 --epoch 200

Run the following command to test the trained model:

python run.py --dataset=OpenSubtitles --dataid resources://OpenSubtitles --eh_size 256 --dh_size 256 --decode_mode [decode mode] --droprate 0.2 --lr 0.0003 --epoch 200 --mode test --restore best

Performance

Perplexity BLEU
OpenSubtitles 43.868 0.0115

Author

HUANG Fei

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published