February 6

Большие языковые модели. База

Как текст превращается в числа

По-разному. Самый простой способ – «мешок слов» (Bag of Words). Вот как это работает:

  1. Берём очень много текстов.
  2. Собираем список всех слов, которые там встречаются хотя бы раз.
  3. Для каждого текста считаем, сколько раз каждое слово в нём встретилось.
  4. Сохраняем полученную информацию: «слово1: 3 раза, слово2: 0 раз, слово3: 1 раз и так далее» – это словарь модели.

То есть, для каждого слова у нас есть вектор вида [1, 0, 0, 3], что значит "в первом предложении слово встретилось один раз, во втором не встретилось – и так далее."

Проблемы:

  • Если слова нет в словаре, у него нет такого вектора, и модель не сможет с ним никак работать;
  • В словаре нет никакой информации о смысловой связи слов;
  • Порядок слов в предложении игнорируется.

Поэтому разработали более умные вложения (Word2Vec, GloVe и др.). Используя их, модель сама подбирает такие векторы (по одному на целое слово), чтобы слова со схожим смыслом были ближе друг к другу геометрически.

Проблемы:

  • Если в словаре нет слова, оно всё ещё никак не будет обработано;
  • Порядок слов? Ничего не знаем про порядок слов.

Современные большие языковые модели используют другой подход – токенизацию по частям (Byte-Pair Encoding, BPE).

Преимущества:

  • В словаре хранится не каждое слово целиком, а только наиболее часто встречающиеся кусочки слов;
  • Поэтому любое новое слово можно собрать из кусочков!

Важно помнить: модель работает не со словами или буквами, а с кусочками слов, превращёнными в векторы. Почему конкретное слово разбилось на кусочки именно так? Мы не знаем, так вышло.

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

Что такое «веса модели»

Модель состоит из слоёв. Каждый слой – это, грубо говоря, сложная формула с кучей коэффициентов.

Векторы, в которые превратился текст, проходят сначала через одну формулу, потом через другую – и так до конца. В конце получившиеся новые векторы преобразуются снова в текст.

Коэффициенты формул – это и есть веса модели. В процессе обучения они немного уменьшаются или увеличиваются в зависимости от того, какая получилась ошибка. Насколько хорош будет текст, зависит от того, как точно подобраны веса.

Трансформеры

Языковые модели, которыми мы сегодня пользуемся – трансформеры. Так называется архитектура, то есть, набор компонентов, из которых они состоят. Ключевая фишка трансформеров – внимание.

Внимание – это тоже математика. Набор матриц, на которые умножается наш текст (точнее, то, во что он превратился). Матрицы так устроены, что там где-то побольше числа, где-то поменьше, и в итоге после перемножения от текста остаются фрагменты. Мы говорим, что «внимание сфокусировано на этих фрагментах» или «эти фрагменты более важны / имеют больший вес». Матриц несколько, и каждая «фокусируется» на своём участке текста – так можно выделить нюансы смысла и связь отдельных слов в предложении.

Зачем вам это знать?

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

Из-за того, что в процессе обучения использован нечеловечески огромный массив текстов, мы понятия не имеем, что там оказалось: у нас просто нет возможности их все перечитать и проверить. Там философские трактаты, поэмы Пушкина, конспирологические теории, ругань из соцсетей? Вероятнее всего, всё всместе, но в каких пропорциях, никому не известно.

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

Добросовестные разработчики также стараются в процессе дообучения настроить модель так, чтобы влияние Твиттера было поменьше, а Пушкина – побольше. Есть даже разные работы, авторы которых стараются вычистить влияние Твиттера совсем, но это крайне трудно и приводит к неожиданным побочным эффектам (например, вместе с Твиттером вычищается и Пушкин).

К слову, когда мы говорим что-то вроде: «Давайте уберём Твиттер из памяти модели», мы имеем в виду примерно следующее: «Из-за того, что в тренировочных данных были посты из Твиттера, какие-то веса модели как-то изменились, и теперь она пишет тексты, полные ненависти к темнокожим и женщинам. Давайте попробуем выяснить, какие примерно это были веса, и как-то их скорректировать, чтобы модель генерировала приличный текст.» То есть, «память» – это не хранилище с фактами, а веса. Хранилище мы можем отдельно к модели присоединить: например, можем дать ей доступ к папке с файлами на компьютере, в самом простом варианте. Но исходно такого хранилища у неё нет.

Итак, зачем?

Наш язык так устроен, что мы говорим: «Модель сделала», «Модель написала», «Нейросеть решила» и всё такое. И это заставляет нас думать, что модель как бы сама ответственна за свой текст – но мы не должны этому поддаваться.

  • Люди создали архитектуру;
  • Люди набрали текстов;
  • Люди провели предварительное обучение, затем дообучение;
  • Люди тестировали модель (надеюсь);
  • Люди решили: «Всё, запускаем».

За каждым генерируемым моделью токеном стоит человек, который принимал решения. Ответственность всегда лежит на человеке.

Всего предусмотреть невозможно

Даже у самых ответственных разработчиков вылезут ошибки. Но ответственные разработчики не будут говорить: «Ой это наш ИИ, это не мы,» – ответственные разработчики будут стараться исправить свои ошибки, сгладить нанесённый ущерб и не будут спихивать с себя ответственность.

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