Как хеширование реализовано в SGNN (самоуправляемых нейронных сетях)? - PullRequest
0 голосов
/ 21 декабря 2018

Итак, я прочитал статью под названием Самоуправляющиеся нейронные сети для классификации коротких текстов на устройстве , в которой представлен подход без внедрения к проецированию слов в нейронное представление.Чтобы процитировать их:

Ключевое преимущество SGNN над существующей работой заключается в том, что они преодолевают необходимость предварительно обученных вложений слов и сложных сетей с огромными параметрами.[...] наш метод является по-настоящему подходом без встраивания, в отличие от большинства широко используемых современных методик глубокого обучения в НЛП

В основном, насколько я понимаю, онидействуйте следующим образом:

  1. Сначала вам нужно будет вычислить n-грамм (дополнительный вопрос: это скип-грамм, как старый скип-грамм, или новый скип-грамм, как word2vec?Я предполагаю, что это первое, что осталось) на символах слов, чтобы получить персонализированное представление слов в тексте, поэтому, например, с 4 граммами вы могли бы получить 1M-мерный вектор разреженных признаков на слово.Надеемся, что она редкая, так что для этого не нужно полностью использовать память, потому что она почти одна горячая (или векторизованная ngram, или tf-idf ngram с большим количеством нулей).
  2. Тогда вам нужно будет хэшировать эти разреженные n-грамм-векторы, используя Локальное хеширование (LSH) .Кажется, они используют Случайная проекция из того, что я понял.Кроме того, вместо ngram-векторов они вместо этого используют кортежи индекса n-граммного признака и его значения для ненулевого n-граммного признака (который также по определению является «разреженной матрицей», вычисляемой на лету, например, изСловарь по умолчанию ненулевых объектов вместо полного вектора).
  3. Я обнаружил реализацию случайной проекции в scikit-learn .Судя по моим тестам, он не дает двоичного вывода, хотя все это использует разреженные вычисления на лету в разреженных матрицах scikit-learn, как и ожидалось для эффективного использования памяти (отличные от нуля словарные функции)реализация я думаю.

Что не работает во всем этом и в чем заключается мой вопрос, так это в том, как они могут получить двоичные элементы из разреженной проекции (хеширования).Похоже, они говорят, что хеширование выполняется одновременно с вычислением функций, что вызывает путаницу, я ожидал бы, что хеширование произойдет в порядке, описанном выше, как в 1-2-3 шага, но их шаги 1и 2 кажется каким-то образом слитым.

Моя путаница возникает в основном из абзацев, начинающихся с фразы «Вычисление на лету».на странице 888 (страница 2 PDF) бумага в правом столбце.Вот изображение, изображающее отрывок, который меня смущает:

what doesn't work

Я хотел бы довести свой школьный проект до успеха (пытаясь смешать BERT с SGNN вместо использования встраивания слов).Итак, как бы вы это демистифицировали?Точнее, , как можно достичь аналогичной случайной проекции хеширования с помощью scikit-learn, или TensorFlow, или с PyTorch?Пытаясь соединить точки здесь, я значительно исследовал, но их статья не дает подробностей реализации, что я хотел бы воспроизвести.Я, по крайней мере, знаю, что SGNN использует 80 четырёхмерных LSH на n-граммах слов на уровне персонажей (мое понимание в первую очередь правильно?).

Спасибо!


РЕДАКТИРОВАТЬ : после запуска кода я понял, что вывод команды scikit-learn's SparseRandomProjection() выглядит следующим образом:

[0.7278244729081154,
 -0.7278244729081154,
 0.0,
 0.0,
 0.7278244729081154,
 0.0,
 ...
]

На данный момент все выглядит хорошо, он ближе к двоичномуно он по-прежнему можно преобразовать в целое число вместо числа с плавающей точкой, используя в первую очередь хорошее соотношение.Я все еще задаюсь вопросом о пропускаемой грамматике, я предполагаю n-грамм символов слов на данный момент, но это, вероятно, неправильно.Скоро выложу код на GitHub.


РЕДАКТИРОВАТЬ # 2 : я что-то здесь кодировал, но с n-граммами вместо скип-грамм: https://github.com/guillaume-chevalier/SGNN-Self-Governing-Neural-Networks-Projection-Layer

...