이 저장소에는 두 개의 Salesforce 연구 논문에 사용된 코드가 포함되어 있습니다.
모델에는 다음과 같은 학습 지침이 제공됩니다.
Penn Treebank(PTB), WikiText-2(WT2) 및 WikiText-103(WT103) 데이터 세트에 대한 단어 수준 언어 모델
Penn Treebank(PTBC) 및 Hutter Prize 데이터 세트(enwik8)에 대한 문자 수준 언어 모델
모델은 LSTM 또는 QRNN(Quasi-Recurrent Neural Network)으로 구성될 수 있으며, 이는 이 설정에서 cuDNN LSTM보다 2배 이상 빠르면서도 동일하거나 더 나은 정확도를 달성합니다.
getdata.sh
실행하십시오.main.py
사용하여 기본 모델 학습finetune.py
사용하여 모델을 미세 조정합니다.pointer.py
사용하여 미세 조정된 모델에 연속 캐시 포인터를 적용합니다.귀하의 연구에 이 코드나 결과를 사용하는 경우 적절하게 인용해 주십시오.
@article{merityRegOpt,
title={{Regularizing and Optimizing LSTM Language Models}},
author={Merity, Stephen and Keskar, Nitish Shirish and Socher, Richard},
journal={arXiv preprint arXiv:1708.02182},
year={2017}
}
@article{merityAnalysis,
title={{An Analysis of Neural Language Modeling at Multiple Scales}},
author={Merity, Stephen and Keskar, Nitish Shirish and Socher, Richard},
journal={arXiv preprint arXiv:1803.08240},
year={2018}
}
코드베이스는 이제 대부분의 사용 사례에 대해 PyTorch 0.4와 호환됩니다(상당히 포괄적인 PR #43은 https://github.com/shawntan에 큰 소리로 외칩니다). 견적된 성능을 얻으려면 하이퍼파라미터를 약간 재조정해야 할 수도 있습니다. 정확한 재현성을 원하거나 PyTorch 0.3 이하에서 실행하려는 경우 이 저장소의 이전 커밋을 사용하는 것이 좋습니다. 우리는 여전히 pointer
, finetune
및 generate
기능을 개발 중입니다.
현재 코드베이스에는 Python 3 및 PyTorch 0.4가 필요합니다.
아래에는 원본 논문에 포함된 결과와 동등하거나 더 나은 결과를 얻기 위한 하이퍼 매개변수가 포함되어 있습니다.
이전 버전의 코드베이스를 사용해야 하는 경우 Python 3 및 PyTorch 0.1.12와 함께 PyTorch==0.1.12 릴리스에서 액세스할 수 있는 원본 코드와 하이퍼 매개변수가 필요합니다. Anaconda를 사용하는 경우 conda install pytorch=0.1.12 -c soumith
통해 PyTorch 0.1.12를 설치할 수 있습니다.
논문을 작성하는 동안 코드베이스가 수정되어 무작위 시드 등의 사소한 차이로 인해 정확한 재현이 불가능해졌습니다. 또한 기본 GPU를 변경할 때 정확한 재현 수치가 변경되는 것을 확인했습니다. 아래 가이드는 보고된 수치와 거의 유사한 결과를 생성합니다.
데이터 설정을 위해서는 ./getdata.sh
실행하세요. 이 스크립트는 Mikolov 사전 처리된 Penn Treebank 및 WikiText-2 데이터 세트를 수집하여 data
디렉터리에 배치합니다.
다음으로 기본 순환 신경망 모델로 QRNN을 사용할지 LSTM을 사용할지 결정합니다. QRNN은 Nvidia의 cuDNN 최적화 LSTM보다 몇 배 빠르지만(순진한 LSTM 구현보다 수십 배 빠르지만) 많은 단어 수준 데이터세트에 대해 LSTM과 유사하거나 더 나은 결과를 얻습니다. 이 글을 쓰는 시점에서 QRNN 모델은 동일한 수의 매개변수를 사용하고 약간 더 깊은 네트워크이지만 에포크당 2~4배 더 빠르며 수렴하는 데 더 적은 에포크가 필요합니다.
QRNN 모델은 첫 번째 레이어에 컨벌루션 크기 2의 QRNN을 사용하여 모델이 개별 자연어 입력(예: "뉴욕")을 볼 수 있도록 하고 다른 모든 레이어는 컨벌루션 크기 1을 사용합니다.
미세 조정 참고: 미세 조정은 원래 저장된 모델 model.pt
파일을 수정합니다. 원래 가중치를 유지하려면 파일을 복사해야 합니다.
참고 사항: BPTT는 GPU에 푸시된 시퀀스의 길이만 변경하지만 최종 결과에는 영향을 미치지 않습니다.
python -u main.py --epochs 50 --nlayers 3 --emsize 400 --nhid 1840 --alpha 0 --beta 0 --dropoute 0 --dropouth 0.1 --dropouti 0.1 --dropout 0.4 --wdrop 0.2 --wdecay 1.2e-6 --bptt 200 --batch_size 128 --optimizer adam --lr 1e-3 --data data/enwik8 --save ENWIK8.pt --when 25 35
python -u main.py --epochs 500 --nlayers 3 --emsize 200 --nhid 1000 --alpha 0 --beta 0 --dropoute 0 --dropouth 0.25 --dropouti 0.1 --dropout 0.1 --wdrop 0.5 --wdecay 1.2e-6 --bptt 150 --batch_size 128 --optimizer adam --lr 2e-3 --data data/pennchar --save PTBC.pt --when 300 400
python -u main.py --epochs 14 --nlayers 4 --emsize 400 --nhid 2500 --alpha 0 --beta 0 --dropoute 0 --dropouth 0.1 --dropouti 0.1 --dropout 0.1 --wdrop 0 --wdecay 0 --bptt 140 --batch_size 60 --optimizer adam --lr 1e-3 --data data/wikitext-103 --save WT103.12hr.QRNN.pt --when 12 --model QRNN
아래 명령은 미세 조정 없이 약 61.2
/ 58.8
(검증/테스트)의 혼란을 달성하고, 미세 조정을 통해 약 58.8
/ 56.5
의 혼란을 달성하며, 지속적인 캐시 포인터 증가를 통해 약 53.2
/ 52.5
의 혼란을 달성하는 PTB 모델을 훈련합니다.
python main.py --batch_size 20 --data data/penn --dropouti 0.4 --dropouth 0.25 --seed 141 --epoch 500 --save PTB.pt
python finetune.py --batch_size 20 --data data/penn --dropouti 0.4 --dropouth 0.25 --seed 141 --epoch 500 --save PTB.pt
python pointer.py --data data/penn --save PTB.pt --lambdasm 0.1 --theta 1.0 --window 500 --bptt 5000
아래 명령은 미세 조정 없이 약 60.6
/ 58.3
(검증/테스트)의 혼란을 달성하고, 미세 조정을 통해 약 59.1
/ 56.7
의 혼란을 달성하며, 지속적인 캐시 포인터 확대를 통해 약 53.4
/ 52.6
의 혼란을 달성하는 QRNN 모델을 훈련합니다.
python -u main.py --model QRNN --batch_size 20 --clip 0.2 --wdrop 0.1 --nhid 1550 --nlayers 4 --emsize 400 --dropouth 0.3 --seed 9001 --dropouti 0.4 --epochs 550 --save PTB.pt
python -u finetune.py --model QRNN --batch_size 20 --clip 0.2 --wdrop 0.1 --nhid 1550 --nlayers 4 --emsize 400 --dropouth 0.3 --seed 404 --dropouti 0.4 --epochs 300 --save PTB.pt
python pointer.py --model QRNN --lambdasm 0.1 --theta 1.0 --window 500 --bptt 5000 --save PTB.pt
아래 명령은 미세 조정 없이 약 68.7
/ 65.6
(검증/테스트)의 복잡도를 달성하고, 미세 조정을 통해 약 67.4
/ 64.7
의 복잡도를 달성하며, 지속적인 캐시 포인터 증가를 통해 약 52.2
/ 50.6
의 복잡도를 달성하는 PTB 모델을 훈련합니다.
python main.py --epochs 750 --data data/wikitext-2 --save WT2.pt --dropouth 0.2 --seed 1882
python finetune.py --epochs 750 --data data/wikitext-2 --save WT2.pt --dropouth 0.2 --seed 1882
python pointer.py --save WT2.pt --lambdasm 0.1279 --theta 0.662 --window 3785 --bptt 2000 --data data/wikitext-2
아래 명령은 미세 조정 없이 약 69.3
/ 66.8
(검증/테스트)의 혼란을 달성하고, 미세 조정을 통해 약 68.5
/ 65.9
의 혼란을 달성하며, 지속적인 캐시 포인터 증가를 통해 약 53.6
/ 52.1
의 혼란을 달성하는 QRNN 모델입니다. 더 나은 숫자를 얻을 수 있을 가능성이 높지만 하이퍼 매개변수는 광범위하게 검색되지 않았습니다. 그러나 이러한 하이퍼 매개변수는 좋은 출발점이 되어야 합니다.
python -u main.py --epochs 500 --data data/wikitext-2 --clip 0.25 --dropouti 0.4 --dropouth 0.2 --nhid 1550 --nlayers 4 --seed 4002 --model QRNN --wdrop 0.1 --batch_size 40 --save WT2.pt
python finetune.py --epochs 500 --data data/wikitext-2 --clip 0.25 --dropouti 0.4 --dropouth 0.2 --nhid 1550 --nlayers 4 --seed 4002 --model QRNN --wdrop 0.1 --batch_size 40 --save WT2.pt
python -u pointer.py --save WT2.pt --model QRNN --lambdasm 0.1279 --theta 0.662 --window 3785 --bptt 2000 --data data/wikitext-2
문자 수준 PTB 및 enwik8 또는 단어 수준 WikiText-103에 대한 속도는 관련 문서를 참조하세요.
NVIDIA Quadro GP100에서 훈련하는 동안 모델의 기본 속도:
기본 QRNN 모델은 cuDNN LSTM 모델보다 훨씬 더 빠를 수 있으며 RNN의 병목 현상 정도에 따라 속도가 향상됩니다. 위 모델 시간의 대부분은 이제 소프트맥스 또는 최적화 오버헤드에 소비됩니다(속도에 대한 PyTorch QRNN 토론 참조).
K80의 속도는 약 3배 느립니다. K80 또는 메모리가 적은 기타 메모리 카드에서는 특히 WikiText-2의 경우 메모리 부족(OOM) 오류를 방지하기 위해 최대 샘플링 시퀀스 길이에 대한 제한을 활성화할 수 있습니다.
속도가 주요 문제인 경우 SGD는 비단조적으로 트리거되는 ASGD 변형보다 더 빠르게 수렴하지만 전체적인 혼란은 더 나쁩니다.
자세한 내용은 PyTorch QRNN 저장소를 참조하세요.
반복적인 드롭아웃을 추가하는 중량 감소라고 불리는 DropConnect(Wan et al. 2013)의 변형을 포함하여 LSTM에 대한 모든 기능 강화를 통해 NVIDIA의 cuDNN LSTM 구현을 사용할 수 있습니다. PyTorch는 cuDNN이 설치된 CUDA에서 실행되는 경우 자동으로 cuDNN 백엔드를 사용합니다. 이를 통해 수렴에 수백 번의 에포크가 걸릴 수 있는 경우에도 모델을 빠르게 학습할 수 있습니다.