Как устроен ChatGPT? Полное погружение в принципы работы и спектр возможностей самой известной нейросети в мире - Стивен Вольфрам. Страница 11


О книге
изображение одного блока внимания (для GPT-2):

Внутри каждого такого блока внимания есть набор так называемых голов внимания (англ. attention heads) – 12 штук для GPT-2 и 96 для GPT-3, – каждая из которых работает независимо друг от друга с разными фрагментами значений в векторе эмбеддинга. (При этом мы не знаем, почему разделение вектора эмбеддинга было хорошей идеей и что означают разные его части, – это просто работает.)

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

На более детальном уровне голова внимания комбинирует фрагменты с определенными весами в векторах эмбеддинга, связанными с различными токенами. Так, например, 12 голов внимания в первом блоке внимания (в GPT-2) имеют следующие шаблоны весов рекомбинации («оглянись-в-начало-последовательности-токенов») для строки «hello… bye», приведенной выше:

После обработки головой внимания полученный повторно взвешенный вектор эмбеддинга (длиной 768 значений для GPT-2 и 12 288 для GPT-3) передается через стандартный «полностью подключенный» слой нейронной сети. Нам трудно разобраться в том, что делает этот слой. Но вот ниже представлен график матрицы весов размером 768 × 768, которую он использует (здесь он изображен для GPT-2):

Если принять во внимание скользящие средние [4] 64 × 64, то начинает вырисовываться немного рандомная структура:

Что определяет эту структуру? Скорее всего, это некое «нейросетевое кодирование» особенностей человеческого языка. Но на данный момент нам пока неизвестно, что это могут быть за особенности. По факту мы как будто вскрыли мозг ChatGPT (или, по крайней мере, GPT-2) и обнаружили, что здесь все очень сложно и ничего толком непонятно, даже если самому ChatGPT удается создавать узнаваемый человеческий язык.

Итак, пройдя через один блок внимания, мы получаем новый вектор эмбеддинга, который затем последовательно проходит через дополнительные блоки (всего 12 блоков для GPT-2, 96 для GPT-3). Каждый блок имеет собственный особый паттерн внимания и полностью подключенных весов. Так выглядит последовательность весов внимания первого блока GPT-2 для строки «hello… bye»:

А вот скользящие средние матрицы для полностью связанных слоев:

Любопытно, что, хотя эти матрицы весов в разных блоках внимания выглядят довольно похоже, распределение размеров весов может несколько отличаться (и не всегда происходит по Гауссу):

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

Вот в общих чертах то, что происходит внутри ChatGPT. Все это может показаться сложным (не в последнюю очередь из-за множества несколько произвольных «инженерных решений»), но на самом деле задействованные базовые элементы удивительно просты. Потому что, в конце концов, мы имеем дело лишь с нейронной сетью, состоящей из искусственных нейронов, каждый из которых выполняет простую операцию по получению набора числовых входных данных, а затем комбинирует их с определенными весами.

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

Этот метод сильно отличается от работы типичной вычислительной системы вроде машины Тьюринга, в которой результаты многократно перерабатываются одними и теми же вычислительными элементами. Здесь – по крайней мере при генерации заданного токена вывода – каждый вычислительный элемент (нейрон) задействован только один раз.

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

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

Кроме того, в ChatGPT есть особые аспекты нейронной сети, из-за которых его нельзя рассматривать как сеть, состоящую из однородных слоев. Например, как мы обсуждали ранее, внутри блока внимания есть места, где создается множество копий входящих данных, каждая из которых затем проходит свой путь обработки, потенциально включающий в себя разное количество слоев, и только позже рекомбинируется. Рассматривать процесс таким образом очень удобно, но важно также помнить о плотном заполнении слоев, где некоторые веса равны нулю.

Если посмотреть на самый длинный путь ChatGPT, то в нем задействовано около 400 (основных) уровней – в некотором смысле не так уж много. Но в ChatGPT существуют миллионы нейронов, что дает в общей сложности 175 миллиардов связей и, следовательно, 175 миллиардов весов. И нужно понимать, что каждый раз, когда ChatGPT генерирует новый токен, он выполняет вычисление, задействующее каждый из этих весов. Реализация данных вычислений может быть организована по слоям в виде высокопараллельных операций с массивами, которые удобно выполнять на графических процессорах. Но для каждого произведенного токена все равно необходимо осуществить 175 миллиардов вычислений (и в конце еще немного), так что неудивительно, что генерация длинного фрагмента текста с помощью ChatGPT может занять некоторое время.

Но наиболее замечательно то, что все эти операции – какими бы простыми они ни были по отдельности – вместе каким-то образом могут выполнять «человеческую» работу по генерированию текста. Следует еще раз подчеркнуть, что (по крайней мере, насколько нам известно) нет никакого окончательного теоретического обоснования, почему все это работает. Так что, я думаю, мы должны рассматривать это как потенциальное научное открытие: каким-то образом в нейронной сети, подобной ChatGPT, возможно уловить суть того, что человеческому мозгу удается делать при работе с языком.

Обучение ChatGPT

Итак, мы в общих чертах рассказали о том, как работает ChatGPT. Но как он настроен? Как были определены все эти 175 миллиардов весов в его нейронной сети? По сути, они являются результатом очень масштабного обучения, основанного на огромном массиве текстов – в интернете, оцифрованных книг и так далее, – написанных людьми. Как мы уже говорили, все эти обучающие данные не гарантируют, что нейронная сеть сможет успешно создавать текст, подобный написанному человеком. Для того чтобы она все же научилась это делать, по-видимому,

Перейти на страницу: