Книга: Вычислительное мышление: Метод решения сложных задач
Назад: Глава 7 Создаем мозг
Дальше: Играем в «Снап!» с нейронной сетью

Создаем обучающийся мозг

Искусственный интеллект учится играть в карты
Мы уже знаем, что компьютеры слепо выполняют написанные для них инструкции — алгоритмы. В этом их сила, но трудно утверждать, что компьютеры разумны. Наш интеллект проявляется не только в способности решить конкретные задачи, но и в гибкости. Мы учимся. Они — нет. Обучение — ключевой элемент интеллекта, но как будет учиться искусственный интеллект, если он всегда следует инструкциям? Выходит, нужно создать алгоритм для обучения!
Давайте начнем с действительно простого задания для ИИ — проверить, получил ли он необходимое число монет. Сформулируем задачу точнее. Чему именно должен научиться наш простой ИИ? Допустим, нам нужно, чтобы он смог сообщить, когда у него есть две монеты — но только если это действительно так. Если монет нет или на столе только одна монета, делать ничего не надо. Будем считать, что у ИИ есть сенсор для монет, однако нужно научиться их считать.
Чтобы объяснить, как в этом случае происходит обучение, мы используем простую версию самообучающейся машины. Для этого понадобится игровое поле, показанное на рис. 44, и набор карт (не важно, что на них изображено). Сыграв серию раундов этой игры, машина научится правильно определять, есть ли у нее нужное число монет. Игроки кладут (или не кладут) монету на игровое поле, после этого карты перемещают по столу, складывают и сравнивают числа. В итоге машина выдает ответ.

 

 

У машины есть две щели, куда каждый из двух игроков помещает монеты, чтобы их посчитали. Карты обоих игроков выкладываются в нужную позицию на поле. Еще есть зона карточного стола, где играют в карты, и зона, куда складывают карты дома. Итоговую карту раунда кладут в последнюю зону — зону выхода. Выбирают из двух итоговых карт, на одной стоит 0, а на второй — 1.
Игра идет слева направо следующим образом. Мы сдаем небольшое произвольное число карт двум игрокам и дому — это, соответственно, И1, И2 и Д. Потом мы играем серию раундов. Каждый игрок должен положить монету в щель, чтобы получить право сыграть раунд. Сделав это, игроки открывают карты — И1 и И2. Эти карты отправляются в зону карточного стола (там они складываются, и мы получаем сумму — С). Сумма играет против дома. Если у игроков больше карт, чем у дома (С > Д), то они выиграли. В этой ситуации выход равен 1. Нам нужно, чтобы в конечном итоге это означало «Есть две монеты». Если выигрывает дом, то выход равен 0, и мы надеемся, что это будет означать «Двух монет НЕТ». В любом случае карты игроков отправляются в начальную точку и начинается следующий раунд.
Поскольку мы сдаем произвольное количество карт и оно определяет результат, мозг настольной игры тоже будет действовать произвольно. Нам необходимо, чтобы после многократного повторения игры наш мозг научился менять изначальное случайное число карт на число, которое всегда дает нужный результат. То есть в конце выход должен быть равен 1, только если присутствует две монеты. Результат, которого мы хотим добиться, представлен на рис. 45.
Машина учится это делать в ходе серии раундов, и после каждого раунда мы применяем следующие простые порождающие правила, где М1 обозначает число монет, которое положил игрок 1 (одну монету или ни одной), а М2 — число монет, которое положил игрок 2.
Правило П1:
ЕСЛИ сыгранная партия дает правильный выход,
ТО не делайте ничего — не меняйте число карт.

 

 

Правило П2:
ЕСЛИ сыгранная партия дает на выходе 1, но мы хотели получить 0, чтобы это соответствовало таблице выходов,
ТО заберите М1 карт у игрока 1 и М2 карт у игрока 2.
Правило П3:
ЕСЛИ сыгранная партия дает на выходе 0, но мы хотели получить 1,
ТО добавьте М1 карт игроку 1 и М2 карт игроку 2.

 

Эти правила — обучающий алгоритм для нашего мозга. Пора оценить их, поэтому давайте посмотрим на примеры.
Пример игры 1. Удачный расклад, все хорошо!
Представим, что сейчас в игре три карты, сданные игроку 1, четыре — игроку 2 и три — дому (И1 = 3, И2 = 4, Д = 5). В щели 1 есть монета (М1 = 1), а в щели 2 монеты нет (М2 = 0). Мы запишем, что (М1, М2) = (1, 0).
Поскольку в щели 1 есть монета (М1 равно 1), то три карты И1 выкладываются на стол, а карты И2 — не выкладываются, потому что М2 равно 0. Соответственно, на карточном столе у нас три карты (рис. 46).
Можно обобщить количество карт (С), которое отправляется на стол. Оно вычисляется с помощью уравнения:
С = ((М1 × И1) + (М2 × И2)).

 

 

В нашем примере получается (1 × 3 + 0 × 4) = (3 + 0) = 3. Из операции умножения следует, что значения М1 и М2 определяют, будут ли сложены соответствующие суммы. Если М равно 0, то значение И не учитывается в сумме, а если оно равно 1, то значение остается.
Таким образом, сумма С для нашего мозга равна 3, и это меньше, чем Д, равное 5 (3 < 5), поэтому карта, помеченная как 0, помещается в зону выхода: «Двух монет НЕТ». Это выход, который мы хотим получить, когда в игре только одна монета. В этом случае мы применяем правило П1 и ничего не делаем.
Теперь попробуем другой вариант. Все карты возвращаются туда, откуда они взяты. Однако на этот раз давайте поместим по монете в обе щели: (М1, М2) = (1, 1). Теперь карты обоих игроков идут на стол, поскольку в обеих щелях есть монеты. И остается семь карт: (1 × 3 + 1 × 4) = 7.
Теперь 7 > 5, и на выходе 1, как нам и нужно: «Есть две монеты». И снова мы следуем правилу П1 и не делаем ничего.
Более того, если мы попробуем все четыре комбинации монет в щелях, то каждая из них даст правильный выход. Ура! Обучения не потребовалось. Но в данном случае нам повезло. Нам случайно сдали столько карт (три, четыре и пять), что машина сработала правильно. С таким количеством карт она всегда может правильно сказать, присутствуют две монеты или нет. Но что будет, если не повезет? Тогда придется играть по-другому и учиться необходимому поведению. Давайте рассмотрим другую игру.
Пример игры 2. Нужно играть
Мы снова начинаем с того, что произвольно сдаем игрокам и дому небольшое количество карт. На этот раз у игрока 1 на столе шесть карт, у игрока 2 — четыре карты, и у дома тоже четыре карты.
Ситуация, когда ни в одной щели нет монет, а значит, М1 и М2 равны 0, легкая. Карты не перемещаются, для дома мы получаем 0 < 4, и на выходе 0: «Двух монет НЕТ». Условие (М1, М2) = (0, 0) корректно. Это показано на рис. 47.
Если монета есть только в щели 2, значит, (М1, М2) = (0, 1). Тогда карты игрока 2 идут вперед. Игрок 1 остается на месте, и на стол попадают четыре карты. На выходе мы имеем 0: «Двух монет НЕТ». Помните, что для получения 1 на выходе нам нужно, чтобы сумма карт на столе была больше (а не просто равна) Д. То есть ничего не меняется, и мы снова следуем правилу П1. Условие (М1, М2) = (0, 1) корректно.

 

 

Теперь поместите одну монету в щель М1 и ни одной — в щель М2. И снова мы хотим получить на выходе 0, однако посмотрите на карты! На карточном столе у нас 6 4, а значит, на выходе 1, и это неверно! Нужно применить правило П2. В нем говорится:
«ЕСЛИ сыгранная партия дает на выходе 1, но мы хотели получить 0, чтобы это соответствовало таблице выходов,
ТО заберите М1 карт у игрока 1 и М2 карт у игрока 2».
Это значит, что, поскольку М1 равно 1 и М2 равно 0, мы забираем карту у игрока 1, но не забираем у игрока 2. Новое значение И1 — 5 (6 1), а И2 остается равно 4.
Забрав карту из стопки игрока 1, мы возвращаем его карты. Мы не забрали ни одной карты игрока 2. Машина начала учиться.
Теперь мы выбираем другое условие и пробуем еще раз. Экспериментируя с этим примером, вы вернетесь к (М1, М2) = (1, 0), проходя через возможные вводные, и снова получите ошибку. И снова будет применено правило П2, и машина наберется еще немного опыта. На этот раз, когда карту убирают у И1, получается 4.
На этом этапе И1 = 4, И2 = 4, Д = 4. Итак, когда та же ситуация повторится снова, все получится, потому что в игре четыре карты игрока и четыре карты дома. Выход для (М1, М2) = (1, 0) будет 0: «Двух монет НЕТ», а это нам и нужно. Вы также обнаружите, что случай (М1, М2) = (1, 1) тоже дает верный результат. При этом условии конечное уменьшенное значение И1(4) + И2(4) = 8. У дома 4, а 8 > 4.
Наша машина научилась действовать правильно только благодаря игре и меняла карты, когда у нее не получалось. Правила игры — обучающий алгоритм.
Минус не помеха
Поэкспериментируйте с игрой сами. Вы обнаружите, что в какой-то момент придется применить все правила П1–П3 в зависимости от того, какие карты сданы в начале игры. Это поможет машине усвоить правильное поведение. Оно зависит от того, с чего вы начнете, и от порядка, в каком вы будете опускать монеты в щели (разные условия), но в конце концов даст результат. Если по правилам игры требуется взять карт больше, чем осталось у вас на руках, вы прибегаете к старой доброй «долговой расписке». Напишите записку c текстом «–1 карта» или «–2 карты» и продолжайте играть, проверяя, получите ли вы правильный ответ для каждого из условий. В конце останутся значения И1 и И2, которые будут соответствовать либо картам на руках, либо расписке, но игра все равно будет выучена.
Чем полезна игра с мозгом?
В этой игре вы создали самообучающийся модуль для мозга, чтобы вычислять логическую функцию «И». Он учится сообщать, есть ли монеты в щели 1 и в щели 2. Однако мы не программировали логическую функцию «И» — модуль сам научился ее вычислять. Использованный здесь принцип обучения основан на идее нейронной сети.
Нейронная сеть имитирует (моделирует) вычислительные операции мозга на базовом уровне — это абстракция. Миллиарды нервных клеток мозга, называемые нейронами,можно рассматривать как простые устройства обработки данных. Они связаны с другими нейронами с помощью особых отростков аксонов и получают сигналы из других частей нейронного контура. Если сигнал, поступивший в часть клетки, называемую синапс, достаточно силен (превышает весовой порог нейрона), то этот нейрон отправляет сигнал к другим, соединенным с ним.
Наша настольная игра моделирует один-единственный нейрон. В роли вводных сигналов используются монеты. Мы хотим, чтобы сигнал проходил (выход 1), только если присутствуют оба вводных сигнала (например, в обеих щелях есть по монете). Карты на руках представляют собой нейронный вес. Это меняющиеся элементы нейрона, которые помогают ему учиться. Количество карт, сданных дому, действует как весовой порог нейрона. Сначала нейроны не знают, как складывать поступающие сигналы. Они включаются случайно, подобно случайному числу карт, сданных в начале игры. Нейронные веса могут находиться где угодно. Но как один нейрон-кирпичик поймет, что делает мозг в целом? Ему необходимо учиться — и это делается по тому же принципу, что и в нашей карточной игре. Нейроны получают сигнал, который сообщает, был выход верным или неверным (поэтому весь процесс называют контролируемым обучением), и соответствующим образом меняют веса, укрепляя одни связи и ослабляя другие. При этом используются правила обучения, похожие на наши порождающие правила П1, П2 и П3. Веса, определяющие взаимосвязи, могут быть положительными (как карты на руках) или отрицательными (как «долговые расписки»).
Наша игра создает вычислительную модель работы нейронов. Мы сделали алгоритмическую версию нейронов, которая при симуляции действительно ведет себя нужным образом. Мы использовали игру с настоящими предметами, но то же самое можно сделать и с помощью программного обеспечения, которое создает модели с тысячами и даже миллионами нейронов. Такие модели позволяют исследовать, верно ли мы понимаем поведение нейронов. Будет ли наша модель вести себя как простой мозг?
Булевы операции
Итак, мы разобрались с биологическим обучением. Но что такое упомянутая логическая функция «И»? Это пример булевой операции. Булевы операции можно представить в виде таблиц (рис. 45) с булевыми значениями ИСТИНА (1) и ЛОЖЬ (0), на которых основана логика. Их в XIX в. разработал математик Джордж Буль. Математические способности этого удивительного человека позволили ему в 19 лет открыть собственную школу в Линкольне. Сделав блестящую карьеру, он неожиданно умер в возрасте 49 лет. Однажды Буль прошел больше двух миль под проливным дождем и стал читать лекцию прямо в мокрой одежде. Неудивительно, что у него начался сильный жар. К несчастью, жена математика Мэри, которая незадолго до этого уверовала в гомеопатию, решила лечить его средствами, «подобными причине болезни». Она стала поливать его водой из ведра прямо в постели. Стоит ли говорить, что состояние Буля ухудшилось, и 8 декабря 1864 г. он умер.
Работа Буля заложила основы для идеи логических вентилей, которые мы до сих пор используем в цифровых электронных схемах. В кремнии каждого микропроцессора сделаны миллионы логических вентилей, которые могут быстро вычислять сложные суммы. Точнее говоря, из кремния сделаны транзисторы, но конструктору трудно ориентироваться на них при создании новых разработок. Поэтому транзисторы группируют в логические вентили. Создавая логические вентили И (срабатывает, если на ввод подаются оба сигнала), ИЛИ (срабатывает, если есть хотя бы один сигнал) и так далее, конструктор думает о них и забывает о транзисторах — их можно игнорировать. Это обеспечивает первый уровень абстракции в создании цифровой электроники.
Логические вентили группируются в компоненты, которые делают более сложные операции — например, складывают и умножают, перемещают данные из точки в точку. Эти функции обеспечивают еще более высокий уровень абстракции. Конструктору больше не нужно думать о логических вентилях, он может рассуждать в терминах этих изощренных функций. Вообще, создатели микросхем используют много уровней абстракции, переходя все выше по мере того, как усложняется дизайн. Если посмотреть на это с другой стороны, можно увидеть здесь пример декомпозиции. Чтобы создать вычислительное устройство, нам нужны суммирующие и множащие элементы — и так далее. Но как сделать суммирующий элемент? Для этого необходимы логические вентили. Как их сделать? Из транзисторов. Современные микросхемы сложнее, чем дорожная сеть всей планеты. Чтобы их сконструировать, необходимо использовать вычислительное мышление в грандиозных масштабах.
Логические вентили не обязательно делать из транзисторов. Как мы видели, их можно создать из простых нейронных контуров. Если заменить логические вентили на основе транзисторов эквивалентами на основе нейронов, результат будет аналогичным. Исследователи в лабораториях электроники и вычислительной техники по всему миру исследуют возможности биокомпьютинга. Например, они наблюдают, как меняется пульсация в нейронных контурах с течением времени, и размышляют, как учесть это в быстрообучающихся кремниевых или германиевых микросхемах. Алгоритмическое мышление работает в обе стороны. Оно не только позволяет заниматься научными исследованиями — порой алгоритмические версии природных процессов помогают найти новые способы работы компьютеров.
Наша простая схема подсчета монет, которая учится правильно выполнять задачу с нуля, делает тривиальные операции. Но если такую схему объединить с миллионами похожих для совместной работы, можно создать огромную вычислительную армию. Конечно, самое сложное — запрограммировать ее. Нужно разработать необходимое программное обеспечение, и все они будут вместе работать над общей целью.
Назад: Глава 7 Создаем мозг
Дальше: Играем в «Снап!» с нейронной сетью