Kitobni o'qish: «Как устроен ChatGPT? Полное погружение в принципы работы и спектр возможностей самой известной нейросети в мире»

Shrift:

Научный редактор Здоров Антон

На русском языке публикуется впервые

Все права защищены.

Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.

What Is ChatGPT Doing … and Why Does It Work?

© 2023 Stephen Wolfram.

Original English language edition published by Wolfram Media 100 Trade Center Dr. 6th Floor, Champaign Illinois 61820, USA.

Arranged via Licensor's Agent: DropCap Inc. and Igor Korzhenevskiy of Alexander Korzhenevski Agency (Russia). All rights reserved

© Издание на русском языке, перевод, оформление. ООО «Манн, Иванов и Фербер», 2024

* * *

Предисловие

Эта небольшая книга представляет собой попытку объяснить, как работает ChatGPT. В некотором смысле это история о технологиях. Но еще и разговор о науке и философии. И для того, чтобы рассказать эту историю, нам придется собрать воедино огромный спектр идей и открытий, сделанных на протяжении многих столетий.

Я сам с большим интересом и волнением наблюдаю, как вещи, которые так долго меня интересовали, объединяются в результате такого прогресса. Сложное поведение простых программ, погружение в суть языка и смыслообразования, а также практические возможности больших компьютерных систем – все это является частью истории ChatGPT.

ChatGPT основан на концепции нейронных сетей, составленной в 1940-х годах в качестве модели работы головного мозга. Я сам впервые спрограммировал нейронную сеть в 1983 году, но тогда ничего интересного из нее не вышло. Однако 40 лет спустя, когда у нас есть компьютеры, считающие в миллион раз быстрее, миллиарды страниц текста в интернете и целый ряд инженерных инноваций, ситуация совершенно иная. И, ко всеобщему удивлению, современная нейронная сеть, которая в миллиард раз больше созданной мной в 1983 году, способна делать то, что раньше считалось под силу только человеку, – генерировать осмысленный текст.

Эта книга, написанная вскоре после дебюта ChatGPT, состоит из двух частей. В первой объясняется, что такое ChatGPT и как ему удается выполнять сугубо человеческую работу по генерированию текста. Вторая посвящена вычислительным инструментам ChatGPT (выходящим за рамки человеческих возможностей) и сверхспособностям нашей системы Wolfram|Alpha в области вычисляемых знаний.

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

Стивен Вольфрам, 28 февраля 2023 года

Что делает ChatGPT и почему это работает?

Он просто добавляет по одному слову за раз

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

Первое, что нужно объяснить, – ChatGPT всегда пытается создать «разумное продолжение» любого текста, который у него есть на данный момент. Под словами «разумное продолжение» мы подразумеваем «то, что можно ожидать, исходя из того, что люди уже написали на миллиардах веб-страниц».

Итак, давайте предположим, что у нас есть предложение «Самое лучшее в ИИ – это его способность…». Представьте, что вы прочитываете миллиарды страниц текста, написанных людьми (скажем, веб-страницы в интернете и оцифрованные книги), и находите все аналогичные предложения, а затем смотрите, какое слово чаще всего встречается в них на месте многоточия. ChatGPT делает что-то подобное, за исключением того, что (как я объясню позже) он не просматривает тексты буквально – он ищет фрагменты, которые «совпадают по смыслу». Результатом его работы является список слов, которые логически могут следовать за основным словом, ранжированных по степени вероятности их присутствия в этом предложении:

Самое лучшее в ИИ – это его способность…

(англ. The best thing about AI is its ability to…)

…учиться (англ. learn) – 4,5 %

…предсказывать (англ. predict) – 3,5 %

…создавать (англ. make) – 3,2 %

…понимать (англ. understand) – 3,1 %

…делать (англ. do) – 2,9 %

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

Итак, на каждом этапе ChatGPT создает список слов с указанием вероятности их присутствия на данном месте. Но какое из них нужно выбрать, например, для эссе? Можно предположить, что это должно быть слово с самым высоким рейтингом (то есть то, для которого определена самая высокая вероятность). Однако именно здесь ChatGPT начинает проявлять свои вуду-способности. Потому что по какой-то причине (возможно, однажды мы ее даже узнаем), если всегда будем выбирать слово с самым высоким рейтингом, мы получим очень гладенькое эссе без малейшего признака креативности (и которое будет слово в слово повторять множество других текстов). Но если мы наугад выбираем слова с более низким рейтингом, то эссе получается «более интересное».

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

Прежде чем мы продолжим, я должен объяснить, что ради простоты изложения не стану рассматривать всю систему, лежащую в основе ChatGPT. Вместо этого буду работать с более простой системой – GPT-2, которую можно запустить на обычном персональном компьютере. И поэтому практически для всего, что вам здесь покажу, я включу код на языке Wolfram, который вы сможете немедленно запустить на своем компьютере.

Например, вот как получить таблицу вероятностей, приведенную выше. Во-первых, мы должны иметь базовую нейронную сеть языковой модели:

In[]:= model = NetModel[{"GPT-2 Transformer Trained on WebText Data", "Task" → "LanguageModeling"}]

Out[]= NetChain[]

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

In[]:= model["The best thing about AI is its ability to", {"TopProbabilities", 5}]

Out[]= {do → 0,0288508, understand → 0,0307805,

make → 0,0319072, predict → 0,0349748, learn → 0,0445305}

Затем эти строки превращаются в отформатированный набор данных:

In[]:= Dataset[ReverseSort[Association[%]],

ItemDisplayFunction → (PercentForm[#, 2] &)]


Вот что произойдет, если многократно «применять модель» – на каждом шаге добавлять слово, имеющее наибольшую вероятность (в коде это слово decision):

In[]:= NestList[StringJoin[#, model[#, "Decision"]] &, "The best thing about AI is its ability to", 7]

Out[] = {Самое лучшее в ИИ – это его способность,

Самое лучшее в ИИ – это его способность учиться,

Самое лучшее в ИИ – это его способность учиться на,

Самое лучшее в ИИ – это его способность учиться на собственном опыте,

Самое лучшее в ИИ – это его способность учиться на собственном опыте.,

Самое лучшее в ИИ – это его способность учиться на собственном опыте. Это,

Самое лучшее в ИИ – это его способность учиться на собственном опыте. Это не,

Самое лучшее в ИИ – это его способность учиться на собственном опыте. Это не так.}

Что будет, если мы продолжим предложение? В этом случае (при нулевой температуре) полученный текст оказывается запутанным и изобилующим повторами:

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

Но что, если вместо того, чтобы всегда выбирать самое популярное слово, мы выберем слова с меньшей вероятностью (с температурой 0,8)? Тогда может получиться следующий текст:

{Самое лучшее в ИИ – это его способность,

Самое лучшее в ИИ – это его способность создавать,

Самое лучшее в ИИ – это его способность создавать миры,

Самое лучшее в ИИ – это его способность создавать миры, которые,

Самое лучшее в ИИ – это его способность создавать миры, которые являются,

Самое лучшее в ИИ – это его способность создавать миры, которые являются одновременно захватывающими,

Самое лучшее в ИИ – это его способность создавать миры, которые являются одновременно захватывающими,}

И каждый раз, когда мы будет выбирать случайные слова, текст окажется разным, как в следующих примерах:

Самое лучшее в ИИ – это его способность к обучению. Мне всегда нравилось

Самое лучшее в ИИ – это его способность по-настоящему проникать в ваш мир и просто

Самое лучшее в ИИ – это его способность изучать поведение человека и то, как он

Самое лучшее в ИИ – это его способность проделывать отличную работу по обучению нас

Самое лучшее в ИИ – это его способность создавать реальные задачи, но вы можете

Стоит отметить, что даже на первом этапе имеется множество возможных «следующих слов» (при температуре 0,8), хотя вероятность их использования падает достаточно быстро (данные на этом логарифмическом графике демонстрируют зависимость от n-1, которая очень характерна для общей статистики языка):



Так что же произойдет, если мы продолжим создавать текст? Вот этот случайный пример уже лучше, чем пример с самыми популярными (нулевая температура) словами, но текст все еще немного странный:

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

Этот текст был написан простой моделью GPT-2 (2019 года выпуска). У более современной модели, GPT-3, результаты получаются намного лучше. Следующий текст был создан при помощи самых популярных (нулевая температура) слов с использованием того же самого промпта, но с помощью новой модели – GPT-3:

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

А вот пример, созданный при температуре 0,8:

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

Откуда берутся эти вероятности?

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

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

In[]:= LetterCounts[WikipediaData["cats"]]

Out[]= <|e → 4279, a → 3442, t → 3397, i → 2739, s → 2615, n → 2463, o → 2426, r → 2147, h → 1613, l → 1552, c → 1405, d → 1331, m → 989, u → 916, f → 760, g → 745, p → 651, y → 591, b → 511, w → 509, v → 395, k → 212, T → 114, x → 85, A → 81, I → 68, S → 55, F → 42, z → 38, F → 36…|>

А это в статье о собаках (англ. dogs):

In[]:= LetterCounts[WikipediaData["dogs"]]

Out[]= <|e → 3911, a → 2741, o → 2608, i → 2562, t → 2528, s → 2406, n → 2340, r → 1866, d → 1584, h → 1463, l → 1355, c → 1083, g → 929, m → 859, u → 782, f → 662, p → 636, y → 500, b → 462, w → 409, v → 406, k → 151, T → 90, C → 85, I → 80, A → 74, x → 71, S → 65…|>

Результаты похожи, но не идентичны (буква о, без сомнения, чаще встречается в статье о собаках, потому что, в конце концов, она присутствует в самом слове dog). Тем не менее, если мы возьмем достаточно большую выборку текстов на английском языке, то можем ожидать, что в итоге получим достаточно схожие результаты:

In[]:= []

Out[]= {e → 12,7 %, t → 9,06 %, a → 8,17 %, o → 7,51 %, i → 6,97 %, n → 6,75 %, s → 6,33 %, h → 6,09 %, r → 5,99 %, d → 4,25 %, I → 4,03 %, c → 2,78 %, u → 2,76 %, m → 2,41 %, w → 2,36 %, f → 2,23 %, g → 2,02 %, y → 1,97 %, p → 1,93 %, b → 1,49 %, v → 0,978 %, K → 0,772 %, j → 0,153 %, x → 0,150 %, q → 0,0950 %, z → 0,0740 %}

Вот что мы получим, если просто сгенерируем последовательность букв с такими вероятностями:

rronoitadatcaeaesaotdoysaroiyiinnbantoioestlhddeocneooewceseciselnodrtrdgriscsatsepesdcniouhoetsedeyhedslernevstothindtbmnaohngotannbthrdthtonsipieldn

Мы можем разбить это на «слова», добавив пробелы, как если бы это были буквы с определенной вероятностью:

sd n oeiaim satnwhoo eer rtr ofiianordrenapwokom del oaas ill e h f rellptohltvoettseodtrncilntehtotrkthrslo hdaol n sriaefr hthehtn ld gpod a h y oi

Мы также можем упростить процесс, разделив буквы в соответствии со стандартной длиной слов в английском языке:

ni hilwhuei kjtn isjd erogofnr n rwhwfao rcuw lis fahte uss cpnc nluoe nusaetat llfo oeme rrhrtn xdses ohm oa tne ebedcon oarvthv ist

Нам не удалось обнаружить здесь никаких реально существующих слов, но последующие результаты выглядят немного лучше. Однако, чтобы пойти дальше, нам нужно сделать нечто большее, чем просто выбрать буквы наугад. Так, например, мы знаем, что если у нас есть буква q, то следующей буквой должна быть u.

Вот график вероятностей самих букв:


А вот график, который показывает вероятности пар букв в типичном английском тексте. Первая буква пары показана сверху, вторая – слева:



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

on inhuman men ise forernoft wheat iofobato buc is corey ousesetiv fallen tinoco rye for a the ecseri pasuthrgr cuconom tra tesla will tat pere thi

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

0 – on gxeeetowmt tsifhy ah aufnsoc ior oia itlt bnc tu ih uls

1 – ri io os ot timumumoi gymyestit ate bshe abol viowr wotybeat mecho

2 – wore hi usinallistin hia ale warou pothe of premetra bect upo pr

3 – qual musin was witherins wil por vie surgedygua was suchinguary outheydays theresist

4 – stud made yello adenced through theirs from cent intous wherefo proteined screa

5 – special average vocab consumer market prepara injury trade consa usually speci utility

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

of program excessive been by was research rate not here of of other is men were against are show they the different the half the the in any were leaved

Безусловно, получается полная ерунда. Итак, как же добиться лучших результатов? Точно так же, как с буквами, мы можем учитывать вероятности не только для отдельных слов, но и для словосочетаний из двух и большего числа слов. Вот пять примеров того, что можно получить, если начать генерировать предложение, начинающееся со слова «кошка»:

cat through shipping variety is made the aid emergency can the

cat for the book flip was generally decided to design of

cat at safety to contain the vicinity coupled between electric public

cat throughout in a confirmation procedure and two were difficult music

cat on the theory an already from a representation before a

Здесь текст становится более читабельным. Теперь мы можем представить, что, если бы использовали достаточно длинные словосочетания, мы бы, по сути, получили чат – в том смысле, что это нечто генерировало бы последовательности слов длиной в эссе с «правильными общими вероятностями написания эссе». Но проблема заключается в том, что у нас нет такого количества написанных на английском языке текстов, чтобы можно было вывести эти вероятности.

В интернете, возможно, содержится несколько сотен миллиардов слов, в книгах, которые были оцифрованы, может содержаться еще сто миллиардов. Но при наличии 40 тысяч общеупотребительных слов число возможных словосочетаний из двух слов составляет 1,6 миллиарда, а число возможных комбинаций из трех слов равно 60 триллионам. Таким образом, мы никак не можем оценить вероятности для всех этих случаев на основе имеющегося текста. И к тому времени, когда мы добираемся до «фрагментов эссе» длиной в 20 слов, количество возможных комбинаций превышает количество частиц во Вселенной, так что все эти вероятности никогда не смогут быть подсчитаны.

Что мы можем сделать? Главная идея заключается в том, чтобы создать модель, которая позволит нам оценить вероятность последовательностей, даже несмотря на то, что мы никогда не видели эти последовательности непосредственно в тексте. Именно такая модель – большая языковая модель (БЯМ, англ. large language model, LLM) – лежит в основе ChatGPT, и она была специально создана для того, чтобы выполнять оценку этих вероятностей.

Что такое модель?

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

Давайте представим, что у нас есть (несколько усредненные) данные о том, сколько времени требуется пушечному ядру, чтобы долететь до земли при падении с разных этажей:


Как мы можем выяснить, сколько времени потребуется ядру, чтобы долететь до земли при падении с конкретного этажа, если не проводили эксперимент? В этом случае мы можем использовать известные законы физики. Но, допустим, все, что у нас есть, – это экспериментальные данные, и мы не знаем, какие основополагающие физические законы управляют движением ядра. Тогда мы могли бы сделать математическое предположение, например, что, возможно, нам следует использовать в качестве модели прямую линию:



Можно было бы провести разные прямые линии. Но эта линия в среднем ближе всего к полученным нами данным. И по этой прямой мы можем оценить время падения ядра с любого этажа.

Как мы поняли, что нужно провести прямую линию? Это следует из самых основ математики. Мы привыкли к тому, что множество эмпирически полученных данных хорошо описываются с помощью простых математических формул. Мы могли бы попробовать что-нибудь математически более сложное, скажем: a + bx + cx2, и тогда у нас получится следующее:



Однако результат может быть и не таким, как нам надо. Вот, например, что выйдет, если мы используем формулу a + b: x + c × sin(x):



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

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

Модели для человеческих задач

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

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



Мы можем взять ряд изображений каждой цифры:



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



Создавая описанную выше модель для наших числовых данных, мы взяли определенное числовое значение x и просто вычислили a + bx для конкретных a и b. В данном случае, если мы определим цвет каждого пикселя как некую переменную xi, есть ли какая-то функция всех этих переменных, которая – при вычислении – скажет нам, какая цифра изображена в этом случае? Оказывается, такую функцию можно построить. Однако это не так-то просто. И типичный пример может включать в себя, возможно, полмиллиона математических операций.

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

In[]:= NetModel[][{}]

Out[]= {7, 0, 9, 7, 8, 2, 4, 1, 1, 1}

Но что на самом деле тут происходит? Допустим, мы постепенно начнем размывать изображение цифры (в нашем примере – цифры 2). Некоторое время наша функция все еще будет распознавать ее. Но вскоре функция начнет выдавать «неправильный» результат:

In[]:= NetModel[][{}]

Out[]= {2, 2, 2, 1, 1, 1, 1, 1, 1}

Но почему мы рассматриваем этот результат как неправильный? В данном случае мы знаем, что получили изображения, просто размыв цифру 2. Но если наша цель состоит в том, чтобы создать модель того, как люди распознают изображения, то нужно задать следующий вопрос: что сделал бы человек, не знающий, откуда взялись эти размытые изображения?

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

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

Нейронные сети

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

В человеческом мозге находится около 100 миллиардов нейронов (нервных клеток), каждый из которых способен генерировать электрический импульс, возможно, до тысячи раз в секунду. Нейроны соединены в сложную сеть, причем каждый имеет древовидные отростки, позволяющие ему передавать электрические сигналы тысячам других нейронов. Электронный импульс зависит от того, какие импульсы данный нейрон получил от других, при этом разные связи имеют разный вес.

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

«Черный ящик» из предыдущего раздела является «математизированной» версией такой нейронной сети. Оказывается, она имеет одиннадцать слоев (четыре из которых считаются основными):



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

Хорошо, но как подобная нейронная сеть распознаёт изображения? Ключевым моментом является понятие аттрактора. Представьте, что у нас есть изображения рукописных цифр 1 и 2:



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

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



Это можно рассматривать как своего рода задачу на распознавание, где мы не пытаемся понять, на какую цифру похоже изображение, а стараемся увидеть, к какой точке определенная точка находится ближе всего.

(Диаграмма Вороного, которую мы здесь построили, разделяет точки в двумерном евклидовом пространстве; задачу распознавания цифр можно рассматривать как нечто очень похожее, но в 784-мерном пространстве, сформированном из уровней серого всех пикселей на каждом изображении.)

Итак, как мы можем заставить нейронную сеть «распознать» что-то? Давайте рассмотрим такой случай:



Наша цель состоит в том, чтобы получить входные данные, соответствующие позиции {x, y}, а затем «распознать» их, то есть отнести к той из трех точек, к которой они находятся ближе всего. Или, другими словами, мы хотим, чтобы нейронная сеть вычисляла функцию от {x, y} следующим образом:



Как же мы можем это сделать? В конечном счете нейронная сеть представляет собой связанную совокупность нейронов, обычно расположенных слоями. Простой пример выглядит так:



Каждый «нейрон» производит вычисление простой числовой функции. Чтобы задействовать всю сеть, мы просто вводим числа (например, наши координаты x и y) на самом верхнем слое, затем заставляем нейроны каждого следующего слоя вычислять простую числовую функцию и передавать результаты вычисления дальше по сети и в итоге в самом низу получаем:



В традиционной (вдохновленной биологией) установке каждый нейрон фактически имеет определенный набор входящих соединений от нейронов предыдущего уровня, причем каждому соединению присваивается вес, который может быть выражен положительным или отрицательным числом. Значение конкретного нейрона определяется путем умножения значений предыдущих нейронов на их веса, затем сложения результатов, далее добавления константы и, наконец, применения функции порогового значения (или активации). В математических терминах: если у нейрона есть входные данные x = {x1, x2 …}, то мы вычисляем f[wx + b], где обычно вес w и константа b выбираются по-разному для каждого нейрона в сети, а функция f не меняется.

Вычисление wx + b – это всего лишь вопрос умножения и сложения матриц. Функция активации f вводит нелинейность, и в конечном счете именно это приводит к нетривиальному поведению. Обычно используются различные функции активации (на иллюстрации ниже – их примеры). Здесь мы просто применим Ramp (или ReLU):



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

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



Нейронная сеть ChatGPT так же просто реализует математическую функцию, подобную этой, но с миллиардами данных.

Однако давайте вернемся к отдельным нейронам. Вот несколько примеров функций, которые нейрон с двумя входными данными (представляющими координаты x и y) может вычислять при различных вариантах весов и констант (и Ramp в качестве функции активации):

1.Промпт (от англ. prompt – «побуждать») – запрос, подсказка или инструкция, которые вы даете искусственному интеллекту. Прим. пер.

Bepul matn qismi tugad.

Yosh cheklamasi:
16+
Litresda chiqarilgan sana:
17 iyul 2024
Tarjima qilingan sana:
2024
Yozilgan sana:
2023
Hajm:
150 Sahifa 84 illyustratsiayalar
ISBN:
9785002146048
Yuklab olish formati:

O'xshash kitoblar