24 августа компания META выпустила Code Llama – модель искусственного интеллекта, созданную на основе Llama 2 для создания и обсуждения кода. Эта модель доступна по той же общественной лицензии, что и Llama 2, что делает ее бесплатной как для коммерческого, так и для исследовательского использования.

В то время как многие технологические гиганты ревностно охраняют секретный соус своих моделей большого языка (LLM), Meta придерживается другого подхода. Они решили не только поделиться кодом своей новаторской модели Llama 2, но и выпустить Code Llama.Марк Цукерберг, генеральный директор Meta, подчеркнул важность открытого исходного кода в сообщении на Facebook: заявляя: «Открытый исходный код стимулирует инновации, потому что он позволяет гораздо большему количеству разработчиков создавать новые технологии. Это также повышает безопасность и защищенность, поскольку, когда программное обеспечение открыто, больше людей могут изучить его, чтобы выявить и устранить потенциальные проблемы».

И наоборот, среди технологов растет беспокойство по поводу потенциальных рисков, связанных с высокоинтеллектуальным ИИ. Существуют опасения по поводу гипотетических сценариев конца света, когда ИИ может превзойти человеческий интеллект, что приведет к катастрофическим последствиям, таким как выпуск биологического супероружия или другой невообразимый хаос. По этому поводу соучредитель OpenAI Илья Суцкевер ранее в этом году прокомментировал The Verge, заявив, что его компания «совершенно ошибалась» в своем предыдущем открытом подходе. Он предупредил об опасности делиться подробностями о высокоразвитых моделях, особенно если мы когда-нибудь достигнем стадии Общего искусственного интеллекта (AGI).

Теперь давайте углубимся в секретный соус…

Обзор процесса обучения:

Первоначальная настройка и базовое обучение (Base Training) — шаг 1

Отправная точка:

Этот подход следует за обучением кода на основе базовых моделей (Llama 2), аналогичных Кодексу (Chen et al., 2021).

Набор данных:

Code Llama преимущественно обучается на практически дедуплицированном наборе данных общедоступного кода, состоящего из 500 миллиардов токенов на начальном этапе. Набор данных также содержит 8% образцов из наборов данных естественного языка, связанных с кодом. Набор данных также содержит 7% кода общих данных на естественном языке. Это сделано для того, чтобы модель сохранила свои возможности понимания естественного языка.

Токенизатор:

Данные маркируются с использованием кодирования пар байтов (BPE, Senrich et. al, 2016), аналогично Llama и Llama 2.

Краткий обзор BPE (Интуиция):

Понятия, связанные с BPE:

  • Словарь. Набор подслов, которые можно использовать для представления корпуса текста.
  • Байт. Единица цифровой информации, обычно состоящая из восьми бит.
  • Символ. Символ, представляющий собой письменную или печатную букву или цифру.
  • Частота. Сколько раз байт или символ встречается в текстовом корпусе.
  • Объединение. Процесс объединения двух последовательных байтов или символов для создания нового подслова.

Предположим, у нас есть строка

aaabdaaabac

Пара байтов «аа» встречается чаще всего. Таким образом, он заменяется другим отсутствующим байтом, например «Z».

ZabdZabac
Z = aa

Данные можно дополнительно сжать, например, используя ab = Y.

ZYdZYac
Z = aa
Y = ab

Гиперпараметры:

  • Функция оптимизатора:
    AdamW (Лощилов и Хаттер, 2019)
  • Значения β:
    β1: 0,9
    β2: 0,95
  • Размер пакета:
    4 миллиона токенов
    Представлено в последовательностях по 4096 штук.
  • Скорость обучения:

A. Начальное базовое обучение:
Косинусный график с 1000 разминочными шагами
Конечная скорость обучения установлена ​​на уровне 1/30 пиковой скорости обучения.

B. Для точной настройки (то же, что и в Llama и Llama 2):
Модель на 13 миллиардов параметров: 3e-4
Модель на 34 миллиарда параметров: 5e-4

Решение проблем с заполнением языковых моделей:

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

Введите код Лама. В ее рамках решение сформулировано как Code Infilling — стратегическая задача, направленная на прогнозирование отсутствующих сегментов программы при наличии ее контекстного окружения. Это не просто теоретическая концепция; он находит реальные приложения, такие как помощь в завершении кода прямо там, где мигает курсор в IDE кода, помощь в выводе типа и даже облегчение создания документации в коде.

Углубляясь в механику обучения, документы анализируются на уровне персонажей. Они разделены на три отдельные части: префикс, среднюю часть и суффикс. Эти точки разделения не произвольны; они выбираются независимо от равномерного распределения по всей длине документа. Чтобы добавить элемент случайности и разнообразия, данные затем разбиваются на две структуры: формат префикс-суффикс-середина (PSM) и его аналог, формат суффикс-префикс-середина (SPM).

Жаждете более глубокого погружения? Я бы рекомендовал углубиться в эту потрясающую статью для всестороннего понимания.

Точная настройка кода Python – шаг 2

Модель Code Llama — Python сталкивается с дополнительным набором точной настройки для задач, связанных с Python, в приведенных ниже данных обучения.

Длинная настройка контекста — шаг 3

Императив длинной настройки контекста в Code Llama:

Точная настройка длительного контекста — это не просто модный термин; это типичный компонент любой продвинутой языковой модели, такой как Code Llama. Но чем обусловлена ​​его необходимость?

  1. Экстраполяция. По сути, речь идет о прогнозировании длины последовательности, выходящей за рамки того, что можно увидеть во время обучения. Это похоже на подготовку ученика не только к вопросам в учебнике, но и к невидимым вопросам, которые могут возникнуть на экзамене. Чтобы глубже изучить этот аспект, я бы порекомендовал эту содержательную статью из Университета Торонто под названием Изучение обобщения длины в больших языковых моделях.
  2. Проблемы сложности с вниманием. Квадратичная сложность механизмов внимания — это не просто теоретическая проблема; это практически смещает модель в сторону обучения на входных данных короткой и средней длины. Если у вас есть тяга к строгим математическим доказательствам, подчеркивающим этот момент, есть авторитетная статья Нью-Йоркского университета, которая может показаться вам интригующей: О вычислительной сложности самосознания.

Code Llama использует специальный этап тонкой настройки длинного контекста, на котором модели представлены последовательностями из 16 384 токенов по сравнению с 4096 токенами, используемыми для Llama 2 и наших начальных этапов обучения кода. Используемый подход аналогичен точной настройке посредством позиционной интерполяции.

Позиционная интерполяция — интуиция:

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

Теперь «позиционная интерполяция» является более продвинутой концепцией. Вместо использования фиксированных позиционных кодировок, как в обычных моделях преобразователей, позиционная интерполяция предполагает корректировку этих кодировок в процессе обучения.

Представьте себе два отдельных предложения или последовательности. Во время обучения вместо того, чтобы подавать эти последовательности независимо, мы комбинируем их. Теперь задача состоит в том, как присвоить этой объединенной последовательности позиционные кодировки. Здесь в игру вступает интерполяция: мы интерполируем позиционные кодировки двух исходных последовательностей, чтобы создать кодировки для объединенной последовательности.

По сути, позиционная интерполяция помогает модели понимать и адаптироваться к различным длинам и структурам последовательностей. Это особенно полезно при точной настройке моделей в более длинных контекстах или при попытке обобщить последовательности различной длины.

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

Точная настройка инструкций – шаг 4

Модель обучается на разных наборах данных:

  1. Собственный набор данных – мы используем набор данных по настройке инструкций, собранный для Llama 2 и подробно описанный Тувроном и др. (2023б). В частности, мы используем версию, названную в их статье как «RLHF V5», собранную на нескольких этапах обучения с подкреплением на основе обратной связи человека и аннотации обратной связи человека (более подробную информацию см. в разделе 3). Он сочетает в себе тысячи примеров контролируемой точной настройки и миллионы примеров отклонения выборки. Каждый пример состоит из многоэтапного диалога между пользователем и помощником. Для выборки отклонений выходные данные выбирались из нескольких поколений с использованием модели вознаграждения. Окончательный набор данных содержит данные как о полезности, так и о безопасности. Это позволяет Code Llama наследовать следование инструкциям и свойства безопасности Llama 2.

2. Самообучение. Наш собственный набор данных содержит несколько примеров задач, связанных с кодом. Сбор контролируемых данных от людей-аннотаторов или обучение на основе отзывов людей (Ouyang et al., 2022) является дорогостоящим для задач кодирования, поскольку требует участия профессиональных разработчиков. Вместо обратной связи от человека мы используем обратную связь при выполнении для выбора данных для обучения нашей модели инструкций. Мы создаем набор данных для самообучения, следуя приведенному ниже рецепту, в результате чего получается ~ 14 000 троек вопросов-тестов-решений:

  1. Сгенерируйте 62 000 вопросов по программированию в стиле интервью, используя подсказки (рис. 9) Llama 2 70B.
  2. Устраните дублирование набора вопросов, удалив точные дубликаты, в результате чего получится около 52 000 вопросов.

3. По каждому из этих вопросов:

(a) Создайте модульные тесты, запустив Code Llama 7B (рис. 10)
(b) Создайте десять решений Python, запустив Code Llama 7B (рис. 11) (c) Запустите модульные тесты для десяти решений.

Добавьте первое решение, прошедшее тесты (вместе с соответствующими вопросами и тестами), в набор данных для самообучения.

Мы используем Code Llama 7B для создания тестов и решений Python, поскольку мы считаем, что это более эффективно, чем генерирование меньшего количества решений на вопрос с помощью модели 34B при том же бюджете вычислений.

3. Репетиция —Чтобы предотвратить регресс модели в отношении общих возможностей кодирования и понимания языка, Code Llama — Instruct также обучается с использованием небольшой части данных из набора данных кодирования (6%) и нашего набора данных естественного языка (2 %).

Процесс обучения завершен, и нам осталось:

1. Код Лама - (7, 13, 34 миллиарда параметров)

2. Код Лама — Инструкт (7, 13, 34 миллиарда параметров)

3. Код Llama — Python (7, 13, 34 миллиарда параметров)

Бонус: что скрывает МЕТА в статье?

Неестественная модель —Код Llama — Python 34B, настроенный на 15 000 неестественных инструкций, аналогично Honovich et al. (2023) с использованием тех же подсказок, что и для набора данных для самообучения. Эта модель не выпущена, но демонстрирует явные улучшения по сравнению с HumanEval и MBPP, что свидетельствует об улучшениях, которых можно достичь с помощью небольшого набора высококачественных данных кодирования.

Это единственное упоминание о модели в статье.

Результаты:

Значение специализации. Очевидно, что оттачивание фокуса приносит дивиденды. Переходя от Llama2 к Code Llama и далее доводя до Code Llama Python, мы наблюдаем заметное улучшение возможностей генерации кода.

Появление неестественного: введите неестественный код Llama, модель, доработанную на основе набора данных «Неестественные инструкции», начиная с базы кода Llama Python. Хотя этот новый участник затмевает своих предшественников из линии Llama, он не совсем догнал GPT-4.

Сила масштабирования специализированных моделей. По мере углубления специализации и увеличения размера модели (измеряемого в параметрах) производительность заметно возрастает. Чем больше, тем лучше.

Многоязычное мастерство: Code Llama напрягает свои силы и опережает Llama2 во всем спектре языков: Python, Java, C++, C#, TS и PHP. Интересное наблюдение: Code Llama — Python немного уступает обычному Code Llama.

Принятие цели «Заполнить середину». Хотя введение этой цели приводит к незначительному падению производительности, оно открывает множество новых вариантов использования, делая компромисс оправданным.

Исследование долгосрочных контекстных оценок: команда META внимательно изучила Code Llama, проведя пару углубленных тестов:

  1. Недоумение во время экстраполяции: Судя по предоставленным данным, наблюдается постоянное снижение недоумения вплоть до отметки в 16 тыс. токенов, что свидетельствует об способности модели к экстраполяции в длинном контексте. Однако после порога в 100 тысяч токенов наблюдается всплеск недоумения.
  2. Анализ извлечения ключей. В этом эксперименте модели передается объемный кусок синтетически сгенерированного кода Python, встроенного в определенную функцию. Задача модели? Чтобы точно распознать и объявить значение, возвращаемое этой функцией.