КулЛиб - Классная библиотека! Скачать книги бесплатно
Всего книг - 714790 томов
Объем библиотеки - 1415 Гб.
Всего авторов - 275162
Пользователей - 125182

Новое на форуме

Новое в блогах

Впечатления

Влад и мир про Тарханов: Мы, Мигель Мартинес (Альтернативная история)

Оценку не ставлю, но начало туповатое. ГГ пробило на чаёк и думать ГГ пока не в может. Потом запой. Идет тупой набор звуков и действий. То что у нормального человека на анализ обстановки тратится секунды или на минуты, тут полный ноль. ГГ только понял, что он обрезанный еврей. Дальше идет пустой трёп. ГГ всего боится и это основная тема. ГГ признал в себе опального и застреленного писателя, позже оправданного. В основном идёт

  подробнее ...

Рейтинг: 0 ( 0 за, 0 против).
iv4f3dorov про Тюрин: Цепной пес самодержавия (Альтернативная история)

Афтырь упоротый мудак, жертва перестройки.

Рейтинг: +1 ( 1 за, 0 против).
iv4f3dorov про Дорнбург: Змеелов в СССР (Альтернативная история)

Очередное антисоветское гавно размазанное тонким слоем по всем страницам. Афтырь ты мудак.

Рейтинг: +2 ( 3 за, 1 против).
A.Stern про Штерн: Анархопокалипсис (СИ) (Боевик)

Господи)))
Вы когда воруете чужие книги с АТ: https://author.today/work/234524, вы хотя бы жанр указывайте правильный и прологи не удаляйте.
(Заходите к автору оригинала в профиль, раз понравилось!)

Какое же это фентези, или это эпоха возрождения в постапокалиптическом мире? -)
(Спасибо неизвестному за пиар, советую ознакомиться с автором оригинала по ссылке)

Ещё раз спасибо за бесплатный пиар! Жаль вы не всё произведение публикуете х)

Рейтинг: 0 ( 1 за, 1 против).
чтун про серию Вселенная Вечности

Все четыре книги за пару дней "ушли". Но, строго любителям ЛитАниме (кароч, любителям фанфиков В0) ). Не подкачал, Антон Романович, с "чувством, толком, расстановкой" сделал. Осталось только проду ждать, да...

Рейтинг: +2 ( 2 за, 0 против).

Создаём нейронную сеть [Тарик Рашид] (pdf) читать онлайн

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

СОЗДАЕМ
НЕЙРОННУЮ
СЕТЬ

MAKE YOUR
OWN NEURAL
NETWORK
by Tariq Rashid

createspace

СОЗДАЕМ
НЕЙРОННУЮ
СЕТЬ
Тарик Рашид

Москва •Санкт-Петербург •Киев
2017

ББК 32.973.26-018.2.75
С58
УДК 681.3.07
К ом п ью тер н ое и зда тел ьств о “ Д и а л е к ти к а ”
Гл авны й р ед а к тор С.Н. Тригуб
Зав. р едак ц и ей В.Р. Гинзбург
П еревод с а н гл и й ск о го и р ед а к ц и я кан д. х и м . н а ук А.Г. Гузикевича
П о общ и м воп р оса м обр а щ а й тесь в и зд а тел ьств о “ Д и а л е к т и к а ” по адр есу:
in fo @ d ia le k tik a . c o m , h ttp : / / w w w . d ia le k tik a . co m

C58

Рашид, Тарик.
Создаем нейронную сеть. : Пер. с англ. — СПб. : ООО “Альфа-книга” ,
2017. — 272 с. : ил. — Парал. тит. англ.
ISBN 978-5-9909445-7-2 (рус.)
ББК 3 2 .973.26-018.2.75
Все названия программных продуктов являются зарегистрированными торговыми
марками соответствующих фирм.
Никакая часть настоящего издания ни в каких целях не может быть воспроизведена
в какой бы то ни было форме и какими бы то ни было средствами, будь то электронные
или механические, включая фотокопирование и запись на магнитный носитель, если на
это нет письменного разрешения автора, Тарика Рашида.
Authorized Russian translation o f the English edition o f Make Your Own Neural
Network (ISBN 978-1530826605) © 2016 by Tariq Rashid.
This translation is published and sold by permission o f Tariq Rashid, who owns or con­
trols all rights to publish and sell the same.
All rights reserved. No part of this book may be reproduced or transmitted in any form
or by any means, electronic or mechanical, including photocopying, recording, or by any
information storage or retrieval system, without the prior written permission o f the copy­
right owner and the publisher.

Научно-популярное издание
Тарик Рашид

Создаем нейронную сеть
Литературный редактор
Верстка
Х удож ественны й редактор
К орректор

Л.Н. Красножон
О.В. Миш у тина
Е.П. Дынник
Л А . Гордиенко

ООО “Альфа-книга” , 195027, Санкт-Петербург, Магнитогорская ул., д. 30

ISBN 978-5-9909445-7-2 (рус.)

© 2017, Компьютерное изд-во “ Диалектика” ,
перевод, оформление, макетирование

ISBN 978-1530826605 (англ.)

© 2016 by Tariq Rashid

Оглавление
Пролог

10

Введение

14

Глава 1. Как работают нейронные сети

19

Глава 2. Создаем нейронную сеть на Python

129

Глава 3. Несколько интересных проектов

213

Эпилог

229

Приложение А. Краткое введение в дифференциальное исчисление

231

Приложение Б. Нейронная сеть на Raspberry Pi

257

Предметный указатель

270

Содержание
Об авторе

9

Пролог

10

Попытки создания разумных машин
Природа вдохновила новый золотой век

10
11

Введение

14

Для кого предназначена эта книга
Что мы будем делать
Как мы будем это делать
Дополнительные замечания
Ждем ваших отзывов!

14
15
16
17
18

Глава 1. Как работают нейронные сети

19

Что легко одному, трудно другому
Простая прогнозирующая машина
Задачи классификации и прогнозирования очень близки
Тренировка простого классификатора
Иногда одного классификатора недостаточно
Нейроны — вычислительные машины, созданные природой
Распространение сигналов по нейронной сети
Какая все-таки отличная вещь — умножение матриц!
Пример использования матричного умножения
в сети с тремя слоями
Корректировка весовых коэффициентов в процессе обучения
нейронной сети
Обратное распространение ошибок от большего количества
выходных узлов
Обратное распространение ошибок при большом
количестве слоев
Описание обратного распространения ошибок
с помощью матричной алгебры
Как мы фактически обновляем весовые коэффициенты

19
21
28
33
44
51
62
68
76
85
88
91
96
100

Пример обновления весовых коэффициентов
Подготовка данных
Входные значения
Выходные значения
Случайные начальные значения весовых коэффициентов

121
122
123
124
125

Глава 2. Создаем нейронную сеть на Python

129

Python
Интерактивный Python = IPython
Простое введение в Python
Блокноты
Python — это просто
Автоматизация работы
Комментарии
Функции
Массивы
Графическое представление массивов
Объекты
Проект нейронной сети на Python
Скелет кода
Инициализация сети
Весовые коэффициенты — сердце сети
По желанию: улучшенный вариант инициализации
весовых коэффициентов
Опрос сети
Текущее состояние кода
Тренировка сети
Полный код нейронной сети
Набор рукописных цифр MNIST
Подготовка тренировочных данных MNIST
Тестирование нейронной сети
Тренировка и тестирование нейронной сети
с использованием полной базы данных
Улучшение результатов: настройка коэффициента обучения
Улучшение результатов: многократное повторение
тренировочных циклов
Изменение конфигурации сети
Подведем итоги
Окончательный вариант кода

129
130
131
132
133
137
140
140
144
147
149
157
157
158
161

Содержание

163
164
167
170
173
176
185
193
198
200
202
205
207
208

7

Глава 3. Несколько интересных проектов

213

Собственный рукописный текст
Проникнем в “ мозг” нейронной сети
Загадочный черный ящик
Обратные запросы
Маркер “ 0”
Остальные изображения
Создание новых тренировочных данных: вращения

213
217
217
218
219
221
222

Эпилог

229

Приложение А. Краткое введение в диф ференциальное
исчисление

231

Прямая линия
Наклонная прямая линия
Кривая линия
Применение дифференциального исчисления вручную
Усовершенствованный способ применения дифференциального
исчисления, допускающий автоматизацию
Дифференциальное исчисление без использования графиков
Закономерности
Функции функций
Вы освоили дифференциальное исчисление!

232
235
237
239

Приложение Б. Нейронная сеть на Raspberry Pi

257

Установка IPython
Проверка работоспособности программ
Тренировка и тестирование нейронной сети
Успех Raspberry Pi

258
267
268
269

Предметный указатель

270

8

Содержание

241
246
250
252
255

Об авторе
Тарик Рашид — специалист в области количественного анализа
данных и разработки решений на базе продуктов с открытым ис­
ходным кодом. Имеет ученую степень по физике и степень магистра
по специальности “ Machine Learning and Data Mining” .
Тарик — большой поклонник Python, и ему нравится обучать но­
вичков этому языку. Проживая в Лондоне, он возглавляет местную
группу разработчиков Python (насчитывающую около 3000 участни­
ков), организует многочисленные семинары и часто выступает с до­
кладами на международных конференциях.

Пролог
Попытки создания разумных машин
На протяжении тысячелетий человечество пытается разгадать
тайну работы мозга и создать устройства, способные мыслить.
Мы изобрели кремниевые зажигалки, с помощью которых м о­
жем в любой момент получить огонь, блоки для поднятия тяжестей
и даже калькуляторы, способные выполнять для нас расчеты, но все
эти простые механические и электронные устройства, облегчающие
нашу жизнь, нас уже не удовлетворяют.
Теперь мы хотим автоматизировать более сложные задачи, такие
как группирование схожих фотографий, отделение больных клеток
от здоровых и даже игра в шахматы. По-видимому, для решения та­
ких задач требуется человеческий интеллект или по крайней мере
некие загадочные возможности человеческой психики, которых вы
не найдете в простых устройствах типа калькуляторов.
Идея машин, обладающих интеллектом наподобие человеческого,
в равной степени соблазнительная и пугающая, что породило в обще­
стве множество фантазий и страхов на эту тему. Невероятно способ­
ный, но и чрезвычайно опасный HAL 9000 из фильма Космическая
одиссея 2001 года Стэнли Кубрика, боевые роботы в захватываю­
щей кинофраншизе Терминатор и говорящий автомобиль KITT
с ярко выраженной индивидуальностью в классическом телесериале
Рыцарь дорог — это лишь некоторые из огромного числа возможных
примеров.
Когда в 1997 году чемпион мира по шахматам гроссмейстер Гарри
Каспаров потерпел поражение от компьютера IBM Deep Blue, мы не
только радовались этому историческому достижению, но и задума­
лись о возможных опасностях со стороны разгулявшегося машинно­
го интеллекта.
Интерес к разумным машинам был настолько велик, что неко­
торые изобретатели не смогли устоять перед искушением пойти
на прямой обман публики, прибегая к всевозможным ухищрениям

и трюкам. Когда секрет шахматной машины Турок был раскрыт,
оказалось, что внутри ящика скрывался игрок — человек, который
и передвигал фигуры посредством системы рычагов.

open-hide.biz

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

Природа вдохновила новый золотой век

11

Казалось, что машины с их жесткой аппаратной логикой, состоя­
щей сплошь из единиц и нулей, никогда не смогут соперничать с ор­
ганической гибкостью, иногда размытой, мыслительных процессов
биологического мозга.
По прошествии некоторого периода относительно слабого прогрес­
са возникла невероятно мощная идея о том, как вывести исследова­
ния в области искусственного интеллекта из их привычной колеи.
Почему бы не попытаться создать искусственный мозг, копируя
работу биологического мозга? Реального мозга с нейронами вместо
логических вентилей, наделенного способностью делать умозаклю­
чения, а не управляемого традиционными жестко закодированными
черно-белыми абсолютистскими алгоритмами.
Ученых вдохновляла видимая простота мозга пчел или попугаев
по сравнению со сложностью тех задач, которые они могли решать.
Мозг весом не более долей грамма демонстрировал способность управ­
лять полетом и адаптироваться к ветру, распознавать пищу и хищ ­
ников и быстро принимать решения относительно того, стоит ли
вступить в схватку или лучше обратиться в бегство. Исследователей
интересовало, смогут ли компьютеры с их колоссальными электрон­
ными ресурсами имитировать работу такого мозга и даже достичь
большего. Если мозг пчелы насчитывает примерно 950 тысяч нейро­
нов, то смогут ли современные компьютеры с их ресурсами памяти,
исчисляемыми гигабайтами и терабайтами, превзойти пчел?
Но при использовании традиционных подходов к решению про­
блем даже суперкомпьютеры с огромным объемом памяти и сверх­
быстрыми процессорами не могли обеспечить то, на то способен мозг
птицы или пчелы.
Идея проектирования интеллектуальных вычислительных уст­
ройств по образу и подобию биологических систем привела к соз­
данию теории нейронных сетей, ставшей одним из самых мощных
и полезных подходов к разработке искусственного интеллекта. Если
говорить о сегодняшних достижениях, то, например, нейронные сети
являются основным направлением деятельности компании Deepmind
(ныне собственность компании Google), добившейся таких фантасти­
ческих успехов, как создание нейронной сети, способной учиться
играть в видеоигры, и еще одной, которая смогла победить в неве­
роятно сложной игре го гроссмейстера мирового уровня. Нейронные
12

Пролог

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

Природа вдохновила новый золотой век

13

Введение
Для кого предназначена эта книга
Эта книга предназначена для всех, кто хочет разобраться в том,
что такое нейронные сети. Она адресована тем, кто хочет создать
и использовать собственную нейронную сеть, а также по достоинству
оценить элегантную простоту математических идей, лежащих в ос­
нове работы нейронных сетей.
Это руководство не рассчитано на специалистов в области матема­
тики и вычислительной техники. От вас не требуется никаких спе­
циальных знаний или владения математикой в объеме, выходящем
за пределы школьного курса.
Если вы умеете выполнять простые арифметические операции, то
в состоянии создать собственную нейронную сеть. Самое сложное,
что мы будем использовать, — градиенты, но и это понятие будет
разъяснено так, чтобы у большинства читателей не возникло ника­
ких трудностей по данному поводу.
Для любознательных читателей или студентов книга может по­
служить стартовой площадкой для дальнейшего путешествия в ув­
лекательный мир искусственного интеллекта. Ухватив суть того,
как работают нейронные сети, вы сможете применять базовые идеи
для решения самых разнообразных задач.
Преподаватели могут использовать это руководство для того,
чтобы доходчиво рассказать о нейронных сетях и способах их реа­
лизации студентам с целью заинтересовать их этой темой и вселить
в них энтузиазм для создания собственной обучающейся системы ис­
кусственного интеллекта с помощью всего лишь нескольких строк
программного кода. Приведенный в книге пример кода тестировал­
ся на Raspberry Pi — небольшом и недорогом компьютере, пользую­
щемся большой популярностью среди школьников и студентов.
О таком руководстве я мечтал, когда, еще будучи подростком, му­
чительно пытался понять принципы работы этих загадочных нейрон­
ных сетей. О них упоминалось в книгах, журналах и кинофильмах,

но в то время их серьезное обсуждение можно было найти только
в научных статьях, предназначенных для математиков и написан­
ных их языком.
Как мне тогда хотелось, чтобы кто-то объяснил мне все это
на простом и понятном даже студенту колледжа языке! Именно эту
цель и преследую я в книге.

Что мы будем делать
В книге мы создадим нейронную сеть, способную распознавать ру­
кописные цифры.
Мы начнем с очень простых прогнозирующих нейронов и будем
постепенно усовершенствовать их по мере достижения предела их
текущих возможностей. Время от времени мы будем делать корот­
кие паузы для того, чтобы вы могли изучить очередной ряд матема­
тических понятий, которые будут нужны вам для понимания того,
каким образом нейронные сети могут обучаться и прогнозировать
решения задач.
В нашем путешествии мы охватим такие математические поня­
тия, как функции, простые линейные классификаторы, итеративное
улучшение, матричная алгебра, оптимизация методом градиентного
спуска и даже геометрические операции вращения. Но все это будет
объясняться на достаточно доходчивом уровне, совершенно не требу­
ющем никаких дополнительных знаний сверх того, что предлагается
в школьном курсе математики.
Успешно создав нашу первую нейронную сеть, мы вооружимся
накопленным опытом и исследуем другие возможные направления
работы. Например, мы используем распознавание образов для того,
чтобы усовершенствовать способность нашей машины к обучению,
не прибегая к дополнительным тренировочным данным. Мы даже
заглянем в память нейронной сети, чтобы посмотреть, не удастся ли
нам найти там нечто сокровенное, причем существует не так-то мно­
го руководств, в которых показывается, как это можно сделать!
Кроме того, в ходе поэтапного создания нашей нейронной сети мы
изучим Python — простой, полезный и весьма популярный язык про­
граммирования. Вновь подчеркну, что никакого предварительного
опыта или знакомства с программированием от вас не потребуется.

Что мы будем делать

15

Как мы будем это делать
Главной целью книги является разъяснение понятий, лежащих
в основе нейронных сетей, как можно большему кругу читателей.
Это означает, что нашей отправной точкой всегда будет какая-то
более или менее понятная для вас идея, с которой вы уже знако­
мы. Далее, постепенно достраивая конструкцию на уже имеющем­
ся надежном фундаменте, мы будем достигать уровня, достаточного
для того, чтобы вы были в состоянии оценить некий новый интерес­
ный аспект нейронных сетей.
Чтобы не упускать из виду наиболее важные моменты, автор со­
знательно опускает обсуждение вопросов, понимание которых не яв­
ляется обязательным для создания собственной нейронной сети. Мы
будем иметь дело с множеством любопытных контекстов и соприка­
сающихся с ними тем, которые могут входить в круг интересов не­
которых читателей, и если таким читателем являетесь вы, то у вас
есть полная свобода действий для собственных исследований в кон­
кретных направлениях.
В книге вовсе не ставилась задача рассказать обо всех возможных
способах оптимизации и улучшения нейронных сетей. Таких спосо­
бов существует множество, и их анализ отвлек бы нас от основной
цели — ознакомления читателей с основными идеями на простом
и как можно более доходчивом уровне.
Материал книги разделен на три главы.
• В главе 1 обсуждаются математические идеи, лежащие в основе
работы простых нейронных сетей. Автор намеренно не затраги­
вает здесь ничего, что связано с программированием, чтобы сфо­
кусировать внимание читателя на базовых положениях теории.
• В главе 2 вы познакомитесь с языком программирования
Python в объеме, достаточном для реализации нашей нейрон­
ной сети. Мы научим эту сеть распознавать рукописные цифры
и протестируем, насколько эффективно она работает.
• В главе 3 мы продвинемся немного дальше, чем необходимо
для понимания простых нейронных сетей, и просто поработаем
в свое удовольствие. Мы опробуем на практике идеи дальнейше­
го улучшения функционирования своей нейронной сети, а также

16

Введение

заглянем внутрь обученной сети, чтобы увидеть, можем ли мы
понять, чему она уже обучилась и как она принимает решения.
Заранее предупреждаю, что беспокоиться по поводу покупки не­
обходимых программных инструментов вам не следует, поскольку
мы будем использовать лишь бесплатное программное обеспечение
с открытым исходным кодом, так что вам ни за что не придется пла­
тить. Весь приведенный в книге код тестировался на очень дешевом
компьютере Raspberry Pi Zero ($5). О том, как запустить этот ком­
пьютер, рассказывается в приложении.

Дополнительные замечания
Я буду считать, что не справился со своей задачей, если чтение
книги не вызовет у вас чувства подлинного изумления и восхищения
успехами математики и компьютерной науки.
Я буду считать, что не справился со своей задачей, если мне не
удастся убедительно доказать вам, что даже знания школьного кур­
са математики и простых компьютерных приемов вполне достаточ­
но для реализации самых смелых идей, например для создания ис­
кусственного интеллекта, имитирующего способность человеческого
мозга к обучению.
Я буду считать, что не справился со своей задачей, если мне не
удастся вселить в вас уверенность в своих силах и желание заняться
дальнейшими исследованиями в невероятно интересной области ис­
кусственного интеллекта.
Каждый из читателей может внести свой вклад в улучшение кни­
ги и сообщить автору о своих пожеланиях по электронной почте
(makeyourownneuralnetworkSgmail. com) или в Твиттере (Smyoneuralnet).
С обсуждением тем, затронутых в книге, можно ознакомиться
по следующему адресу:
http://makeyourownneuralnetwork.blogspot.со.uk/

Там же будет публиковаться информация об обнаруженных опе­
чатках, ошибках и исправлениях.

Дополнительные замечания

17

Ждем ваших отзывов!
Вы, читатель этой книги, и есть главный ее критик. Мы ценим
ваше мнение и хотим знать, что было сделано нами правильно, что
можно было сделать лучше и что еще вы хотели бы увидеть издан­
ным нами. Нам интересны любые ваши замечания в наш адрес.
Мы ждем ваших комментариев и надеемся на них. Вы можете
прислать нам бумажное или электронное письмо либо просто посе­
тить наш сайт и оставить свои замечания там. Одним словом, любым
удобным для вас способом дайте нам знать, нравится ли вам эта кни­
га, а также выскажите свое мнение о том, как сделать наши книги
более интересными для вас.
Отправляя письмо или сообщение, не забудьте указать название
книги и ее авторов, а также свой обратный адрес. Мы внимательно
ознакомимся с вашим мнением и обязательно учтем его при отборе
и подготовке к изданию новых книг.
Наши электронные адреса:
E-mail:
WWW:

in fo @ d ia le k t ik a .c o m
h t t p : / / w w w .d ia le k t ik a .c o m

Наши почтовые адреса:
в России: 195027, Санкт-Петербург, Магнитогорская ул., д. 30,
ящик 116
в Украине: 03150, Киев, а/я 152

ГЛАВА 1

Как работают
нейронные сети
Черпайте вдохновенье в окружающих вас мелочах.

Что легко одному, трудно другому
Компьютеры, в сущности, — это не более чем калькуляторы, спо­
собные выполнять арифметические операции с огромной скоростью.
Эта особенность компьютеров позволяет им отлично справляться
с задачами, аналогичными тем, которые решаются с помощью каль­
куляторов: суммирование чисел с целью определения объемов про­
даж, применение процентных ставок для начисления налогов или
построение графиков на основе существующих данных.
Даже просмотр телевизионных программ или прослушивание по­
токовой музыки через Интернет с помощью компьютера не требует
чего-то большего, чем многократное выполнение простых арифмети­
ческих операций. Возможно, вы будете удивлены, но реконструкция
видеокадра, состоящего сплошь из единиц и нулей, которые посту­
пают на ваш компьютер по сети, осуществляется путем выполнения
арифметических действий, лишь ненамного более сложных, чем
суммирование чисел, которое вы проходили в школе.
Безусловно, сложение чисел с гигантской скоростью — тысячи
или миллионы операций в секунду — это впечатляющий эффект, но
его нельзя назвать проявлением искусственного интеллекта. Даже
если человеку трудно складывать в уме большие числа, данный
процесс вовсе не требует особого интеллекта. Для таких вычисле­
ний достаточно способности следовать элементарным инструкциям,
и именно это происходит внутри любого компьютера.

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

Мы с вами, посмотрев на эти фотографии, легко определим, что
на них изображены соответственно люди, кот и дерево. Мы способны
практически мгновенно и с высокой точностью распознавать объек­
ты, на которые направляем свой взгляд, и при этом очень редко оши­
баемся.
В процессе анализа изображений и классификации объектов наш
мозг обрабатывает огромные объемы информации. Компьютеру труд­
но решать подобные задачи, а точнее — невероятно трудно.
Задача

Быстрое умножение тысяч больших чисел
Распознавание конкретного человека среди
толпы на фотографии

Компьютер

Человек

Легко

Трудно

Трудно

Легко

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

20

Глава 1. Как работают нейронные сети

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

Резю ме


Одни задачи, как, например, перемножение миллионов пар чисел, просты
для компьютера, но трудны для человека.



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

Простая прогнозирующая машина
Начнем с простого и будем постепенно усложнять задачу.
Вообразите простую прогнозирующую машину (предиктор), ко­
торая получает вопрос, совершает некий “ мыслительный” процесс
и выдает ответ. Все происходит примерно так, как в приведенном
выше примере с распознаванием образов, в котором входная инфор­
мация воспринималась нашими глазами, далее наш мозг анализиро­
вал изображение, после чего мы делали выводы относительно того,
какие объекты имеются на данном изображении. Это можно пред­
ставить с помощью следующей схемы.

вопрос

анализ

ответ

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

Простая прогнозирующая машина

21

ввод

обработка
(расчет)

вывод

Компьютер получает входную информацию, выполняет некоторые
расчеты и выдает результат. Этот процесс схематически представлен
на следующей иллюстрации. Входная информация, заданная в виде
“ 3x4” , обрабатывается с возможной заменой операции умножения
более простыми операциями сложения, и выдается выходной резуль­
тат “ 12” .

расчет
ввод
3X 4

вывод

4 + 4 + 4

1Z

Возможно, вы подумали: “ Ну и что здесь особенного?” Не пере­
живайте, все нормально. Пока что мы используем простые и хорошо
знакомые примеры для введения понятий, которые далее будут при­
менены к более интересным нейронным сетям.
Давайте чуть усложним задачу.
Представьте, что машина должна преобразовывать километры
в мили.

километры

расчет

? ??

22

Глава 1. Как работают нейронные сети

мили

Предположим, что формула, преобразующая километры в мили,
нам неизвестна. Все, что мы знаем, — это то, что данные единицы
измерения связаны между собой линейной зависимостью. Это озна­
чает, что если мы удвоим количество миль, то количество киломе­
тров, соответствующее данному расстоянию, также удвоится. Такая
зависимость воспринимается нами интуитивно.
Существование линейного соотношения между километрами
и милями дает нам ключ к разгадке формулы для вычислений. Она
должна иметь следующий вид: мили = километры х с, где с — констан­
та, величину которой мы пока что не знаем.
Единственными дополнительными подсказками нам могут слу­
жить отдельные примеры правильного выражения расстояний в ки­
лометрах и милях. Эти примеры будут выступать как бы в роли экс­
периментальных данных, отражающих истинное положение вещей,
которые мы используем для проверки своей научной теории.
Истинный пример

Километры

Мили

1

0

0

2

100

62,37

Что нам нужно сделать для того, чтобы определить недостающую
величину константы? Давайте просто подставим в формулу какоелибо случайное значение! Например, предположим, что с=0,5, и по­
смотрим, что при этом произойдет.

километры

ХОО

мили километры к
0.5

мили

SO

Здесь мы подставляем в формулу мили = километры х с значение
100 вместо километры и текущее пробное значение 0,5 вместо кон­
станты с. В результате мы получаем ответ: 50 миль.

Простая прогнозирующая машина

23

Ну хорошо. Это вовсе неплохо, если учесть, что значение с=0,5
было выбрано случайным образом! Но мы знаем, что оно не совсем
точное, поскольку пример 2 истинного соотношения говорит нам
о том, что правильный ответ — 62,137.
Мы ошиблись на 12,137. Это число представляет величину ошиб­
ки, т.е. разность между истинным значением из нашего списка при­
меров и расчетным значением.
ошибка = истина - расчет
=
62,137 - 50
=
12,137

километры

ЮО

мили =
километры
0 ,5

расчетные мили

50
правильный ответ

6 2 ,1 3 7

ошибка

1 2 ,1 3 7

Что дальше? Мы знаем, что ошиблись, и нам известна величина
ошибки. Вместо того чтобы видеть в этой ошибке повод для отчая­
ния, мы используем эту информацию для того, чтобы предложить
более удачное пробное значение константы с, чем первое.
Вернемся к ошибке. Мы ошиблись на 12,137 в сторону меньших
значений. Так как формула для преобразования километров в мили
линейная, мили = километры х с, мы знаем, что увеличение с приведет
к увеличению результирующего значения.
Давайте немного подправим с, заменив значение 0,5 значением
0,6, и посмотрим, к чему это приведет.

24

Глава 1. Как работают нейронные сети

Приняв для с значение 0,6, мы получаем мили = километры х с =
= 100 х 0, 6 = 60. Это уже лучше, чем предыдущий ответ — 50. Налицо
явный прогресс!
Теперь ошибка уменьшилась до 2,137. Вполне возможно, что с та­
кой ошибкой мы могли бы даже смириться.

километры

гоо

мили=
километры х
0 ,ь

расчетные мили

10, cval=0.01, reshape=False)
# повернуть на 10 градусов по часовой стрелке
inputs_minuslO_img =
'bscipy.ndimage.interpolation.rotate(scaled_input.reshape (28,28),
^>-10, cval=0.01, reshape=False)

В этом коде первоначальный массив scaled input преобразуется
в массив размерностью 28x28. Параметр reshape=False сдерживает
излишнюю рьяность библиотеки в ее желании быть как можно более
полезной и сжать изображение таким образом, чтобы после враще­
ния все оно уместилось в массиве и ни один его пиксель не был от­
сечен. Параметр cval — это значение, используемое для заполнения
элементов массива, которые не существовали в исходном массиве, но
теперь появились. Мы откажемся от используемого по умолчанию
значения 0,0 и заменим его значением 0,01, поскольку во избежание
подачи на вход нейронной сети нулей мы используем смещенный ди­
апазон входных значений.
Запись 6 (седьмая по счету) малого тренировочного набора MNIST
содержит рукописное начертание цифры “ 1” . Вот как выглядят ее
исходное изображение и две его повернутые вариации, полученные
с помощью нашего кода.

Результаты очевидны. Версия исходного изображения, повер­
нутая на +10 градусов, является примером почерка человека, “ за­
валивающего” текст влево. Еще более интересна версия оригина­
ла, повернутая на -1 0 градусов, т.е. по часовой стрелке. Эта версия

224

Глава 3. Несколько интересных проектов

располагается даже ровнее по сравнению с оригиналом и в некото­
ром смысле более представительна в качестве изображения для об­
учения.
Создадим новый блокнот Python с имеющимся кодом нейронной
сети, но с дополнительными тренировочными примерами, созданны­
ми путем поворота исходных изображений на 10 градусов в обе сто­
роны. Этот код доступен на сайте GitHub по следующему адресу:
https://github.com/makeyourownneuralnetwork/makeyourownneuralnetwork/
blob/master/part3_neural_network_mnist_data_with_rotations.ipynb

Запуск этого кода с использованием коэффициента обучения 0,1
и всего лишь одной тренировочной эпохи дает показатель эффектив­
ности, равный 0,9669. Это значительное улучшение по сравнению со
значением 0,954, полученным без дополнительных повернутых изо­
бражений. Такой показатель уже попадает в число лучших из тех,
которые опубликованы на сайте Яна Лекуна (http://yann.lecun.
com/exdb/mnist/).
Запустим серию экспериментов, изменяя количество эпох, чтобы
проверить, можно ли еще больше улучшить полученный показатель
эффективности обучения. Кроме того, уменьшим коэффициент обу­
чения до 0,01, поскольку, предоставив гораздо больше тренировоч­
ных данных и тем самым увеличив общее время обучения, мы мо­
жем позволить себе более осторожные шаги обучения меньшей вели­
чины.
Не забывайте о том, что мы не ожидаем получить точность распоз­
навания 100% , поскольку, вероятно, существует естественный пре­
дел точности, обусловленный спецификой архитектуры нейронной
сети или полнотой тренировочных данных, в связи с чем мы вряд ли
можем получить точность выше примерно 98% . Под “ спецификой
архитектуры нейронной сети” здесь подразумевается выбор количес­
тва узлов в каждом слое, количества скрытых слоев, функции акти­
вации и т.п.
Ниже представлены графики, отражающие зависимость эффек­
тивности нейронной сети от угла поворота дополнительных трениро­
вочных изображений. Для сравнения показана также точка данных,
соответствующая отсутствию дополнительных примеров.

Создание новых тренировочных данных: вращения

225

Как видите, для пяти эпох наилучший результат равен 0,9745,
или 97,5% точности. Это явное улучшение по сравнению с предыду­
щим примером.
Также следует отметить, что с увеличением угла поворота изобра­
жения точность падает. Это вполне объяснимо, поскольку при боль­
ших углах поворота результирующие изображения фактически во­
обще не представляют цифры. Представьте цифру “ 3” , повернутую
на 90 градусов, т.е. положенную на бок. Это будет вовсе не тройка.
Поэтому, добавляя тренировочные примеры с чрезмерно большими
углами поворота, мы снижаем качество тренировки, потому что до­
бавляемые примеры являются ложными. Пожалуй, оптимальным
углом поворота для дополнительных тренировочных изображений
является угол 10 градусов.
Для десяти эпох рекордное пиковое значение точности составля­
ет 0,9787, или почти 9 8 % ! Это поистине ошеломляющий результат
для простой нейронной сети такого рода. Не забывайте о том, что
мы не использовали никаких изощренных математических трюков
в отношении нейронной сети или данных, как это делают некоторые

226

Глава 3. Несколько интересных проектов

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

Отличная работа!

Создание новых тренировочных данных: вращения

227

Эпилог
Надеюсь, мне удалось продемонстрировать, что в случае использо­
вания традиционных подходов задачи, которые легко решает чело­
век, для компьютеров оказываются крепким орешком. Одним из вы­
зовов, брошенных так называемому “ искусственному интеллекту” ,
является задача распознавания образов (изображений).
Значительный прогресс в области распознавания изображений,
как, впрочем, и в ряде других проблемных областей, был достигнут
благодаря использованию нейронных сетей. Толчком к развитию
теории нейронных сетей послужило стремление разгадать тайну
биологического мозга, который, обладая, на первый взгляд, мень­
шими быстродействием и ресурсами по сравнению с современными
суперкомпьютерами, даже в случае таких живых существ, как по­
пугаи или насекомые, способен решать сложные задачи, например
управление полетом, прием пищи или строительство жилья. Кроме
того, биологический мозг необычайно устойчив к повреждениям
и способен различать даже несовершенные сигналы. Цифровым
компьютерам и традиционным вычислительным подходам до этого
пока что далеко.
На сегодняшний день нейронные сети — ключевой фактор
успешности самых фантастических проектов в области искусствен­
ного интеллекта. Не ослабевает интерес к применению нейронных
сетей в области машинного обучения, особенно глубокого обучения,
предполагающего наличие иерархии обучающих методов. В начале
2016 года компьютерная система компании DeepMind, ныне при­
надлежащей компании Google, победила профессионального игрока
в го. Это был поворотный момент в развитии искусственного интел­
лекта, поскольку игра го требует гораздо более глубокого продумы­
вания стратегии по сравнению с шахматами, и исследователи по­
лагали, что наступления столь знаменательного события придется
ожидать еще долгие годы. Ключевую роль в этом успехе сыграли
нейронные сети.

Хочется верить, что мне удалось продемонстрировать вам, насколь­
ко простые идеи лежат в основе нейронных сетей. Я также надеюсь,
что эксперименты с нейронными сетями доставили вам удовольствие.
Возможно, это пробудит в вас интерес к изучению других разновиднос­
тей машинного обучения и искусственного интеллекта.
Если хотя бы одно из моих предположений оказалось верным, моя
цель достигнута.

230

Эпилог

ПРИЛОЖЕНИЕ А

Краткое введение
в дифференциальное
исчисление
Представьте, что вы движетесь в автомобиле с постоянной ско­
ростью 30 миль в час. Затем вы нажимаете на педаль акселератора.
Если вы будете держать ее постоянно нажатой, скорость движения
постепенно увеличится до 35, 40, 50, 60 миль в час и т.д.
Скорость движения автомобиля изменяется.
В этом разделе мы исследуем природу изменения различных вели­
чин и обсудим способы математического описания этих изменений.
А что подразумевается под “ математическим описанием” ? Это озна­
чает установление соотношений между различными величинами, что
позволит нам точно определить степень изменения одной величины
при изменении другой. Например, речь может идти об изменении ско­
рости автомобиля с течением времени, отслеживаемого по наручным
часам. Другими возможными примерами могут служить зависимость
высоты растений от уровня выпавших осадков или изменение длины
пружины в зависимости от приложенного к ее концам усилия.
Математики называют это дифференциальным исчислением. Я дол­
го сомневался, прежде чем решился вынести этот термин в название
приложения. Мне казалось, что многих людей он отпугнет, посколь­
ку они посчитают изложенный ниже материал слишком сложным
для того, чтобы на него тратить время. Однако такое отношение к дан­
ному предмету обсуждения могли привить только плохие учителя или
плохие школьные учебники.
Прочитав все приложение до конца, вы убедитесь в том, что мате­
матическое описание изменений — а именно для этого и предназначе­
но дифференциальное исчисление — оказывается совсем не сложным
во многих полезных сценариях.

Даже если вы уже знакомы с дифференциальным исчислением,
возможно, еще со школы, вам все равно стоит прочитать это прило­
жение, поскольку вы узнаете много интересного об истории матема­
тики. Вам будет полезно взять на вооружение идеи и инструменты
математического анализа, чтобы использовать их в будущем при ре­
шении различных задач.
Если вам нравятся исторические эссе, почитайте книгу “ Великие
противостояния в науке” (ИД “ Вильямс” , 2007), где рассказывается
о драме, разыгравшейся между Лейбницем и Ньютоном, каждый из
которых приписывал открытие дифференциального исчисления себе!

Прямая линия
Чтобы настроиться на работу, начнем для разминки с очень прос­
того сценария.
Вновь представьте себе автомобиль, движущийся с постоянной ско­
ростью 30 миль в час. Не больше и не меньше, а ровно 30 миль в час.
В приведенной ниже таблице указана скорость автомобиля в раз­
личные моменты времени с интервалом в полминуты.

232

Приложение А, Краткое введение в дифференциальное исчисление

Время (мин.)

Скорость (миль/ч)

0,0
0,5

30
30
30
30
30
30
30

1,0
1,5
2,0
2,5
3,0

Следующий график представляет значения скорости в соответ­
ствующие моменты времени.

Как видите, скорость не изменяется с течением времени, и по­
этому точки выстраиваются в прямую линию. Эта линия не идет ни
вверх (увеличение скорости), ни вниз (уменьшение скорости), а оста­
ется на уровне 30 миль в час.
В данном случае математическое выражение для скорости, кото­
рую мы обозначим как s, имеет следующий вид:

Прямая линия

233

Если бы кто-то спросил нас о том, как изменяется скорость со вре­
менем, мы бы ответили, что она не изменяется. Скорость ее измене­
ния равна нулю. Иными словами, скорость не зависит от времени.
Зависимость в данном случае нулевая.
Мы только что выполнили одну из операций дифференциального
исчисления! Я не шучу!
Дифференциальное исчисление сводится к нахождению измене­
ния одной величины в результате изменения другой. В данном слу­
чае нас интересует, как скорость изменяется со временем.
Вышеизложенное можно записать в следующей математической
форме:

Что собой представляют эти символы? Считайте, что они означают
“ как скорость изменяется с изменением времени” , или “ как s зави­
сит от t” .
Таким образом, это выражение является компактной математи­
ческой записью утверждения о том, что скорость не изменяется со
временем. Другими словами, изменение времени не влияет на ско­
рость. Зависимость скорости от времени нулевая. Именно это означа­
ет нуль в выражении. Обе величины полностью независимы. Ладно,
ладно — мы все уже поняли!
В действительности эту независимость можно легко заметить,
если вновь взглянуть на выражение для скорости s = 30. В нем во­
обще нет даже намека на время, т.е. в нем отсутствует любое про­
явление символа t. Поэтому, чтобы сказать, что
= 0, нам не по­
требуется никакое дифференциальное исчисление. Говоря языком
математиков, “ это следует из самого вида выражения” .
Выражения вида
t,определяющие степень измене
s/
d
величины при изменении другой, называют производными. Для на­
ших целей знание этого термина не является обязательным, но он
вам может встретиться где-нибудь еще.
А теперь посмотрим, что произойдет, если надавить на педаль ак­
селератора. Поехали!
234

Приложение А. Краткое введение в дифференциальное исчисление

Наклонная прямая линия
Представьте себе все тот же автомобиль, движущийся со скорос­
тью 30 миль в час. Вы надавили на педаль акселератора, и автомо­
биль набирает скорость. Вы удерживаете педаль нажатой, смотрите
на показания спидометра и записываете их через каждые 30 секунд.
По прошествии 30 секунд скорость автомобиля составила 35 миль
в час. Через минуту она возрастает до 40 миль в час. Через 90 секунд
автомобиль ускоряется до 45 миль в час, а после двух минут автомо­
биль разгоняется до 50 миль в час. С каждой минутой скорость авто­
мобиля увеличивается на 10 миль в час.
Эта информация сведена в представленной ниже таблице.
Время (мин.)

Скорость (миль/ч)

0,0

30

0,5

35

1,0

40

1,5
2,0

45

2,5

55

3,0

60

50

Визуализируем этиданные.

Наклонная прямая линия

235

Как видите, увеличение скорости движения автомобиля с 30
до 60 миль в час происходит с постоянной скоростью изменения.
Она действительно постоянна, поскольку приращение скорости за
каждые полминуты остается одним и тем же, что приводит к прямо­
линейному графику скорости.
А что собой представляет выражение для скорости? В нулевой
момент времени скорость равна 30 миль в час. Далее мы добавляем
по 10 миль в час за каждую минуту. Таким образом, искомое выра­
жение должно иметь следующий вид:

Перепишем его, используя символьные обозначения:

В этом выражении имеется константа 30. В нем также есть
член
0*время), который каждую минуту увеличивает скорость
(1
на 10 миль в час. Вы быстро сообразите, что 10 — это угловой ко­
эффициент линии, график которой мы построили. Вспомните, что
общая форма уравнения прямой линии имеет вид =
где а —
угловой коэффициент, или наклон, линии.
А как будет выглядеть выражение, описывающее изменение ско­
рости во времени? Мы уже говорили, что с каждой минутой скорость
увеличивается на 10 миль в час.

Это выражение говорит о том, что между скоростью движения ав­
томобиля и временем существует зависимость. На это указывает тот
факт, что 3 s/3 t не равно нулю.
Вспомните, что для прямой линии, описываемой уравнением =
= ах +
Ь,наклон равен а, и поэтому наклон для прямой линии s = 30
+ 10t должен быть равным 10.

236

Приложение А. Краткое введение в дифференциальное исчисление

Отличная работа! Мы уже успели охватить довольно много базо­
вых элементов дифференциального исчисления, и это оказалось со­
всем несложно.
А теперь надавим на акселератор еще сильнее!

Кривая линия
Представьте, что я начинаю поездку в автомобиле, нажав педаль
акселератора почти до упора и удерживая ее в этом положении.
Совершенно очевидно, что начальная скорость равна нулю, посколь­
ку в первый момент автомобиль вообще не двигался.
Поскольку педаль акселератора нажата почти до упора, скорость
движения будет увеличиваться не равномерно, а быстрее. Это оз­
начает, что скорость автомобиля уже не будет возрастать только
на 10 миль в час каждую минуту. Само ежеминутное приращение
скорости будет с каждой минутой увеличиваться, если педаль аксе­
лератора по-прежнему удерживается нажатой.
Предположим, что скорость автомобиля принимает в каждую ми­
нуту значения, приведенные в следующей таблице.
Время (мин.)

Скорость (миль/ч)

0

0

1

1

2

4

3

9

4

16

5

25

6

36

7

49

8

64

Внимательно присмотревшись к этим данным, вы заметите, что
выбранные мною значения скорости представляют собой время в ми­
нутах, возведенное в квадрат, т.е. скорость в момент времени 2 равна
22=4, в момент времени 3 - 32=9, в момент времени 4 - 42=16 и т.д.
Записать соответствующее математическое выражение не состав­
ляет труда:

Кривая линия

237

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

Как видите, со временем скорость автомобиля растет все интенсив­
нее. График уже не является прямой линией. Нетрудно сделать вы­
вод, что вскоре скорость должна достигнуть очень больших значений.
На 20-й минуте она должна была бы составить 400 миль в час, а на
100-й — целых 10000 миль в час!
Возникает интересный вопрос: как быстро изменяется скорость
с течением времени? Другими словами, каково приращение скорости
в каждый момент времени?
Это не то же самое, что спросить: а какова фактическая скорость
в каждый момент времени? Ответ на этот вопрос нам уже известен,
поскольку для него у нас есть соответствующее выражение: s = t 2.
Мы же спрашиваем следующее: какова скорость изменения скорос­
ти автомобиля в каждый момент времени? Но что вообще это означает
в нашем примере, в котором график оказался криволинейным?
238

Приложение А. Краткое введение в дифференциальное исчисление

Если вновь обратиться к двум предыдущим примерам, то в них ско­
рость изменения скорости определялась наклоном графика зависимости
скорости от времени. Когда автомобиль двигался с постоянной скоро­
стью 30 миль в час, его скорость не изменялась, и поэтому скорость ее из­
менения была равна 0. Когда автомобиль равномерно набирал скорость,
скорость ее изменения составляла 10 миль в час за минуту. Данный по­
казатель имел одно и то же значение в любой момент времени. Он был
равен 10 миль в час на второй, четвертой и даже на сотой минуте.
Можем ли мы применить те же рассуждения к криволинейному гра­
фику? Можем, но с этого момента нам следует немного сбавить темп,
чтобы не спеша обсудить этот вопрос.

Применение дифференциального
исчисления вручную
Присмотримся повнимательнее к тому, что происходит в конце тре­
тьей минуты движения.
По прошествии трех минут с момента начала движения (t=3) ско­
рость (s) составит 9 миль в час. Сравним это с тем, что будет в конце шес­
той минуты движения. В этот момент скорость составит 36 миль в час,
но мы знаем, что после этого автомобиль будет двигаться еще быстрее.
Мы также знаем, что в любой момент времени вслед за шестой ми­
нутой скорость будет увеличиваться быстрее, чем в эквивалентный мо­
мент времени, следующий за третьей минутой. Существует реальное
различие в том, что происходит в моменты времени, соответствующие
трем и шести минутам движения.
Представим все это в наглядной форме с помощью графика.

Применение дифференциального исчисления вручную

239

Вы видите, что в момент времени 6 минут наклон кривой круче,
чем в момент времени 3 минуты. Оба наклона представляют иско­
мую скорость изменения скорости движения. Очень важно, чтобы
вы это поняли, потому повторим мысль в следующей формулировке:
скорость изменения кривой в любой точке определяется ее наклоном
в этой точке.
Но как измерить наклон линии, которая искривлена? С прямыми
линиями все просто, а вот как быть с кривыми? Мы можем попы­
таться оценить наклон, прочертив прямую линию, так называемую
касательную, которая лишь касается кривой (имеет с ней только
одну общую точку) таким образом, чтобы иметь тот же наклон, что
и кривая в данной точке. Именно так в действительности люди и по­
ступали, пока не были изобретены другие способы.
Давайте испытаем этот приближенный простой способ хотя бы
для того, чтобы лучше понять, к чему он приводит. На следующей
иллюстрации представлен график скорости с касательной к кри­
вой в точке, соответствующей шести минутам движения.

240

Приложение А. Краткое введение в дифференциальное исчисление

Из школьного курса математики нам известно, что для определе­
ния наклона, или углового коэффициента, следует разделить при­
ращение вертикальной координаты на приращение горизонтальной
координаты. На диаграмме приращение по вертикали (скорость)
обозначено как Да, а приращение по горизонтали (время) — как At.
Символ Д (читается “дельта” ) просто означает небольшое изменение.
Поэтому At — это небольшое изменение t.
Наклон определяется отношением A s/A t. Мы можем выбрать
для определения наклона любой треугольник и измерить длину его
катетов с помощью линейки. В выбранном мною треугольнике при­
ращение As оказалось равным 9,6, а приращение At — 0,8. Это дает
следующую величину наклона.

Мы получили очень важный результат! Скорость изменения скоро­
сти в момент времени 6 минут составляет 12,0 миль в час за минуту.
Нетрудно заметить, что от способа, основанного на проведении ка­
сательной вручную и выполнении измерений с помощью линейки,
вряд ли можно ожидать высокой точности. Поэтому мы должны об­
ратиться к более совершенным методам.

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

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

241

Связь этой прямой с моментом времени 3 минуты действитель­
но существует. Для ее проведения были выбраны моменты времени
до и после интересующего нас момента времени t=3. В данном случае
были выбраны точки, отстоящие от точки t=3 на две минуты в боль­
шую и меньшую стороны, т.е. этим моментам времени соответствуют
точки t= l и t=5.
Используя математические обозначения, можно сказать, что А х
равно 2 минуты. Тогда выбранным нам точкам соответствуют коор­
динаты х - А х и х + А х . Вспомните, что символ А означает “ небольшое
изменение” , поэтому А х — это небольшое изменение х .
Зачем мы это делаем? Потерпите минутку — очень скоро все про­
яснится.
Если мы возьмем значения скорости в моменты времени х - А х и
х + А х и проведем через соответствующие две точки прямую линию, то
ее наклон будет примерно равен наклону касательной в средней точке х .

242

Приложение А. Краткое введение в дифференциальное исчисление

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

Смещение по вертикали — это разность между значениями ско­
рости в точках х + Д х и х - Д х , соответствующих пяти минутам и од­
ной минуте движения. Эти скорости нам известны: 52 = 25 и I 2 = 1,
поэтому разность составляет 24. Смещение по горизонтали — это
просто расстояние между точками х + Д х и х - Д х . , т.е. 5 - 1=4.
Следовательно, имеем:

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

243

Таким образом, наклон прямой линии, являющейся приближением
к касательной в точке t=3 минуты, составляет 6 миль в час за минуту.
Сделаем паузу и осмыслим полученные результаты. Сначала мы
попытались определить наклон кривой, вручную проведя касатель­
ную к ней. Такой подход никогда не бывает точным, и мы не можем
повторять его многократно, поскольку человеку свойственно уста­
вать, терять концентрацию внимания и совершать ошибки. Второй
подход не требует проведения касательной вручную и вместо этого
предлагает рецепт построения другой линии, наклон которой, повидимому, может служить приближением к истинному наклону
кривой. Этот подход допускает автоматизированную реализацию
с помощью компьютера и может выполняться многократно с огром­
ной скоростью, недоступной человеку.
Конечно, это неплохо, но и этого еще недостаточно!
Второй подход также является всего лишь приближенным. Можно
ли его усовершенствовать так, чтобы сделать точным? В конце кон­
цов, нашей целью является точное математическое описание скорос­
ти изменения величин.
Вот здесь и начинается магия! Я познакомлю вас с одним из самых
элегантных инструментов, разработанных математиками.
Что случится, если мы уменьшим величину смещения. Иными
словами, что произойдет, если уменьшить Д х ? Следующая иллюстра­
ция демонстрирует несколько приближений в виде наклонных пря­
мых, соответствующих уменьшению Д х .

244

Приложение А. Краткое введение в дифференциальное исчисление

Мы провели линии для Д х = 2 , 0 , Д х = 1 , 0 , Д х = 0 , 5 и Л х = 0 , 1 . Вы видите,
что эти линии постепенно приближаются к интересующей нас точке
х = 3 . Нетрудно сообразить, что по мере уменьшения А х прямые линии
будут все более и более приближаться к истинной касательной.
При бесконечно малой величине А х линия приблизится к истин­
ной касательной на бесконечно малое расстояние. Это очень круто!
Идея постепенного улучшения первоначального приближенного
решения путем уменьшения отклонений необычайно плодотворна.
Она позволяет математикам решать задачи, непосредственное реше­
ние которых наталкивается на значительные трудности. При таком
подходе к решению приближаются постепенно, словно крадучись,
вместо того чтобы атаковать его прямо в лоб!

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

245

Дифференциальное исчисление
без использования графиков
Как уже отмечалось, целью дифференциального исчисления явля­
ется описание изменения величин математически точным способом.
Посмотрим, можем ли мы добиться этого, применяя идею последо­
вательного уменьшения Д х к математическим выражениям, опре­
деляющим эти величины, такие, например, как скорость движения
автомобиля.
Напомню, что в нашем примере скорость движения является
функцией времени вида s = t 2. Нас интересует скорость изменения
скорости движения как функция времени. Вы видели, что эта вели­
чина определяется наклоном графика зависимости s от t.
Интересующая нас скорость изменения ds/dt определяется вели­
чиной отношения смещения по вертикали к смещению по горизонта­
ли, где последнее бесконечно мало и стремится к нулю.
Что такое смещение по вертикали? Как было показано раньше,
это (t + Д х ) 2- (t - Д х ) 2. Здесь использована функция s = t 2, где t при­
нимает значения, немного меньшие и немного большие, чем в инте­
ресующей нас точке. Это “ немного” равно Д х .
Что такое смещение по горизонтали? Как вы видели раньше, это
просто расстояние между точками (t + Д х ) и (t - Д х ) , которое равно 2Д х.
Мы уже почти у цели:

Раскроем и упростим это выражение:

246

Приложение А. Краткое введение в дифференциальное исчисление

В данном случае нам крупно повезло, поскольку алгебра необы­
чайно все упростила.
Итак, мы это сделали! Математически точная скорость изменения
d s /d t = 2 t . Это означает, что для любого момента времени t мы мо­
жем вычислить скорость изменения скорости движения по формуле
da/dt = 2t.

При t = 3 мы получаем d s /d t = 2 t = 6. Фактически мы подтвердили
этот результат еще раньше с помощью приближенного метода. Для
t = 6 получаем 3 s / 3 t = 2 t = 1 2 , что также согласуется с найденным ра­
нее результатом.
А что насчет ста минут? В этом случае 3 s / 3 t = 2 t = 2 0 0 миль в час
за минуту. Это означает, что спустя сто минут от начала движения
машина будет ускоряться со скоростью 200 миль в час за минуту.
Сделаем небольшую паузу и немного поразмышляем над величи­
ем и красотой того, что нам удалось сделать. Мы получили матема­
тическое выражение, с помощью которого можем точно определить
скорость изменения скорости движения автомобиля в любой момент
времени. При этом, в полном соответствии с нашими рассуждениями
в начале приложения, мы видим, что эти изменения s действительно
зависят от времени.
Нам повезло, что алгебра все упростила, но в силу простоты выра­
жения s = t 2 нам не представилась возможность проверить на практи­
ке идею устремления Дх к нулю. В связи с этим полезно рассмотреть
другой пример, в котором скорость движения автомобиля описыва­
ется несколько более сложной формулой:

Дифференциальное исчисление без использования графиков

247

А что теперь означает вертикальное смещение? Это разность меж­
ду скоростью s , рассчитанной в момент времени t + Д х , и скоростью s ,
рассчитанной в момент времени t - Д х . Найдем эту разность путем
несложных вычислений: ( t + Д х ) 2 + 2 ( t + Д х ) - ( t - Д х ) 2 — 2 ( t — Д х ) .
А что насчет горизонтального смещения? Это просто расстояние
между точками ( t + Д х ) и ( t - Д х ) , которое по-прежнему равно 2 Д х :

Раскроем и упростим это выражение:

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

248

Приложение А. Краткое введение в дифференциальное исчисление

Раскроем и упростим это выражение:

Это уже намного интереснее! Мы получили результат, содержа­
щий Д х , тогда как раньше эти члены взаимно сокращались.
Вспомните, что корректное значение наклона получается лишь в том
случае, если величина Д х уменьшается, становясь бесконечно малой.
А сейчас смотрите! Что произойдет с величиной Д х в выражении
d s / d t = 3 t 2 + A x 2, если она становится все меньшей и меньшей? Она
исчезнет! Если для вас это неожиданность, то представьте, что вели­
чина Д х очень мала. Напрягитесь и представьте, что она еще мень­
ше. Потом представьте, что на самом деле она еще меньше... И этот
процесс мысленного уменьшения Д х вы могли бы продолжать до бес­
конечности, устремляя ее к нулю. Поэтому давайте проявим реши­
мость и сразу же перейдем к нулю без лишней суеты.
В результате мы получаем искомый математически точный ответ:

Дифференциальное исчисление без использования графиков

249

Это фантастический результат, и на этот раз он был получен с ис­
пользованием мощного математического инструмента, что оказалось
совсем несложным.

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

Вы видите, что производная функции t представляет собой ту же
функцию, но с понижением на единицу каждой степени t. Поэтому
t4превращается в t3, a t7превратилось бы в t* и т.д. Это очень просто!
А если вы вспомните, что t — это t\ то в производной это превраща­
ется в t°, т.е. в 1.
Свободные постоянные члены, такие как 3, 4 или 5, просто исчеза­
ют. Постоянные переменные, не являющиеся коэффициентами, такие
как а, b или с, также исчезают, поскольку скорость их изменения так­
же нулевая. Именно поэтому их называют константами.
Но погодите, ведь t2превращается в 2t, а не просто в t, a t8превра­
щается в 3t2, а не просто в t2. Это общее правило: степень переменной,
прежде чем уменьшиться на единицу, становится коэффициентом.
250

Приложение А. Краткое введение в дифференциальное исчисление

Поэтому 5 в 2 t 5 используется в качестве дополнительного коэффици­
ента перед уменьшением степени на единицу: 5 * 2 t 4 = 1 0 t 4.
Приведенная ниже формула суммирует все, что было сказано
о дифференцировании степеней, в виде следующего правила:

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

Это правило пригодится вам во многих случаях, а зачастую ниче­
го другого вам и не потребуется. Верно и то, что правило применимо
только к полиномам, т.е. к выражениям, состоящим из переменных
в различных степенях, как, например, выражение у = а х 3 + b x 2 + с х + d ,
но не к функциям вида s in (x ) или c o s (x ). Это не является сущес­
твенным недостатком, поскольку в огромном количестве случаев вам
вполне хватит правила дифференцирования степеней.
Однако для нейронных сетей нам понадобится еще один инстру­
мент, о котором сейчас пойдет речь.

Закономерности

251

Функции функций
Представьте, что в функции

переменная у сама является функцией:

При желании можно переписать эту формулу в виде f = (х8+ х)2.
Как f изменяется с изменением у? То есть что собой представля­
ет производная df/Эу? Получить ответ на этот вопрос не составляет
труда, поскольку для этого достаточно применить только что полу­
ченное нами правило дифференцирования степенных выражений,
поэтому
fЭу
d
/ = 2у.
Но возникает более интересный вопрос: как изменяется f при из­
менении х? Ну хорошо, мы могли бы раскрыть выражение f = (х3+ х)2
и применить уже знакомый подход. Только ни в коем случае не счи­
тайте наивно, что производная от (ха+ х)2 — это 2 (х3+ х ).
Если бы мы проделали множество подобных вычислений преж­
ним трудоемким способом, предполагающим устремление прираще­
ний к нулю в результирующих выражениях, то рано или поздно мы
подметили бы еще одну закономерность. Я сразу же дам вам готовый
рецепт.
Вот как выглядит новая закономерность.

Это очень мощный результат, который называется цепным пра
видом.
252

Приложение А. Краткое введение в дифференциальное исчисление

В соответствии с этим правилом нахождение производной в по­
добных случаях осуществляется поэтапно. Может оказаться так, что
для нахождения производной dt/dx проще найти производные d f / Э у
и эу/ах. Если последние две производные действительно вычисляют­
ся очень просто, то с помощью этого приема удается находить произ­
водные, определить которые другими способами практически невоз­
можно. Цепное правило позволяет разбивать трудные задачи на бо­
лее легкие.
Рассмотрим следующий пример и применим к нему цепное правило:

Мы разбили задачу на две простые части. Первая часть дает
( a f / Э у ) = 2 у , вторая — ( Э у / Э х ) = З х 2 + 1. Объединяя эти части с помо­
щью цепного правила, получаем

Мы знаем, что у =
держащее только х :

х3+ х,

поэтому можем получить выражение, со­

Магия!

Функции функций

253

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

f - 2-Ху

+3

+

В ней переменные х , у и
г не зависят одна от друг
разумеваем под независимостью переменных? Под этим подразуме­
вается, что каждая из переменных х , у и z может принимать любые
значения, какими бы ни были значения остальных переменных —
их изменения на нее не влияют. В предыдущем примере это было
не так, поскольку значение у определялось значением выражения
х 3 + х , а значит, переменная у зависела от х .
Что такое S f / Э х ? Рассмотрим каждый член длинного полинома
по отдельности. Первый член — это 2 х у , поэтому его производная
равна 2 у . Почему так просто? Да потому, что у не зависит от х . Когда
мы интересуемся величиной д£/дх, нас интересует, как изменяется f
при изменении х . Если переменная у не зависит от х , то с ней можно
обращаться как с константой. На ее месте могло бы быть любое дру­
гое число, например 2, 3 или 10.
Идем дальше. Следующий член выражения — 3 x 2z . Применяя
правило понижения степеней, получаем 2 * 3 x z или 6 x z . Мы рассмат­
риваем z как обычную константу, значением которой может быть 2,
4 или 100, поскольку х и
г не зависят друг от друга
влияет на х .
Последний член, 4 z , вообще не содержит х . Поэтому он полностью
исчезает, так как мы рассматриваем его как постоянное число, кото­
рым, например, могло бы быть 2 или 4.
Вот как выглядит окончательный ответ:

254

Приложение А. Краткое введение в дифференциальное исчисление

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

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

Вы освоили дифференциальное исчисление!

255

ПРИЛОЖЕНИЕ Б

Нейронная сеть
на Raspberry Pi
В этом приложении вы узнаете, как установить IPython на устрой­
стве Raspberry Pi.
Необходимость в этом может возникнуть по нескольким причинам.
• Компьютеры Raspberry Pi очень дешевые и доступные по срав­
нению с более дорогими ноутбуками.
• Компьютер Raspberry Pi работает под управлением бесплатной
операционной системы Linux с открытым исходным кодом,
для которой доступно множество всевозможных бесплатных
программ, включая Python. Открытость исходного кода чрез­
вычайно важна, поскольку это позволяет разобраться в том,
как функционирует та или иная программа, и поделиться ре­
зультатами своей работы с другими людьми, которые смогут
воспользоваться ими в своих проектах. Это важно и для образо­
вательных целей, ведь, в отличие от коммерческого программ­
ного обеспечения, открытый исходный код свободно доступен
для изучения.
• В силу описанных, а также множества других причин устрой­
ства Raspberry Pi получили широкую популярность в качестве
школьных и домашних компьютеров для детей, увлекающихся
созданием компьютерных программ или программно-аппарат­
ных систем.
• Компьютеры Raspberry Pi не такие мощные, как более до­
рогие компьютеры и ноутбуки. Поэтому интересно проде­
монстрировать, что даже этот фактор не мешает реализовать
на Raspberry Pi нейронную сеть с помощью Python.

Я буду использовать модель Raspberry Pi Zero, поскольку она еще
дешевле и миниатюрнее, чем обычные устройства Raspberry Pi, и это
делает задачу развертывания на ней нейронной сети еще более инте­
ресной. Стоит эта модель около 5 долларов. Это не опечатка!
Ниже представлена фотография моего устройства с двухпенсовой
монетой для сравнения.

Установка IPython
Далее предполагается, что питание вашего Raspberry Pi включе­
но, а клавиатура, мышь, дисплей и подключение к Интернету рабо­
тают нормально.
Существует несколько дистрибутивов операционных систем
для Raspberry Pi, но мы будем ориентироваться на Raspbian — вер­
сию популярного дистрибутива Debian Linux, оптимизированную
для аппаратных возможностей Raspberry Pi и доступную для загруз­
ки по следующему адресу:
https://www.raspberrypi.org/downloads/raspbian/

258

Приложение Б. Нейронная сеть на Raspberry Pi

Ниже показан вид рабочего стола после запуска Raspberry Pi.
Я убрал фоновое изображение, чтобы оно не отвлекало внимание.

В левом верхнем углу видны кнопки меню, а также другие значки.
Мы собираемся установить IPython, чтобы иметь возможность ра­
ботать с помощью дружественного интерфейса блокнотов через веб­
браузер, а не в режиме командной строки.
Для установки IPython нам все-таки придется использовать ко­
мандную строку, но сама эта процедура очень простая, и ее придется
выполнить только один раз.
Откройте приложение Terminal, представленное в верхней час­
ти окна значком с изображением черного экрана. При наведении
на него указателя мыши появляется подсказка “ Terminal” . Когда вы
запустите это приложение, откроется окно для ввода команд.

Установка IPython

259

Raspberry Pi очень хорош тем, что не позволяет рядовым поль­
зователям вводить команды, приводящие к глубоким изменениям
в системе. Для этого необходимо иметь специальные привилегии.
Введите в окне терминала следующую команду:
sudo

SU “

Вместо символа доллара ($), которым до этого заканчивалась под­
сказка для ввода команд, должен появиться символ решетки (#). Это
свидетельствует о том, что теперь вы обладаете административными
привилегиями и должны внимательно относиться к выбору вводи­
мых команд.
Следующие команды актуализируют список текущего программ­
ного обеспечения Raspberry Pi, а затем обновляют установленные
вами программы, загружая дополнительные программные компо­
ненты.
apt-get update
apt-get dist-upgrade

260

Приложение Б. Нейронная сеть на Raspberry Pi

Если ваше программное обеспечение в последнее время не обнов­
лялось, то, вероятно, эта процедура потребуется некоторым про­
граммам. В таком случае вы увидите, как на экране промелькнет
множество текстовых строк. На них можно не обращать внимания.
От вас может потребоваться подтвердить обновление нажатием кла­
виши .
Обновив состояние системы, введите команду для получения
IPython. Имейте в виду, что на момент написания книги программ­
ные пакеты Raspbian не содержали версий IPython, позволяю­
щих работать с размещенными на сайте GitHub для всеобщего до­
ступа блокнотами, которые мы ранее создали. Если бы они их со­
держали, то достаточно было бы просто ввести команду apt-get
install ipython3 ipython3-notebook или аналогичную ей.
Если вы не хотите запускать блокноты из GitHub, можете спокой­
но использовать более старые версии IPython и блокнота из репози­
тория программного обеспечения Raspberry Pi.
Если же вы хотите работать с более свежими версиями IPython
и блокнота, то для того, чтобы получить их из каталога PyPi (Python
Package Index — каталог пакетов Python), вам придется использо­
вать некоторые команды “ pip” в дополнение к командам apt-get.
В этом случае программное обеспечение будет управляться Python,
а не менеджером программного обеспечения операционной системы.
Следующие команды обеспечат вас всем необходимым.
apt-get install python3-matplotlib
apt-get install python3-scipy
pip3 install jupyter

Работа будет выполнена, как только на экране промелькнут по­
следние строки текста. Скорость выполнения зависит от конкретной
модели Raspberry Pi и скорости вашего интернет-соединения. Вот
как выглядел мой экран после выполнения этих команд.

Установка IPython

261

Как правило, в Raspberry Pi используются карты памяти, так на­
зываемые SD-карты, наподобие тех, которые вы, возможно, исполь­
зуете в своей цифровой камере. Они обеспечивают меньший объем
памяти, чем обычные компьютеры. Удалите программные пакеты,
которые были загружены для обновления вашего Raspberry Pi, ис­
пользовав для этого следующую команду:
apt-get clean

В последних версиях Raspbian браузер Epiphany заменен бра­
узером Chromium (версия с открытым исходным кодом популяр­
ного браузера Chrome). Но Epiphany гораздо легче тяжеловесного
Chromium и работает лучше с крохотным Raspberry Pi Zero. Чтобы
установить его в качестве браузера по умолчанию для блокнотов
IPython, используйте следующую команду:
update-alternatives — config x-www-browser

Команда уведомит вас о текущей установленной версии браузера,
используемой по умолчанию, и запросит разрешение на установку

262

Приложение Б, Нейронная сеть на Raspberry Pi

новой версии. Выберите номер, соответствующий Epiphany, и от вас
больше ничего не потребуется.
Теперь все готово. Перезапустите Raspberry Pi в том случае, если
обновление повлекло за собой некие глубокие изменения, такие как
обновление ядра. Для этого выберите пункт Shutdown основного меню
в левом верхнем углу, а затем пункт Reboot, как показано ниже.

Shutdow n Options

-

Shutdown
Reboot
Logout

После повторного запуска Raspberry Pi запустите Python, выпол­
нив в окне терминала следующую команду:
jupyter-notebook

Это приведет к автоматическому запуску веб-браузера с откры­
той основной страницей IPython, на которой можно создавать новые
блокноты IPython. Jupyter Notebook — это новое программное обес­
печение для выполнения блокнотов. Ранее приходилось выполнять
команду ipython3 notebook, которая будет еще работать в течение
переходного периода. Ниже показана основная начальная страница
IPython.

Установка IPython

263

Замечательно! Мы получили IPython и запустили оболочку
на Raspberry Pi.
С этого момента можно приступать к работе и создавать собствен­
ные блокноты IPython, но мы продемонстрируем, что способны вы­
полнить на Raspberry Pi код, который разработали ранее. Мы по­
лучим блокноты и базу данных рукописных цифр MNIST на сайте
GitHub. Откройте в браузере новую вкладку и перейдите по следую­
щей ссылке:
https://github.com/makeyourownneuralnetwork/makeyourownneuralnetwork

Вы увидите страницу проекта GitHub (см. ниже). Загрузите фай­
лы, щелкнув на кнопке Clone or Download и выбрав вариант Download ZIP.

264

Приложение Б. Нейронная сеть на Raspberry Pi

Если GitHub не воспримет Epiphany, введите в адресной строке
браузера следующую ссылку для загрузки файлов:
https://github.com/makeyourownneuralnetwork/
makeyourownneuralnetwork/archive/master.zip

Браузер сообщит вам об окончании загрузки. Откройте новое окно
терминала и введите следующие команды, чтобы распаковать фай­
лы, а затем освободить место, удалив zip-файл.
unzip Downloads/makeyourownneuralnetwork-master.zip
rm -f Downloads/makeyourownneuralnetwork-master.zip

Файлы будут распакованы в каталог makeyourownneuralnetworkmaster. При желании можете присвоить ему более короткое имя, но
делать это вовсе необязательно.
На сайте GitHub содержатся лишь сокращенные версии наборов
данных MNIST, поскольку сайт не позволил бы мне разместить фай­
лы большего размера. Чтобы получить полный набор данных, введи­
те в том же окне терминала следующие команды для перехода в ка­
талог mnist_dataset и получения тренировочного и тестового набо­
ров данных в CSV-формате.
Установка IPython

265

cd makeyourownneuralnetwork-master/mnist_dataset
wget -c http://pjreddie.com/media/files/mnist_train.csv
wget -c http://pjreddie.com/media/files/mnist_test.csv

Загрузка файлов может занять некоторое время, которое зави­
сит от скорости вашего интернет-соединения и конкретной модели
Raspberry Pi.
Теперь вы располагаете всеми необходимыми блокнотами и дан­
ными MNIST. Закройте это окно терминала, но не то, из которого
запускали IPython.
Вернувшись в окно браузера с начальной страницей IPython, вы
увидите в списке новую папку makeyourownneuralnetwork-master.
Откройте эту папку, щелкнув на ней. Теперь вы сможете открыть
любой блокнот, как смогли бы это сделать на любом другом компью­
тере. Ниже показаны блокноты, хранящиеся в указанной папке.

266

Приложение Б. Нейронная сеть на Raspberry Pi

Проверка работоспособности программ
Прежде чем приступить к тренировке и тестированию нейронной
сети, убедимся в работоспособности кода, выполняющего такие опе­
рации, как чтение файлов и вывод изображений. Откройте блокнот
part3_m nist_data_set_w ith_rotations. ipynb, реализующий эти опе­
рации. Открывшийся и готовый к выполнению блокнот должен вы­
глядеть так.

Выполните содержащиеся в блокноте инструкции, выбрав в меню
Cell пункт Run АН. Спустя некоторое время, превышающее то, которое
потребовалось бы в случае современного ноутбука, вы должны уви­
деть изображения повернутых цифр.

Проверка работоспособности программ

267

Таким образом, мы убедились в работоспособности на Raspberry Pi
таких средств, как загрузка данных из файла, импорт модулей рас­
ширения Python для работы с массивами и изображениями, а также
графический вывод изображений.
Выберите в меню File этого блокнота пункт Close and Halt. Именно
так, а не простым закрытием вкладки браузера, вы должны закры­
вать свои блокноты.

Тренировка и тестирование нейронной сети
Приступим к тренировке нейронной сети. Откройте блокнот
part2_neural_network_mnist_data. ipynb. В нем представлена упро­
щенная версия нашей программы, лишенная таких возможностей,
как вращение изображений. Поскольку наш Raspberry Pi работает
гораздо медленнее типичного ноутбука, мы уменьшим некоторые па­
раметры для снижения объема вычислений, чтобы можно было сра­
зу же убедиться в работоспособности кода, а не потратить несколько
часов лишь для того, чтобы обнаружить, что он не работает.
Я уменьшил количество скрытых узлов до 10, а количество эпох —
до 1. Я по-прежнему использовал полные тренировочные и тестовые

268

Приложение Б. Нейронная сеть на Raspberry Pi

наборы данных MNIST, а не ранее созданные уменьшенные подмно­
жества. Чтобы запустить программу, выберите в меню Cell пункт Run
АН. Теперь вам остается только ждать.
Обычно на выполнение подобных вычислений на моем ноутбуке
уходит около минуты, но в данном случае для завершения работы
программе потребовалось около 25 минут. В целом это не так уж
и плохо, если учесть, что Raspberry Pi Zero стоит примерно в 400 раз
дешевле, чем мой ноутбук. Я был готов к тому, что программа завер­
шится только к утру.

Успех Raspberry Pi
Только что мы продемонстрировали, что функциональных воз­
можностей даже такого миниатюрного компьютера, как Raspberry
Pi Zero стоимостью всего 5 долларов, достаточно для полноценной
работы с блокнотами IPython и создания кода, позволяющего тре­
нировать и тестировать нейронные сети. Просто все выполняется не­
много медленнее!

Успех Raspberry Pi

269

Предметный указатель
А
Anaconda, 130

С
Chromium, 262
CSV-файл, 177

Е
Epiphany, 262

I
IPython, 130
установка, 258

J
Jupyter Notebook, 130; 263

M
MNIST, 176; 215; 222; 264
тренировочный набор, 185

Р
Python, 129

R
Raspberry Pi, 130; 257
Raspbian, 258

A
Аксон, 58
Алгоритм, 21; 36
Анонимная функция, 166
Асимптота, 124

Б
Библиотека
matplotlib.pyplot, 148
numpy, 145
scipy, 165
scipy.misc, 215

Блокнот, 132
Булева функция, 45

В
Векторизация, 96
Весовой коэффициент, 60; 64; 78;
100;161
инициализация, 125; 163
Внутреннее произведение, 73
Входной порог, 55
Вызов функции, 142

Г
Гиперболический тангенс, 126
Глубокое обучение, 229
Градиентный спуск, 103

д

Дендрит, 52; 58
Дескриптор, 180
Дифференциальное исчисление,
110;231

И
Импорт, 148
Итеративный процесс, 27

К
Касательная, 240
Класс, 150
Классификатор, 28
линейный, 44
тренировка, 33
Комментарий, 140
Константа, 250
Коэффициент обучения, 119;
205;225
настройка, 200

л
Линейная зависимость, 23
Линейный классификатор, 44
Логистическая функция, 56
Лямбда-выражение, 166

М
Маркер, 178
Массив, 144
графическое представление, 147
нумерация элементов, 147
Матрица, 68
Машинное обучение, 41
Метод, 153
градиентного спуска, 103
грубой силы, 101

Н
Наклон, 236; 241
Насыщение нейронной сети, 123
Нейрон,51
Нейронная сеть, 153; 157
инициализация, 158
опрос, 164
способность к обучению, 206
тестирование, 193; 198
тренировка, 170; 198; 202; 268

О
Обратное распространение
ошибок, 88; 91; 117
Обратный запрос, 218
Объект, 149
Ошибка, 24; 36; 86

П
Переменная,136
Переобучение, 203
Предиктор, 21; 44
Приращение, 241
Производная, 234; 250

Р
Распознавание образов, 176
Рукописные цифры, 176; 213
вращение, 222

С
Сглаживание, 41; 66
Сигмоида, 55; 65; 81; 117; 165
Скалярное произведение, 73
Скорость обучения, 42
Скрытый слой, 77; 205
Способность к обучению, 206
Ступенчатая функция, 54

Т
Терминаль, 52; 58
Тестовый набор, 177
Точечное произведение, 73
Точка разрыва, 106
Транспонирование, 98
Трансцендентные числа, 56
Тренировка
классификатора, 33
нейронной сети ,170; 198;
202;268
Тренировочный набор, 177

У
Угловой коэффициент, 236

Ф
Функция, 140; 252
1еп(), 182
list(), 137
matplotlib.pyplot.imshow(), 148
numpy.argmax(), 197
numpy.asfarrayO, 183
numpy.dot(), 165
numpy.random.normal(), 163
numpy.random.randO, 161
numpy.zeros(), 145; 189
open(), 180

Предметный указатель

271

ц
pow(), 164
print(), 133
readlines(), 181
reshape(), 184
scipy.misc.imread(), 215
scipy.ndimage.interpolation.
rotate(), 223
scipy.special.expit(), 165
scipy.special.logit(), 219
spit(), 183
активации,54; 66
анонимная, 166
вызов, 142
параметры, 154

272

Предметный указатель

Цепное правило, 252
Цикл, 138
Ч
Черный ящик, 217
Э
Эпоха, 202; 225
Эффективность, 199; 225

Я
Ячейка, 132