Реализация модели Word2vec CBOW, отклонения от исходного алгоритма - PullRequest
1 голос
/ 24 апреля 2019

Я пытаюсь реализовать модель CBOW с помощью pytorch. Что я понял из объяснения word2vec , так это то, что word2vec имеет 2 слоя (и, следовательно, 2 матрицы), первая матрица содержит низкоразмерные векторы слов, которые на самом деле являются таблицей поиска и векторным представлением спроецированного слова на проекционном слое (нет нелинейности, поэтому не скрытый слой). Векторы слова затем умножаются на 2-ю матрицу и затем поступают на выход через функцию softmax. После обучения первая матрица может использоваться как вложение слов.

Я вижу, что многие реализации используют 3 слоя (1 слой внедрения и еще 2 слоя), что противоречит моему пониманию выше. Некоторые примеры реализации здесь , здесь и здесь . Следующие три строки кода обычно используются в качестве модели для реализации 3 уровня:

self.embeddings = nn.Embedding(vocab_size, embedding_dim)
self.linear1 = nn.Linear(context_size * embedding_dim, 128)
self.linear2 = nn.Linear(128, vocab_size)

Мои вопросы: если мое понимание в порядке, то почему они используют 3 слоя? Есть ли преимущества?

Один очевидный недостаток, я думаю, заключается в том, что это будет дорого в вычислительном отношении.

Word2vec напоминает идею автоматического кодировщика (который также имеет двухслойный режим), отклонение от этой проверенной идеи может ухудшить качество встраивания. Я прав?

Еще одна важная вещь заключается в том, что, согласно упомянутой выше статье, для нескольких контекстных слов среднее значение векторов будет проецироваться на защитный слой. Но вместо усреднения они объединяют векторы. Это почему? есть ли преимущества?

Кроме того, они используют нелинейность в скрытом слое, который, я думаю, создаст серьезную проблему производительности при обучении с огромным количеством данных. Верно?

...