Что такое GPT?
Инициалы GPT означают Generative Pretrained Transformer.
Итак, первое слово достаточно простое: это боты, которые генерируют новый текст.
Pretrained означает, что модель прошла через процесс обучения на огромном количестве данных, а приставка pre подразумевает, что при дополнительном обучении у нее есть больше возможностей для тонкой настройки на конкретные задачи.
Но ключевое слово здесь - последнее.
Трансформер - это особый вид нейронной сети, модель машинного обучения, и это основное изобретение, лежащее в основе нынешнего бума в области ИИ.
В этом видео и последующих главах я хочу наглядно объяснить, что на самом деле происходит внутри трансформера.
Мы пошогово проследим за данными, которые через него проходят.
Существует множество различных видов моделей, которые можно построить, используя трансформеры.
Некоторые модели принимают аудиозапись и выдают транскрипт.
Это предложение относится к модели, работающей наоборот, производящей синтетическую речь только из текста.
Все те инструменты, которые взяли мир штурмом в 2022 году, вроде Dolly и Midjourney, которые принимают текстовое описание и выдают изображение, основаны на трансформерах.
Даже если я не могу заставить его понять, каким должно быть существо из пирога, я все равно потрясен тем, что такое вообще возможно.
А оригинальный трансформер, представленный в 2017 году компанией Google, был придуман для конкретного случая использования - перевода текста с одного языка на другой.
Но вариант, на котором мы с тобой сосредоточимся и который лежит в основе таких инструментов, как ChatGPT, - это модель, обученная воспринимать фрагмент текста, возможно, даже с сопутствующими изображениями или звуком, и выдавать предсказание того, что будет дальше в отрывке.
Это предсказание имеет форму распределения вероятностей по множеству различных фрагментов текста, которые могут последовать за ним.
На первый взгляд, тебе может показаться, что предсказание следующего слова - это совсем другая цель, нежели генерация нового текста.
Но если у тебя есть подобная модель предсказания, то для создания более длинного куска текста можно просто дать ей начальный фрагмент для работы, взять случайную выборку из только что созданного распределения, добавить ее к тексту, а затем запустить весь процесс снова, чтобы сделать новое предсказание на основе всего нового текста, включая то, что она только что добавила.
Не знаю, как тебе, но мне кажется, что это действительно не должно работать.
Например, в этой анимации я запускаю GPT-2 на своем ноутбуке и заставляю его многократно предсказывать и сэмплировать следующий фрагмент текста, чтобы сгенерировать историю на основе начального текста.
Просто в этой истории не так много смысла.
Но если я заменю его на API-вызовы к GPT-3, который является той же базовой моделью, только намного больше, то внезапно, почти по волшебству, мы получим разумную историю, которая, кажется, даже позволяет сделать вывод о том, что существо пи могло бы жить в стране математики и вычислений.
Этот процесс повторного предсказания и выборки - по сути, то, что происходит, когда ты взаимодействуешь с ChatGPT или любой другой большой языковой моделью и видишь, как они выдают по одному слову за раз.
На самом деле, одна из функций, которая мне бы очень понравилась, - это возможность видеть базовое распределение для каждого нового слова, которое он выбирает.
Давай начнем с того, что очень подробно рассмотрим, как данные проходят через трансформатор.
Мы потратим гораздо больше времени, мотивируя, интерпретируя и расширяя детали каждого шага, но в общих чертах, когда один из этих чатботов генерирует заданное слово, вот что происходит под капотом.
Во-первых, входные данные разбиваются на кучу маленьких кусочков.
Эти части называются лексемами, и в случае с текстом это, как правило, слова, маленькие кусочки слов или другие распространенные комбинации символов.
Если речь идет об изображениях или звуке, то токены могут быть маленькими фрагментами изображения или маленькими кусочками звука.
Каждый из этих токенов затем ассоциируется с вектором, то есть с некоторым списком чисел, который должен каким-то образом закодировать значение этого фрагмента.
Если представить, что эти векторы дают координаты в каком-то очень высокоразмерном пространстве, то слова с похожими значениями имеют тенденцию приземляться на векторы, которые находятся близко друг к другу в этом пространстве.
Затем эта последовательность векторов проходит через операцию, которая известна как блок внимания, и это позволяет векторам общаться друг с другом и передавать информацию туда-сюда, чтобы обновить свои значения.
Например, значение слова model во фразе a machine learning model отличается от его значения во фразе a fashion model.
Блок внимания отвечает за то, чтобы понять, какие слова в контексте имеют отношение к обновлению значений каких других слов, и как именно эти значения должны быть обновлены.
И опять же, всякий раз, когда я использую слово "смысл", он каким-то образом полностью закодирован в записях этих векторов.
После этого эти векторы проходят через другой вид операций, и в зависимости от источника, который ты читаешь, это будет называться многослойным перцептроном или, может быть, слоем feed-forward.
И здесь векторы не разговаривают друг с другом, они все проходят одну и ту же операцию параллельно.
И хотя этот блок немного сложнее интерпретировать, позже мы поговорим о том, что этот шаг немного похож на то, чтобы задать длинный список вопросов о каждом векторе, а затем обновить их на основе ответов на эти вопросы.
Все операции в обоих этих блоках выглядят как гигантская куча матричных умножений, и наша основная задача будет заключаться в том, чтобы понять, как читать базовые матрицы.
Я упускаю некоторые подробности о некоторых этапах нормализации, которые происходят между ними, но это, в конце концов, высокоуровневое превью.
После этого процесс, по сути, повторяется, ты ходишь туда-сюда между блоками внимания и блоками многослойного перцептрона, пока в самом конце не появится надежда на то, что весь основной смысл отрывка каким-то образом был заложен в самый последний вектор в последовательности.
Затем мы выполняем определенную операцию над этим последним вектором, в результате которой получаем распределение вероятности по всем возможным лексемам, всем возможным небольшим фрагментам текста, которые могут быть следующими.
И, как я уже сказал, как только у тебя появится инструмент, который предсказывает, что будет дальше, учитывая фрагмент текста, ты сможешь скормить ему немного начального текста и заставить его многократно играть в эту игру: предсказывать, что будет дальше, делать выборку из распределения, добавлять ее, а затем повторять снова и снова.
Некоторые из твоих знакомых могут вспомнить, как задолго до появления ChatGPT вот так выглядели ранние демо-версии GPT-3: ты должен был автозаполнять рассказы и сочинения на основе начального фрагмента.
Чтобы превратить такой инструмент в чатбота, проще всего начать с небольшого текста, задающего обстановку взаимодействия пользователя с полезным ИИ-ассистентом, который можно назвать системной подсказкой, а затем использовать начальный вопрос или подсказку пользователя в качестве первого фрагмента диалога, а затем начать предсказывать, что скажет в ответ такой полезный ИИ-ассистент.
Можно еще много чего сказать о шаге подготовки, который необходим для того, чтобы это хорошо работало, но на высоком уровне идея такова.
В этой главе мы с тобой расширим детали того, что происходит в самом начале сети, в самом конце сети, а также я хочу уделить много времени обзору некоторых важных битов фоновых знаний, вещей, которые стали бы второй натурой для любого инженера по машинному обучению к тому времени, когда появились трансформаторы.
Если тебя устраивают эти фоновые знания и ты немного нетерпелив, то можешь смело переходить к следующей главе, в которой речь пойдет о блоках внимания, которые принято считать сердцем трансформатора.
После этого я хочу подробнее рассказать об этих блоках многослойного перцептрона, о том, как происходит обучение, и о ряде других деталей, которые до этого момента были пропущены.
Для более широкого контекста эти видео являются дополнениями к мини-сериалу о глубоком обучении, и ничего страшного, если ты не смотрел предыдущие, думаю, ты сможешь сделать это и не по порядку, но прежде чем погрузиться конкретно в трансформеров, думаю, стоит убедиться, что мы на одной волне в отношении основных предпосылок и структуры глубокого обучения.
Рискуя заявить очевидное, скажу, что это один из подходов к машинному обучению, который описывает любую модель, где ты используешь данные, чтобы как-то определить, как ведет себя модель.
Я имею в виду, что, допустим, тебе нужна функция, которая принимает изображение и выдает метку, описывающую его, или наш пример с предсказанием следующего слова по отрывку текста, или любая другая задача, которая, кажется, требует некоторого элемента интуиции и распознавания образов.
В наши дни мы воспринимаем это почти как должное, но идея машинного обучения заключается в том, что вместо того, чтобы пытаться явно определить процедуру выполнения этой задачи в коде, что люди и делали в самые ранние дни ИИ, вместо этого ты создаешь очень гибкую структуру с настраиваемыми параметрами, как куча ручек и циферблатов, а затем каким-то образом используешь множество примеров того, как должен выглядеть выход для данного входа, чтобы подстроить и настроить значения этих параметров для имитации этого поведения.
Например, самой простой формой машинного обучения может быть линейная регрессия, где твоими входными и выходными данными являются отдельные числа, что-то вроде площади дома и его цены, и что ты хочешь, так это найти линию наилучшего соответствия через эти данные, чтобы предсказать будущие цены на дома.
Эта линия описывается двумя непрерывными параметрами, скажем, наклоном и y-интерцептом, и цель линейной регрессии - определить эти параметры, чтобы они точно соответствовали данным.
Нет нужды говорить, что модели глубокого обучения становятся намного сложнее.
GPT-3, например, имеет не два, а 175 миллиардов параметров.
Но дело вот в чем: нельзя сказать, что ты можешь создать какую-то гигантскую модель с огромным количеством параметров без того, чтобы она либо сильно перегружала обучающие данные, либо была совершенно неподдающейся обучению.
Глубокое обучение описывает класс моделей, которые за последние пару десятилетий доказали, что они удивительно хорошо масштабируются.
Их объединяет один и тот же алгоритм обучения, называемый обратным распространением, и я хочу, чтобы ты понял, что для того, чтобы этот алгоритм обучения хорошо работал в масштабе, эти модели должны следовать определенному формату.
Если ты знаешь этот формат, то он поможет объяснить многие варианты обработки языка трансформатором, которые в противном случае рискуют показаться произвольными.
Во-первых, какую бы модель ты ни создавал, входные данные должны быть оформлены в виде массива вещественных чисел.
Это может быть список чисел, может быть двумерный массив, а очень часто ты имеешь дело с массивами более высокой размерности, где используется общий термин - тензор.
Ты часто думаешь о том, что входные данные постепенно преобразуются во множество отдельных слоев, где, опять же, каждый слой всегда структурирован как некий массив вещественных чисел, пока ты не дойдешь до последнего слоя, который ты считаешь выходом.
Например, последний слой в нашей модели обработки текста - это список чисел, представляющий собой распределение вероятностей для всех возможных следующих лексем.
В глубоком обучении эти параметры модели почти всегда называются весами, и это потому, что ключевая особенность этих моделей заключается в том, что единственный способ взаимодействия этих параметров с обрабатываемыми данными - это взвешенные суммы.
Ты также рассыпаешь повсюду нелинейные функции, но они не будут зависеть от параметров.
Обычно вместо того, чтобы видеть взвешенные суммы в явном виде, ты видишь их упакованными вместе в виде различных компонентов в векторном произведении матрицы.
Это равносильно тому, что если ты вспомнишь, как работает матрично-векторное умножение, то каждый компонент на выходе будет выглядеть как взвешенная сумма.
Просто зачастую для нас с тобой концептуально чище думать о матрицах, которые заполнены настраиваемыми параметрами, преобразующими векторы, взятые из обрабатываемых данных.
Например, те 175 миллиардов весов в GPT-3 организованы в чуть менее 28 000 отдельных матриц.
Эти матрицы, в свою очередь, делятся на восемь различных категорий, и мы с тобой собираемся пройтись по каждой из них, чтобы понять, что делает тот или иной тип.
По ходу дела я думаю, что будет забавно ссылаться на конкретные цифры из GPT-3, чтобы подсчитать, откуда именно взялись эти 175 миллиардов.
Даже если сейчас есть модели больше и лучше, эта имеет определенный шарм как крупноязычная модель, которая действительно привлекла внимание мира за пределами ML-сообществ.
Кроме того, с практической точки зрения, компании, как правило, гораздо жестче обходят стороной конкретные цифры для более современных сетей.
Я просто хочу рассказать, что если заглянуть под капот и посмотреть, что происходит внутри такого инструмента, как ChatGPT, то почти все фактические вычисления выглядят как матрично-векторное умножение.
Есть небольшой риск заблудиться в море миллиардов цифр, но ты должен очень четко разграничить в своем сознании веса модели, которые я всегда буду окрашивать в синий или красный цвет, и обрабатываемые данные, которые я всегда буду окрашивать в серый цвет.
Веса - это собственно мозг, это то, что усваивается во время тренировок, и они определяют его поведение.
Обрабатываемые данные просто кодируют все конкретные входные данные, которые подаются в модель для данного запуска, например, фрагмент текста.
С учетом всего этого давайте приступим к первому шагу этого примера по обработке текста, который заключается в том, чтобы разбить входной сигнал на маленькие кусочки и превратить эти кусочки в векторы.
Я уже упоминал, что эти куски называются лексемами, которые могут быть кусками слов или пунктуации, но время от времени в этой главе и особенно в следующей я хотел бы просто притворяться, что все разбито на слова более чисто.
Поскольку мы, люди, мыслим словами, это лишь значительно упростит обращение к небольшим примерам и разъяснение каждого шага.
Модель имеет предопределенный словарный запас, некоторый список всех возможных слов, скажем, 50 000 из них, и первая матрица, с которой мы столкнемся, известная как матрица встраивания, имеет один столбец для каждого из этих слов.
Именно эти столбцы определяют, в какой вектор превратится каждое слово на первом этапе.
Мы обозначим ее We, и, как и все матрицы, которые мы видим, ее значения начинаются случайно, но в дальнейшем они будут выучены на основе данных.
Превращение слов в векторы было обычной практикой в машинном обучении задолго до появления трансформаторов, но это немного странно, если ты никогда не видел этого раньше, и это закладывает основу для всего последующего, так что давай уделим немного времени знакомству с этим.
Мы часто называем это вкрапление словом, которое предлагает тебе думать об этих векторах очень геометрически, как о точках в некотором высокоразмерном пространстве.
Визуализировать список из трех чисел как координаты точек в трехмерном пространстве не составит труда, но вкрапления слов имеют тенденцию быть гораздо более высокой размерности.
В GPT-3 у них 12 288 измерений, и, как ты увидишь, важно работать в пространстве, которое имеет много разных направлений.
Точно так же, как ты можешь взять двумерный срез через трехмерное пространство и спроецировать все точки на этот срез, для анимации вкраплений слов, которые дает мне простая модель, я собираюсь сделать аналогичную вещь, выбрав трехмерный срез через это очень высокоразмерное пространство, спроецировать векторы слов вниз на него и отобразить результаты.
Главная идея здесь в том, что по мере того, как модель настраивает и подстраивает свои веса, определяющие, как именно слова встраиваются в векторы в процессе обучения, она стремится остановиться на наборе вкраплений, где направления в пространстве имеют некий семантический смысл.
Для простой модели "слово-вектор", которую я здесь использую, если я проведу поиск по всем словам, чьи вкрапления наиболее близки к вкраплениям слова "башня", то ты заметишь, что все они дают очень похожие вибрации, похожие на башню.
А если ты хочешь подтянуть Python и поиграть с ним дома, то вот конкретная модель, которую я использую для создания анимации. Это не трансформер, но этого достаточно, чтобы проиллюстрировать идею о том, что направления в пространстве могут нести семантическое значение.
Классический пример - если взять разницу между векторами для женщины и мужчины, то есть то, что можно представить как маленький вектор, соединяющий кончик одного с кончиком другого, то это очень похоже на разницу между королем и королевой.
Так что, допустим, ты не знаешь слова, обозначающего монарха-женщину, ты можешь найти его, взяв king, добавив к нему направление woman-man и поискав вкрапления, наиболее близкие к этой точке.
По крайней мере, в некотором роде. Несмотря на то, что это классический пример для модели, с которой я играю, истинное вложение queen на самом деле немного дальше, чем можно было бы предположить, предположительно потому, что то, как queen используется в обучающих данных, не просто женская версия king.
Когда я поиграл, семейные отношения показались мне гораздо лучше иллюстрирующими эту идею.
Дело в том, что, похоже, во время обучения модель сочла выгодным выбрать вкрапления таким образом, чтобы одно направление в этом пространстве кодировало гендерную информацию.
Другой пример: если взять вкрапления Италии, вычесть вкрапления Германии и прибавить это к вкраплениям Гитлера, то получится что-то очень близкое к вкраплениям Муссолини.
Как будто модель научилась ассоциировать одни направления с итальянскостью, а другие - с лидерами оси Второй мировой войны.
Возможно, мой любимый пример в этом ключе - это то, как в некоторых моделях, если взять разницу между Германией и
Японией и добавить ее к суши, то в итоге получится очень близко к сарделькам.
Также, играя в эту игру по поиску ближайших соседей, я с удовольствием наблюдал, насколько близко Кэт была и к зверю, и к монстру.
Одна из математических интуиций, которую полезно иметь в виду, особенно для следующей главы, заключается в том, что точечное произведение двух векторов можно рассматривать как способ измерения того, насколько хорошо они выровнены.
С вычислительной точки зрения точечные продукты подразумевают умножение всех соответствующих компонентов, а затем сложение результатов, что очень хорошо, так как большая часть наших вычислений должна выглядеть как взвешенные суммы.
Геометрически точечное произведение положительно, если векторы направлены в одинаковые стороны, оно равно нулю, если они перпендикулярны, и отрицательно, если они направлены в противоположные стороны.
Допустим, ты играл с этой моделью и предположил, что вкрапление "кошки минус кошка" может представлять собой некое направление множественности в этом пространстве.
Чтобы проверить это, я собираюсь взять этот вектор и вычислить его точечное произведение на вкрапления некоторых существительных единственного числа, а затем сравнить его с точечным произведением на соответствующие существительные множественного числа.
Если ты поиграешь с этим, то заметишь, что множественное число действительно, кажется, постоянно дает более высокие значения, чем единственное, что указывает на то, что они больше соответствуют этому направлению.
Также забавно, что если взять это точечное произведение с вкраплениями слов 1, 2, 3 и так далее, то они дают возрастающие значения, так что мы как будто можем количественно измерить, насколько многозначным модель находит данное слово.
Опять же, специфику того, как слова встраиваются, можно узнать, используя данные.
Эта матрица вкраплений, столбцы которой говорят нам о том, что происходит с каждым словом, является первой стопкой весов в нашей модели.
Если использовать цифры GPT-3, то размер словарного запаса в конкретном случае составляет 50 257, и, опять же, технически он состоит не из слов как таковых, а из лексем.
Размерность встраивания равна 12 288, и умножение этих значений говорит нам о том, что он состоит примерно из 617 миллионов весов.
Давай добавим это в бегущий счет, помня, что к концу мы должны досчитать до 175 миллиардов.
В случае с трансформаторами ты действительно хочешь думать о векторах в этом пространстве встраивания не просто как о представлении отдельных слов.
Во-первых, они также кодируют информацию о позиции этого слова, о чем мы поговорим позже, но что более важно, ты должен думать о том, что они обладают способностью впитывать контекст.
Вектор, который начал свою жизнь как вставка слова king, например, может постепенно подтягиваться и подтягиваться различными блоками в этой сети, так что к концу он указывает на гораздо более конкретное и тонкое направление, которое каким-то образом кодирует, что это был король, живший в Шотландии, который добился своего поста после убийства предыдущего короля и которого описывают на шекспировском языке.
Подумай о своем собственном понимании того или иного слова.
Значение этого слова явно зависит от окружения, и иногда оно включает в себя контекст, находящийся на большом расстоянии, поэтому при создании модели, способной предсказать, какое слово будет следующим, цель состоит в том, чтобы каким-то образом дать ей возможность эффективно учитывать контекст.
Чтобы было понятно, на первом этапе, когда ты создаешь массив векторов на основе входного текста, каждый из них просто выдергивается из матрицы встраивания, поэтому изначально каждый из них может кодировать только значение одного слова без какого-либо вклада из окружения.
Но ты должен думать, что главная цель этой сети, по которой он течет, - позволить каждому из этих векторов впитать смысл, который намного богаче и конкретнее, чем то, что могут представлять собой отдельные слова.
Сеть может обрабатывать только фиксированное количество векторов за раз, известное как размер контекста.
Для GPT-3 он был обучен с размером контекста 2048, поэтому данные, проходящие через сеть, всегда выглядят как массив из 2048 столбцов, каждый из которых имеет 12 000 измерений.
Размер контекста ограничивает то, сколько текста может включить трансформатор, когда он делает предсказание следующего слова.
Именно поэтому при длительных беседах с некоторыми чатботами, например с ранними версиями ChatGPT, часто возникало ощущение, что бот как бы теряет нить разговора, когда ты продолжаешь слишком долго.
В свое время мы углубимся в детали внимания, но, пропуская вперед, я хочу на минуту поговорить о том, что происходит в самом конце.
Помни, что желаемый результат - это распределение вероятностей по всем токенам, которые могут прийти следующими.
Например, если самое последнее слово - профессор, а контекст включает такие слова, как Гарри Поттер, а непосредственно перед ним мы видим наименее любимого учителя, а также если ты дашь мне некоторую свободу действий, позволив притвориться, что лексемы просто выглядят как полные слова, то хорошо обученная сеть, накопившая знания о Гарри Поттере, предположительно присвоит высокий номер слову Снейп.
Это включает в себя два разных этапа.
Первый заключается в использовании другой матрицы, которая сопоставляет самый последний вектор в данном контексте со списком из 50 000 значений, по одному на каждую лексему в словаре.
Затем есть функция, которая нормализует это в распределение вероятностей, она называется Softmax, и мы поговорим о ней подробнее буквально через секунду, но до этого может показаться немного странным использовать только это последнее вложение для предсказания, когда, в конце концов, на последнем шаге в слое есть тысячи других векторов, просто сидящих там со своими собственными значениями, богатыми контекстом.
Это связано с тем, что в процессе обучения оказывается гораздо эффективнее, если ты используешь каждый из этих векторов в финальном слое, чтобы одновременно сделать предсказание того, что будет сразу после него.
О тренировках еще много чего можно будет сказать позже, но сейчас я просто хочу обратить на это внимание.
Эта матрица называется матрицей Unembedding, и мы даем ей обозначение WU.
Опять же, как и все весовые матрицы, которые мы видим, ее записи начинаются случайным образом, но они усваиваются в процессе обучения.
Продолжая подсчитывать общее количество параметров, эта матрица Unembedding имеет одну строку для каждого слова в словаре, и каждая строка имеет столько же элементов, сколько и размерность встраивания.
Она очень похожа на матрицу встраивания, только порядок поменялся местами, поэтому она добавляет в сеть еще 617 миллионов параметров, то есть на данный момент мы насчитали чуть больше миллиарда - небольшая, но не совсем незначительная часть от 175 миллиардов, которые мы получим в итоге.
В качестве последнего мини-урока для этой главы я хочу подробнее поговорить об этой функции softmax, так как она снова предстанет перед нами, как только мы погрузимся в блоки внимания.
Идея заключается в том, что если ты хочешь, чтобы последовательность чисел действовала как распределение вероятностей, скажем, распределение по всем возможным следующим словам, то каждое значение должно быть между 0 и 1, и тебе также нужно, чтобы все они складывались в 1.
Однако если ты играешь в обучающую игру, где все, что ты делаешь, выглядит как матрично-векторное умножение, то выходы, которые ты получаешь по умолчанию, совсем не соответствуют этому.
Значения часто бывают отрицательными или намного больше 1, и они почти наверняка не складываются в 1.
Softmax - это стандартный способ превратить произвольный список чисел в правильное распределение таким образом, чтобы наибольшие значения оказались ближе всего к 1, а меньшие - очень близко к 0.
Это все, что тебе действительно нужно знать.
Но если тебе интересно, то принцип работы заключается в том, чтобы сначала возвести e в степень каждого из чисел, то есть теперь у тебя есть список положительных значений, а затем ты можешь взять сумму всех этих положительных значений и разделить каждый член на эту сумму, что нормализует список, который складывается в 1.
Ты заметишь, что если одно из чисел на входе значимо больше остальных, то на выходе соответствующий член доминирует в распределении, так что если бы ты делал выборку из него, то почти наверняка просто выбрал бы максимизирующий вход.
Но это мягче, чем просто выбрать максимум, в том смысле, что когда другие значения так же велики, они тоже получают значимый вес в распределении, и все непрерывно меняется, когда ты постоянно варьируешь входные данные.
В некоторых ситуациях, например, когда ChatGPT использует это распределение для создания следующего слова, есть возможность немного повеселиться, добавив в эту функцию немного дополнительной остроты: в знаменатель этих экспоненты подбрасывается константа t.
Мы называем его температурой, так как он смутно напоминает роль температуры в некоторых уравнениях термодинамики, и эффект заключается в том, что когда t больше, ты придаешь больший вес меньшим значениям, то есть распределение становится немного более равномерным, а если t меньше, то большие значения будут доминировать более агрессивно, а в крайнем случае, если установить t равным нулю, то весь вес перейдет к максимальному значению.
Например, я попрошу GPT-3 сгенерировать историю с начальным текстом "Жил-был А", но в каждом случае я буду использовать разные температуры.
Нулевая температура означает, что он всегда выбирает самое предсказуемое слово, и то, что ты получишь, в итоге окажется банальной производной от "Златовласки".
Более высокая температура дает ему шанс выбирать менее вероятные слова, но это связано с риском.
В данном случае история начинается более оригинально, о молодом веб-художнике из Южной Кореи, но быстро вырождается в бессмыслицу.
Технически говоря, API на самом деле не позволяет тебе выбрать температуру больше 2.
Для этого нет никаких математических причин, это просто произвольное ограничение, наложенное для того, чтобы их инструмент не был замечен в генерации слишком нелепых вещей.
Если тебе интересно, то на самом деле эта анимация работает так: я беру 20 наиболее вероятных следующих токенов, которые генерирует GPT-3, что, похоже, является максимумом, который они мне выдают, а затем подстраиваю вероятности, основываясь на экспоненте 1 5.
В качестве еще одного жаргона: точно так же, как ты можешь называть компоненты выхода этой функции вероятностями, люди часто называют входы логарифмами, или кто-то говорит логарифмы, кто-то - логарифмы, я буду говорить логарифмы.
Так, например, когда ты вводишь текст, все эти вкрапления слов проходят через сеть, и ты делаешь финальное перемножение с матрицей без вкраплений, люди, занимающиеся машинным обучением, называют компоненты в этом сыром, ненормированном выходе логитами для предсказания следующего слова.
Во многом целью этой главы было заложить основы для понимания механизма внимания, в стиле Karate Kid wax-on-wax-off.
Видишь ли, если у тебя есть сильная интуиция в отношении вкраплений слов, софтмакса, того, как точечные произведения измеряют сходство, а также базовая предпосылка, что большинство вычислений должны выглядеть как матричное умножение с матрицами, полными настраиваемых параметров, то понимание механизма внимания, этого краеугольного камня во всем современном буме ИИ, должно быть относительно легким.
Для этого присоединяйся ко мне в следующей главе.
Пока я это публикую, черновик следующей главы доступен для ознакомления сторонникам Patreon.
Финальная версия должна появиться в паблике через неделю или две, обычно это зависит от того, сколько я в итоге изменю, основываясь на этой рецензии.
А пока, если ты хочешь погрузиться во внимание и немного помочь каналу, он ждет тебя.
Итак, первое слово достаточно простое: это боты, которые генерируют новый текст.
Pretrained означает, что модель прошла через процесс обучения на огромном количестве данных, а приставка pre подразумевает, что при дополнительном обучении у нее есть больше возможностей для тонкой настройки на конкретные задачи.
Но ключевое слово здесь - последнее.
Трансформер - это особый вид нейронной сети, модель машинного обучения, и это основное изобретение, лежащее в основе нынешнего бума в области ИИ.
В этом видео и последующих главах я хочу наглядно объяснить, что на самом деле происходит внутри трансформера.
Мы пошогово проследим за данными, которые через него проходят.
Существует множество различных видов моделей, которые можно построить, используя трансформеры.
Некоторые модели принимают аудиозапись и выдают транскрипт.
Это предложение относится к модели, работающей наоборот, производящей синтетическую речь только из текста.
Все те инструменты, которые взяли мир штурмом в 2022 году, вроде Dolly и Midjourney, которые принимают текстовое описание и выдают изображение, основаны на трансформерах.
Даже если я не могу заставить его понять, каким должно быть существо из пирога, я все равно потрясен тем, что такое вообще возможно.
А оригинальный трансформер, представленный в 2017 году компанией Google, был придуман для конкретного случая использования - перевода текста с одного языка на другой.
Но вариант, на котором мы с тобой сосредоточимся и который лежит в основе таких инструментов, как ChatGPT, - это модель, обученная воспринимать фрагмент текста, возможно, даже с сопутствующими изображениями или звуком, и выдавать предсказание того, что будет дальше в отрывке.
Это предсказание имеет форму распределения вероятностей по множеству различных фрагментов текста, которые могут последовать за ним.
На первый взгляд, тебе может показаться, что предсказание следующего слова - это совсем другая цель, нежели генерация нового текста.
Но если у тебя есть подобная модель предсказания, то для создания более длинного куска текста можно просто дать ей начальный фрагмент для работы, взять случайную выборку из только что созданного распределения, добавить ее к тексту, а затем запустить весь процесс снова, чтобы сделать новое предсказание на основе всего нового текста, включая то, что она только что добавила.
Не знаю, как тебе, но мне кажется, что это действительно не должно работать.
Например, в этой анимации я запускаю GPT-2 на своем ноутбуке и заставляю его многократно предсказывать и сэмплировать следующий фрагмент текста, чтобы сгенерировать историю на основе начального текста.
Просто в этой истории не так много смысла.
Но если я заменю его на API-вызовы к GPT-3, который является той же базовой моделью, только намного больше, то внезапно, почти по волшебству, мы получим разумную историю, которая, кажется, даже позволяет сделать вывод о том, что существо пи могло бы жить в стране математики и вычислений.
Этот процесс повторного предсказания и выборки - по сути, то, что происходит, когда ты взаимодействуешь с ChatGPT или любой другой большой языковой моделью и видишь, как они выдают по одному слову за раз.
На самом деле, одна из функций, которая мне бы очень понравилась, - это возможность видеть базовое распределение для каждого нового слова, которое он выбирает.
Давай начнем с того, что очень подробно рассмотрим, как данные проходят через трансформатор.
Мы потратим гораздо больше времени, мотивируя, интерпретируя и расширяя детали каждого шага, но в общих чертах, когда один из этих чатботов генерирует заданное слово, вот что происходит под капотом.
Во-первых, входные данные разбиваются на кучу маленьких кусочков.
Эти части называются лексемами, и в случае с текстом это, как правило, слова, маленькие кусочки слов или другие распространенные комбинации символов.
Если речь идет об изображениях или звуке, то токены могут быть маленькими фрагментами изображения или маленькими кусочками звука.
Каждый из этих токенов затем ассоциируется с вектором, то есть с некоторым списком чисел, который должен каким-то образом закодировать значение этого фрагмента.
Если представить, что эти векторы дают координаты в каком-то очень высокоразмерном пространстве, то слова с похожими значениями имеют тенденцию приземляться на векторы, которые находятся близко друг к другу в этом пространстве.
Затем эта последовательность векторов проходит через операцию, которая известна как блок внимания, и это позволяет векторам общаться друг с другом и передавать информацию туда-сюда, чтобы обновить свои значения.
Например, значение слова model во фразе a machine learning model отличается от его значения во фразе a fashion model.
Блок внимания отвечает за то, чтобы понять, какие слова в контексте имеют отношение к обновлению значений каких других слов, и как именно эти значения должны быть обновлены.
И опять же, всякий раз, когда я использую слово "смысл", он каким-то образом полностью закодирован в записях этих векторов.
После этого эти векторы проходят через другой вид операций, и в зависимости от источника, который ты читаешь, это будет называться многослойным перцептроном или, может быть, слоем feed-forward.
И здесь векторы не разговаривают друг с другом, они все проходят одну и ту же операцию параллельно.
И хотя этот блок немного сложнее интерпретировать, позже мы поговорим о том, что этот шаг немного похож на то, чтобы задать длинный список вопросов о каждом векторе, а затем обновить их на основе ответов на эти вопросы.
Все операции в обоих этих блоках выглядят как гигантская куча матричных умножений, и наша основная задача будет заключаться в том, чтобы понять, как читать базовые матрицы.
Я упускаю некоторые подробности о некоторых этапах нормализации, которые происходят между ними, но это, в конце концов, высокоуровневое превью.
После этого процесс, по сути, повторяется, ты ходишь туда-сюда между блоками внимания и блоками многослойного перцептрона, пока в самом конце не появится надежда на то, что весь основной смысл отрывка каким-то образом был заложен в самый последний вектор в последовательности.
Затем мы выполняем определенную операцию над этим последним вектором, в результате которой получаем распределение вероятности по всем возможным лексемам, всем возможным небольшим фрагментам текста, которые могут быть следующими.
И, как я уже сказал, как только у тебя появится инструмент, который предсказывает, что будет дальше, учитывая фрагмент текста, ты сможешь скормить ему немного начального текста и заставить его многократно играть в эту игру: предсказывать, что будет дальше, делать выборку из распределения, добавлять ее, а затем повторять снова и снова.
Некоторые из твоих знакомых могут вспомнить, как задолго до появления ChatGPT вот так выглядели ранние демо-версии GPT-3: ты должен был автозаполнять рассказы и сочинения на основе начального фрагмента.
Чтобы превратить такой инструмент в чатбота, проще всего начать с небольшого текста, задающего обстановку взаимодействия пользователя с полезным ИИ-ассистентом, который можно назвать системной подсказкой, а затем использовать начальный вопрос или подсказку пользователя в качестве первого фрагмента диалога, а затем начать предсказывать, что скажет в ответ такой полезный ИИ-ассистент.
Можно еще много чего сказать о шаге подготовки, который необходим для того, чтобы это хорошо работало, но на высоком уровне идея такова.
В этой главе мы с тобой расширим детали того, что происходит в самом начале сети, в самом конце сети, а также я хочу уделить много времени обзору некоторых важных битов фоновых знаний, вещей, которые стали бы второй натурой для любого инженера по машинному обучению к тому времени, когда появились трансформаторы.
Если тебя устраивают эти фоновые знания и ты немного нетерпелив, то можешь смело переходить к следующей главе, в которой речь пойдет о блоках внимания, которые принято считать сердцем трансформатора.
После этого я хочу подробнее рассказать об этих блоках многослойного перцептрона, о том, как происходит обучение, и о ряде других деталей, которые до этого момента были пропущены.
Для более широкого контекста эти видео являются дополнениями к мини-сериалу о глубоком обучении, и ничего страшного, если ты не смотрел предыдущие, думаю, ты сможешь сделать это и не по порядку, но прежде чем погрузиться конкретно в трансформеров, думаю, стоит убедиться, что мы на одной волне в отношении основных предпосылок и структуры глубокого обучения.
Рискуя заявить очевидное, скажу, что это один из подходов к машинному обучению, который описывает любую модель, где ты используешь данные, чтобы как-то определить, как ведет себя модель.
Я имею в виду, что, допустим, тебе нужна функция, которая принимает изображение и выдает метку, описывающую его, или наш пример с предсказанием следующего слова по отрывку текста, или любая другая задача, которая, кажется, требует некоторого элемента интуиции и распознавания образов.
В наши дни мы воспринимаем это почти как должное, но идея машинного обучения заключается в том, что вместо того, чтобы пытаться явно определить процедуру выполнения этой задачи в коде, что люди и делали в самые ранние дни ИИ, вместо этого ты создаешь очень гибкую структуру с настраиваемыми параметрами, как куча ручек и циферблатов, а затем каким-то образом используешь множество примеров того, как должен выглядеть выход для данного входа, чтобы подстроить и настроить значения этих параметров для имитации этого поведения.
Например, самой простой формой машинного обучения может быть линейная регрессия, где твоими входными и выходными данными являются отдельные числа, что-то вроде площади дома и его цены, и что ты хочешь, так это найти линию наилучшего соответствия через эти данные, чтобы предсказать будущие цены на дома.
Эта линия описывается двумя непрерывными параметрами, скажем, наклоном и y-интерцептом, и цель линейной регрессии - определить эти параметры, чтобы они точно соответствовали данным.
Нет нужды говорить, что модели глубокого обучения становятся намного сложнее.
GPT-3, например, имеет не два, а 175 миллиардов параметров.
Но дело вот в чем: нельзя сказать, что ты можешь создать какую-то гигантскую модель с огромным количеством параметров без того, чтобы она либо сильно перегружала обучающие данные, либо была совершенно неподдающейся обучению.
Глубокое обучение описывает класс моделей, которые за последние пару десятилетий доказали, что они удивительно хорошо масштабируются.
Их объединяет один и тот же алгоритм обучения, называемый обратным распространением, и я хочу, чтобы ты понял, что для того, чтобы этот алгоритм обучения хорошо работал в масштабе, эти модели должны следовать определенному формату.
Если ты знаешь этот формат, то он поможет объяснить многие варианты обработки языка трансформатором, которые в противном случае рискуют показаться произвольными.
Во-первых, какую бы модель ты ни создавал, входные данные должны быть оформлены в виде массива вещественных чисел.
Это может быть список чисел, может быть двумерный массив, а очень часто ты имеешь дело с массивами более высокой размерности, где используется общий термин - тензор.
Ты часто думаешь о том, что входные данные постепенно преобразуются во множество отдельных слоев, где, опять же, каждый слой всегда структурирован как некий массив вещественных чисел, пока ты не дойдешь до последнего слоя, который ты считаешь выходом.
Например, последний слой в нашей модели обработки текста - это список чисел, представляющий собой распределение вероятностей для всех возможных следующих лексем.
В глубоком обучении эти параметры модели почти всегда называются весами, и это потому, что ключевая особенность этих моделей заключается в том, что единственный способ взаимодействия этих параметров с обрабатываемыми данными - это взвешенные суммы.
Ты также рассыпаешь повсюду нелинейные функции, но они не будут зависеть от параметров.
Обычно вместо того, чтобы видеть взвешенные суммы в явном виде, ты видишь их упакованными вместе в виде различных компонентов в векторном произведении матрицы.
Это равносильно тому, что если ты вспомнишь, как работает матрично-векторное умножение, то каждый компонент на выходе будет выглядеть как взвешенная сумма.
Просто зачастую для нас с тобой концептуально чище думать о матрицах, которые заполнены настраиваемыми параметрами, преобразующими векторы, взятые из обрабатываемых данных.
Например, те 175 миллиардов весов в GPT-3 организованы в чуть менее 28 000 отдельных матриц.
Эти матрицы, в свою очередь, делятся на восемь различных категорий, и мы с тобой собираемся пройтись по каждой из них, чтобы понять, что делает тот или иной тип.
По ходу дела я думаю, что будет забавно ссылаться на конкретные цифры из GPT-3, чтобы подсчитать, откуда именно взялись эти 175 миллиардов.
Даже если сейчас есть модели больше и лучше, эта имеет определенный шарм как крупноязычная модель, которая действительно привлекла внимание мира за пределами ML-сообществ.
Кроме того, с практической точки зрения, компании, как правило, гораздо жестче обходят стороной конкретные цифры для более современных сетей.
Я просто хочу рассказать, что если заглянуть под капот и посмотреть, что происходит внутри такого инструмента, как ChatGPT, то почти все фактические вычисления выглядят как матрично-векторное умножение.
Есть небольшой риск заблудиться в море миллиардов цифр, но ты должен очень четко разграничить в своем сознании веса модели, которые я всегда буду окрашивать в синий или красный цвет, и обрабатываемые данные, которые я всегда буду окрашивать в серый цвет.
Веса - это собственно мозг, это то, что усваивается во время тренировок, и они определяют его поведение.
Обрабатываемые данные просто кодируют все конкретные входные данные, которые подаются в модель для данного запуска, например, фрагмент текста.
С учетом всего этого давайте приступим к первому шагу этого примера по обработке текста, который заключается в том, чтобы разбить входной сигнал на маленькие кусочки и превратить эти кусочки в векторы.
Я уже упоминал, что эти куски называются лексемами, которые могут быть кусками слов или пунктуации, но время от времени в этой главе и особенно в следующей я хотел бы просто притворяться, что все разбито на слова более чисто.
Поскольку мы, люди, мыслим словами, это лишь значительно упростит обращение к небольшим примерам и разъяснение каждого шага.
Модель имеет предопределенный словарный запас, некоторый список всех возможных слов, скажем, 50 000 из них, и первая матрица, с которой мы столкнемся, известная как матрица встраивания, имеет один столбец для каждого из этих слов.
Именно эти столбцы определяют, в какой вектор превратится каждое слово на первом этапе.
Мы обозначим ее We, и, как и все матрицы, которые мы видим, ее значения начинаются случайно, но в дальнейшем они будут выучены на основе данных.
Превращение слов в векторы было обычной практикой в машинном обучении задолго до появления трансформаторов, но это немного странно, если ты никогда не видел этого раньше, и это закладывает основу для всего последующего, так что давай уделим немного времени знакомству с этим.
Мы часто называем это вкрапление словом, которое предлагает тебе думать об этих векторах очень геометрически, как о точках в некотором высокоразмерном пространстве.
Визуализировать список из трех чисел как координаты точек в трехмерном пространстве не составит труда, но вкрапления слов имеют тенденцию быть гораздо более высокой размерности.
В GPT-3 у них 12 288 измерений, и, как ты увидишь, важно работать в пространстве, которое имеет много разных направлений.
Точно так же, как ты можешь взять двумерный срез через трехмерное пространство и спроецировать все точки на этот срез, для анимации вкраплений слов, которые дает мне простая модель, я собираюсь сделать аналогичную вещь, выбрав трехмерный срез через это очень высокоразмерное пространство, спроецировать векторы слов вниз на него и отобразить результаты.
Главная идея здесь в том, что по мере того, как модель настраивает и подстраивает свои веса, определяющие, как именно слова встраиваются в векторы в процессе обучения, она стремится остановиться на наборе вкраплений, где направления в пространстве имеют некий семантический смысл.
Для простой модели "слово-вектор", которую я здесь использую, если я проведу поиск по всем словам, чьи вкрапления наиболее близки к вкраплениям слова "башня", то ты заметишь, что все они дают очень похожие вибрации, похожие на башню.
А если ты хочешь подтянуть Python и поиграть с ним дома, то вот конкретная модель, которую я использую для создания анимации. Это не трансформер, но этого достаточно, чтобы проиллюстрировать идею о том, что направления в пространстве могут нести семантическое значение.
Классический пример - если взять разницу между векторами для женщины и мужчины, то есть то, что можно представить как маленький вектор, соединяющий кончик одного с кончиком другого, то это очень похоже на разницу между королем и королевой.
Так что, допустим, ты не знаешь слова, обозначающего монарха-женщину, ты можешь найти его, взяв king, добавив к нему направление woman-man и поискав вкрапления, наиболее близкие к этой точке.
По крайней мере, в некотором роде. Несмотря на то, что это классический пример для модели, с которой я играю, истинное вложение queen на самом деле немного дальше, чем можно было бы предположить, предположительно потому, что то, как queen используется в обучающих данных, не просто женская версия king.
Когда я поиграл, семейные отношения показались мне гораздо лучше иллюстрирующими эту идею.
Дело в том, что, похоже, во время обучения модель сочла выгодным выбрать вкрапления таким образом, чтобы одно направление в этом пространстве кодировало гендерную информацию.
Другой пример: если взять вкрапления Италии, вычесть вкрапления Германии и прибавить это к вкраплениям Гитлера, то получится что-то очень близкое к вкраплениям Муссолини.
Как будто модель научилась ассоциировать одни направления с итальянскостью, а другие - с лидерами оси Второй мировой войны.
Возможно, мой любимый пример в этом ключе - это то, как в некоторых моделях, если взять разницу между Германией и
Японией и добавить ее к суши, то в итоге получится очень близко к сарделькам.
Также, играя в эту игру по поиску ближайших соседей, я с удовольствием наблюдал, насколько близко Кэт была и к зверю, и к монстру.
Одна из математических интуиций, которую полезно иметь в виду, особенно для следующей главы, заключается в том, что точечное произведение двух векторов можно рассматривать как способ измерения того, насколько хорошо они выровнены.
С вычислительной точки зрения точечные продукты подразумевают умножение всех соответствующих компонентов, а затем сложение результатов, что очень хорошо, так как большая часть наших вычислений должна выглядеть как взвешенные суммы.
Геометрически точечное произведение положительно, если векторы направлены в одинаковые стороны, оно равно нулю, если они перпендикулярны, и отрицательно, если они направлены в противоположные стороны.
Допустим, ты играл с этой моделью и предположил, что вкрапление "кошки минус кошка" может представлять собой некое направление множественности в этом пространстве.
Чтобы проверить это, я собираюсь взять этот вектор и вычислить его точечное произведение на вкрапления некоторых существительных единственного числа, а затем сравнить его с точечным произведением на соответствующие существительные множественного числа.
Если ты поиграешь с этим, то заметишь, что множественное число действительно, кажется, постоянно дает более высокие значения, чем единственное, что указывает на то, что они больше соответствуют этому направлению.
Также забавно, что если взять это точечное произведение с вкраплениями слов 1, 2, 3 и так далее, то они дают возрастающие значения, так что мы как будто можем количественно измерить, насколько многозначным модель находит данное слово.
Опять же, специфику того, как слова встраиваются, можно узнать, используя данные.
Эта матрица вкраплений, столбцы которой говорят нам о том, что происходит с каждым словом, является первой стопкой весов в нашей модели.
Если использовать цифры GPT-3, то размер словарного запаса в конкретном случае составляет 50 257, и, опять же, технически он состоит не из слов как таковых, а из лексем.
Размерность встраивания равна 12 288, и умножение этих значений говорит нам о том, что он состоит примерно из 617 миллионов весов.
Давай добавим это в бегущий счет, помня, что к концу мы должны досчитать до 175 миллиардов.
В случае с трансформаторами ты действительно хочешь думать о векторах в этом пространстве встраивания не просто как о представлении отдельных слов.
Во-первых, они также кодируют информацию о позиции этого слова, о чем мы поговорим позже, но что более важно, ты должен думать о том, что они обладают способностью впитывать контекст.
Вектор, который начал свою жизнь как вставка слова king, например, может постепенно подтягиваться и подтягиваться различными блоками в этой сети, так что к концу он указывает на гораздо более конкретное и тонкое направление, которое каким-то образом кодирует, что это был король, живший в Шотландии, который добился своего поста после убийства предыдущего короля и которого описывают на шекспировском языке.
Подумай о своем собственном понимании того или иного слова.
Значение этого слова явно зависит от окружения, и иногда оно включает в себя контекст, находящийся на большом расстоянии, поэтому при создании модели, способной предсказать, какое слово будет следующим, цель состоит в том, чтобы каким-то образом дать ей возможность эффективно учитывать контекст.
Чтобы было понятно, на первом этапе, когда ты создаешь массив векторов на основе входного текста, каждый из них просто выдергивается из матрицы встраивания, поэтому изначально каждый из них может кодировать только значение одного слова без какого-либо вклада из окружения.
Но ты должен думать, что главная цель этой сети, по которой он течет, - позволить каждому из этих векторов впитать смысл, который намного богаче и конкретнее, чем то, что могут представлять собой отдельные слова.
Сеть может обрабатывать только фиксированное количество векторов за раз, известное как размер контекста.
Для GPT-3 он был обучен с размером контекста 2048, поэтому данные, проходящие через сеть, всегда выглядят как массив из 2048 столбцов, каждый из которых имеет 12 000 измерений.
Размер контекста ограничивает то, сколько текста может включить трансформатор, когда он делает предсказание следующего слова.
Именно поэтому при длительных беседах с некоторыми чатботами, например с ранними версиями ChatGPT, часто возникало ощущение, что бот как бы теряет нить разговора, когда ты продолжаешь слишком долго.
В свое время мы углубимся в детали внимания, но, пропуская вперед, я хочу на минуту поговорить о том, что происходит в самом конце.
Помни, что желаемый результат - это распределение вероятностей по всем токенам, которые могут прийти следующими.
Например, если самое последнее слово - профессор, а контекст включает такие слова, как Гарри Поттер, а непосредственно перед ним мы видим наименее любимого учителя, а также если ты дашь мне некоторую свободу действий, позволив притвориться, что лексемы просто выглядят как полные слова, то хорошо обученная сеть, накопившая знания о Гарри Поттере, предположительно присвоит высокий номер слову Снейп.
Это включает в себя два разных этапа.
Первый заключается в использовании другой матрицы, которая сопоставляет самый последний вектор в данном контексте со списком из 50 000 значений, по одному на каждую лексему в словаре.
Затем есть функция, которая нормализует это в распределение вероятностей, она называется Softmax, и мы поговорим о ней подробнее буквально через секунду, но до этого может показаться немного странным использовать только это последнее вложение для предсказания, когда, в конце концов, на последнем шаге в слое есть тысячи других векторов, просто сидящих там со своими собственными значениями, богатыми контекстом.
Это связано с тем, что в процессе обучения оказывается гораздо эффективнее, если ты используешь каждый из этих векторов в финальном слое, чтобы одновременно сделать предсказание того, что будет сразу после него.
О тренировках еще много чего можно будет сказать позже, но сейчас я просто хочу обратить на это внимание.
Эта матрица называется матрицей Unembedding, и мы даем ей обозначение WU.
Опять же, как и все весовые матрицы, которые мы видим, ее записи начинаются случайным образом, но они усваиваются в процессе обучения.
Продолжая подсчитывать общее количество параметров, эта матрица Unembedding имеет одну строку для каждого слова в словаре, и каждая строка имеет столько же элементов, сколько и размерность встраивания.
Она очень похожа на матрицу встраивания, только порядок поменялся местами, поэтому она добавляет в сеть еще 617 миллионов параметров, то есть на данный момент мы насчитали чуть больше миллиарда - небольшая, но не совсем незначительная часть от 175 миллиардов, которые мы получим в итоге.
В качестве последнего мини-урока для этой главы я хочу подробнее поговорить об этой функции softmax, так как она снова предстанет перед нами, как только мы погрузимся в блоки внимания.
Идея заключается в том, что если ты хочешь, чтобы последовательность чисел действовала как распределение вероятностей, скажем, распределение по всем возможным следующим словам, то каждое значение должно быть между 0 и 1, и тебе также нужно, чтобы все они складывались в 1.
Однако если ты играешь в обучающую игру, где все, что ты делаешь, выглядит как матрично-векторное умножение, то выходы, которые ты получаешь по умолчанию, совсем не соответствуют этому.
Значения часто бывают отрицательными или намного больше 1, и они почти наверняка не складываются в 1.
Softmax - это стандартный способ превратить произвольный список чисел в правильное распределение таким образом, чтобы наибольшие значения оказались ближе всего к 1, а меньшие - очень близко к 0.
Это все, что тебе действительно нужно знать.
Но если тебе интересно, то принцип работы заключается в том, чтобы сначала возвести e в степень каждого из чисел, то есть теперь у тебя есть список положительных значений, а затем ты можешь взять сумму всех этих положительных значений и разделить каждый член на эту сумму, что нормализует список, который складывается в 1.
Ты заметишь, что если одно из чисел на входе значимо больше остальных, то на выходе соответствующий член доминирует в распределении, так что если бы ты делал выборку из него, то почти наверняка просто выбрал бы максимизирующий вход.
Но это мягче, чем просто выбрать максимум, в том смысле, что когда другие значения так же велики, они тоже получают значимый вес в распределении, и все непрерывно меняется, когда ты постоянно варьируешь входные данные.
В некоторых ситуациях, например, когда ChatGPT использует это распределение для создания следующего слова, есть возможность немного повеселиться, добавив в эту функцию немного дополнительной остроты: в знаменатель этих экспоненты подбрасывается константа t.
Мы называем его температурой, так как он смутно напоминает роль температуры в некоторых уравнениях термодинамики, и эффект заключается в том, что когда t больше, ты придаешь больший вес меньшим значениям, то есть распределение становится немного более равномерным, а если t меньше, то большие значения будут доминировать более агрессивно, а в крайнем случае, если установить t равным нулю, то весь вес перейдет к максимальному значению.
Например, я попрошу GPT-3 сгенерировать историю с начальным текстом "Жил-был А", но в каждом случае я буду использовать разные температуры.
Нулевая температура означает, что он всегда выбирает самое предсказуемое слово, и то, что ты получишь, в итоге окажется банальной производной от "Златовласки".
Более высокая температура дает ему шанс выбирать менее вероятные слова, но это связано с риском.
В данном случае история начинается более оригинально, о молодом веб-художнике из Южной Кореи, но быстро вырождается в бессмыслицу.
Технически говоря, API на самом деле не позволяет тебе выбрать температуру больше 2.
Для этого нет никаких математических причин, это просто произвольное ограничение, наложенное для того, чтобы их инструмент не был замечен в генерации слишком нелепых вещей.
Если тебе интересно, то на самом деле эта анимация работает так: я беру 20 наиболее вероятных следующих токенов, которые генерирует GPT-3, что, похоже, является максимумом, который они мне выдают, а затем подстраиваю вероятности, основываясь на экспоненте 1 5.
В качестве еще одного жаргона: точно так же, как ты можешь называть компоненты выхода этой функции вероятностями, люди часто называют входы логарифмами, или кто-то говорит логарифмы, кто-то - логарифмы, я буду говорить логарифмы.
Так, например, когда ты вводишь текст, все эти вкрапления слов проходят через сеть, и ты делаешь финальное перемножение с матрицей без вкраплений, люди, занимающиеся машинным обучением, называют компоненты в этом сыром, ненормированном выходе логитами для предсказания следующего слова.
Во многом целью этой главы было заложить основы для понимания механизма внимания, в стиле Karate Kid wax-on-wax-off.
Видишь ли, если у тебя есть сильная интуиция в отношении вкраплений слов, софтмакса, того, как точечные произведения измеряют сходство, а также базовая предпосылка, что большинство вычислений должны выглядеть как матричное умножение с матрицами, полными настраиваемых параметров, то понимание механизма внимания, этого краеугольного камня во всем современном буме ИИ, должно быть относительно легким.
Для этого присоединяйся ко мне в следующей главе.
Пока я это публикую, черновик следующей главы доступен для ознакомления сторонникам Patreon.
Финальная версия должна появиться в паблике через неделю или две, обычно это зависит от того, сколько я в итоге изменю, основываясь на этой рецензии.
А пока, если ты хочешь погрузиться во внимание и немного помочь каналу, он ждет тебя.