Я склонен доверять развернутому коду больше, чем бумажным рецензиям, особенно в случае, подобном word2vec, где исходный текст авторов word2vec.c
, выпущенный авторами статьи, широко использовался и служил в качествешаблон для других реализаций. Если мы посмотрим на его механизм субсэмплинга ...
if (sample > 0) {
real ran = (sqrt(vocab[word].cn / (sample * train_words)) + 1) * (sample * train_words) / vocab[word].cn;
next_random = next_random * (unsigned long long)25214903917 + 11;
if (ran < (next_random & 0xFFFF) / (real)65536) continue;
}
... мы увидим, что те слова с крошечным счетчиком (.cn
), которые могли бы дать отрицательные значения в исходной формуле вместо этого, дают значения большечем 1.0
, и, следовательно, никогда не может быть меньше, чем long
-случайно-замаскировано и масштабировано, чтобы никогда не быть больше 1.0
((next_random & 0xFFFF) / (real)65536
). Таким образом, кажется, что намерение авторов было, чтобы все отрицательные значения исходной формулы означали «никогда не отбрасывать».
Согласно комментариям и реализации keras make_sampling_table()
, они не обращаются к фактическим частотам слов вообще. Вместо этого они предполагают Zipf-подобное распределение, основанное на порядке ранжирования слов, для синтеза моделируемой частоты слов.
Если их предположения подтвердятся - связанные слова взяты из корпуса на естественном языке с частотным распределением, подобным Zipf, - тогда я ожидаю, что их вероятности выборки будут близки к вероятностям понижающей дискретизации, которыебыли рассчитаны на основе достоверной информации о частоте. И это, вероятно, «достаточно близко» для большинства целей.
Я не уверен, почему они выбрали это приближение. Возможно, другие аспекты их обычных процессов не поддерживали истинные частоты до этого шага, и они ожидают, что всегда будут работать с текстами на естественном языке, где предполагаемые частоты будут в целом истинными.
(По счастливой случайности и потому, что люди часто хотят вменять частоты в общедоступные наборы векторов слов, которые сократили истинные значения, но все же сортируются от наиболее к наименее частым, всего за несколько днейназад я написал ответ об имитации ложного, но правдоподобного распределения с использованием закона Ципфа - аналогично тому, что делает этот код keras.)
Но, если вы работаете с данными, не не соответствует их предположениям (как с вашими синтетическими или описанными наборами данных), их вероятности выборки будут сильно отличаться от того, что вы рассчитываете сами, с любой формой исходной формулы, которая использует истинные частоты слов.
В частности, представьте раздачу с одним токеном миллион раз, затем сотня токенов появляется всего по 10 раз каждый. Порядок этих сотен токенов в списке рангов произвольный - действительно, они все связаны по частоте. Но подход, основанный на моделировании, путем подгонки распределения Zipfian к этому порядку, фактически будет выбирать каждую из них очень по-разному. Одно слово из 10 появлений, достаточно удачное для того, чтобы быть на позиции 2-го ранга, будет гораздо более урезанным, как если бы оно было гораздо более частым. И значение «высокой головы» 1-го ранга, при условии, что его истинная частота * занижена *, будет менее пониженным, чем в противном случае. Ни один из этих эффектов не кажется полезным, или в духе опции частого выборочного сокращения слов, которая должна только «прореживать» очень частые слова и во всех случаях оставлять слова примерно одинаковой частоты друг с другом в исходном корпусе. эквивалентно представлены друг другу в корпусе с пониженной выборкой.
Итак, для вашего случая я бы выбрал исходную формулу (вероятность отбрасывания, которая требует специальной обработки отрицательных значений), или практическую / инвертированную реализацию word2vec.c
(вероятность сохранения того, что насыщает на уровне 1,0), а не приближение в стиле керас.
(AЭто совершенно отдельное примечание, которое, тем не менее, может иметь отношение к вашему набору данных / целям, если вы используете отрицательную выборку: есть другой параметр, управляющий относительной выборкой отрицательных примеров, часто фиксируемый в 0.75
в ранних реализациях, который один из предложенных документов может быть полезен для раздачи токенов не на естественном языке и для конечного использования, связанного с рекомендациями . Этот параметр называется ns_exponent
в реализации Python gensim
, но просто фиксированное значение power
, внутреннее для предварительного расчета таблицы выборки в исходном word2vec.c
коде .)