Как описать эту задачу нейронной сети? Мы должны сформулировать ее в цифрах. Один из способов – присвоить уникальный номер каждому из примерно 50 тысяч наиболее распространенных слов в английском языке. Так, например, артикль the может получить номер 914, а слово cat (с пробелом перед ним) – 3542. (Это фактические числа, используемые GPT-2.) Итак, для задачи «the ___ cat» наши входные данные будут {914, 3542}. Каким окажется результат? Ну, это должен быть список из 50 тысяч или около того чисел, которые дают вероятности для каждого из возможных «заполняющих» слов. Опять-таки, чтобы найти эмбеддинг, мы хотим «перехватить» состояние нейронной сети непосредственно перед тем, как она «примет решение», а затем получить список чисел, которые там встречаются и которые мы можем рассматривать как характеризующие каждое слово.
Как же выглядят эти характеристики? За последние десять лет была разработана последовательность различных систем (word2vec, GloVe, BERT, GPT …), каждая из которых основана на уникальном подходе к нейронным сетям. Но в конечном счете все они берут слова и характеризуют их списками из сотен или тысяч цифр.
В необработанном виде эти векторы эмбеддинга довольно неинформативны. Например, вот что выдает GPT-2 в качестве необработанных векторов эмбеддинга для трех конкретных слов:

Если мы измерим расстояние между этими векторами, то сможем определить близость этих слов к другим словам. Позже мы более подробно обсудим когнитивные значения подобных эмбеддингов. Но на данный момент для нас самое главное заключается в том, что мы можем превращать слова в наборы чисел, которые нейронная сеть способна понимать.
На самом деле мы можем характеризовать наборами чисел не только слова, но и последовательности слов или даже целые блоки текста. Именно так и работает ChatGPT. Он берет готовый текст и генерирует вектор эмбеддинга. Затем высчитывает вероятности последующих слов. Далее генерирует список чисел, которые, по сути, дают вероятности для каждого из 50 тысяч или около того возможных слов.
Строго говоря, ChatGPT работает не со словами, а с токенами – удобными лингвистическими единицами, которые представляют собой слова или фрагменты слов вроде pre, ing или ised [3]. Использование токенов облегчает обработку редких и сложных слов, а также слов из других языков, а иногда позволяет – хорошо это или плохо? – изобретать новые слова.
Внутри ChatGPT
Теперь мы наконец можем перейти к тому, как именно работает ChatGPT, что происходит у него внутри. ChatGPT представляет собой гигантскую нейронную сеть. В настоящее время это версия так называемой сети GPT-3, в которой насчитывается 175 миллиардов весов. Эта нейронная сеть во многих отношениях похожа на другие, которые мы обсуждали ранее. Отличием является то, что она специально настроена для работы с языком. Самой примечательной ее особенностью является часть архитектуры, которая называется трансформером.
Как мы уже обсуждали выше, в первых нейронных сетях каждый нейрон на каждом слое связан с каждым нейроном предыдущего слоя. Но подобная связь (предположительно) является излишней, если вы работаете с данными, которые имеют определенную, известную структуру. Так, например, на ранних стадиях работы с изображениями обычно используются так называемые сверточные нейронные сети (convnets), в которых нейроны расположены на сетке, аналогичной пикселям на изображении, и связаны только с близлежащими к ним нейронами.
Идея трансформера состоит в том, чтобы сделать нечто похожее и для последовательностей токенов, из которых состоит фрагмент текста. Но вместо того, чтобы определять фиксированную область в последовательности, где могут быть связи, трансформеры вводят понятие «внимание», то есть некоторым частям текста уделяется больше внимания, чем другим. Возможно, однажды можно будет просто запустить универсальную нейронную сеть и выполнить всю настройку с помощью обучения. Но по крайней мере на данный момент кажется, что на практике очень важно модулировать вещи – так, как это делают трансформеры и, вероятно, человеческий мозг.
Итак, что же на самом деле делает ChatGPT (а скорее сеть GPT-3, которая лежит в его основе)? Напомним, что его главная задача заключается в том, чтобы продолжить текст «разумным» способом, основываясь на тех «знаниях», которые были получены во время обучения (заключавшегося в просмотре миллиардов страниц текста из интернета и прочих источников). То есть в любой момент времени у ChatGPT есть определенный объем текста, и главная задача состоит в том, чтобы «придумать» следующий подходящий вариант токена.
ChatGPT работает в три этапа. Сначала берет последовательность токенов, соответствующую тексту на данный момент, и находит эмбеддинг (то есть массив чисел), который представляет эти токены. Затем продолжает работу над этим эмбеддингом при помощи стандартного подхода нейронной сети, когда значения «просачиваются» через последовательные слои сети для создания нового эмбеддинга (то есть нового массива чисел). После ChatGPT берет последнюю часть этого массива и генерирует из нее массив, состоящий примерно из 50 тысяч значений, которые превращаются в вероятности для возможных следующих токенов. (И иногда случается так, что он использует примерно столько же токенов, сколько слов английского языка находится в широком употреблении, хотя только около трех тысяч из этих токенов являются целыми словами, а остальные представляют собой фрагменты слов.)
Важно отметить, что каждая часть этого конвейера реализована нейронной сетью, веса которой определяются путем сквозного обучения сети. Другими словами, в действительности ничто, кроме общей архитектуры, не является «явно спроектированным»: все просто «изучается» на основе входных данных.
Архитектура нейронной сети содержит множество деталей, отражающих всевозможный опыт работы нейронных сетей и знания о них. И хотя это выходит за рамки повествования, я думаю, полезно поговорить о некоторых из этих деталей, чтобы получить представление о том, что входит в нейросети, подобные ChatGPT.
Сначала идет модуль эмбеддинга. Это его схематическое представление на языке Wolfram Language для GPT-2:

В качестве входных данных мы имеем вектор из n токенов (представленных, как и в предыдущем разделе, целыми числами от 1 примерно до 50 000). Каждый из этих токенов с помощью однослойной нейронной сети преобразуется в вектор эмбеддинга (длиной 768 значений для GPT-2 и 12 288 для GPT-3). Между тем существует вторичный путь, который принимает последовательность целочисленных позиций для токенов и из этих целых чисел создает другой вектор эмбеддинга. И наконец, оба вектора эмбеддинга – из значения и из позиции токена – складываются вместе, чтобы получилась окончательная последовательность векторов эмбеддинга из этого модуля.
Для чего нам нужно складывать векторы эмбеддинга значения и эмбеддинга положения токена? Здесь нет никакой научно обоснованной причины. Путем проб и ошибок мы пришли к тому, что срабатывает именно такой метод. И это то, что нужно знать о нейронных сетях: до тех пор, пока настройки будут «примерно правильными», достаточно просто провести полноценное обучение, без необходимости понимания на глубоком уровне, как работает нейронная сеть и как она сама себя настраивает.
Вот результат работы модуля эмбеддинга для строки «hello hello hello hello hello hello hello hello hello hello bye bye bye bye bye bye bye bye bye bye»:

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