การประมาณค่าความคมชัดของเสียงรบกวน (NCE) เป็นวิธีการประมาณที่ใช้ในการแก้ไขค่าใช้จ่ายในการคำนวณขนาดใหญ่ของชั้น softmax ขนาดใหญ่ แนวคิดพื้นฐานคือการแปลงปัญหาการทำนายเป็นปัญหาการจำแนกประเภทในขั้นตอนการฝึกอบรม มันได้รับการพิสูจน์แล้วว่าเกณฑ์ทั้งสองนี้มาบรรจบกันเป็นจุดน้อยที่สุดเท่าที่จะเป็นตราบใดที่การกระจายเสียงรบกวนใกล้พอที่จะเกิดขึ้นจริง
NCE เชื่อมช่องว่างระหว่างแบบจำลองการกำเนิดและโมเดลการเลือกปฏิบัติมากกว่าเพียงแค่เร่งความเร็วของเลเยอร์ Softmax ด้วย NCE คุณสามารถเปลี่ยนเกือบทุกอย่างให้เป็นด้านหลังด้วยความพยายามน้อยลง (ฉันคิดว่า)
refs:
nce:
http://www.cs.helsinki.fi/u/ahyvarin/papers/gutmann10aistats.pdf
nce บน rnnlm:
https://pdfs.semanticscholar.org/144e/357b1339c27cce7a1e69f0899c21d8140c1f.pdf
รีวิววิธีการเร่งความเร็วของ SoftMax:
http://ruder.io/word-embeddings-softmax/
NCE vs. IS (การสุ่มตัวอย่างที่สำคัญ): NCE เป็นการจำแนกแบบไบนารีในขณะที่เป็นปัญหาการจำแนกประเภทหลายชั้น
http://demo.clab.cs.cmu.edu/cdyer/nce_notes.pdf
NCE vs. Gan (เครือข่ายฝ่ายตรงข้ามกำเนิด):
https://arxiv.org/abs/1412.6515
ใน NCE การแจกแจง Unigram มักจะใช้เพื่อประมาณการกระจายเสียงรบกวนเนื่องจากเป็นตัวอย่างที่รวดเร็ว การสุ่มตัวอย่างจาก unigram นั้นเท่ากับการสุ่มตัวอย่างแบบพหุคูณซึ่งมีความซับซ้อน
เนื่องจากการแจกแจง Unigram สามารถรับได้ก่อนการฝึกอบรมและยังคงไม่เปลี่ยนแปลงในการฝึกอบรมงานบางอย่างจึงถูกเสนอเพื่อใช้ประโยชน์จากคุณสมบัตินี้เพื่อเร่งขั้นตอนการสุ่มตัวอย่าง วิธีนามแฝงเป็นหนึ่งในนั้น

โดยการสร้างโครงสร้างข้อมูลวิธีการนามแฝงสามารถลดความซับซ้อนในการสุ่มตัวอย่างจาก
refs:
วิธีนามแฝง:
https://hips.seas.harvard.edu/blog/2013/03/03/the-alias-method-efficient-sampling-with-many-discrete-out
NCE ทั่วไปจะดำเนินการที่ตัดกันบนเลเยอร์เชิงเส้น (softmax) นั่นคือเนื่องจากอินพุตของเลเยอร์เชิงเส้นเอาต์พุตโมเดลคือ
ในฐานรหัสนี้ฉันใช้ตัวแปรของ NCE ทั่วไปชื่อ Full-NCE (F-NCE) เพื่อชี้แจง ซึ่งแตกต่างจาก NCE ปกติตัวอย่าง F-NCE เสียงที่ฝังอินพุต
refs:
โมเดลภาษาทั้งหมดโดย IBM (ICASSP2018)
แบบจำลองภาษา BI-LSTM โดย SeechLab, SJTU (ICSLP2016?)
NCE ทั่วไปต้องการตัวอย่างเสียงรบกวนที่แตกต่างกันต่อโทเค็นข้อมูล รูปแบบการคำนวณดังกล่าวไม่ได้มีประสิทธิภาพ GPU อย่างสมบูรณ์เนื่องจากต้องการการคูณเมทริกซ์แบบแบตช์ เคล็ดลับคือการแบ่งปันตัวอย่างเสียงรบกวนทั่วทั้งมินิแบทช์ดังนั้นการคูณเมทริกซ์แบบเบาบางจะถูกแปลงเป็นการคูณเมทริกซ์หนาแน่นที่มีประสิทธิภาพมากขึ้น NCE แบตช์ได้รับการสนับสนุนโดย TensorFlow แล้ว
วิธีการก้าวร้าวมากขึ้นคือการเรียกตัวเองว่าตัดกัน (ตั้งชื่อโดยตัวเอง) แทนที่จะสุ่มตัวอย่างจากการกระจายเสียงรบกวนเสียงเป็นเพียงการฝึกอบรมอื่น ๆ ที่มีโทเค็นภายในมินิแบทช์เดียวกัน
อ้างอิง:
NCE
https://arxiv.org/pdf/1708.05997.pdf
การตัดกันตนเอง:
https://www.isi.edu/natural-language/mt/simple-fast-noise.pdf
มีตัวอย่างที่แสดงวิธีการใช้โมดูล NCE ในโฟลเดอร์ example ตัวอย่างนี้ถูกแยกจาก pytorch/ตัวอย่าง repo
โปรดเรียกใช้ pip install -r requirements ก่อนเพื่อดูว่าคุณมี Python Lib ที่จำเป็นหรือไม่
tqdm ใช้สำหรับ Process Bar ในระหว่างการฝึกอบรมdill เป็นการทดแทนที่ยืดหยุ่นมากขึ้นสำหรับดอง--nce : ไม่ว่าจะใช้ NCE เป็นการประมาณ--noise-ratio <50> : จำนวนตัวอย่างเสียงรบกวนต่อชุดเสียงจะถูกแชร์ระหว่างโทเค็นในชุดเดียวสำหรับความเร็วในการฝึกอบรม--norm-term <9> : คำศัพท์การทำให้เป็นมาตรฐานคงที่ Ln(z)--index-module <linear> : โมดูลดัชนีที่จะใช้สำหรับโมดูล NCE (ปัจจุบันและพร้อมใช้งานไม่รองรับการคำนวณ PPL)--train : รถไฟหรือเพียงแค่ประเมินรูปแบบที่มีอยู่--vocab <None> : ใช้ไฟล์คำศัพท์ถ้าระบุมิฉะนั้นใช้คำใน train.txt--loss [full, nce, sampled, mix] : เลือกประเภทการสูญเสียอย่างใดอย่างหนึ่งสำหรับการฝึกอบรมการสูญเสียจะถูกแปลงเป็น full สำหรับการประเมิน PPL โดยอัตโนมัติเรียกใช้เกณฑ์ NCE ด้วยโมดูลเชิงเส้น:
python main.py --cuda --noise-ratio 10 --norm-term 9 --nce --trainเรียกใช้เกณฑ์ NCE ด้วยโมดูล GRU:
python main.py --cuda --noise-ratio 10 --norm-term 9 --nce --train --index-module gruเรียกใช้เกณฑ์ CE ทั่วไป:
python main.py --cuda --train มันเป็นงานแสดงประสิทธิภาพ ชุดข้อมูลไม่ได้รวมอยู่ใน repo นี้อย่างไรก็ตาม แบบจำลองได้รับการฝึกฝนเกี่ยวกับประโยคที่ต่อกัน แต่รัฐที่ซ่อนอยู่จะไม่ผ่านแบทช์ มีการแทรก <s> ระหว่างประโยค แบบจำลองได้รับการประเมินบน <s> ประโยคเบาะแยกกัน
โดยทั่วไปรูปแบบที่ได้รับการฝึกฝนเกี่ยวกับประโยคที่ต่อกันจะทำงานได้แย่กว่าที่ได้รับการฝึกฝนในประโยคที่แยกต่างหากเล็กน้อย แต่เราประหยัดเวลาฝึกอบรม 50% โดยการลดการดำเนินการของการขยายประโยค
python main.py --train --batch-size 96 --cuda --loss nce --noise-ratio 500 --nhid 300
--emsize 300 --log-interval 1000 --nlayers 1 --dropout 0 --weight-decay 1e-8
--data data/swb --min-freq 3 --lr 2 --save nce-500-swb --concatRescore ดำเนินการใน SWBD 50-best ขอบคุณ Hexlee
| ประเภทการสูญเสียการฝึกอบรม | ประเภทการประเมินผล | ppl | ล้วน |
|---|---|---|---|
| 3 กรัม | ที่ได้ถูกบรรทัดฐาน | - | 19.4 |
| CE (ไม่มี concat) | normed (เต็ม) | 53 | 13.1 |
| CE | normed (เต็ม) | 55 | 13.3 |
| NCE | ไม่ได้รับความสนใจ (NCE) | ไม่ถูกต้อง | 13.4 |
| NCE | normed (เต็ม) | 55 | 13.4 |
| ตัวอย่างความสำคัญ | normed (เต็ม) | 55 | 13.4 |
| ตัวอย่างความสำคัญ | ตัวอย่าง (500) | ไม่ถูกต้อง | 19.0 (แย่กว่า W/O Rescore) |
example/log/ : ไฟล์บันทึกบางส่วนของสคริปต์นี้nce/ : Wrapper โมดูล NCEnce/nce_loss.py : การสูญเสีย NCEnce/alias_multinomial.py : การสุ่มตัวอย่างวิธีการนามแฝงnce/index_linear.py : โมดูลดัชนีที่ใช้โดย NCE เป็นการแทนที่โมดูลเชิงเส้นปกติnce/index_gru.py : โมดูลดัชนีที่ใช้โดย NCE เป็นการแทนที่โมดูลโมเดลภาษาทั้งหมดsample.py : สคริปต์ง่ายๆสำหรับ NCE linearexample : ตัวอย่างโมเดลคำ Langauge เพื่อใช้ NCE เป็นการสูญเสียexample/vocab.py : เสื้อคลุมสำหรับวัตถุคำศัพท์example/model.py : wrapper ของ nn.Module s ทั้งหมดexample/generic_model.py : model wrapper สำหรับโมดูล index_gru nceexample/main.py : จุดเข้าexample/utils.py : ฟังก์ชั่น UTIL สำหรับโครงสร้างรหัสที่ดีขึ้นตัวอย่างนี้ฝึก LSTM หลายชั้นในงานการสร้างแบบจำลองภาษา โดยค่าเริ่มต้นสคริปต์การฝึกอบรมจะใช้ชุดข้อมูล PTB ที่มีให้
python main.py --train --cuda --epochs 6 # Train a LSTM on PTB with CUDAรุ่นจะใช้แบ็กเอนด์ CUDNN โดยอัตโนมัติหากเรียกใช้บน CUDA ด้วยการติดตั้ง CUDNN
ในระหว่างการฝึกอบรมหากได้รับการขัดจังหวะแป้นพิมพ์ (CTRL-C) การฝึกอบรมจะหยุดลงและรูปแบบปัจจุบันจะถูกประเมินกับชุดข้อมูลทดสอบ
สคริปต์ main.py ยอมรับอาร์กิวเมนต์ต่อไปนี้:
optional arguments:
-h, --help show this help message and exit
--data DATA location of the data corpus
--emsize EMSIZE size of word embeddings
--nhid NHID humber of hidden units per layer
--nlayers NLAYERS number of layers
--lr LR initial learning rate
--lr-decay learning rate decay when no progress is observed on validation set
--weight-decay weight decay(L2 normalization)
--clip CLIP gradient clipping
--epochs EPOCHS upper epoch limit
--batch-size N batch size
--dropout DROPOUT dropout applied to layers (0 = no dropout)
--seed SEED random seed
--cuda use CUDA
--log-interval N report interval
--save SAVE path to save the final model
--bptt max length of truncated bptt
--concat use concatenated sentence instead of individual sentence