Привет!
Я Никита, аспирант Сколтеха из NLP лабы. Ещё я младший научный сотрудник аири над мультиязычными моделями.
В какой то момент я понял, мысли у меня есть, а канала нет, поэтому я решил создать этот канал.
Тут буду писать обзоры статей, преколы, мысли по поводу и не, а остальное описание мне писать лениво.
Я Никита, аспирант Сколтеха из NLP лабы. Ещё я младший научный сотрудник аири над мультиязычными моделями.
В какой то момент я понял, мысли у меня есть, а канала нет, поэтому я решил создать этот канал.
Тут буду писать обзоры статей, преколы, мысли по поводу и не, а остальное описание мне писать лениво.
🔥9
https://arxiv.org/abs/2409.02877
Не статья, а карусель эмоций. Абстракт жутко интересный и интригующий, пишут, что предлагают новый фреймворк рассуждений о моделях: так как знания лежат в параметрах, почему бы не понять, в каких параметрах лежат какие знания и как бы правильно эти знания комбинировать, чтобы получалась сеть, которая умеет делать именно то, что нам надо.
В качестве базового блока знаний в сети они предлагают "brick" -- это очень широкая по смыслу штуковина, которая может быть группой отдельных нейронов, слоем, экспертом в MoE, лора-адаптером, базой знаний для RAG и так далее.
Дальше они предлагают разделить кирпичики на два варианта: emergent bricks и customized bricks. Emergent bricks появляются на этапе обучения моделей и формируются сами, имплиситно -- например, эксперты МоЕ, отвечающие за знания модели в коде или параметры, у которых высокая активация при вопросах про биологию в dense моделях -- это emergent bricks. Customizable bricks -- это, например, Лора адаптеры под конкретную задачу, база знаний, llava-адаптер, в общем, все то, что мы можем воткнуть в сеть с пониманием того, что и зачем мы втыкаем и улучшить качество работы на конкретных задачах.
Дальше мне стало становиться скучновато, потому что первые 30 страниц это обзорное перечисление разных кирпичиков, без конкретных предложений по улучшению моделей. "Че звал, сларк?"
Потом стало поживее, потому что начался обзор методов создания кирпичиков -- от обучения адаптеров до мержей.
А потом они внезапно сделали совсем интересную вещь: взяли лламу и мистраль и стали прунить отдельные кирпичики, наблюдая за изменением перплексии на текстах из разных доменов.
К сожалению, дальше этого эксперимента особо мысль не пошла и конкретных теорий об интерпретируемости, подкрепленных экспериментами, я так и не дождался. Кроме того, они даже не рассматривали архитектуры, отличные от декодера (МоЕ и ллаву считаем декодерами). В результате получилась обзорная статья на 50 страниц с одним любопытным экспериментом в конце.
Будь я ревьюером -- вломил бы реджект за недостатком новелти. Но статей по интерпретируемости мало, так что на безрыбье и рак рыба.
Не статья, а карусель эмоций. Абстракт жутко интересный и интригующий, пишут, что предлагают новый фреймворк рассуждений о моделях: так как знания лежат в параметрах, почему бы не понять, в каких параметрах лежат какие знания и как бы правильно эти знания комбинировать, чтобы получалась сеть, которая умеет делать именно то, что нам надо.
В качестве базового блока знаний в сети они предлагают "brick" -- это очень широкая по смыслу штуковина, которая может быть группой отдельных нейронов, слоем, экспертом в MoE, лора-адаптером, базой знаний для RAG и так далее.
Дальше они предлагают разделить кирпичики на два варианта: emergent bricks и customized bricks. Emergent bricks появляются на этапе обучения моделей и формируются сами, имплиситно -- например, эксперты МоЕ, отвечающие за знания модели в коде или параметры, у которых высокая активация при вопросах про биологию в dense моделях -- это emergent bricks. Customizable bricks -- это, например, Лора адаптеры под конкретную задачу, база знаний, llava-адаптер, в общем, все то, что мы можем воткнуть в сеть с пониманием того, что и зачем мы втыкаем и улучшить качество работы на конкретных задачах.
Дальше мне стало становиться скучновато, потому что первые 30 страниц это обзорное перечисление разных кирпичиков, без конкретных предложений по улучшению моделей. "Че звал, сларк?"
Потом стало поживее, потому что начался обзор методов создания кирпичиков -- от обучения адаптеров до мержей.
А потом они внезапно сделали совсем интересную вещь: взяли лламу и мистраль и стали прунить отдельные кирпичики, наблюдая за изменением перплексии на текстах из разных доменов.
К сожалению, дальше этого эксперимента особо мысль не пошла и конкретных теорий об интерпретируемости, подкрепленных экспериментами, я так и не дождался. Кроме того, они даже не рассматривали архитектуры, отличные от декодера (МоЕ и ллаву считаем декодерами). В результате получилась обзорная статья на 50 страниц с одним любопытным экспериментом в конце.
Будь я ревьюером -- вломил бы реджект за недостатком новелти. Но статей по интерпретируемости мало, так что на безрыбье и рак рыба.
🤩3☃1❤1🎉1
Do Llamas Work in English? On the Latent Language of Multilingual Transformers
Одна из любимых статей последнего года, прям очень нравится и идея, и реализация, и мотивация, и выводы.
TLDR:
Смотрят на активации внутри llama-2, приходят к выводу, что разные части декодера отвечают за разные задачи внутри модели (перевод в embedding space, рахмышления в concept space, перевод в натуральный язык в output space).
Метод:
- Для создания эмбеддингов, они используют logit lens:
— Перед тем, как модель придумывает следующий токен, она должна взять выход последнего слоя и домножить на некоторую unembedding matrix, которая превратит его в logit scores, которые потом проходят через софтмакс, чтобы получить вероятности токенов
— Поскольку все слои имеют ту же размерность, что и последний слой, нам не так важно, какой слой домножать на unembedding matrix и с какого считать logit scores
— Таким образом, мы можем посмотреть вероятности токенов на любом, даже первом слое
- Три таски:
— Перевод на заданный язык
— Повторение того же слова
— Sort-of MLM, где маскируется одно слово и модели надо вставить пропущенное
- Такие таски нужны для предсказуемости следующего токена
- Каждый слой нужен для того, чтобы добавить небольшой сдвиг на сфере размерностью в хидден
- Mean squared cosine между выходом h и unembedding matrix U (?) даёт token energy, это нужно чтобы понять насколько бесполезна инфа от этого слоя для предсказания следующего токена
- На llama-2-70b получается:
— На 1-40 слоях энтропия вероятных следующих токенов высокая (следующий токен может быть какой угодно), энергия токена низкая (инфа от слоя малополезна для следующего токена), нет чёткого доминирующего языка
— На 41-70 слоях низкая энтропия (следующих токенов мало), низкая энергия токена (инфа от слоя малополезна), английский доминирует, так как модель много его видела и английские токены ближе всего к смысловому эмбеддингу. При этом, информация о языке токена всё ещё остаётся внутри эмбеддинга.
— На 71-80 слоях низкая энтропия (следующих токенов мало), высокая энергия токена (инфа от слоя полезна), язык ответа модели доминирует
- Авторы пишут, что энергия латентов показывает в большей степени не на язык, а на концепты, но концепты больше связаны с английским, располагаясь ближе к пространству английских токенов на шаре
Мысли:
- Модели внутри себя переводят текст на англ
— Это заметно со стихами — у некоторых крутых декодеров классно пишутся стихи на английском, но так себе на русском. А вот если перевести текст на русском на английский, получатся стихи в рифму!
- В начале у нас sort of mapping в латентный язык, в середине sort of размышления, как правильно достать оттуда инфу, в конце sort of unmapping в реальный язык.
Paper: https://arxiv.org/pdf/2402.10588
Github: https://github.com/epfl-dlab/llm-latent-language
Одна из любимых статей последнего года, прям очень нравится и идея, и реализация, и мотивация, и выводы.
TLDR:
Смотрят на активации внутри llama-2, приходят к выводу, что разные части декодера отвечают за разные задачи внутри модели (перевод в embedding space, рахмышления в concept space, перевод в натуральный язык в output space).
Метод:
- Для создания эмбеддингов, они используют logit lens:
— Перед тем, как модель придумывает следующий токен, она должна взять выход последнего слоя и домножить на некоторую unembedding matrix, которая превратит его в logit scores, которые потом проходят через софтмакс, чтобы получить вероятности токенов
— Поскольку все слои имеют ту же размерность, что и последний слой, нам не так важно, какой слой домножать на unembedding matrix и с какого считать logit scores
— Таким образом, мы можем посмотреть вероятности токенов на любом, даже первом слое
- Три таски:
— Перевод на заданный язык
— Повторение того же слова
— Sort-of MLM, где маскируется одно слово и модели надо вставить пропущенное
- Такие таски нужны для предсказуемости следующего токена
- Каждый слой нужен для того, чтобы добавить небольшой сдвиг на сфере размерностью в хидден
- Mean squared cosine между выходом h и unembedding matrix U (?) даёт token energy, это нужно чтобы понять насколько бесполезна инфа от этого слоя для предсказания следующего токена
- На llama-2-70b получается:
— На 1-40 слоях энтропия вероятных следующих токенов высокая (следующий токен может быть какой угодно), энергия токена низкая (инфа от слоя малополезна для следующего токена), нет чёткого доминирующего языка
— На 41-70 слоях низкая энтропия (следующих токенов мало), низкая энергия токена (инфа от слоя малополезна), английский доминирует, так как модель много его видела и английские токены ближе всего к смысловому эмбеддингу. При этом, информация о языке токена всё ещё остаётся внутри эмбеддинга.
— На 71-80 слоях низкая энтропия (следующих токенов мало), высокая энергия токена (инфа от слоя полезна), язык ответа модели доминирует
- Авторы пишут, что энергия латентов показывает в большей степени не на язык, а на концепты, но концепты больше связаны с английским, располагаясь ближе к пространству английских токенов на шаре
Мысли:
- Модели внутри себя переводят текст на англ
— Это заметно со стихами — у некоторых крутых декодеров классно пишутся стихи на английском, но так себе на русском. А вот если перевести текст на русском на английский, получатся стихи в рифму!
- В начале у нас sort of mapping в латентный язык, в середине sort of размышления, как правильно достать оттуда инфу, в конце sort of unmapping в реальный язык.
Paper: https://arxiv.org/pdf/2402.10588
Github: https://github.com/epfl-dlab/llm-latent-language
🔥1🥰1🤔1
Figure 4d: Все эмбеддинги на d-мерной сфере, где d — размерность хиддена модели. Эмбеддинги токенов лежат на экваторе, по x лежит язык (от английского до китайского), по y лежит смысл/концепт (слово sweetness), по z лежит дополнительная информация, которая потребуется на следующих слоях, типа контекста и прочего.
🤩2
Matryoshka Representation Learning и MatFormer
Есть такая штука, Matryoshka Embeddings. Суть в том, что если мы учим какой-нибудь берт, вит или резнет, мы на выходе получаем довольно жирный вектор эмбеддингов — например, 2048-мерный. Если мы хотим снизить число измерений в нем, мы можем либо взять эмбеддер с меньшей размерностью, либо попробовать порезать этот вектор, повыкидывав часть измерений из него. Ожидаемо, второй вариант снизит качество эмбеддингов, а в первом подходящей нам модели может не оказаться.
Авторы статьи предложили очень простую идею: а что если мы будем вешать лосс не только на весь слой, но ещё и на первые {1024, 512, ..., 32, 16, 8} измерений выхода этого слоя, проставлять веса и оптимизировать всё сразу? В результате они добились того, что самые важные значения вектора оказываются в начале, а менее важные — в конце. Таким образом, качество эмбеддингов при откидывании правой части вектора снижается совсем незначительно.
Идея прижилась, поддержку матрёшек завезли в sentence transformers, теперь их активно используют для, например, ускорения поиска по векторной базе в RAG'е. А потом можно ту же модель, но с большей размерностью эмбеддинга использовать, например, для реранкинга.
Однако авторы на этом не остановились и предложили новую идею — MatFormer. Суть следующая:
- Учим с матрешкой feedforward слои трансформера (хоть энкодера, хоть декодера, не так важно)
- На этапе инференса либо руками, либо через роутинг как в MoE динамически откидываем "лишние" части справа
- Получаем уменьшенную модель, которая становится легче и немножко теряет в качестве
Идея сработала. Более того, оказалось, что можно комбинировать FFN разной размерности и получать не d (размерность матрёшки) моделей, а d^n (где n — число слоев), получая более гибкую настройку размера модели под имеющийся компьют. При этом количество ресурсов на обучение остаётся сравнимым с ванильным трансформером!
Качество такой модели не уступает модели, обученной без матрёшки, а при прунинге мы можем отказаться аж от 40% параметров. Интересно, кстати, насколько тяжело потом пруненные таким образом модели квантовать.
К сожалению, кажется, идея не прижилась. А жаль.
Базовая статья про матрёшки: https://arxiv.org/abs/2205.13147
Статья про MatFormer: https://arxiv.org/pdf/2310.07707
Есть такая штука, Matryoshka Embeddings. Суть в том, что если мы учим какой-нибудь берт, вит или резнет, мы на выходе получаем довольно жирный вектор эмбеддингов — например, 2048-мерный. Если мы хотим снизить число измерений в нем, мы можем либо взять эмбеддер с меньшей размерностью, либо попробовать порезать этот вектор, повыкидывав часть измерений из него. Ожидаемо, второй вариант снизит качество эмбеддингов, а в первом подходящей нам модели может не оказаться.
Авторы статьи предложили очень простую идею: а что если мы будем вешать лосс не только на весь слой, но ещё и на первые {1024, 512, ..., 32, 16, 8} измерений выхода этого слоя, проставлять веса и оптимизировать всё сразу? В результате они добились того, что самые важные значения вектора оказываются в начале, а менее важные — в конце. Таким образом, качество эмбеддингов при откидывании правой части вектора снижается совсем незначительно.
Идея прижилась, поддержку матрёшек завезли в sentence transformers, теперь их активно используют для, например, ускорения поиска по векторной базе в RAG'е. А потом можно ту же модель, но с большей размерностью эмбеддинга использовать, например, для реранкинга.
Однако авторы на этом не остановились и предложили новую идею — MatFormer. Суть следующая:
- Учим с матрешкой feedforward слои трансформера (хоть энкодера, хоть декодера, не так важно)
- На этапе инференса либо руками, либо через роутинг как в MoE динамически откидываем "лишние" части справа
- Получаем уменьшенную модель, которая становится легче и немножко теряет в качестве
Идея сработала. Более того, оказалось, что можно комбинировать FFN разной размерности и получать не d (размерность матрёшки) моделей, а d^n (где n — число слоев), получая более гибкую настройку размера модели под имеющийся компьют. При этом количество ресурсов на обучение остаётся сравнимым с ванильным трансформером!
Качество такой модели не уступает модели, обученной без матрёшки, а при прунинге мы можем отказаться аж от 40% параметров. Интересно, кстати, насколько тяжело потом пруненные таким образом модели квантовать.
К сожалению, кажется, идея не прижилась. А жаль.
Базовая статья про матрёшки: https://arxiv.org/abs/2205.13147
Статья про MatFormer: https://arxiv.org/pdf/2310.07707
arXiv.org
Matryoshka Representation Learning
Learned representations are a central component in modern ML systems, serving a multitude of downstream tasks. When training such representations, it is often the case that computational and...
⚡3👍2🔥1
Матрёшка и качество классификации при урезании эмбеддингов на резнете и вите.
🍌2
Прикольный бейзлайн для энкодеров для простеньких задач типа мелкой классификации, дедупа или близости. Работает на вынимании первого слоя
Кажется, из-за выбора именно первого слоя в мультиязе такая штука не будет работать хорошо (то есть similarity параллельных переводов одной и той же фразы не будет близким), потому что первый слой, как правило, имеет сгруппированные по языкам представления (см картинку). Но может быть автор как-то по умному их учил, надо будет проверить.
https://github.com/dleemiller/WordLlama
nn.Embedding у какой-нибудь большой и мудрой модели вроде llama-3-70b и обучения мелкой модельки с теми же матрёшками, если я верно всё понял. Получается 16-мегабайтная модель, которая работает лучше стареньких бейзлайнов типа GloVe, но заметно хуже современных сот большего размера (не для того, всё таки, делалось). Есть замеры на MTEB'е.Кажется, из-за выбора именно первого слоя в мультиязе такая штука не будет работать хорошо (то есть similarity параллельных переводов одной и той же фразы не будет близким), потому что первый слой, как правило, имеет сгруппированные по языкам представления (см картинку). Но может быть автор как-то по умному их учил, надо будет проверить.
https://github.com/dleemiller/WordLlama
✍5
jina-embeddings-v3: Multilingual Embeddings With Task LoRA
В 2022 году, если я не ошибаюсь, впервые представили инструктивный эмбеддер — Instructor. Это была довольно прорывная идея, потому что теперь эмбеддеры могли быть обучены на разные задачи (ретрив, реранк, классификация, кластеризация) и для того, чтобы воспользоваться моделью для новой задачи, надо было всего лишь приаппендить промпт слева к тексту, который мы эмбеддим. Это сильно помогло модели, в своё время она стала сотой на MTEB с довольно уверенным отрывом от конкурентов того же размера на многих задачах. С тех пор, конечно, утекло много воды, соты менялись, придумали даже делать эмбеддеры на декодерах, но идея прижилась. Одна из лучших мультилингв моделей в размере до 1B —
Кроме того, в последнее время стали появляться мультилингв эмбеддеры. Но проблема в том, что такие эмбеддеры сильно просаживались по качеству по сравнению с монолингв моделями — BGE-M3, например, по моим замерам, в ретривале сильно отставала даже от bge-1.5-base, модели, которая была в пять раз меньше.
И вот сегодня в Daily Papers прилетела статья от стартапа Jina AI, в которой они представляют эмбеддинговую модель, которая, во-первых, лучше проприетарных
Ну а ещё модель размером всего 572M ("всего" — потому что текущие соты на MTEB это здоровенные 7-9B эмбеддеры, которых доучивали с декодеров типа мистрали или геммы), не очень сильно уступает большим сотам по качеству (клеймят, что
В качестве инита они брали XLM-RoBERTa, дообучали на своём сете, а потом делали пять адаптеров: text-matching для STS, classification для классификации, separation для реранкинга и классификации и query и passage для энкодинга query и passage при ретриве. У каждого был свой лосс и свой обучающий сет, они довольно подробно всё расписывают, интересно было почитать.
Разумеется, надо самому тыкать руками и перепроверять, но звучит как сказка: сравнительно компактный эмбеддер, который ещё и выдаёт сота мультилингв результаты по многим задачам. Единственный минус — лицензия cc-by-nc-4.0, а не пермиссивная MIT, но я думаю, что скоро идею с лорами подхватят и у нас появятся новые соты с нормальными лицензиями.
Paper: https://arxiv.org/abs/2409.10173
HF: https://huggingface.co/jinaai/jina-embeddings-v3
В 2022 году, если я не ошибаюсь, впервые представили инструктивный эмбеддер — Instructor. Это была довольно прорывная идея, потому что теперь эмбеддеры могли быть обучены на разные задачи (ретрив, реранк, классификация, кластеризация) и для того, чтобы воспользоваться моделью для новой задачи, надо было всего лишь приаппендить промпт слева к тексту, который мы эмбеддим. Это сильно помогло модели, в своё время она стала сотой на MTEB с довольно уверенным отрывом от конкурентов того же размера на многих задачах. С тех пор, конечно, утекло много воды, соты менялись, придумали даже делать эмбеддеры на декодерах, но идея прижилась. Одна из лучших мультилингв моделей в размере до 1B —
multilingual-e5-large-instruct — инструктивная.Кроме того, в последнее время стали появляться мультилингв эмбеддеры. Но проблема в том, что такие эмбеддеры сильно просаживались по качеству по сравнению с монолингв моделями — BGE-M3, например, по моим замерам, в ретривале сильно отставала даже от bge-1.5-base, модели, которая была в пять раз меньше.
И вот сегодня в Daily Papers прилетела статья от стартапа Jina AI, в которой они представляют эмбеддинговую модель, которая, во-первых, лучше проприетарных
text-embeddings-3-large и cohere-embed-multilingual-3.0, лучше моего предыдущего фаворита multilingual-e5-large-instruct, всё ещё хороша на английском, и, внезапно, использует не инструкции, а отдельно натюненные лоры для выполнения итоговых задач. Насколько я знаю, такой подход применяется впервые, круто, что наконец то кто-то это сделал.Ну а ещё модель размером всего 572M ("всего" — потому что текущие соты на MTEB это здоровенные 7-9B эмбеддеры, которых доучивали с декодеров типа мистрали или геммы), не очень сильно уступает большим сотам по качеству (клеймят, что
e5-mistral-instruct лучше всего на 1%), обучена с матрёшками для того, чтобы можно было снизить вес векторной базы и имеет контекст в 8192 токена, так как алгоритм позиционного энкодинга там RoPE. Звучит очень круто, но надо, конечно, проверять самому.В качестве инита они брали XLM-RoBERTa, дообучали на своём сете, а потом делали пять адаптеров: text-matching для STS, classification для классификации, separation для реранкинга и классификации и query и passage для энкодинга query и passage при ретриве. У каждого был свой лосс и свой обучающий сет, они довольно подробно всё расписывают, интересно было почитать.
Разумеется, надо самому тыкать руками и перепроверять, но звучит как сказка: сравнительно компактный эмбеддер, который ещё и выдаёт сота мультилингв результаты по многим задачам. Единственный минус — лицензия cc-by-nc-4.0, а не пермиссивная MIT, но я думаю, что скоро идею с лорами подхватят и у нас появятся новые соты с нормальными лицензиями.
Paper: https://arxiv.org/abs/2409.10173
HF: https://huggingface.co/jinaai/jina-embeddings-v3
🔥5
Если я правильно понял эту табличку, то она очень интересная — число ошибок при использовании адаптеров сильно падает, так что есть надежда, что при обучении лор, подобных jina-v3 (а не просто приклеивании инструкций, как в e5-instruct) для других моделей, можно будет добиться неплохого буста в качестве.
🔥3