Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шолле Ф. - Глубокое обучение на Python (Библиотека программиста) - 2023.pdf
Скачиваний:
6
Добавлен:
07.04.2024
Размер:
11.34 Mб
Скачать

54    Глава 1. Что такое глубокое обучение

1.3.5. Демократизация глубокого обучения

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

На.начальном.этапе.глубокое.обучение.требовало.значительных.знаний.и.опыта. программирования.на.C++.и.владения.CUDA,.чем.могли.похвастаться.очень. немногие..В.настоящее.время.для.исследований.в.области.глубокого.обучения. достаточно.базовых.навыков.программирования.на.Python..Это.вызвано.прежде. всего.развитием.Theano.и.позднее.TensorFlow.(двух.фреймворков.для.Python,. реализующих.операции.с.тензорами,.которые.поддерживают.автоматическое. дифференцирование.и.значительно.упрощают.реализацию.новых.моделей),. а.также.появлением.дружественных.библиотек.(например,.Keras),.которые.делают. работу.с.глубоким.обучением.таким.же.простым.делом,.как.манипулирование. кубиками.лего..После.выхода.в.2015.году.библиотека.Keras.быстро.была.принята. за.основу.многими.командами.новых.стартапов,.аспирантами.и.исследователями,. работающими.в.этой.области.

1.3.6. Ждать ли продолжения этой тенденции?

Есть.ли.что-то.особенное.в.глубоком.обучении,.что.делает.его.правильным. выбором.и.для.компаний-инвесторов,.и.для.исследователей?.Или.это.просто. увлечение,.которое.не.продлится.долго?.Будем.ли.мы.использовать.глубокие. нейронные.сети.через.20.лет?

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

.простота.—.глубокое.обучение.избавляет.от.необходимости.конструировать. признаки,.заменяя.сложные,.противоречивые.и.тяжелые.конвейеры.простыми.обучаемыми.моделями,.которые.обычно.строятся.с.использованием. 5–6.тензорных.операций;

.масштабируемость .—.глубокое.обучение.легко.поддается.распараллели- ванию.на.GPU.или.TPU,.поэтому.оно.в.полной.мере.может.использовать. закон.Мура..Кроме.того,.обучение.моделей.можно.производить.итеративно, .на .небольших .пакетах .данных, .что .дает .возможность .осуществлять. этот.процесс.на.наборах.данных.произвольного.размера.(единственным. узким .местом .является .объем .доступной .мощности .для .параллельных. вычислений,.которая,.как.следует.из.закона.Мура,.является.быстро.перемещающимся.барьером);

1.3. Почему глубокое обучение? Почему сейчас?    55

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

Это.также.позволяет.применить.глубокое.обучение.к.очень.маленьким.объемам.данных.

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

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

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

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

Математические2основы нейронных сетей

В этой главе

33 Первый пример нейронной сети.

33 Тензоры и операции с тензорами.

33 Процесс обучения нейронной сети методами обратного распространения ошибки и градиентного спуска.

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

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

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

Прочитав.эту.главу,.вы.освоите.математическую.теорию,.на.которой.основывается.глубокое.обучение,.и.будете.готовы.погрузиться.в.изучение.Keras. и.TensorFlow.в.главе.3.

2.1.Первое знакомство с нейронной сетью     57

2.1.ПЕРВОЕ ЗНАКОМСТВО

С НЕЙРОННОЙ СЕТЬЮ

Рассмотрим.конкретный.пример.нейронной.сети,.которая.обучается.классификации.рукописных.цифр.и.создана.с.помощью.библиотеки.Keras.для.Python.. Если.у.вас.нет.опыта.использования.Keras.или.других.подобных.библиотек,. возможно,.вы.не.все.здесь.поймете..Но.пусть.вас.это.не.пугает..В.следующей. главе.мы.рассмотрим.и.подробно.объясним.каждый.элемент.в.примере..Поэто- му.не.волнуйтесь,.если.какие-то.шаги.покажутся.странными.или.похожими.на. магию..В.конце.концов,.мы.должны.с.чего-то.начать.

Перед.нами.стоит.задача:.реализовать.классификацию.черно-белых.изображений. рукописных.цифр.(28.×.28.пикселей).по.десяти.категориям.(от.0.до.9)..Мы.будем. использовать.набор.данных.MNIST,.популярный.в.сообществе.исследователей. глубокого.обучения,.который.существует.практически.столько.же,.сколько.сама. область.машинного.обучения,.и.широко.используется.для.обучения..Этот.набор. содержит.60.000.обучающих.изображений.и.10.000.контрольных.изображений,. собранных.Национальным.институтом.стандартов.и.технологий.США.(National. Institute.of.Standards.and.Technology.—.часть.NIST.в.аббревиатуре.MNIST). в.1980-х.годах..«Решение».задачи.MNIST.можно.рассматривать.как.своеобразный. аналог.Hello.World.в.глубоком.обучении.—.часто.это.первое.действие,.которое. выполняется.для.уверенности,.что.алгоритмы.действуют.в.точности.как.ожи-

далось..По.мере.углубления.в.практику.

 

машинного.обучения.вы.увидите,.что.

 

MNIST.часто.упоминается.в.научных.

 

статьях, .блогах .и .т..д..Некоторые .об-

 

разцы.изображений.из.набора.MNIST.

Рис. 2.1. Образцы изображений MNIST

можно.видеть.на.рис..2.1.

ПРИМЕЧАНИЕ

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

Не.пытайтесь.сразу.же.воспроизвести.пример.на.своем.компьютере..Чтобы.его. опробовать,.нужно.сначала.установить.библиотеку.Keras.—.а.это.будет.рассмо- трено.в.главе.3.

Набор.данных.MNIST.уже.входит.в.состав.Keras.в.форме.набора.из.четырех. массивов.NumPy.

Листинг 2.1. Загрузка набора данных MNIST в Keras

from tensorflow.keras.datasets import mnist

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

58    Глава 2. Математические основы нейронных сетей

Здесь.train_images .и.train_labels .—.это.обучающий набор,.то.есть.данные,.на. которых.модель.обучается..После.обучения.модель.будет.проверяться.тестовым. (или.контрольным).набором,.test_images .и.test_labels.

Изображения.хранятся.в.массивах.NumPy,.а.метки.—.в.массиве.цифр.от.0.до.9.. Изображения.и.метки.находятся.в.прямом.соответствии,.один.к.одному.

Рассмотрим.обучающие.данные:

>>>train_images.shape (60000, 28, 28)

>>>len(train_labels) 60000

>>>train_labels

array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)

И.контрольные.данные:

>>>test_images.shape (10000, 28, 28)

>>>len(test_labels) 10000

>>>test_labels

array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)

Вот.как.мы.будем.действовать.дальше:.сначала.передадим.нейронной.сети.обучающие.данные,.train_images .и.train_labels..Сеть.обучится.подбирать.правильные.метки.для.изображений..А.затем.мы.предложим.ей.классифицировать. изображения.в.test_images .и.проверим.точность.классификации.по.меткам. из.test_labels.

Теперь.сконструируем.сеть..Не.забывайте.—.от.вас.никто.не.ждет,.что.вы.поймете. в.этом.примере.все.и.сразу.

Листинг 2.2. Архитектура сети

from tensorflow import keras

from tensorflow.keras import layers model = keras.Sequential([

layers.Dense(512, activation="relu"), layers.Dense(10, activation="softmax")

])

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

2.1. Первое знакомство с нейронной сетью     59

Модель.глубокого.обучения.можно.сравнить.с.ситом,.состоящим.из.последова- тельности.фильтров.—.слоев.—.все.более.тонкой.работы.с.данными.

В.нашем.случае.сеть.состоит.из.последовательности.двух.слоев.Dense,.которые. являются.тесно.связанными.(их.еще.называют.полносвязными).нейронными. слоями..Второй.(и.последний).слой.—.это.десятипеременный.слой.классифика- ции softmax,.возвращающий.массив.с.десятью.оценками.вероятностей.(в.сумме. дающих.1)..Каждая.оценка.определяет.вероятность.принадлежности.текущего. изображения.к.одному.из.десяти.классов.цифр.

Чтобы.подготовить.модель.к.обучению,.нужно.настроить.еще.три.параметра. для.этапа.компиляции:

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

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

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

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

Листинг 2.3. Этап компиляции

model.compile(optimizer="rmsprop", loss="sparse_categorical_crossentropy", metrics=["accuracy"])

Перед.обучением.мы.выполним.предварительную.обработку.данных,.преобразовав.в.форму,.которую.ожидает.получить.нейронная.сеть,.и.масштабируем.их. так,.чтобы.все.значения.оказались.в.интервале.[0,.1]..Исходные.данные.—.обуча­ ющие.изображения.—.хранятся.в.трехмерном.массиве.(60000,.28,.28).типа.uint8,. значениями.в.котором.являются.числа.в.интервале.[0, .255]..Мы.преобразуем. его.в.массив.(60000, .28 .* .28) .типа.float32 .со.значениями.в.интервале.[0, .1].

Листинг 2.4. Подготовка исходных данных

train_images = train_images.reshape((60000, 28 * 28)) train_images = train_images.astype('float32') / 255 test_images = test_images.reshape((10000, 28 * 28)) test_images = test_images.astype('float32') / 255

Теперь.можно.начинать.обучение.сети,.для.чего.в.случае.библиотеки.Keras.до- статочно.вызвать.метод.fit.модели.—.он.попытается.адаптировать.(fit).модель. под.обучающие.данные.

60    Глава 2. Математические основы нейронных сетей

Листинг 2.5. Обучение («адаптация») модели

>>> model.fit(train_images, train_labels, epochs=5, batch_size=128) Epoch 1/5

60000/60000 [==============================] - 9s - loss: 0.2524 - acc: 0.9273 Epoch 2/5

51328/60000 [========================>.....] - ETA: 1s - loss: 0.1035 - acc: 0.9692

В.процессе.обучения.отображаются.две.величины:.потери.сети.на.обучающих. данных.и.точность.сети.на.обучающих.данных..Мы.быстро.достигли.точности. 0,989.(98,9.%).

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

Листинг 2.6. Использование модели для получения предсказаний

>>>test_digits = test_images[0:10]

>>>predictions = model.predict(test_digits)

>>>predictions[0]

array([1.0726176e-10, 1.6918376e-10, 6.1314843e-08, 8.4106023e-06, 2.9967067e-11, 3.0331331e-09, 8.3651971e-14, 9.9999106e-01, 2.6657624e-08, 3.8127661e-07], dtype=float32)

Каждое.число.в.элементе.массива.с.индексом.i .соответствует.вероятности.принадлежности.изображения.цифры.test_digits[0] .к.классу.i.

Наивысшая.оценка.вероятности.(0,99999106.—.почти.1).для.этого.тестового. изображения.цифры.находится.в.элементе.с.индексом.7,.то.есть.согласно.нашей. модели.—.перед.нами.изображение.цифры.7:

>>>predictions[0].argmax()

7

>>>predictions[0][7]

0.99999106

Прогноз.можно.проверить.по.массиву.меток:

>>> test_labels[0] 7

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

Листинг 2.7. Оценка качества модели на новых данных

>>>test_loss, test_acc = model.evaluate(test_images, test_labels)

>>>print(f"test_acc: {test_acc}")

test_acc: 0.9785