Pull to refresh
90
0
Илья Гусев @Takagi

Программист

Send message

В смысле эмбеддеры для поиска? Или языковую модель?
Нормальные эмбеддеры:

А языковая модель - Сайга, либо нормальные инстракт-модели (OpenChat, OpenOrca).

Код супер-простой версии поиска + ЯМ: https://huggingface.co/spaces/IlyaGusev/saiga_13b_llamacpp_retrieval_qa

На первом месте дотюненая базовая модель Mistral-7B-v0.1.
На 18 месте НЕтюненая адаптированная под русский saiga_mistral_7b_lora.
Если saiga_mistral_7b_lora дотюнить на RSG, получиться примерно такой же результат, как и у Mistral-7B-v0.1.
"IlyaGusev/saiga_mistral_7b" из кода в статье вообще не существует. В остальном в статье действительно модель с 18 места. Только это никакого значения не имеет, среди zero-shot посылок она на 3 месте после gpt-3.5-turbo и 70b модели.

Замечу, что модель (как и любые другие инструктивные модели) критична к формату промпта.
В этом случае он должен быть примерно таким:

<s>system
Ты — Сайга, русскоязычный автоматический ассистент. Ты разговариваешь с людьми и помогаешь им.</s>
<s>user
Текст: {context}
Вопрос: {question}</s>
<s>bot
Вот ответ на ваш вопрос длиной не более 10 слов:

Откуда это я точно знать не могу, скорее всего из косяков датасета. Всё-таки большая его часть синтетическая, иногда ChatGPT генерировала фигню. Как корректировать — а толком никак, только фильтровать датасет и переучивать.

Ну вот на 3090 всё, что меньше 30B, и обучалось. В карточках моделей есть ссылки на wandb, там есть конкретное железо и время обучения.

Я просто считал соотношение количества символов и количества токенов на наборе текстов. Для Лламы это что-то типа 2.6 символа на токен, для большинства остальных моделей — меньше 2.

Да, ускоряет. Насчёт пары десятков не знаю, но где-то до 8 ускорение значительное. В llama-cpp-python можно указать можно через аргумент в конструкторе, n_threads.

Модели нужно хорошо предсказать следующее слово. Это её основная цель. Поставьте себя на место модели и поймёте, что она может и почему. Ради этой цели она и сжимает информацию, а во время сжатия рождается понимание и смысл.

Просто обучение на тексте первоисточника может дать такие хорошие результаты?

Может, особенно с последующим обучением на ответы на вопросы в целом, не обязательно про эту книгу.

Или он где-то прочитал статью вроде "основные персонажи Войны и Мира" и дает ответ на этом основании (как бы подбирает уже готовый короткий ответ).

Такое возможно, но не необходимо.

Если мы хотим получить ответы аналогичного качества про другую книгу, о которой LLM не знает (ну и которая не влезает вся в prompt) - то какие есть способы, где про них почитать?

  1. Разбить книгу на фрагменты, искать внешней системой релевантные фрагменты, которые влезут в промпт, генерировать ответ на их основе. RAG, retrieval-augmented generation, см. одну из демок, статей про это дофига и больше.

  2. Дообучить модель на предсказание следующего слова по книге. Так модель точно всё запомнит, останется только дообучить её отвечать на вопросы, на которые она уже должна знать ответы, причём вопросы могут быть и по Википедии (если до этого модель обучалась и на ней).

Модели в принципе не могут как-то считать-обобщать большие данные (не вмещающиеся в текст запроса) или могут? Например (понимаю, что извращенная задача, но этим и интересна) - берем список из 1 млн сотрудников крупной организации и их зарплаты. Любая СУБД и даже эл. таблица легко нам и просуммирует их и посчитает максимум, минимум, среднее. А можно ли такой же результат получить от языковых моделей?

Могут, но вот складывают числа они так себе без специализированных трюков с промптом, типа разворота чисел. И это касается явного сложения, что уж говорить про неявное сложение или умножение. С максимумом скорее всего похожая история. Кроме того, опять же, модель нужно будет специально научить этому.

Как переучить модель на новые факты? Например, заставить ее исходить из предположения, что Земля плоская или что курение полезно. Пока что наилучшее что я нашел, это всякие "игры" (давай допустим-предположим-поиграем), но ответы "не искренние", видно, что это в рамках игры. Если мы хотим сделать чат с LLM для плоскоземельщиков (чтобы и про войну и мир отвечала, но и "правильный" ответ про форму земли знала), то как можно решить эту задачу, в какую сторону копать?

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

Это всё равно, что спрашивать китайца, есть ли мягкий знак в слове 鼠.
Большинство современных моделей не оперируют на уровне букв, они оперируют на уровне токенов, разбивка на которые подчиняется неочевидным правилам. Например, "мышь" в токенизации Лламы — это [29915, 29973]. А "шьёт" — это [3354, 29978, 10101]. Модели, даже если бы она идеально умела оперировать своими токенами, просто неоткуда взять, что [29973] и [3354, 29978] пишется одинаково.

И таким вещам их нужно учить специально, чего никто не делает, потому что это довольно бесполезно.

Чёрт его знает, на самом деле.
Хорошо бы почистить набор инструкций и ответов, который используется в обучении. 70B я уже обучал только на выходах gpt-4 и человеческих диалогах, но и это можно дополнительно дочистить.
Также хотелось бы замерить результаты на RSG во few-shot режиме и TAPE.
Можно ещё попробовать обучить reward модель на основе бок-о-бок разметки и затем сделать RLHF, но это вряд ли сработает хорошо.

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

Да всё стандартно — либо это всё определять в промпте, либо собрать выборку примеров и дообучить на ней. Даже меньше 1000 примеров должно быть достаточно.

Концепт понял, я подумаю над этим.

Насчёт сообществ, я читаю довольно много англоязычных:

Ну и с чатами в Телеграме всё не так плохо. Те, в которых я есть, обычно даже и не знают о существовании друг друга.

П.с. вы на данную статью, я уверен, потратили в несколько раз больше времени, чем для создания подобного мануала, о котором я говорю.

А вот тут вы вероятно ошибаетесь, на статью я потратил часов 6 максимум, за 3 часа я мануал не напишу.

Deep Learning School, наверное? Если вас устроят вчерашние или сегодняшние студенты в качестве лекторов. Я последний раз смотрел русскоязычные лекции на эти темы много-много лет назад, так что мне сложно тут советовать. А в текстовом варианты — курс Лены Войты, уже упомянутый в статье, сколько уж ему лет, но он всё ещё хорош.

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

  • меняются форматы: safetensors, ggml, gguf, gptq

  • меняются способы обучения: sft, lora, qlora, ppo, dpo

  • меняются фреймворки для обучения: bitsandbytes, accelerate, trl

  • меняются фреймворки для инференса: native hf, onnx, tgi, vllm

Моя мысль тоже понятна, я думаю. Мне недавно писал человек, спрашивал как сделать X в фреймворке Y, а я про фреймворк Y первый раз слышу так-то.

Для примера, вот кусочек моего TODO списка статей на чтение. А я из него все нормально прочитанные статьи уже выкинул...

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

Лучший гайд по обучению моделей, который я видел: https://rentry.org/llm-training. А теперь удачи найти его в Гугле.

Что ещё стоит читать:

Мой топ постов из блога HF:

А также их документация, особенно разделы типа Methods and tools for efficient training on a single GPU

Ничего странного, я-то даже не ggml модельку пробовал, да и для одной модели параметры генерации могли бы быть разными. Собственно сваливание в английский — серьёзная проблема для полу-автоматической оценки, разметчики-то дополнительных сообщений написать не смогут. Да и пользователей это, очевидно, раздражает.

Ну и исторически LLaMA-2 Chat довольно новая штука, оригинальная Альпака например совсем никогда не отвечала на русском. А вот Викунья и Open Assistant вполне сносно отвечали и отвечают. Это зависит от наличия хотя бы пары примеров на русском в дообучении.

А про LoRA — да вполне можно. Просто обычно LoRA слои навешивают параллельно только линейным слоям из само-внимания, типа Q и K, и в таком случае модель действительно будет учиться преимущественно стилю. Однако ж никто не мешает добавлять их ко всем линейным слоям вообще.

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

А про пример:

Явных нет, есть неявные. В инструктивном наборе данных таких не было, потому что ChatGPT и GPT-4 такие не генерируют, как нет такого и в данных из Open Assistant. В данных для изначального обучения такое есть, но не очень много.

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

Information

Rating
Does not participate
Location
Amsterdam, Noord-Holland, Нидерланды
Date of birth
Registered
Activity