Предварительное обучение (Word2Vec) встраивание в нейронные сети - PullRequest
0 голосов
/ 25 декабря 2018

Если мне нужно использовать предварительно обученные векторы слов в качестве слоя внедрения в нейронных сетях (например, скажем, CNN), как мне работать с индексом 0?

Подробно:

Обычно мы начинаем с создания массива 2D с нулевым смещением.Позже мы заполняем индексы слов из словаря.Проблема в том, что 0 уже является индексом другого слова в нашем словаре (скажем, «i» - это индекс в 0).Следовательно, мы в основном инициализируем всю матрицу, заполненную «i» вместо пустых слов.Итак, как мы справляемся с заполнением всех предложений одинаковой длины?

Одно простое всплывающее сообщение: мы можем использовать другую цифру = numberOfWordsInVocab + 1 для заполнения.Но разве это не займет больше?[Помоги мне!]

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Если мне нужно использовать предварительно обученные векторы слов в качестве слоя внедрения в нейронных сетях (например, скажем, CNN), как мне работать с индексом 0?

Ответ

Как правило, пустые записи могут обрабатываться посредством взвешенной стоимости модели и целевых показателей.Однако при работе со словами и последовательными данными все может быть немного сложнее, и есть несколько вещей, которые можно рассмотреть.Давайте сделаем некоторые предположения и поработаем с этим.

Допущения

  1. Мы начнем с предварительно обученной модели word2vec.
  2. У нас есть последовательностис различной длиной, не более max_lenght слов.

Подробности

  • Word2Vec - это модель, которая изучает отображение (внедрение) из дискретногопеременные (word token = уникальный идентификатор слова) в непрерывном векторном пространстве.
  • Представление в векторном пространстве таково, что функция стоимости (CBOW, Skip -gram, по сути, предсказывает слово из контекста вНаправленный путь) сводится к минимуму на корпусе.
  • При чтении основных учебников (например, Учебное пособие Google по word2vec по Учебное пособие по Tensorflow ) раскрываются некоторые подробности алгоритма, в том числе отрицательная выборка .
  • Реализация представляет собой справочную таблицу.Это быстрее, чем альтернативный метод горячего кодирования, поскольку размеры матрицы с горячим кодированием огромны (скажем, 10 000 столбцов для 10 000 слов, n строка для n последовательных слов).Таким образом, таблица поиска (хэш) значительно быстрее, и она выбирает строки из матрицы встраивания (для векторов строк).

Task

  • Добавьте отсутствующие записи (без слов) и используйте их в модели.

Предложения

  • Если есть какое-то использование для стоимости отсутствующих данныхНапример, используя прогноз из этой записи и для этой записи есть метка, вы можете добавить новое значение, как предлагается (может быть индексом 0, но все индексы должны двигаться i=i+1, а матрица внедрения должна иметь новую строку впозиция 0).
  • Следуя первому предложению, вам нужно потренировать добавленную строку.Вы можете использовать отрицательную выборку для класса NaN против всех. Я не предлагаю его для обработки пропущенных значений.Это хороший прием для обработки класса «Неизвестное слово».
  • Вы можете взвесить стоимость этих записей на константу 0 для каждого образца, который короче max_length.То есть, если у нас есть последовательность токенов слов [0,5,6,2,178,24,0,NaN,NaN], соответствующий весовой вектор равен [1,1,1,1,1,1,1,0,0]
  • . Вам следует беспокоиться о переиндексации слов и стоимости этого.В памяти разницы почти нет (1 против N слов, N большой).По сложности это то, что может быть позже включено в начальную функцию токенизации.Предсказания и сложность модели - это более серьезная проблема и более важное требование системы.
  • Существует множество способов решения проблемы различной длины (LSTM, RNN, теперь мы пробуем CNN и хитрости с затратами).Читайте современную литературу по этому вопросу, я уверен, что есть много работы.Например, см. Сверточная нейронная сеть для моделирования предложений paper.
0 голосов
/ 25 декабря 2018

Одно простое всплывающее окно: мы можем использовать другую цифру = numberOfWordsInVocab + 1 для заполнения.Но разве это не займет больше?

Нет!Это тот же размер.

a=np.full((5000,5000), 7)
a.nbytes
200000000

b=np.zeros((5000,5000))
b.nbytes
200000000

Редактировать: опечатка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...