Comments 4

На удивление — статья на Хабре с оригинальным контентом, давно такого не завозили, респект. Вы большой молодец, что работаете над сжатием моделей, это всегда полезно и правильно, расширяет рамки применимости (а не стакаете трансформеры =) ).


Но к делу. Судя по вашей статье, вы же базируете свои эксперименты на основе пакетов fasttext от FAIR или gensim? Насколько я помню, fasttextон написан на C++ и в питоне там только интерфейс (очень неплохой кстати, а не как обычно). C gensim я пробовал работать, там довольно плохая документация, и код не очень.


Я это к тому, что скорее всего, если кто-то будет использовать даже ваши сжатые модели на практике, скорее всего он не пойдет дальше ограничений, которые накладывают эти пакеты. Ну или просто возьмет вектора as-is для старта какой-то сетки. В fasttext конечно есть классификатор, но сидеть на проектах, которые не развиваются тоже такое себе удовольствие.


Также насколько я понимаю, свои оценки вы делает на академических датасетах и используете что-то сродни корреляции в оценках, что "не стало хуже".


Я пишу все это, т.к. если вы пишете про работу под продакшен, то есть сильно более простые способы делать минификацию н-грамных моделей, и при этом не быть технологически залоченным и делать хоть seq2seq на такой токенизации =).


Я делал что-то подобное на работе в продакшен NER модели и достигал таких же результатов по сжатию без потери качества (условно в ~100 раз). Также недавно в голову приходила такая идея альтернативной токенизации для руского языка, которая может учитывать лучшее из двух миров классического и современного NLP. Мы также пробовали засовывать такое и в BERT, и там н-граммы и пре-трейн роляли.


TLDR:


  • Используете слой nn.EmbeddingBag из PyTorch — по сути это и есть FastText, но внутри нейросети. Рано или поздно этот слой, вероятно, завезут в поддержку квантизации в int8 или float16, но и без этого все очень быстро и так работает (в наших продовых пайплайнах — сеть это самая быстрая часть =) )
  • Н-граммы и токенизацию выбираете и пищете сами, квантизацию можете сделать уже на этапе отбора н-грамм
  • Поскольку нейросеть вы пишите сами, никакие ограничения пакетов выше на вас не действуют
  • Опять же, поскольку инференс пишете сами — в теории любые извращения на ваш вкус — матрицы же перемножаем по сути

Пара вещей, которые на практике надо иметь в виду:


  • При прототипировании НЕ НАДО делать квантизацию / сжатие, т.к. сетки с ней сходятся примерно кратно логарифму дольше — при сжатии с 300 до 5 сетка сходилась где-то раз в 5 дольше.
  • Вышеупомянутый слой nn.EmbeddingBagможно инициализировать внезапно весами FastText, и даже вашими весами! Одна беда — я пробовал такое на 2-3 разных задачах… иногда получал буст к сходимости ну процентов 25-40% от времени, но качество итоговое никогда не было лучше, увы. В последних проектах просто начинаю с рандома
  • Проблемы возникают с батчингом для такого подхода когда мы используем 2+ видеокарты,, беда в том, что все обертки для распределенной работы подразумевают тензоры как инпуты моделей, а nn.EmbeddingBag проще использовать так, чтобы он… принимал массив строк. Это все обходится, просто очень некрасиво получается

PS
Вдвойне удивительно и показательно видеть статью от сотрудника Яндекса… на личном аккаунте :trollface

В ближайшем будущем я перейду от сжатия словных эмбеддингов к созданию компактной модели фразных эмбеддингов для русского языка. Если хотите поучаствовать, либо предложить или покритиковать что-нибудь, пишите мне на Хабр или в ODS.

Можно прикрутить сюда эту идею и добавить сверху пару каких-то очень легких слоев LSTM / трансформера — получится вообще подход, агностик почти ко всему (он универсален для всех языков с падежами, если иметь стеммер)


Если возьметесь это делать полностью опен-сорсно, могу накинуть код нашей токенизации + сильно больше корпусов, чем тайга
=)


Видим, что фильтрация словаря эффективнее остальных методов, а применение квантизации делает её ещё эффективнее.

То ощущение, когда пробовал только эти методы, отметая на практике все остальное, т.к. "сложна", а кто-то проверил и пришел к похожему выводу.

Only those users with full accounts are able to leave comments. Log in, please.