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

13.2. Масштабирование обучения моделей     517

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

В .своей .практике .я .обнаружил .один .прием, .дающий .хорошие .результаты,. однако.он.не.является.универсальным.и.подходит.не.для.всякой.предметной. области:.использование.ансамбля.древовидных.методов.(таких.как.случайные. леса.или.деревья.градиентного.роста).и.глубоких.нейронных.сетей..В.2014.году. Андрей.Колев.и.я.вместе.заняли.четвертое.место.в.решении.задачи.обнаруже- ния.бозона.Хиггса.на.сайте.Kaggle.(www.kaggle.com/c/higgs-boson),.использовав. ансамбль.разных.древовидных.моделей.и.глубоких.нейронных.сетей..Примечательно,.что.одна.из.моделей.в.ансамбле.реализовала.другой.метод.(это. был.регуляризованный.жадный.лес.—.regularized.greedy.forest).и.имела.суще- ственно.худшую.оценку,.нежели.остальные..Неудивительно,.что.она.получила. маленький.вес.в.ансамбле..Тем.не.менее,.к.нашему.удивлению,.оказалось,.что. она.значительно.улучшала.ансамбль.в.целом,.потому.что.сильно.отличалась. от.всех.других.моделей:.она.сохраняла.информацию,.к.которой.другие.модели. не.имели.доступа..Именно.в.этом.заключается.суть.ансамблирования..Главное. не.то,.насколько.хороша.ваша.лучшая.модель,.а.то,.насколько.разнообразны. модели-кандидаты.

13.2. МАСШТАБИРОВАНИЕ ОБУЧЕНИЯ МОДЕЛЕЙ

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

Рис. 13.1. Циклическое движение вперед

518    Глава 13. Методы и приемы для применения на практике

По.мере.обретения.опыта.использования.Keras.API.скорость.подготовки.новых. экспериментов.по.глубокому.обучению.перестанет.быть.для.вас.узким.местом. в.этом.циклическом.движении.вперед,.но.останется.еще.одно.—.скорость.об- учения.моделей..Быстрой.можно.назвать.инфраструктуру.обучения,.если.она. позволяет.получить.результаты.через.10–15.минут.—.благодаря.этому.вы.сможете. выполнять.десятки.итераций.каждый.день..А.чем.быстрее.обучение,.тем.выше. качество.ваших.решений.

В.этом.разделе.вы.познакомитесь.с.тремя.способами.ускорения.обучения.моделей:

. с.обучением.со.смешанной.точностью,.которое.можно.использовать.даже.с.GPU;

. с.обучением.на.нескольких.GPU;

. с.обучением.на.TPU.

Поехали.

13.2.1. Ускорение обучения на GPU со смешанной точностью

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

Точность представления вещественных чисел

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

Многие.из.вас.знакомы.с.целыми.числами.uint8,.которые.отражают.целочисленные.значения,.закодированные.восемью.битами:.00000000 .представляет.0,. а.11111111.—.255..Чтобы.закодировать.целые.числа.больше.255,.нужно.добавить. больше.битов.—.восьми.будет.недостаточно..Большинство.целых.чисел.хранят- ся.в.32.битах,.с.помощью.которых.можно.представлять.целые.числа.со.знаком. в.диапазоне.от.–2.147.483.648.до.2.147.483.647.

То .же .относится .к .вещественным .числам .(числам .с .плавающей .запятой)..

В.математике.они.образуют.непрерывную.последовательность:.между.любыми. двумя.числами.находится.бесконечное.количество.точек,.и.вы.всегда.можете. увеличить.масштаб.оси.вещественных.чисел..Однако.в.информатике.все.совсем. иначе:.например.между.3.и.4.существует.конечное.число.промежуточных.точек.. Как.много?.Зависит.от.точности.используемого.представления.—.количества. битов,.используемых.для.хранения.числа..Это.количество.можно.увеличивать. только.до.определенного.предела.

13.2. Масштабирование обучения моделей     519

Существует.три.уровня.точности,.которые.обычно.используются.в.информатике:

. половинная.точность,.или.float16,.когда.числа.хранятся.в.16.битах;

. одинарная.точность,.или.float32,.когда.числа.хранятся.в.32.битах;

. двойная.точность,.или.float64,.когда.числа.хранятся.в.64.битах.

ПРИМЕЧАНИЕ О ПРЕДСТАВЛЕНИИ ВЕЩЕСТВЕННЫХ ЧИСЕЛ В ФОРМАТЕ С ПЛАВАЮЩЕЙ ТОЧКОЙ

Представление вещественных чисел в формате с плавающей точкой вопреки здравому смыслу имеет неравномерное распределение. Большие числа имеют меньшую точность: между 2 ** N и 2 ** (N + 1) столько же представимых значений, сколько между 1 и 2, для любого N.

Данный факт связан с тем, что числа в представлении с плавающей точкой кодируются тремя частями — знаком, значением (его еще называют мантиссой) и показателем степени:

{знак} * (2 ** ({показатель степени} - 127)) * 1.{мантисса}

Например, вот как можно закодировать значение float32, ближайшее к числу пи:

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

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

520    Глава 13. Методы и приемы для применения на практике

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

Для.представлений.с.одинарной.точностью.это.около.1e–7..С.двойной.точно- стью.—.около.1e–16..С.половинной.точностью.—.всего.лишь.1e–3.

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

Также.можно.использовать.числа.типа.float64,.хотя.это.и.избыточно:.такие. операции,.как.умножение.или.сложение.матриц.чисел.с.двойной.точностью,. обходятся.намного.дороже,.а.модель.будет.выполнять.вдвое.больше.работы.без. каких-либо.явных.преимуществ..Но.то.же.самое.нельзя.сделать.с.весами.float16:. процесс.градиентного.спуска.не.будет.гладким.из-за.невозможности.представить. небольшие.изменения.градиента.—.около.1e–5.или.1e–6.

ОСТЕРЕГАЙТЕСЬ ЗНАЧЕНИЙ ПО УМОЛЧАНИЮ ДЛЯ DTYPE

ВKerasиTensorFlowпоумолчаниюберетсяодинарнаяточность:любыесозданные вами тензор или переменная, если явно не указать иное, будут иметь тип float32. Однако для массивов NumPy по умолчанию используется типfloat64!

Преобразование массива NumPy с типом по умолчанию в тензорTensorFlow даст в результате тензор float64, который, возможно, вам совсем не нужен:

>>>import tensorflow as tf

>>>import numpy as np

>>>np_array = np.zeros((2, 2))

>>>tf_tensor = tf.convert_to_tensor(np_array)

>>>tf_tensor.dtype

tf.float64

Не забывайте явно указывать типы данных при преобразовании массивов NumPy:

>>>np_array = np.zeros((2, 2))

>>>tf_tensor = tf.convert_to_tensor(np_array, dtype="float32")

>>> tf_tensor.dtype

Явно указывайте тип

tf.float32

через параметр dtype

Обратите внимание, что, если вызвать метод fit() из библиотеки Keras с данными в массиве NumPy, он выполнит это преобразование автоматически.

13.2. Масштабирование обучения моделей     521

Однако.можно.использовать.гибридный.подход.—.в.этом.и.заключается.суть. обучения.со.смешанной.точностью..Идея.следующая:.применять.16-битные.вы- числения.там,.где.не.нужна.высокая.точность,.и.32-битные.—.в.других.местах,. чтобы.поддержать.числовую.стабильность..Современные.GPU.и.TPU.оснащены.специализированными.аппаратными.модулями,.способными.выполнять. 16-битные.операции.намного.быстрее.и.использовать.меньше.памяти,.чем.при. выполнении.эквивалентных.32-битных.операций..Используя.низкоточные. операции.там,.где.это.допустимо,.можно.значительно.ускорить.обучение.на. таких.устройствах..А.обеспечивая.вычисления.с.одинарной.точностью.в.частях. модели,.чувствительных.к.точности,.можно.получить.ряд.преимуществ.без. существенного.влияния.на.качество.модели.

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

Обучение со смешанной точностью на практике

Вот.как.можно.включить.использование.смешанной.точности.при.обучении. на.GPU:

from tensorflow import keras keras.mixed_precision.set_global_policy("mixed_float16")

Большая.часть.прямого.прохода.модели.в.этом.случае.будет.выполняться.с.использованием.чисел.float16.(за.исключением.численно.нестабильных.операций,. таких.как.softmax),.а.веса.модели.будут.храниться.и.изменяться.в.float32.

Слои.Keras.имеют.атрибуты.variable_dtype .и.compute_dtype..По.умолчанию. оба.имеют.значение.float32..При.включении.режима.смешанной.точности. атрибуту.compute_dtype .большинства.слоев.присваивается.значение.float16;. в.результате.эти.слои.будут.приводить.входные.данные.к.типу.float16 .и.выполнять.вычисления.в.float16 .(используя .копии .весов .с .половинной .точ- ностью)..Однако,.поскольку.их.атрибут.variable_dtype .по-прежнему.имеет. значение.float32,.веса.будут.получать.от.оптимизатора.точные.изменения. с.плавающей.точкой.

Обратите.внимание.на.то,.что.при.использовании.типа.float16.некоторые.операции.могут.быть.численно.нестабильными.(в.частности,.softmax.и.crossentropy)..

Если.вам.понадобится.отказаться.от.смешанной.точности.в.определенном.слое,. просто.передайте.аргумент.dtype="float32" .конструктору.этого.слоя.