Сегодня в цифровом виде нам доступно огромное количество написанных людьми текстов. В Сети насчитывается по меньшей мере несколько миллиардов страниц, написанных человеком, а общий объем этого супертекста составляет, возможно, триллион слов. Если же включить в него непубличные веб-страницы, то объем будет как минимум в сто раз больше. В данный момент у нас есть доступ к пяти с лишним миллионам оцифрованных книг (из 100 миллионов когда-либо написанных), что составляет еще около 100 миллиардов слов. И это даже не учитывая текстов видеоматериалов. (Для сравнения: мной за всю мою жизнь было опубликовано чуть менее 3 миллионов слов, а за последние тридцать лет я написал около 15 миллионов слов в электронных письмах, в общей сложности напечатал около 50 миллионов слов и всего за последние два-три года я произнес более 10 миллионов слов в прямых трансляциях. Вскоре буду обучать бота на основе наработок.)
Как с помощью всех этих текстов можно обучить нейронную сеть? Базовый процесс очень похож на тот, который мы уже обсуждали выше. Вы даете сети набор примеров, а затем корректируете веса, чтобы свести к минимуму ошибки (потери), которые она может допустить в дальнейшем. Самое главное, что при обратном распространении ошибки вы каждый раз меняете вес (хотя бы немного), поэтому вам приходится иметь дело с большим количеством весов. (Фактические обратные вычисления, как правило, лишь немного сложнее прямых.)
Современные графические процессоры позволяют параллельно вычислять результаты тысяч примеров. Но когда дело доходит до фактического обновления весов в нейронной сети, это должно выполняться постепенно. (И вероятно, именно здесь человеческий мозг, с его комбинированными вычислительными элементами и памятью, на данный момент имеет по крайней мере архитектурное преимущество.)
Даже в случаях изучения числовых функций, кажущихся простыми, которые мы обсуждали ранее, мы обнаружили, что иногда приходится использовать миллионы примеров для успешного обучения сети, по крайней мере при обучении с нуля. Сколько же тогда примеров понадобится для обучения нейросети человеческому языку? Похоже, какого-либо фундаментального теоретического способа узнать это не существует. Но на практике ChatGPT был успешно обучен на нескольких сотнях миллиардов слов текста.
Некоторые части текста использовались для обучения один раз, другие – несколько. Однако каким-то образом ChatGPT все равно «получил то, что ему было нужно» из текста, который «увидел». Но, учитывая огромный объем текста для изучения, насколько большой должна быть сеть, чтобы хорошо выучить его? Опять же, у нас пока нет теоретического ответа. Как мы обсудим далее, предположительно существует определенное общее алгоритмическое содержание человеческого языка и того, что люди обычно выражают с его помощью. Следующий вопрос заключается в том, насколько эффективной будет нейронная сеть при реализации модели, основанной на этом алгоритмическом содержании. Но, опять-таки, пока мы этого не знаем, хотя успех ChatGPT говорит о том, что данная модель достаточно эффективна.
И в конце мы можем просто отметить, что ChatGPT работает, используя две-три сотни миллиардов весов, что по количеству сопоставимо с общим количеством слов (или токенов), предоставленных ему в обучающих данных. В некотором смысле удивительно (хотя подобное мы наблюдаем и в других похожих на ChatGPT системах), что размер сети сопоставим с размером обучающих данных. Это, конечно, не значит, что весь этот текст из интернета, книг и так далее хранится внутри ChatGPT. Потому что на самом деле внутри ChatGPT находится набор чисел с точностью чуть менее 10 знаков, которые представляют собой своего рода распределенную кодировку совокупной структуры всего этого текста.
Иными словами, мы могли бы спросить, каково же эффективное информационное содержание человеческого языка. Допустим, у нас есть несколько фрагментов необработанного текста и представление этого текста в нейронной сети ChatGPT. Это представление, скорее всего, далеко от алгоритмически минимального представления (об этом мы поговорим далее), но именно его использует нейронная сеть. В этом представлении происходит незначительное сжатие обучающих данных. В среднем для передачи информационного содержания одного слова из обучающего материала требуется чуть меньше одного веса нейронной сети.
Когда мы запускаем ChatGPT для генерации текста, нам, по сути, приходится использовать каждый вес один раз. Таким образом, если у нас есть n весов, нам нужно выполнить порядка n вычислительных шагов, хотя на практике многие из них обычно выполняются параллельно. Но если нам нужно около n слов обучающих данных для настройки этих весов, то (следуя из того, что было сказано выше) нам потребуется около n2 вычислительных шагов для обучения сети. Вот почему при современных методах приходится говорить о затратах на обучение стоимостью в миллиарды долларов.
Помимо базового обучения
Основная часть усилий при обучении ChatGPT тратится на то, чтобы показать ему большое количество существующего текста из интернета, оцифрованных книг и так далее. Но, оказывается, есть и другая – по-видимому, довольно важная – часть обучения.
Как только сеть получит всю сырую информацию на основе исходного массива текста, который был изучен, она готова начать генерировать собственный текст, одновременно продолжая учиться на подсказках. И хотя сгенерированный текст кажется разумным, у ChatGPT есть тенденция – особенно при генерировании длинных фрагментов текста – сильно отклоняться (то есть нередко текст становится непохож на то, что написал бы человек). Это не то, что можно легко обнаружить при традиционном статистическом анализе текста, однако люди точно это заметят.
Ключевая идея, легшая в основу создания ChatGPT, заключалась в том, чтобы позволить реальным людям активно взаимодействовать с ChatGPT, видеть, что он производит, и, по сути, давать ему обратную связь о том, «как быть хорошим чат-ботом». Но как нейронная сеть может использовать этот фидбэк? Во-первых, можно просто попросить людей оценить результаты работы нейронной сети. Затем строится другая модель нейронной сети, которая пытается предсказать эти оценки, после чего эту модель прогнозирования можно запускать – по сути, как функцию потерь – в исходной сети, фактически позволяя настраивать сеть с помощью обратной связи от человека. На практике результаты оказывают большое влияние на успех системы в производстве чего-то человеческого.
Удивительно, как мало изменений нужно внести в первоначально обученную сеть, чтобы заставить ее двигаться в нужном направлении. Можно было бы подумать, что для дальнейшего обучения придется запускать постоянные алгоритмы обучения, корректировать веса и так далее.
Но все не так. Вместо этого, кажется, достаточно что-то сказать ChatGPT один раз – как часть промпта, который вы ему задаете, – и он сможет успешно использовать подсказку при генерации текста. Повторюсь, тот факт, что это работает, является ключом к пониманию того, что ChatGPT делает и как это связано со структурой человеческого языка и мышления.
В этом определенно есть что-то человеческое: проведя всю предварительную подготовку ChatGPT, вы можете один раз сказать ему что-то, а он запомнит это на достаточное количество времени, чтобы сгенерировать с помощью полученной информации фрагмент текста. Что же происходит в этом случае? Возможно, все, что вы можете сказать, уже заложено в сеть и вы просто задаете ChatGPT правильное направление. Однако это не кажется правдоподобным. Более вероятно, что все элементы уже существуют, но вся конкретика определяется чем-то вроде траектории между ними, то есть задачей, которую вы ставите перед ChatGPT.
Так же, как и в случае с людьми, если сказать ChatGPT что-то странное и неожиданное, совершенно не вписывающееся в известные ему рамки, он не сможет успешно интегрировать эту информацию. Он сумеет это сделать только в том случае, если интегрирует новые данные поверх уже имеющейся структуры.
Также стоит еще раз отметить, что у нейронной сети существуют так называемые алгоритмические пределы того, что сеть может уловить. Если дать сети поверхностные правила вроде «это принадлежит этому» и так далее, то