Многие поставщики моделей возвращают вероятности, сгенерированные их моделями, в виде лог-проб. Логарифмические вероятности (сокращение от логарифмических вероятностей) – это вероятности в логарифмической шкале. Логарифмический масштаб предпочтительнее при работе с вероятностями нейронной сети, поскольку он помогает уменьшить проблему переполнения. Языковая модель может работать с размером словарного запаса 100 000, а это означает, что вероятности для многих лексем могут быть слишком малы для представления машиной. Маленькие числа можно округлить до 0 в меньшую сторону. Логарифмическая шкала помогает уменьшить эту проблему.
Как вы увидите на протяжении всей книги, logprobs полезны для создания приложений (особенно для классификации), оценки приложений и понимания того, как модели работают под капотом. Однако многие поставщики моделей не предоставляют logprobs своих моделей, а если и предоставляют, то API logprobs ограничен. Ограниченный API logprobs, скорее всего, связан с причинами безопасности, так как открытые logprobs модели облегчают репликацию модели другими пользователями.
Top-k – это стратегия выборки, позволяющая снизить вычислительную нагрузку без чрезмерного ущерба для разнообразия откликов модели. Напомним, что слой softmax используется для вычисления распределения вероятностей по всем возможным значениям. Softmax требует двух проходов по всем возможным значениям: один для выполнения экспоненциальной суммы, а другой для вычисления каждого значения. Для языковой модели с большим словарным запасом этот процесс требует больших вычислительных ресурсов.
Чтобы избежать этой проблемы после того, как модель вычислила логиты, мы выбираем топ-k логитов и выполняем softmax только над этими топ-k логитами. В зависимости от того, насколько разнообразным должно быть ваше приложение, k может быть от 50 до 500, что намного меньше, чем размер словарного запаса модели. Затем модель выполняет выборку из этих верхних значений. Меньшее значение k делает текст более предсказуемым, но менее интересным, так как модель ограничена меньшим набором вероятных слов.
При выборке top-k количество рассматриваемых значений фиксируется равным k. Однако это число должно меняться в зависимости от ситуации. Например, задан вопрос «Вы любите музыку? Отвечайте только «да» или «нет». Количество рассматриваемых значений должно быть два: «да» и «нет». Учитывая вопрос «В чем смысл жизни?», количество рассматриваемых ценностей должно быть значительно больше.
Метод top-p, также известный как выборка ядра, позволяет более динамично выбирать значения для выборки. При выборке top-p модель суммирует вероятности наиболее вероятных следующих значений в порядке убывания и останавливается, когда сумма достигает p. Учитываются только значения в пределах этой совокупной вероятности. Общие значения для выборки top-p (ядра) в языковых моделях обычно находятся в диапазоне от 0,9 до 0,95. Например, значение top-p 0,9 означает, что модель будет учитывать наименьший набор значений, совокупная вероятность которых превышает 90 %.
Допустим, вероятности всех токенов такова, что если top-p равно 90%, то будут рассматриваться только «да» и «возможно», так как их совокупная вероятность больше 90%. Если top-p равно 99%, то рассматриваются «да», «возможно» и «нет».
В отличие от top-k, top-p не обязательно снижает вычислительную нагрузку softmax. Его преимущество заключается в том, что, поскольку он фокусируется только на наборе наиболее релевантных значений для каждого контекста, он позволяет выводам быть более контекстуально релевантными. Теоретически, похоже, что у выборки top-p нет особых преимуществ. Однако на практике выборка top-p доказала свою эффективность, что привело к росту ее популярности.
Связанная с этим стратегия выборки – min-p, в которой вы задаете минимальную вероятность того, что токен должен быть достигнут, чтобы его учитывали во время выборки.
Авторегрессионная языковая модель генерирует последовательности лексем, генерируя одну лексим за другой. Длинная последовательность вывода занимает больше времени, требует больше вычислительных ресурсов (денег) и иногда может раздражать пользователей. Мы можем захотеть задать условие, при котором модель должна остановить последовательность.
Один из простых способов – попросить модели прекратить генерацию после фиксированного количества токенов. Недостатком является то, что вывод, скорее всего, будет прерван на полуслове. Другой метод – использовать стоп-токены или стоп-слова. Например, можно попросить модель прекратить генерацию при обнаружении маркера конца последовательности. Условия остановки полезны для снижения задержек и затрат.
Недостатком ранней остановки является то, что, если вы хотите, чтобы модели создавали выходные данные в определенном формате, преждевременная остановка может привести к неправильному форматированию выходных данных. Например, если вы попросите модель создать JSON, ранняя остановка может привести к тому, что в выходном JSON будут отсутствовать такие вещи, как закрывающие скобки, что затруднит анализ созданного JSON.
В предыдущем разделе обсуждалось, как модель может сделать выборку для следующей лексемы. В этом разделе обсуждается, как модель может выполнять выборку всего выходного сигнала.
Одним из простых способов повысить качество ответов модели является вычисление времени тестирования: вместо создания только одного ответа на запрос вы создаете несколько ответов, чтобы увеличить вероятность хороших ответов. Одним из способов вычисления тестового времени является лучший из N методов, рассмотренных ранее в этой главе: вы случайным образом генерируете несколько выходных данных и выбираете тот, который работает лучше всего. Тем не менее, вы также можете более стратегически подходить к тому, как генерировать несколько выходных данных. Например, вместо того, чтобы генерировать все выходные данные независимо друг от друга, которые могут включать множество менее перспективных кандидатов, можно использовать поиск луча для генерации фиксированного числа наиболее перспективных кандидатов (луча) на каждом шаге генерации последовательности.
Простая стратегия повышения эффективности вычислений во время тестирования заключается в увеличении разнообразия выходных данных, поскольку более разнообразный набор вариантов с большей вероятностью приведет к появлению лучших кандидатов. Если вы используете одну и ту же модель для создания разных вариантов, часто рекомендуется варьировать переменные выборки модели, чтобы разнообразить ее выходные данные. Хотя обычно можно ожидать некоторого повышения производительности модели за счет выборки нескольких выходных данных, это дорого. В среднем, создание двух выходов стоит примерно в два раза дороже, чем создание одного.
В исследованиях ИИ время тестирования обычно используется для обозначения вывода, потому что исследователи в основном делают выводы только для проверки модели. Тем не менее, этот метод может быть применен к моделям в производстве в целом. Это вычисление во время тестирования, так как количество выходных данных, которые можно выбрать, определяется тем, сколько вычислительных ресурсов можно выделить для каждого вызова вывода.
Чтобы выбрать лучший выход, вы можете либо показать пользователям несколько выходных данных и позволить им выбрать тот, который лучше всего подходит для них, либо вы можете разработать метод выбора лучшего. Одним из методов выбора является выбор выходных данных с наибольшей вероятностью. Выходными данными языковой модели является последовательность лексем, и каждая лексема имеет вероятность, вычисленную моделью. Вероятность выхода – это произведение вероятностей всех токенов на выходе.
Рассмотрим последовательность лексем ["Я", "любовь", "еда"]. Если вероятность для "Я" равна 0,2, вероятность для "любовь" при "л" равна 0,1, а вероятность для "еда" при данных "л" и "любовь" равна 0,3, вероятность последовательности равна: 0,2 × 0,1 × 0,3 = 0,006. Математически это можно обозначить следующим образом: p(Я люблю еду) = p(I) × p(I | люблю) × p(еда | Я, любовь)
Помните, что проще работать с вероятностями на логарифмической шкале. Логарифм произведения равен сумме логарифмов, поэтому logprob последовательности лексем является суммой логпроба всех лексем в последовательности: logprob(Я люблю еду) = logprob(Я) + logprob(Я | люблю) + logprob(еда | Я, любовь). При суммировании более длинные последовательности, скорее всего, будут иметь меньший общий logprob (значения logprob обычно отрицательны, потому что log значений от 0 до 1 отрицательны). Чтобы избежать смещения в сторону коротких последовательностей, можно использовать среднее логарифмическое значение, разделив сумму последовательности на ее длину. После выборки нескольких выходных данных вы выбираете тот, у которого самый высокий средний logprob.
Другой метод выбора заключается в использовании модели вознаграждения для оценки каждого результата, как обсуждалось в предыдущем разделе. Вспомните, что и Stitch Fix, и Grab выбирают выходы, получившие высокие баллы по моделям вознаграждений или верификаторам. Компания Nextdoor обнаружила, что использование модели вознаграждения стало ключевым фактором в повышении производительности их приложения (2023 год).
OpenAI также обучила верификаторов, чтобы они помогали своим моделям выбирать лучшие решения математических задач. Они обнаружили, что использование верификатора значительно повысило производительность модели. Фактически, использование верификаторов привело к примерно такому же приросту производительности, как и увеличение размера модели в 3 раза. Это означает, что модель со 100 миллионами параметров, использующая верификатор, может работать наравне с моделью с 3 миллиардами параметров, которая не использует верификатор.
DeepMind также доказывает ценность вычислений во время тестирования, утверждая, что масштабирование вычислений во время тестирования (например, выделение большего количества вычислительных ресурсов для генерации большего количества выходных данных во время вывода) может быть более эффективным, чем масштабирование параметров модели. В той же статье задается интересный вопрос: если LLM разрешено использовать фиксированный, но нетривиальный объем вычислений во время вывода, насколько он может улучшить свою производительность в сложной задаче?
В эксперименте OpenAI выборка большего количества выходов привела к повышению производительности, но только до определенного момента. В этом эксперименте этот показатель составлял 400 выходов. Они предположили, что по мере увеличения числа выборочных выходов вероятность нахождения состязательных выходов, которые могут обмануть верификатора, также увеличивается. Однако эксперимент в Стэнфорде показал другой вывод. Установлено, что количество решенных задач часто увеличивается логарифмически по мере увеличения числа образцов от 1 до 10 000. Хотя интересно подумать о том, можно ли масштабировать вычисления во время тестирования до бесконечности, вряд ли кто-то в производственной среде сэмплирует 400 или 10 000 различных выходов для каждого входа. Стоимость будет астрономической.
Вы также можете использовать эвристики, специфичные для приложения, чтобы выбрать наилучший отклик. Например, если ваше приложение выигрывает от более коротких ответов, вы можете выбрать самого короткого кандидата. Если ваше приложение преобразует естественный язык в SQL-запросы, вы можете заставить модель продолжать генерировать выходные данные до тех пор, пока она не сгенерирует действительный SQL-запрос.
Одним из особенно интересных применений вычислений во время тестирования является преодоление проблемы задержки. Для некоторых запросов, особенно для цепочек мыслей, модели может потребоваться много времени для завершения ответа. Киттипат Кампа, руководитель отдела искусственного интеллекта в TIFIN, рассказал мне, что его команда просит свою модель генерировать несколько ответов параллельно и показывать пользователю первый ответ, который завершен и действителен.
Выбор наиболее распространенных выходных данных из набора выходных данных может быть особенно полезен для задач, в которых ожидаются точные ответы. Например, если дана математическая задача, модель может решить ее несколько раз и выбрать наиболее частый ответ в качестве окончательного решения. Аналогичным образом, для вопроса с несколькими вариантами ответов модель может выбрать наиболее часто встречающийся вариант вывода. Именно так поступил Google, оценивая Gemini по бенчмарку MMLU. Они отобрали 32 результата для каждого вопроса. Это позволило модели получить более высокий балл, чем тот, который был бы достигнут при использовании только одного результата на вопрос.
Модель считается устойчивой, если она не изменяет резко свои выходные данные с небольшими изменениями входных данных. Чем менее надежна модель, тем больше преимуществ дает выборка нескольких выходных данных. В одном проекте мы использовали искусственный интеллект для извлечения определенной информации из изображения продукта. Мы обнаружили, что для одного и того же изображения наша модель может считывать информацию только в половине случаев. Для второй половины модель говорила, что изображение слишком размытое или текст слишком мелкий для чтения. Однако, попробовав три раза с каждым изображением, модель смогла извлечь правильную информацию для большинства изображений.
Часто в продакшене требуются модели для генерации выходных данных в определенных форматах. Структурированные выходные данные имеют решающее значение для следующих двух сценариев:
1. Задачи, требующие структурированных результатов. Наиболее распространенной категорией задач в этом сценарии является семантический парсинг. Семантический синтаксический анализ включает в себя преобразование естественного языка в структурированный, машиночитаемый формат. Text-to-SQL – это пример семантического разбора, где выходными данными должны быть валидные SQL-запросы. Семантический парсинг позволяет пользователям взаимодействовать с API с помощью естественного языка (например, английского). Например, text-to-PostgreSQL позволяет пользователям запрашивать базу данных Postgres с помощью запросов на английском языке, таких как «Каков средний ежемесячный доход за последние 6 месяцев» вместо того, чтобы записывать это в PostgreSQL. Это пример запроса для GPT-4o на преобразование текста в регулярное выражение. Выходы являются фактическими выходами, сгенерированными GPT-4o. Другие категории задач в этом сценарии включают классификацию, в которой выходные данные должны быть допустимыми классами.
Задачи, выходные данные которых используются нижестоящими приложениями. В этом сценарии сама задача не нуждается в структурировании выходных данных, но, поскольку выходные данные используются другими приложениями, они должны быть доступны для анализа этими приложениями. Например, если вы используете модель искусственного интеллекта для написания электронного письма, само письмо не обязательно должно быть структурировано. Однако нижестоящему приложению, использующему этот адрес электронной почты, может потребоваться определенный формат, например документ JSON с определенными ключами.
К структурам, поддерживающим структурированные результаты, относятся руководство, планы, инструктор и llama.cpp. Каждый поставщик моделей также может использовать свои собственные методы для улучшения способности своих моделей генерировать структурированные выходные данные. OpenAI был первым поставщиком моделей, который внедрил режим JSON в свой API для генерации текста. Обратите внимание, что режим JSON API обычно гарантирует только то, что выходные данные являются допустимым JSON, а не содержимым объектов JSON. Допустимые в остальном сгенерированные JSON также могут быть усечены и, таким образом, не поддаются анализу, если генерация останавливается слишком рано, например, когда достигается максимальная длина выходного токена. Однако, если максимальная длина лексемы установлена слишком длинной, ответы модели становятся слишком медленными и дорогостоящими.
Вы можете управлять моделью для создания структурированных выходных данных на разных уровнях стека ИИ: подсказки, постобработка, вычисление тестового времени, ограниченная выборка и тонкая настройка. Первые три больше похожи на бинты. Они работают лучше всего, если модель уже довольно хорошо генерирует структурированные выходные данные и ее просто нужно немного подтолкнуть. Для интенсивной обработки необходим ограниченный отбор проб и тонкая настройка. Вычисления во время тестирования только что обсуждались в предыдущем разделе – продолжайте генерировать выходные данные, пока один из них не будет соответствовать ожидаемому формату. В этом разделе основное внимание уделяется остальным четырем подходам.
Подсказки – это первое направление действий для структурированных результатов. Вы можете поручить модели генерировать выходные данные в любом формате. Однако то, может ли модель следовать этой инструкции, зависит от способности модели следовать инструкциям и ясности инструкции. В то время как модели становятся все более хорошими в следовании инструкциям, нет никакой гарантии, что они всегда будут следовать вашим инструкциям. Несколько процентных пунктов неверных выходных данных модели все еще могут быть неприемлемыми для многих приложений.
О проекте
О подписке
Другие проекты