噪聲對比估計(NCE)是一種近似方法,用於圍繞大型軟磁層的巨大計算成本工作。基本思想是在培訓階段將預測問題轉換為分類問題。已經證明,只要噪聲分佈足夠接近真實的標準,這兩個標準就會收斂到相同的最小點。
NCE橋接生成模型和判別模型之間的差距,而不是簡單地加速軟磁層層。使用NCE,您可以減少努力將幾乎所有東西變成後部。
參考:
NCE:
http://www.cs.helsinki.fi/u/ahyvarin/papers/gutmann10aistats.pdf
在rnnlm上:
https://pdfs.semanticscholar.org/144e/357B1339C27CCE7A1E69F0899C21D8140C1F.pdf.pdf
SoftMax加速方法的評論:
http://ruder.io/word-embeddings-softmax/
NCE與IS(重要性採樣):NCE是二進制分類,而是多類分類問題。
http://demo.clab.cs.cmu.edu/cdyer/nce_notes.pdf
NCE與Gan(生成對抗網絡):
https://arxiv.org/abs/1412.6515
在NCE中,通常使用umigram分佈來近似噪聲分佈,因為它很快從中採樣。來自umram的採樣等於多項式抽樣,這很複雜
由於可以在培訓之前獲得umram分佈,並且在培訓中保持不變,因此建議一些工作以利用此屬性來加速採樣程序。別名方法是其中之一。

通過構建數據結構,別名方法可以降低來自
參考:
別名方法:
https://hips.seas.harvard.edu/blog/2013/03/03/the-alias-method-efficited-smpling-with-many-discrete-utcomes/
傳統的NCE僅在線性(軟馬克斯)層上執行對比度,也就是說,給出了線性層的輸入
在此代碼庫中,我使用名為Full-NCE(F-NCE)的仿製品變體來澄清。與正常的NCE不同,F-NCE樣品在輸入嵌入時的噪音。
參考:
IBM的整個句子語言模型(ICASSP2018)
bi-lstm語言模型,segresslab,sjtu(ICSLP2016?)
常規的NCE需要每個數據令牌不同的噪聲樣本。這種計算模式並不完全GPU有效,因為它需要批處理的矩陣乘法。一個訣竅是在整個迷你批次上共享噪聲樣本,從而將稀疏的批處理矩陣乘法轉換為更有效的密集矩陣乘法。 TensorFlow已經支持批處理的NCE。
一種更具侵略性的方法是稱為自我對比(由我自己命名)。噪音不是從噪聲分佈中取樣,而只是其他訓練令牌,而在同一迷你批處理中。
參考:
批處理
https://arxiv.org/pdf/1708.05997.pdf
自我對比:
https://www.isi.edu/natural-language/mt/simple-fast-noise.pdf
有一個示例說明瞭如何在example文件夾中使用NCE模塊。此示例是從Pytorch/示例存儲庫分配的。
請首先運行pip install -r requirements以查看您是否具有所需的Python lib。
tqdm在培訓期間用於過程欄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使用GRU模塊運行NCE標準:
python main.py --cuda --noise-ratio 10 --norm-term 9 --nce --train --index-module gru運行常規CE標準:
python main.py --cuda --train這是一個表演展示櫃。但是,該數據集並未捆綁在此存儲庫中。該模型接受了串聯句子的訓練,但是隱藏的狀態並未通過批處理傳遞。 <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 --concat得益於Hexlee,Rescore是在SWBD 50張中進行的。
| 培訓損失類型 | 評估類型 | ppl | wer |
|---|---|---|---|
| 3Gram | 規範 | ? | 19.4 |
| CE(無concat) | 規範(完整) | 53 | 13.1 |
| CE | 規範(完整) | 55 | 13.3 |
| NCE | 未估計(NCE) | 無效的 | 13.4 |
| NCE | 規範(完整) | 55 | 13.4 |
| 重要性樣本 | 規範(完整) | 55 | 13.4 |
| 重要性樣本 | 採樣(500) | 無效的 | 19.0(比Rescore差得多) |
example/log/ :此腳本的一些日誌文件nce/ :NCE模塊包裝器nce/nce_loss.py :NCE損失nce/alias_multinomial.py :別名方法採樣nce/index_linear.py :NCE使用的索引模塊,作為正常線性模塊的替代品nce/index_gru.py :NCE使用的索引模塊,作為整個語言模型模塊的替代sample.py線性的簡單腳本。example :使用NCE用作損失的單詞langauge模型樣本。example/vocab.py :詞彙對象的包裝器example/model.py :所有nn.Module的包裝器。example/generic_model.py nce模塊的模型包裝器example/main.py :入口點example/utils.py :一些用於更好代碼結構的UTIT功能此示例在語言建模任務上訓練多層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