Шумовая контрастная оценка (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 против IS (выборка важности): NCE-это бинарная классификация, в то время как это своего рода задача классификации многоклассов.
http://demo.clab.cs.cmu.edu/cdyer/nce_notes.pdf
NCE против GAN (Генеративная состязательная сеть):
https://arxiv.org/abs/1412.6515
В NCE распределение Unigram обычно используется для аппроксимации распределения шума, поскольку его быстро отбрасывает. Выборка из Unigram равен многономиальной выборке, которая имеет сложность
Поскольку распределение Unigram может быть получено до обучения и остается неизменным по всему обучению, предлагаются некоторые работы, чтобы использовать это свойство для ускорения процедуры отбора проб. Метод псевдонима является одним из них.

Построив структуры данных, метод псевдонима может уменьшить сложность выборки из
Refs:
Метод псевдонима:
https://hips.seas.harvard.edu/blog/2013/03/03/the-alias-method-effiate-sampling-with-many-discrete-outcomes/
Обычный NCE выполняет только контрастирование на линейном (Softmax) слое, то есть с учетом ввода линейного слоя, выходы модели являются
В этой базе кода я использую вариант общего NCE с именем Full-NCE (F-NCE), чтобы уточнить. В отличие от обычного NCE, F-NCE пробегает шумы при вводе ввода.
Refs:
Модель языка целого предложения от IBM (ICASSP2018)
Языковая модель BI-LSTM от SpeechLab, SJTU (ICSLP2016?)
Обычный NCE требует разных образцов шума на токен данных. Такая вычислительная шаблон не является полностью эффективным графическим процессором, поскольку ему требуется умножение пакетной матрицы. Хитрость заключается в том, чтобы разделить образцы шума по всей мини-партии, таким образом, умножение разреженного пакетного матрикса преобразуется в более эффективное умение плотной матрицы. Перекрытый NCE уже поддерживается TensorFlow.
Более агрессивный подход - это называется самопосторонним (названным мной). Вместо отбора проб из распределения шума звуки-это просто другие тренировочные токены в пределах той же мини-партии.
Ref:
Перекрытый NCE
https://arxiv.org/pdf/1708.05997.pdf
Самостоятельно контрастное:
https://www.isi.edu/natural-language/mt/simple-fast-noise.pdf
Есть пример, иллюстрирующий, как использовать модуль NCE в папке example . Этот пример раздвоен от репокса 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Запустите критерий NCE с модулем GRU:
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 --concatRescore выполняется на SWBD 50 лучших, благодаря Hexlee.
| Тип потери тренировок | Тип оценки | Ппл | Wer |
|---|---|---|---|
| 3 Грэм | норм | ?? | 19.4 |
| CE (без конката) | Нормация (полная) | 53 | 13.1 |
| CE | Нормация (полная) | 55 | 13.3 |
| Неп | Недономированный (NCE) | неверный | 13.4 |
| Неп | Нормация (полная) | 55 | 13.4 |
| важность выборки | Нормация (полная) | 55 | 13.4 |
| важность выборки | SAMPLED (500) | неверный | 19.0 (хуже, чем без Rescore) |
example/log/ : некоторые файлы журнала этих сценариевnce/ : модуль NCEnce/nce_loss.py : потеря NCEnce/alias_multinomial.py : выборка метода псевдонимаnce/index_linear.py : индексный модуль, используемый NCE, в качестве замены для нормального линейного модуляnce/index_gru.py : индексный модуль, используемый NCE, в качестве замены для модуля модели всего языкаsample.py : простой сценарий для NCE Linear.example : образец модели Langauge Word для использования NCE в качестве потери.example/vocab.py : обертка для словарного объектаexample/model.py : обертка всех nn.Module s.example/generic_model.py : модель обертка для модуля 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