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

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

Мы видим, что если сеть слишком мала, то она просто не сможет воспроизвести нужную нам функцию. Но если сеть больше определенного размера, то проблем быть не должно – по крайней мере если тренировать ее довольно долго и на достаточном количестве примеров. Кстати говоря, эти картинки иллюстрируют часть наших знаний о нейронных сетях: нередко можно обойтись сетью меньшего размера, если в середине есть определенное «сжатие», которое заставляет информацию проходить через меньшее промежуточное число нейронов. (Также стоит упомянуть, что сети без промежуточного уровня – так называемые перцептронные – могут изучать только линейные функции. Но как только появляется хотя бы один промежуточный уровень, всегда можно произвольно выстроить любую функцию, по крайней мере если у сети достаточно нейронов. Однако для того, чтобы сделать их реально обучаемыми, обычно требуется своего рода регуляризация или нормализация.)
Итак, давайте предположим, что вы остановились на определенной архитектуре нейронной сети. Теперь возникает проблема получения данных для обучения сети. И многие практические задачи, связанные с нейронными сетями и машинным обучением в целом, сосредоточены на получении или подготовке необходимых обучающих данных. Во многих случаях требуется получить примеры входных данных и ожидаемых результатов (так называемое контролируемое обучение). Например, изображения можно переименовывать в зависимости от того, что на них, или снабжать каким-то атрибутом. Возможно, кому-то придется этим заняться, для чего понадобится много усилий. Однако нередко можно брать что-то готовое, применяя это как своего рода прокси-элемент. Например, можно использовать Alt-теги, которыми уже были помечены изображения в интернете. Также можно задействовать субтитры, которые были созданы для видео. Для обучения языковому переводу применимы уже переведенные на разные языки версии веб-страниц или других документов.
Сколько данных нужно дать нейронной сети, чтобы обучить ее выполнению конкретной задачи? Это трудно определить. Конечно, количество данных можно значительно снизить, если использовать так называемое трансферное обучение – перенос данных, которые уже были изучены в другой сети. Но, как правило, нейронным сетям нужно много примеров, чтобы обучение проходило успешно. И для некоторых задач также важно, чтобы примеры были повторяющимися. Действительно, это стандартная стратегия – просто снова и снова показывать нейронной сети все имеющиеся примеры. В каждой из этих эпох обучения нейронная сеть будет находиться в разном состоянии и каким-то образом напоминать самой себе о конкретном примере, чтобы запомнить его. (Возможно, это аналогично тому, как повторение материала помогает человеку запомнить информацию.)
Но нередко просто повторения одного и того же примера недостаточно: нейронной сети необходимо показать вариации. И, как уже было выяснено, для того, чтобы быть полезными, эти вариации не обязательно должны быть сложными. Простое незначительное изменение изображений может создать эффект новизны. Или, например, если заканчиваются реальные видео, скажем, по обучению вождению беспилотных автомобилей, можно просто взять данные из симуляций в модельной среде, подобной видеоиграм, без деталей, свойственных реальным видеозаписям.
А что же ChatGPT? У него есть приятная особенность, которая заключается в способности выполнять обучение без присмотра, а это значительно облегчает поиск примеров. Напомним, основная задача ChatGPT состоит в том, чтобы выяснить, как продолжить фрагмент текста, который ему был предоставлен. Итак, чтобы получить обучающие примеры, все, что нужно сделать, – это взять фрагмент текста и замаскировать его конец, а затем использовать этот фрагмент в качестве входных данных для обучения; при этом выходными данными будет полный фрагмент текста. Позже мы обсудим это подробнее, но главное, что нам нужно знать, – это то, что, скажем, в отличие от распознавания изображений здесь нам не нужны явные теги. ChatGPT может учиться на любых примерах текста, которые ему даны.
А что насчет самого процесса обучения в нейронной сети? В конце концов, все дело сводится к определению того, какие веса наилучшим образом будут соответствовать приведенным примерам. Существуют всевозможные подробно описанные варианты выбора и настройки гиперпараметров (веса допустимо рассматривать как параметры), которые можно использовать. Имеются различные варианты функции потерь (сумма квадратов, сумма абсолютных значений и так далее). Есть различные способы минимизации потерь (как далеко можно перемещаться с каждым шагом и так далее). И тогда возникают вопросы вроде того, сколько примеров нужно показать, чтобы получить каждую последующую оценку потерь, которые человек пытается минимизировать. И кстати, можно применить машинное