พื้นที่เก็บข้อมูลนี้มีโค้ดที่ใช้สำหรับเอกสารการวิจัยของ Salesforce สองฉบับ:
โมเดลมาพร้อมกับคำแนะนำในการฝึก:
แบบจำลองภาษาระดับคำเหนือชุดข้อมูล Penn Treebank (PTB), WikiText-2 (WT2) และ WikiText-103 (WT103)
โมเดลภาษาระดับตัวละครเหนือชุดข้อมูล Penn Treebank (PTBC) และ Hutter Prize (enwik8)
โมเดลสามารถประกอบด้วย LSTM หรือ Quasi-Recurrent Neural Network (QRNN) ซึ่งเร็วกว่า cuDNN LSTM สองเท่าขึ้นไปในการตั้งค่านี้ ในขณะที่ได้รับความแม่นยำที่เทียบเท่าหรือดีกว่า
getdata.sh
เพื่อรับชุดข้อมูล Penn Treebank และ WikiText-2main.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}
}
ตอนนี้ codebase เข้ากันได้กับ PyTorch 0.4 แล้วสำหรับกรณีการใช้งานส่วนใหญ่ (ขอกล่าวถึง https://github.com/shawntan สำหรับการประชาสัมพันธ์ที่ค่อนข้างครอบคลุม #43) อาจจำเป็นต้องปรับไฮเปอร์พารามิเตอร์ใหม่เล็กน้อยเพื่อให้ได้ประสิทธิภาพที่เสนอมา หากคุณต้องการความสามารถในการทำซ้ำที่แน่นอน (หรือต้องการรันบน PyTorch 0.3 หรือต่ำกว่า) เราขอแนะนำให้ใช้คอมมิตเก่าของพื้นที่เก็บข้อมูลนี้ เรายังคงทำงานกับ pointer
finetune
และ generate
ฟังก์ชันต่างๆ
ต้องใช้ Python 3 และ PyTorch 0.4 สำหรับโค้ดเบสปัจจุบัน
รวมไว้ด้านล่างคือพารามิเตอร์ไฮเปอร์เพื่อให้ได้ผลลัพธ์ที่เทียบเท่าหรือดีกว่าที่รวมอยู่ในรายงานต้นฉบับ
หากคุณต้องการใช้โค้ดเบสเวอร์ชันก่อนหน้า จำเป็นต้องใช้โค้ดต้นฉบับและพารามิเตอร์ไฮเปอร์ที่สามารถเข้าถึงได้ที่ PyTorch==0.1.12 release โดยมี Python 3 และ PyTorch 0.1.12 หากคุณใช้ Anaconda การติดตั้ง PyTorch 0.1.12 สามารถทำได้ผ่าน: conda install pytorch=0.1.12 -c soumith
รหัสฐานได้รับการแก้ไขในระหว่างการเขียนรายงาน ป้องกันการทำซ้ำที่แน่นอนเนื่องจากความแตกต่างเล็กน้อยในการสุ่มเมล็ดหรือสิ่งที่คล้ายกัน เรายังเห็นว่าจำนวนการผลิตที่แน่นอนเปลี่ยนแปลงไปเมื่อเปลี่ยน GPU พื้นฐาน คำแนะนำด้านล่างนี้ให้ผลลัพธ์คล้ายกับตัวเลขที่รายงานเป็นส่วนใหญ่
สำหรับการตั้งค่าข้อมูล ให้รัน . ./getdata.sh
สคริปต์นี้รวบรวมชุดข้อมูล Penn Treebank และ WikiText-2 ที่ประมวลผลล่วงหน้าของ Mikolov และวางไว้ในไดเร็กทอรี data
จากนั้น ตัดสินใจว่าจะใช้ QRNN หรือ LSTM เป็นแบบจำลองโครงข่ายประสาทเทียมที่เกิดขึ้นซ้ำ QRNN นั้นเร็วกว่า LSTM ที่ได้รับการปรับปรุง cuDNN ของ Nvidia หลายเท่า (และเร็วกว่าการใช้งาน LSTM ไร้เดียงสาหลายสิบเท่า) แต่ยังให้ผลลัพธ์ที่ใกล้เคียงกันหรือดีกว่า LSTM สำหรับชุดข้อมูลระดับคำจำนวนมาก ในขณะที่เขียน โมเดล QRNN ใช้พารามิเตอร์จำนวนเท่ากันและเป็นเครือข่ายที่ลึกกว่าเล็กน้อย แต่เร็วกว่าสองถึงสี่เท่าในแต่ละยุค และต้องใช้ยุคน้อยกว่าในการมาบรรจบกัน
โมเดล QRNN ใช้ QRNN ที่มีขนาด Convolution 2 สำหรับเลเยอร์แรก ทำให้โมเดลสามารถดูอินพุตภาษาธรรมชาติที่แยกจากกัน (เช่น "นิวยอร์ก") ในขณะที่เลเยอร์อื่นๆ ทั้งหมดใช้ขนาด Convolutional เป็น 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
คำแนะนำด้านล่างนี้ฝึกโมเดล PTB ที่หากไม่มีการปรับแต่งอย่างละเอียดจะทำให้เกิดความฉงนสนเท่ห์ประมาณ 61.2
/ 58.8
(การตรวจสอบความถูกต้อง / การทดสอบ) ด้วยการปรับแต่งอย่างละเอียดจะทำให้มีความฉงนสนเท่ห์ประมาณ 58.8
/ 56.5
และด้วยการเพิ่มตัวชี้แคชอย่างต่อเนื่องจะทำให้มีความฉงนสนเท่ห์ประมาณ 53.2
/ 52.5
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
คำสั่งด้านล่างฝึกโมเดล QRNN ที่ไม่มีการปรับแต่งอย่างละเอียดจะทำให้เกิดความฉงนสนเท่ห์ประมาณ 60.6
/ 58.3
(การตรวจสอบความถูกต้อง / การทดสอบ) ด้วยการปรับแต่งอย่างละเอียดจะทำให้ได้ความฉงนสนเท่ห์ประมาณ 59.1
/ 56.7
และด้วยการเพิ่มตัวชี้แคชอย่างต่อเนื่องจะทำให้มีความฉงนสนเท่ห์ประมาณ 53.4
/ 52.6
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
คำสั่งด้านล่างนี้ฝึกโมเดล PTB ที่หากไม่มีการปรับแต่งอย่างละเอียดจะทำให้เกิดความฉงนสนเท่ห์ประมาณ 68.7
/ 65.6
(การตรวจสอบความถูกต้อง / การทดสอบ) ด้วยการปรับแต่งอย่างละเอียดจะทำให้เกิดความฉงนสนเท่ห์ประมาณ 67.4
/ 64.7
และด้วยการเพิ่มตัวชี้แคชอย่างต่อเนื่องจะทำให้มีความฉงนสนเท่ห์ประมาณ 52.2
/ 50.6
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
คำแนะนำด้านล่างจะเป็นโมเดล QRNN ที่ไม่มีการปรับแต่งอย่างละเอียดจะทำให้เกิดความฉงนสนเท่ห์ประมาณ 69.3
/ 66.8
(การตรวจสอบความถูกต้อง / การทดสอบ) ด้วยการปรับแต่งอย่างละเอียดจะทำให้มีความฉงนสนเท่ห์ประมาณ 68.5
/ 65.9
และด้วยการเพิ่มตัวชี้แคชอย่างต่อเนื่องจะทำให้มีความฉงนสนเท่ห์ประมาณ 53.6
/ 52.1
ตัวเลขที่ดีกว่าน่าจะทำได้ แต่พารามิเตอร์ไฮเปอร์ยังไม่ได้รับการค้นหาอย่างกว้างขวาง อย่างไรก็ตาม พารามิเตอร์ไฮเปอร์เหล่านี้ควรใช้เป็นจุดเริ่มต้นที่ดี
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 เป็นคอขวดมากน้อยเพียงใด เวลาส่วนใหญ่ของโมเดลข้างต้นถูกใช้ไปใน softmax หรือค่าใช้จ่ายในการเพิ่มประสิทธิภาพ (ดูการอภิปราย PyTorch QRNN เรื่องความเร็ว)
ความเร็วจะช้าลงประมาณสามเท่าใน K80 บน K80 หรือการ์ดหน่วยความจำอื่นๆ ที่มีหน่วยความจำน้อยกว่า คุณอาจต้องการเปิดใช้งานการจำกัดความยาวลำดับการสุ่มตัวอย่างสูงสุด เพื่อป้องกันข้อผิดพลาดหน่วยความจำไม่เพียงพอ (OOM) โดยเฉพาะอย่างยิ่งสำหรับ WikiText-2
หากความเร็วเป็นปัญหาสำคัญ SGD จะมาบรรจบกันเร็วกว่า ASGD ตัวแปรที่ไม่ซ้ำซากจำเจของเรา แม้ว่าจะประสบกับความฉงนสนเท่ห์โดยรวมที่แย่ลงก็ตาม
สำหรับรายละเอียดทั้งหมด โปรดดูที่พื้นที่เก็บข้อมูล PyTorch QRNN
การเพิ่มทั้งหมดให้กับ LSTM รวมถึง DropConnect เวอร์ชันอื่นของเรา (Wan et al. 2013) เรียกว่าการลดน้ำหนักซึ่งเพิ่มการออกกลางคันซ้ำ ทำให้สามารถใช้ cuDNN LSTM ของ NVIDIA ได้ PyTorch จะใช้แบ็กเอนด์ cuDNN โดยอัตโนมัติหากทำงานบน CUDA โดยติดตั้ง cuDNN ไว้ ซึ่งช่วยให้มั่นใจว่าโมเดลจะฝึกได้รวดเร็ว แม้ว่าการบรรจบกันอาจต้องใช้เวลาหลายร้อยยุคก็ตาม