Мой рейтинг LM'ок по качеству расчета перплексии текста

В качестве побочного продукта текущего r&d у меня появилась вот такая табличка:


mistralai/Mistral-7B-v0.1              0.65
NousResearch/Llama-2-7b-hf             0.63
ai-forever/rugpt3large_based_on_gpt2   0.62
ai-forever/rugpt3medium_based_on_gpt2  0.60
AlexWortega/Vikhr-7b-0.1               0.59


В ней несколько открытых языковых моделей, доступных в https://huggingface.co/models, отсортированы в порядке убывания рейтинга, полученного в следующем бенчмарке.

1) Есть генерации художественных текстов, для каждого пользовательского промпта по несколько штук.
2) Ранжируем эти генерации с помощью перплексии от LM'ки, и берем топовую генерацию.
3) Затем выполняем экспертную оценку side-by-side выбранной генерации против человеческого варианта для данного запроса.
4) Считаем, как часто эксперт выбирает генерацию из п.3, а не человеческий текст. Числа во втором столбце - усредненный результат такого sbs.

В целом, расчет перплексии в этом пайплайне выполняет роль прокси-искусствоведа, чтобы отбросить кривые (в разном смысле) генерации.

Что хочу заметить по приведенным результатам.

1) Мистраль действительно рулит в своем классе, максимально хорошо генерализуясь на новые домены русских текстов. Сколько там у них было русских текстов в претрейне?

2) Как я уже много раз замечал, доучивание любой foundation LM это не так чтобы простое дело. Можно получить просадку в каком-то свойстве модели, как в данном случае получилось с моделькой Vikhr-7b-0.1.

3) Всегда нужно оценивать все LM'ки на своих бенчмарках, на своей downstream задаче. Ориентироваться на чужие метрики - непрофессиональный подход.

Текст это не просто кучка слов (или нет?)

Есть такая бородатенькая шутка:

"Не надо меня уговаривать" означает "нет"
"Меня не надо уговаривать" означает "конечно да".

В целом её можно считать хорошей иллюстрацией того, что даже в русском языке с его почти свободным порядком слов есть ситуации, когда семантика предложения критично зависит от порядка слов. Заметьте, что в этом примере меняются местами составляющие (constituents), а отрицательная частица "не" по сути остается перед словом "надо". Казалось бы, никаких причин менять семантику нет, так как к порядку составляющих русская речь еще более толерантна, чем к порядку слов. В общем, очень хорошая иллюстрация :)

Так вот к чему это я. На днях нашел на архиве статью от 21 года, написанную рисёрчерами из r&d лабы фейсбука: UnNatural Language Inference. Вкратце говорится там следующее. Взяли задачу NLI, когда для двух фраз проверяется, вытекает ли вторая логически из первой (так называемый entailment), или нет. Замечу, что всё это для английского языка, где порядок слов прямо железобетонный. И оказалось, что модели на базе Roberta etc зачастую плевать хотели на порядок слов. Цитирую:

Collapse )

Идемпотентность перефразировок через языковые модели

По определению, идемпотентность это такое свойство операций, когда повторное применение операции дает такой же результат, как и первое. Другими словами, f(f(x)) = f(x).

С идемпотентными математическими операциями всё достаточно просто. Знаний в рамках школьной программы достаточно, чтобы придумать несколько подходящих: умножение на 0 или 1 и т.п.

В домене естественного языка можно предположить, что такое свойство должно быть у некоторых составных "round-trip" операций, в частности - для перевода ru => en => ru. Впрочем, из-за вариативности языка ждать строгой идемпотентности от перевода не стоит.

Более того, с ходу я не могу сказать, что получение исходного текста в результате цепочки переводов ru => en => ru является подтверждением высого уровня владения языками, так как важным аспектом владения языком является способность выразить свою мысль
другими словами, иначе говоря - перефразировать текст. В конце концов, нешаблонность мышления это то, что мы ожидаем от сильного ИИ в том или ином виде.

Два этих конкурирующих фактора (консервативность семантики и вариативность лексики) позволяют использовать системы машперевода в качестве генераторов перефразировок. Этот прием давно в числе стандартных для аугментации датасетов, хотя я его обычно не использую из-за удручающего качества результатов.

И вот тут появилась дурацкая идея: а что, если применять рекурсивно перевод ru-en-ru к какой-то фразе и смотреть, когда модель зациклится,  то есть повторит какой-то из предыдущих вариантов? Затем прогнать через такой пайплайн много разных фраз и посмотреть статистику числа итераций до зацикливания.

Collapse )

Удивительная вещь: универсальность генетического кода (записки дилетанта-айтишнека)

С точки зрения разработчика, сильно испорченного всяким DS с матстатом и оптимизационными штуками, этот факт выглядит крайне интригующе и должен (как кажется) быть основой каких-то невероятно умных теоретических выкладок. Как тезис о постоянстве скорости света и специальная теория относительности со всем ее красивым математическим бэкграундом в виде преобразований Лоренца и пространства Минковского.

В кратком изложении "на пальцах" это звучит так. Практически все живые организмы используют одинаковую таблицу кодирования 20 аминокислот в тройках из четырех нуклеотидов. Математически строгая система, машина Тьюринга, созданная слепым часовщиком.

По этому поводу я нашел весьма подробную обзорную статью от 2008 года за авторством Кунина и Новожилова: "Origin and evolution of the genetic code: The universal enigma" https://arxiv.org/pdf/0807.4749.pdf, с массой ссылок и перечнем альтернативных теорий.
Collapse )

Насколько хорошо справляются LLM'ки с задачами, связанными с программным кодом

В рамках одной перспективной темы делаю рисёч тыкаю открытые PLM'ки: всякие CodeLLama etc.

Общее моё впечатление - хайп с этими моделями и реальное состояние технологии различаются намного сильнее, чем для обычных чатботов. Причина вполне очевидна: если в диалоговых моделях бредовый ответ можно при желании натянуть на некую интерпретацию, то с кодом это не проходит.

Упрощая - код либо работает, либо нет.

Например, идем сюда потыкать CodeLlama-13B. Судя по статье,  эта модель видела кода на питоне значительно больше, чем я за всё время. Ок, верю. Вбиваю запрос:
Collapse )

Промптинг в LLM и прайминг у людей

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

Итак, собственно ссылка на пост: https://t.me/chrdk/1667

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

Первый баг связан с тем, что любое предшествующее восприятие или мысль начинает влиять на последующие решения, причем зачастую совершенно неосознанно и там, где оснований для такого влияния нет. «Эффект числового якоря», как частный случай, выглядит так (далее цитирую):

Collapse )

Второй упомянутый баг описан в научной статье (sic!) "Visual event boundaries restrict anchoring effects in decision-making". Опять цитирую тг-пост:

Collapse )


В книге "Думай медленно, решай быстро" (я нашел аудио в литресе, но без проблем ищется и "бесплатный" пдф) приводятся еще примеры сногсшибательных багов. Например, неожиданно и неконтролируемо появляющийся эффект идеомоторного прайминга:

Collapse )


Эффект работает и в обратную сторону:

Collapse )

Читая про все эти немыслимые эффекты, трудно удержаться от аналогии с одним техническим приемом в нашем уютненьком NLP домене при работе с LLM'ками. Я говорю о промптинге и всем, что по этому поводу придумано за последние годы. Если посмотреть на выдачу поисковика, можно убедиться, что всякая магия правильных запросов к чатжпг и подобным системам обсуждается далеко за рамками узкого комьюнити NLP'шников.

О чем говорит такая популярность? На мой взгляд, о двух вещах.

Во-первых, промптинг действительно эффективен.

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

А теперь давайте добавим сюда еще парочку фактов про тренды в LLM.

1) Мы (те, кто создает LLM'ки и их пользователи) довольно бодро двигаемся в сторону мультимодальности, когда языковые модели будут работать не только с текстовым представлением, но и с аудио и видео. Запутанность, неочевидность ассоциативных связей в LLM будет нарастать, и ничего с этим не поделаешь. Проклятие высокой размерности обучающих данных и вытекающие из него особенности машобуча с нами навсегда.

2) Командами, ведущими r&d в области чатботов, вкладывается много сил в улучшении механизмов кратковременной и долговременной памяти. В частности, расширение длины контекста в LLM'ках от прежних 1-2k токенов до 4k или выше это уже факт. Плюс всякий RAG как реализация механизма долговременной памяти. Всё это означает, что эффекты влияния предшествующих коммуникаций на последующие шаги будут нарастать. И не факт, что простые вставки "Забудь всё, что говорилось ранее" в промпты нас будут спасать :)

Старшая сестра charllama-35M

Какое-то время назад (полгода?) я начал эксперименты с посимвольной токенизацией для декодерных генеративок. Первыми результатами, разной степени успешности, были chargpt-96M и charllama-35M. Была еще модель charbloom-35M с позиционными эмбеддингами alibi, но ее я не стал выкладывать, так как она была чуть хуже charllama-35M.

Прошло время, я научился собирать хороший датасет, качественно делать претрейн char-level моделей, сделал автоматический бенчмарк для сравнения этих моделей на разных специфических downstream задачах типа расстановки ударений на омографах. Ёмкость модели и ее качество выросли кардинально. Ура-ура!

Теперь могу поделиться текущим результатом в модели charllama. Генерация стихотворения "под Шекспира", прямо в том виде, как его выдает модель charllama, с расстановкой ударений (можно подавать в tts пайплайн, ага):

Collapse )

По планам - перевести генерацию в боте @verslibre_bot на эту модель в начале следующего года.

Intrinsic dimension для разных жанров поэзии

(в продолжение вот этой темы про топологию эмбеддингов)

Распределения intrinsic dimension, рассчитанные с помощью scikit-dimension по эмбеддингам модели ruroberta для стихов некоторых жанров, выглядят так:
Collapse )Вот некоторые инсайты, которые можно тут найти:

1) "эротика" - наиболее сложный жанр с точки зрения ruRoberta; это самый правый горб.
2) "иронические стихи" немного отстают от "эротики".
3) как ни странно, "любовная лирика" на третьем месте по сложности.
4) твёрдые жанры - депрессяшки и пирожки, представленные четырехстрочниками, топологически наиболее просты, это самые левые горбы.
5) "пирожки" - единственное бимодальное распределение, возможно там на самом деле 2 разных поджанра.
6) стихи для детей достаточно близки к любовной лирике.

PS: Спасибо коллеге imageman72'у за очень верный вопрос про зависимость intrinsic dimention от длины текста. Сам я этот нюанс упустил, а он реально важен. Вот что получается, если отрисовать такую зависимость для жанра "любовная лирика":
Collapse )

Сочная цитата из статьи про генерацию поэзии

"Any suitor who has pledged their affection in print can attest to how difficult it can be to write good love poetry; and being able to generate rhyming text that also has the lengths of consecutive words matching the digits of pi is sure to swoon all but the most frigid of mathematicians."

Мой примерный перевод:

"Любой поклонник, стремящийся выразить свою страсть письменно, подтвердит, как непросто писать хорошую любовную поэзию. А возможность сгенерировать зарифмованный текст, в котором длины последовательных слов соответствуют цифрам числа пи, безусловно ошеломит любого, кроме разве что самых фригидных математиков."


Статья: Most Language Models can be Poets too: An AI Writing Assistant and Constrained Text Generation Studio (ссылка)

Отличаются ли диалоги, написанные людьми, от сгенерированных ChatGPT?

Продолжаю погружение в TDA, а именно в тему "Artificial Text Detection" через расчеты топологических метрик.

После стихов появилась мысль попробовать применить эти топологические инструменты к диалогам.

В последний год массовой практикой стала генерация диалогов через апишку OpenAI и обучение моделей чатботов (и даже базовых моделей - см. статью про TinyStories) на таких данных. Эта практика кажется в какой-то степени сомнительной, так как обучение генеративок на текстах, порожденных генеративках лично у меня вызывает какое-то внутреннее ожидание плохого. Главный вопрос: а насколько хорошо сгенерированные chatgpt тексты воспроизводят латентные свойства человеческих диалогов?

Да, визуально эти диалоги мало отличимы, особенно если аккуратно делать промптинг генерации. Впрочем, у текстов, которые порождает ChatGPT часто есть "привкус" какой-то скучности, плоскости что-ли. Но такие ощущение к делу не подошьешь. Надо получать объективные метрики. Кстати, тема соприкасается с вопросами детектирования порожденных ChatGPT текстов в академической сфере - в дипломных работах, статьях и т.д.

Итак, первый мой подход к снаряду. Я взял 1000 диалогов, написанных профессиональными редакторами для виртуального ассистента. Это гарантированно человеческие тексты. Добавил равное количество диалогов, которые породила ChatGPT. Далее, я получил эмбеддинги диалогов с помощью sberbank-ai/ruRoberta-large, и воспользовался библиотекой skdim для расчета внутренней размерности этих облаков точек. И вот что получилось на определенном этапе с помощью вот этого алгоритма:

Collapse )

Средние и дисперии:

Human mean=4.21 std=2.09
Model: mean=7.02 std=3.30


То есть в данном сеттинге эти диалоги кажутся вполне различимыми на уровне чисто топологических свойств.

В следующей итерации займусь выправлением методологии эксперимента. В частности, надо бы получать диалоги по 1-2 начальным репликам из человеческих диалогов, чтобы не было сильного лексического и семантического дрейфа. Возможно, нужно немного поиграть с промптом, чтобы максимально приблизить генерируемые диалоги к человеческим примерам. Займусь этим в следующей итерации.

PS: Пара слов про топологический анализ для эмбеддингов диалогов. Представим три предмета - стеклянную кружку с ручкой, чайник и пончик. Они сделаны из разного материала (лексика), имеют разный размер (длины и количество реплик), используются по-разному (прагматика текста), но топологически они все - тор. Именно такие свойства диалогов ловят рассматриваемые выше метрики в skdim, когда важны не слова или их значение, а, грубо говоря, наличие "дырок" в графах, которые строятся на облаках точек-эмбеддингов.