Что такое модель GPT?

Формально говоря, GPT — это Generative Pre-Trained Transformer (генеративный предобученный трансформер). Первые два слова говорят сами за себя: generative означает, что модель генерирует новый текст; pre-trained означает, что модель была обучена на больших объёмах данных. На чём мы сосредоточимся, так это на transformer-аспекте языковой модели — главном двигателе недавнего бума в области ИИ.

Что такое Трансформер (Transformer)?

Трансформер — это особый вид нейронной сети, модель машинного обучения (Machine Learning Model). Существует широкое разнообразие моделей, которые можно построить с использованием transformers: преобразование голоса в текст (voice-to-text), текста в голос (text-to-voice), текста в изображение (text-to-image), машинный перевод и многое другое. Конкретный вариант, на котором мы сосредоточимся и который лежит в основе таких инструментов, как ChatGPT, — это модель, обученная принимать фрагмент текста, возможно, даже с сопутствующими изображениями или звуком, а затем выдавать предсказание того, что будет дальше, в форме распределения вероятностей (probability distribution) по всем фрагментам текста, которые могут следовать.

Поначалу предсказание следующего слова может показаться отличной целью от генерации нового текста. Но как только у вас есть модель предсказания, один простой способ заставить её генерировать более длинный фрагмент — дать ей начальный кусок текста для работы, попросить предсказать следующее слово, взять случайную выборку из только что созданного распределения, а затем запустить всё снова, чтобы сделать новое предсказание на основе всего текста, включая то, что только что было добавлено. Этот процесс повторяющегося предсказания и выборки (sampling) — это, по сути, то, что происходит, когда вы взаимодействуете с ChatGPT и видите, как он выдаёт одно слово за раз.

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

Токены (Tokens)

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

To date, the cleverest thinker of all time was ...

Токенизация (tokenization) этих входных данных будет выглядеть так:

To| date|,| the| cle|ve|rest| thinker| of| all| time| was ...

Каждый из этих токенов затем ассоциируется с вектором (vector), то есть со списком чисел. Распространённая интерпретация этих вложенных чисел "Вложений" (embeddings) заключается в том, что координаты этих векторов, определенным образом кодируют значение каждого токена. Если думать об этих векторах как о координатах в некотором многомерном пространстве, слова со схожими значениями, как правило, попадают на вектора, близкие друг к другу в этом пространстве. Эти шаги являются этапами предварительной обработки (pre-processing), которые происходят до того, как что-либо попадает в сам трансформер.

"Блок Внимания" (Attention Block)

Затем закодированные вектора проходят через Блок Внимания, где они взаимодействуют друг с другом, чтобы обновить свои значения на основе контекста. Например, значение слова model во фразе "a machine learning model" отличается от его значения во фразе "a fashion model". Блок Внимания отвечает за выяснение того, какие слова в контексте релевантны для обновления значений других слов и как именно эти значения должны быть обновлены.

Многослойный распознаватель / Многослойный перцептрон (слой прямого распространения / Полносвязный слой) - (англ. Multilayer Perceptron, Feed-Forward Layer)

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

После этого векторы проходят через другой Блок Внимания, затем через другой блок Многослойного распознавателя, затем через другой Блок Внимания и так далее, изменяясь множеством вариантов этих двух операций, чередующихся друг с другом. Большое количество таких слоёв (layers) — это то, что делает глубокое обучение (deep learning) «глубоким». С вычислительной точки зрения, все операции в обоих блоках будут выглядеть как гигантская куча матричных умножений (matrix multiplications), и нашей целью будет понять, как читать лежащие в основе матрицы.

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

Какова распространённая интерпретация координат векторов, связанных с токенами?

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

Предпосылки Глубокого обучения (Deep Learning)

Машинное обучение (Machine learning), в широком смысле, описывает совокупность методов, где используются данные для определения поведения программы, в противовес полному доверию на явно закодированный набор правил. Например, чтобы написать функцию, которая принимает изображение и выдаёт метку (label), вместо явного определения процедуры для этого в коде, модель машинного обучения будет состоять из гибких параметров (parameters), которые определяют её поведение, как набор ручек и регуляторов. Работа инженера заключается не в установке этих регуляторов, а в определении процедуры настройки этих параметров на основе данных. Например, программа маркировки изображений (image-labeling) может быть обучена с использованием большого набора изображений с связанным текстовым описанием.

Например, простейшей формой машинного обучения может быть линейная регрессия (linear regression), где входные и выходные данные (inputs and outputs) представляют собой отдельные числа, такие как площадь дома в квадратных футах и его цена. Линейная регрессия находит линию наилучшего соответствия (line of best fit) через данные для предсказания будущих цен на дома. Эта линия определяется двумя параметрами: наклоном (slope) и точкой пересечения с осью Y (y-intercept), которые настраиваются для наиболее точного соответствия данным. Затем для будущих домов с неизвестными ценами прогнозируемая цена будет определяться на основе значения этой линии для данной площади.

Глубокое обучение — это подобласть машинного обучения (Machine Learning), сосредоточенная на определённой категории моделей, известных как нейронные сети / нейросети (Neural Networks). Излишне говорить, что они могут стать значительно сложнее, чем простой пример линейной регрессии. GPT-3, например, имела поразительные 175 миллиардов параметров. Однако простое наделение модели огромным количеством параметров не гарантирует, что она будет работать лучше. Модели в таких масштабах рискуют быть либо совершенно неподдающимися обучению (intractable to train), склонными к переобучению (overfitting), либо и тем, и другим.

Некоторые модели глубокого обучения демонстрируют замечательное увеличение возможностей по мере того, как размер модели и данных, на которых она обучается, масштабируются до огромных размеров. Они обучаются с использованием алгоритма, называемого "методом обратного распространения" или "обратное распространение ошибки" (backpropagation), но для того, чтобы этот алгоритм хорошо работал в масштабе, эти модели должны придерживаться определённого формата. Понимание этого формата поможет объяснить многие выборы в том, как трансформеры обрабатывают язык — выборы, которые в противном случае могут показаться произвольными.

Во-первых, входные данные модели должны быть отформатированы как массив (array) действительных чисел. Это может просто означать список чисел, двумерный массив (2D array) или часто массивы более высокой размерности (higher-dimensional arrays), где общий термин, используемый здесь, — Тензор / "Многомерный массив" (tensor). Входные данные постепенно преобразуются во множество различных слоев, всегда структурированных как некий массив чисел, пока не достигнут финального слоя в качестве выходных данных. Например, финальный слой в нашей модели предсказания следующего токена (next-token-prediction model) — это распределение вероятностей по всем возможным следующим токенам.

В глубоком обучении, параметры модели почти всегда называются "Весами" (weights), потому что в основном единственный способ их взаимодействия с обрабатываемыми данными — это взвешенные суммы (weighted sums). Обычно вы найдёте Веса, упакованные вместе в матрицы (matrices), и вместо того, чтобы видеть взвешенные суммы, явно записанные в математике такой модели, вы видите только произведения матричных векторов. Это представляет ту же идею, поскольку каждый компонент в выходных данных произведения матричных векторов выглядит как взвешенные суммы, просто часто концептуально проще думать о матрицах, заполненных настраиваемыми параметрами (tunable parameters), преобразующих вектора, извлечённые из обрабатываемых данных.

Чтобы предотвратить линейность всей модели, обычно также существуют некоторые нелинейные функции (nonlinear functions), разбросанные между этими произведениями матричных векторов, такие как операция "Софтмакс" (softmax), пример которой показан в конце статьи.

Например, 175 миллиардов весов в GPT-3 организованы в чуть менее 28 000 различных матриц. Эти матрицы делятся на 8 различных категорий, и мы пройдёмся по каждому типу, чтобы понять, что он делает. По ходу будет интересно ссылаться на числа из GPT-3, чтобы точно подсчитать, откуда берутся все эти 175 миллиардов параметров. Существует риск потеряться в огромном количестве чисел, и в надежде добавить ясности мы проведём чёткое различие между весами модели, окрашенными в синий или красный цвет, и обрабатываемыми данными (data being processed), окрашенными в серый цвет. Веса — это настоящие мозги модели, изученные во время обучения (training) и определяющие её поведение. Обрабатываемые данные кодирует любые конкретные входные данные, который были переданы в модель, например: фрагмента текста.

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

Вложения (Embedding)

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

Вложенные матрицы (Embedding Matrix)

Модель имеет предопределённый словарь (vocabulary), некий список всех возможных слов, скажем, 50 000 из них. Первый матричный трансформер (matrix transformer), известный как вложенная матрица (embedding matrix), будет иметь один столбец (column) для каждого из этих слов. Эти столбцы определяют, в какой вектор превращается каждое слово на этом первом шаге. Мы обозначим её как W_E, и, как и все матрицы, которые мы увидим, её значения начинаются случайными, но они будут изучены на основе данных.

Превращение слов в вектора было обычной практикой в машинном обучении задолго до трансформеров. Их часто называют вложенными словами, и предлагается воспринимать эти вектора, как направлениях (directions) в некотором пространстве. Визуализация списка из трёх чисел как координат точки в трёхмерном пространстве (3D space) не проблема, но вложения слов, как правило, очень многомерны (high dimensional). Для GPT3 они имеют 12,288 измерений, и, как вы увидите, важно работать в пространстве с множеством различных направлений.

Так же, как вы можете взять двумерный срез (2D slice) через 3D пространство и спроецировать точки на этот срез, для визуализации вложения слов мы сделаем что-то аналогичное, выбрав трёхмерный срез через очень многомерное пространство (high-dimensional space), спроецировав на него словесные вектора и отобразив результат.

Направление (Direction)

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

Другой классический пример этого — когда берётся разность между векторами для "женщины" (woman) и "мужчины" (man), которую можно визуализировать как вектор в этом пространстве, соединяющий вектор от одного вектора к другому. Эта разность очень похожа на разность между "король"(king) и "королева" (queen). Таким образом, если бы слово для женского монарха было неизвестно, его можно было бы найти, взяв "король", добавив направление "женщина" (woman) минус "мужчина" (man) и выполнив поиск ближайшего вложенного слова.

Несмотря на то, что это классический пример, для модели, с которая продемонстрирована в видео, истинная "вложенная королева" (embedding queen) немного дальше, чем предполагает разность, предположительно потому, что способ использования "королева" в тренировочных данных — это не просто женская версия "короля". Семейные отношения иллюстрируют эту идею лучше:

Идея здесь в том, что кажется, будто во время обучения модель нашла выгодным выбрать вложения таким образом, чтобы одно направление в этом пространстве кодировало информацию о поле (gender information).

Скалярное произведение (Dot Product)

Одна часть математической интуиции, полезная для понимания, — это как скалярное произведение (dot product) двух векторов можно рассматривать как измерение того, насколько хорошо они выравниваются (align). С вычислительной точки зрения, скалярное произведение включает умножение всех выравнивающихся компонентов и сложение результата. Геометрически скалярное произведение положительно, когда вектор указывают в схожем направлении, равен нулю, если они перпендикулярны, и отрицателен, когда они указывают в противоположные направления.

Например, предположим, мы хотели проверить, представляет ли вложение "коты" минус вложение "кот" своего рода направление множественности (plurality direction) в этом пространстве. Чтобы проверить это, вы можете взять скалярное произведение между этим вектором и различными существительными в единственном и множественном числе (singular and plural nouns). Оказалось, что множественные формы действительно получают последовательно более высокие значения, чем единственные. Также, взяв это скалярное произведение с вложениями слов "один", "два" и тд они дают возрастающие значения, как будто их количественно измеряют.

Опять же, то, как конкретно каждое слово встраивается (embedded), изучается с использованием данных. Вложенная матрица, столбцы которой хранят вложения каждого слова, является первым параметром - Весом в нашей модели. Используя числа GPT-3, размер словаря составляет 50,257, и, опять же, технически это состоит не из слов как таковых, а из различных маленьких фрагментов текста, называемых токенами. Многомерность вложений составляет 12,288, что даёт нам в общей сложности 617,558,016 Весов для этого первого шага. Давайте добавим это к нашему текущему подсчёту (running tally), помня, что к концу мы должны досчитать до 175 миллиардов Весов.

В пространстве векторов, представляющем значения, какой из следующих, как вы ожидаете, будет ближе всего к вектору Embedding(Cat) - Embedding(Meow) + Embedding(Bark) ?

В этом векторном пространстве Embedding(Cat) - Embedding(Meow) представляет своего рода направление звука. Животное, которое чаще всего издаёт звук лая — это собака.

За словами (Beyond words)

В случае трансформеров мы также хотим думать о векторах в этом пространстве вложений не просто как представляющих отдельные слова. Во-первых, эти вложения также будут кодировать информацию о позиции слова (position of the word), но, что более важно, они должны иметь способность впитывать контекст.

Например, вектор, который начал свою жизнь как вложение слова "король" (king), может постепенно перетягиваться и притягиваться различными блоками в сети, чтобы в конечном итоге указывать в гораздо более нюансированном направлении, которое неким образом кодирует короля, который жил в Шотландии, который достиг своего поста после убийства предыдущего короля, который описывается на языке Шекспира, и так далее.

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

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

Сеть может смотреть только на фиксированное количество векторов одновременно, известное как её размер контекста (context size). GPT-3 была обучена с размером контекста 2048 токенов. Таким образом, данные, протекающие через сеть, будут выглядеть как этот array из 2048 столбцов, каждый из которых имеет около 12тыс. измерений. Этот размер контекста ограничивает количество текста, которое трансформер может включить для своего предсказания следующего слова, поэтому длинные разговоры с ранними версиями ChatGPT часто создавали ощущение, что бот теряет нить разговора.

Обратное преобразование вложения / Обратное преобразование эмбеддинга

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

Например, если последнее слово — "Профессор", и контекст включает слова вроде "Гарри Поттер", а непосредственно предшествующее — "не любимый", и если мы делаем вид, что все токены выглядят как полные слова, хорошо обученная сеть, предположительно, присвоила бы высокое число слову Снейп (Snape).

Матрица обратного внедрения (Unembedding Matrix)

Этот процесс включает два шага. Первый — использовать другую матрицу, которая отображает (maps) самый последний вектор в контексте в список из примерно 50,000 значений, по одному для каждого токена в словаре, затем есть функция, которая нормализует это в распределение вероятностей, называемая "softmax".

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

Матрице обратного внедрения "матрица ОВ" мы дадим обозначение W_U. Опять же, как и все Весы матриц, которые мы увидим, её элементы (entries) начинаются случайными, но настраиваются (tuned) во время процесса обучения.

Ведя счёт общему количеству параметров, матрица ОВ имеет одну строку (row) для каждого слова в словаре, что даёт 50,257 слов, и каждая строка имеет такое же количество элементов, как многомерность вложения, что даёт 12,288 столбцов. Она очень похожа на матрицу вложения, только с перевёрнутыми размерами строк и столбцов, поэтому она добавляет ещё 617 млн. параметров к сети, доводя наш счетчик параметров до чуть более миллиарда; небольшая, но не незначительная часть от 175 миллиардов, с которыми мы в итоге закончим.

Если модель имеет предопределённый словарь из 32,000 токенов, а размерность матрицы эмбеддинга составляет 10,000, матрица анэмбеддинга имеет:

Поскольку размерность, в которой существует матрица эмбеддинга, составляет 10,000, матрица эмбеддинга должна иметь 10,000 строк. Тогда матрица эмбеддинга должна иметь 32,000 столбцов, по одному для каждого токена.

Матрица анэмбеддинга похожа на матрицу эмбеддинга, но размерности строк и столбцов меняются местами, что даёт 32,000 строк и 10,000 столбцов.

"Софтмакс" (Softmax)

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

Софтмакс превращает произвольный список чисел в "правильное распределение" (valid distribution) таким образом, что наибольшие значения оказываются ближе всего к 1, а меньшие значения оказываются ближе к 0.

Принцип работы заключается в том, что сначала возводится Е в степень каждого числа, что даёт набор положительных значений. Затем вы берёте сумму всех этих новых элементов (terms) и делите каждый элемент на эту сумму, что нормализует её в список, который в сумме даёт 1.

Причина, по которой это называется софтмакс, заключается в том, что вместо простого извлечения наибольшего значения (pulling out the biggest value), оно производит распределение, которое придаёт Вес всем относительно большим значениям, соразмерно тому, насколько они велики. Если одно значение во входных данных намного больше остальных, соответствующие выходные данные будет очень близки к 1, поэтому выборка (sampling) из распределения, вероятно, будет таким же, как просто выбор максимизирующего индекса (maximizing index) из входных данных.

В некоторых случаях, например, когда ChatGPT использует это распределение для выборки каждого следующего слова, мы можем добавить немного дополнительной остроты (spice) в эту функцию софтмакс с константой T, вставленной во все эти экспоненты (exponents). Она называется температурой (temperature), поскольку она смутно напоминает роль температуры в определённых термодинамических уравнениях. Эффект этой константы заключается в том, что когда T больше, больший вес придаётся меньшим значениям, делая распределение более равномерным (uniform). Когда T меньше, большие значения будут доминировать в распределении, и в экстремальной настройке, когда T равно 0, весь вес идёт на максимальное значение.

Заключение

В данной статье мы заложили фундаментальные основы для понимания архитектуры трансформеров — технологии, которая произвела революцию в области обработки естественного языка и стала движущей силой современного бума искусственного интеллекта. Мы проследили путь данных от исходного текста через процесс токенизации и вложения(эмбеддинга) до финального предсказания следующего слова, получив целостное представление о том, как работают такие системы, как ChatGPT.

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

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

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

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

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

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

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

Комментарии (0)