Estimasi Kontras Noise (NCE) adalah metode perkiraan yang digunakan untuk bekerja di sekitar biaya komputasi besar lapisan softmax besar. Ide dasarnya adalah untuk mengubah masalah prediksi menjadi masalah klasifikasi pada tahap pelatihan. Telah terbukti bahwa kedua kriteria ini menyatu dengan titik minimal yang sama selama distribusi kebisingan cukup dekat dengan yang nyata.
NCE menjembatani kesenjangan antara model generatif dan model diskriminatif, daripada sekadar mempercepat lapisan softmax. Dengan NCE, Anda dapat mengubah hampir semua hal menjadi posterior dengan sedikit usaha (saya pikir).
Refs:
NCE:
http://www.cs.helsinki.fi/u/ahyvarin/papers/gutmann10aistats.pdf
Nce on rnnlm:
https://pdfs.semanticscholar.org/144e/357b1339c27cce7a1e69f0899c21d8140c1f.pdf
Ulasan metode speedup softmax:
http://ruder.io/word-embeddings-softmax/
NCE vs. IS (Pentingnya Pengambilan Sampel): NCE adalah klasifikasi biner sementara IS adalah semacam masalah klasifikasi multi-kelas.
http://demo.clab.cs.cmu.edu/cdyer/nce_notes.pdf
NCE vs. GAN (jaringan permusuhan generatif):
https://arxiv.org/abs/1412.6515
Dalam NCE, distribusi unigram biasanya digunakan untuk memperkirakan distribusi kebisingan karena cepat untuk sampel. Pengambilan sampel dari unigram sama dengan pengambilan sampel multinomial, yang merupakan kompleksitas
Karena distribusi unigram dapat diperoleh sebelum pelatihan dan tetap tidak berubah di seluruh pelatihan, beberapa pekerjaan diusulkan untuk memanfaatkan properti ini untuk mempercepat prosedur pengambilan sampel. Metode alias adalah salah satunya.

Dengan membangun struktur data, metode alias dapat mengurangi kompleksitas pengambilan sampel dari
Refs:
Metode alias:
https://hips.seas.harvard.edu/blog/2013/03/03/theas-lias-method-eficient-sampling-with-many-discrete-outcomes/
NCE konvensional hanya melakukan kontras pada lapisan linier (softmax), yaitu, diberi input lapisan linier, output model adalah
Dalam basis kode ini, saya menggunakan varian NCE generik bernama Full-NCE (F-NCE) untuk mengklarifikasi. Tidak seperti NCE normal, sampel F-NCE, suara-suara saat embedding input.
Refs:
Model Bahasa seluruh kalimat oleh IBM (ICASSP2018)
Model Bahasa Bi-LSTM oleh SpeechLab, SJTU (ICSLP2016?)
NCE konvensional membutuhkan sampel noise yang berbeda per token data. Pola komputasi seperti itu tidak sepenuhnya efisien GPU karena membutuhkan multiplikasi matriks batch. Trik adalah berbagi sampel kebisingan di seluruh mini-batch, sehingga multiplikasi matriks batch yang jarang dikonversi menjadi multiplikasi matriks padat yang lebih efisien. NCE batched sudah didukung oleh TensorFlow.
Pendekatan yang lebih agresif adalah disebut diri kontras (dinamai sendiri). Alih-alih mencicipi dari distribusi kebisingan, suara-suara hanyalah token pelatihan lainnya dalam mini-batch yang sama.
Ref:
NCE Batched
https://arxiv.org/pdf/1708.05997.pdf
Kontras diri:
https://www.isi.edu/natural-language/mt/simple-fast-noise.pdf
Ada contoh yang menggambarkan cara menggunakan modul NCE di folder example . Contoh ini bercabang dari repo Pytorch/Contoh.
Harap jalankan pip install -r requirements terlebih dahulu untuk melihat apakah Anda memiliki Python Lib yang diperlukan.
tqdm digunakan untuk proses proses selama pelatihandill adalah pengganti yang lebih fleksibel untuk acar--nce : apakah akan menggunakan NCE sebagai perkiraan--noise-ratio <50> : Jumlah sampel noise per batch, kebisingan dibagi di antara token dalam satu batch, untuk kecepatan pelatihan.--norm-term <9> : istilah normalisasi konstan Ln(z)--index-module <linear> : Modul indeks untuk digunakan untuk modul NCE (saat ini dan tersedia, tidak mendukung penghitungan ppl)--train : Latih atau hanya evaluasi model yang ada--vocab <None> : Gunakan file kosa kata jika ditentukan, jika tidak gunakan kata-kata di train.txt--loss [full, nce, sampled, mix] : Pilih salah satu jenis kerugian untuk pelatihan, kerugian dikonversi menjadi full untuk evaluasi ppl secara otomatis.Jalankan kriteria NCE dengan modul linier:
python main.py --cuda --noise-ratio 10 --norm-term 9 --nce --trainJalankan kriteria NCE dengan Modul GRU:
python main.py --cuda --noise-ratio 10 --norm-term 9 --nce --train --index-module gruJalankan kriteria CE konvensional:
python main.py --cuda --train Ini adalah pertunjukan pertunjukan. Namun, dataset tidak dibundel dalam repo ini. Model ini dilatih pada kalimat yang digabungkan, tetapi negara -negara tersembunyi tidak dilewati seluruh batch. <s> dimasukkan di antara kalimat. Model ini dievaluasi pada <s> kalimat empuk secara terpisah.
Umumnya model yang dilatih pada kalimat gabungan berkinerja sedikit lebih buruk daripada yang dilatih pada kalimat terpisah. Tapi kami menghemat 50% waktu pelatihan dengan mengurangi operasi bantalan kalimat.
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 --concatThe Rescore dilakukan di SWBD 50-terbaik, terima kasih kepada Hexlee.
| Jenis Kehilangan Pelatihan | jenis evaluasi | Ppl | Wer |
|---|---|---|---|
| 3gram | normed | ?? | 19.4 |
| CE (tidak ada concat) | normed (penuh) | 53 | 13.1 |
| Ce | normed (penuh) | 55 | 13.3 |
| Nce | Unnormed (NCE) | tidak sah | 13.4 |
| Nce | normed (penuh) | 55 | 13.4 |
| sampel penting | normed (penuh) | 55 | 13.4 |
| sampel penting | Sampel (500) | tidak sah | 19.0 (lebih buruk dari W/o Rescore) |
example/log/ : Beberapa file log dari skrip inince/ : Pembungkus Modul NCEnce/nce_loss.py : kerugian ncence/alias_multinomial.py : alias Metode samplingnce/index_linear.py : Modul indeks yang digunakan oleh NCE, sebagai pengganti untuk modul linier normalnce/index_gru.py : Modul indeks yang digunakan oleh NCE, sebagai pengganti modul model seluruh bahasasample.py : skrip sederhana untuk NCE linear.example : Sampel model langauge kata untuk menggunakan NCE sebagai kehilangan.example/vocab.py : Pembungkus untuk Objek Kosakataexample/model.py : Pembungkus semua nn.Module s.example/generic_model.py : Pembungkus model untuk modul index_gru nCEexample/main.py : titik masukexample/utils.py : Beberapa fungsi util untuk struktur kode yang lebih baikContoh ini melatih LSTM multi-lapisan pada tugas pemodelan bahasa. Secara default, skrip pelatihan menggunakan dataset PTB, yang disediakan.
python main.py --train --cuda --epochs 6 # Train a LSTM on PTB with CUDAModel akan secara otomatis menggunakan backend cudnn jika dijalankan pada cuda dengan cudnn terpasang.
Selama pelatihan, jika interupsi keyboard (CTRL-C) diterima, pelatihan dihentikan dan model saat ini dievaluasi terhadap dataset uji.
Script main.py menerima argumen berikut:
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