Комментарии 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 / трансформера — получится вообще подход, агностик почти ко всему (он универсален для всех языков с падежами, если иметь стеммер)
Если возьметесь это делать полностью опен-сорсно, могу накинуть код нашей токенизации + сильно больше корпусов, чем тайга
=)
Видим, что фильтрация словаря эффективнее остальных методов, а применение квантизации делает её ещё эффективнее.
То ощущение, когда пробовал только эти методы, отметая на практике все остальное, т.к. "сложна", а кто-то проверил и пришел к похожему выводу.
Как сжать модель fastText в 100 раз