Главная страница
Навигация по странице:

  • Шаг 3. Еще одна линейная регрессия

  • Рис. 2.11.

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

  • Рис. 2.12.

  • Производная Код

  • Обучение и оценка нейронной сети

  • Рис. 2.13.

  • Основы глубокого обучения

  • Определение глубокого обучения: первый проход

  • Курсовая работа. Глубокое обучение


    Скачать 4.97 Mb.
    НазваниеГлубокое обучение
    АнкорКурсовая работа
    Дата26.06.2022
    Размер4.97 Mb.
    Формат файлаpdf
    Имя файлаVeydman_S_Glubokoe_obuchenie_Legkaya_razrabotka_proektov_na_Pyth.pdf
    ТипДокументы
    #615357
    страница7 из 22
    1   2   3   4   5   6   7   8   9   10   ...   22
    Шаг 2. Нелинейная функция
    Все эти взвешенные суммы подаются на вход какой-то нелинейной функ- ции. Первой мы опробуем в этой роли знакомую по главе 1 функцию sigmoid
    , показанную на рис. 2.9.

    80
    Глава 2. Основы глубокого обучения
    Рис. 2.9. Сигмоидная функция в диапазоне x от –5 до 5
    Почему мы не взяли, например, квадратичную функцию f (x) = x
    2
    ? Во- первых, нам нужна монотонная функция, «сохраняющая» информацию о знаке вводимых значений. Предположим, две из наших линейных ре- грессий дали значения –3 и 3. Квадратичная функция в обоих случаях даст значение 9, то есть информация о разнице знаков в исходных данных будет «потеряна».
    Во-вторых, сигмоида — нелинейная функция, что позволит нашей нейрон- ной сети извлекать нелинейные взаимосвязи между признаками и целью.
    Наконец, производную сигмоиды можно легко выразить через саму функцию, что выгодно с точки зрения вычислений:
    Вы в этом убедитесь, как только мы дойдем до обратного прохода по нашей нейронной сети.
    Шаг 3. Еще одна линейная регрессия
    Сигмоидная функция преобразует 13 извлеченных признаков таким образом, что их значения оказываются в диапазоне от 0 до 1. После чего

    Основы нейронных сетей
    81
    они используются как входные данные для обычной функции линейной регрессии.
    Для обучения полученной функции мы повторим действия, выполняв- шиеся с моделью линейной регрессии, а именно воспользуемся цепным правилом, чтобы выяснить, насколько увеличение весов увеличит (или уменьшит) потери, и обновим веса в направлении, уменьшающем потери.
    Через некоторое количество итераций (по крайней мере, мы на это наде- емся) мы получим более точную модель, которая «выучила» нелинейную взаимосвязь между признаками и целью.
    Теперь посмотрим, как это выглядит схематично.
    Визуализация
    Новая версия модели представлена на рис. 2.10.
    γ
    X
    B
    1
    W
    1
    M
    1
    γ
    M
    2
    N
    1
    α
    δ
    P
    L
    Чем меньше, тем лучше
    α
    Λ
    B
    2
    Y
    W
    2
    Рис. 2.10. Представление шагов 1–3 в виде вычислительного графа
    Как и прежде, все начинается с умножения и сложения матриц. Первая матрица, которую мы используем для преобразования входных признаков, называется матрицей весов (weight matrix), а вторая матрица, которую мы добавляем к полученному набору признаков, называется смещениями
    (bias). Поэтому мы обозначили их W
    1
    и B
    1 соответственно.
    Результат этих операций передается в сигмоидную функцию, после чего процесс повторяется с другим набором весов и смещений, которые мы обозначим как W
    2
    и B
    2
    . Эта методика и даст в итоге предсказание P.
    Еще визуализация?
    Позволяет ли подобное пошаговое описание получить интуитивное пред- ставление о происходящем? Этот вопрос касается основной темы книги: для полного понимания нейронных сетей нужно рассмотреть несколько представлений, каждое из которых показывает свой аспект их работы.

    82
    Глава 2. Основы глубокого обучения
    Диаграмма с рис. 2.10 не помогает интуитивно понять «структуру» сети, зато наглядно показывает способ обучения модели. Во время обратного прохода оцениваются значения частных производных всех составляю- щих функции для существующих входных данных, после чего простым умножением мы считаем градиенты потерь по каждому из весов. Эту процедуру вы уже видели в главе 1.
    Существует и другой, более стандартный способ представления нейронной сети. Исходные признаки рисуются в виде окружностей. В нашем случае их будет 13. Вторые 13 окружностей будут обозначать результат работы набора линейных регрессий и сигмоиды. Причем каждая окружность из второго набора — функция 13 оригинальных признаков, поэтому из каждой окружности будет выходить 13 линий
    1
    При этом 13 выходных данных используются для генерации единствен- ного предсказания, которое мы обозначим еще одной окружностью, как показано на рис. 2.11, демонстрирующем окончательный вариант схемы
    2
    Тем, кто уже что-то читал о нейронных сетях, скорее всего, знакома по- добная схема. Такое представление сразу показывает, что перед вами нейронная сеть и сколько у нее слоев. Но по нему невозможно понять математическую основу происходящего и способы обучения сети.
    Поэтому при всей важности этой диаграммы я добавил ее в первую оче- редь, чтобы продемонстрировать связь между ней и основным способом представления нейронных сетей: в виде соединенных линиями блоков, представляющих функции, которые выполняются во время прямого про- хода, и производные, которые вычисляются во время обратного прохода.
    В следующей главе я покажу, как напрямую превратить эти рисунки в код, записывая каждую функцию как класс
    Python
    , наследующий от базового класса
    Operation
    Код
    Этот код имеет ту же структуру, что и код для более простой модели линейной регрессии, которую мы рассматривали выше. Веса задаются
    1
    Разумеется, возможна ситуация, когда выходные данные связаны только с частью исходных признаков; так происходит, например, в сверточных нейронных сетях.
    2
    На самом деле это не совсем полная схема: на ней отсутствуют 169 линий, обозна- чающих связи между первыми двумя «слоями» объектов. Впрочем, нарисованного достаточно для иллюстрации идеи.

    Основы нейронных сетей
    83
    с помощью словаря weights
    , а возвращает функция величину потерь и словарь forward_info
    , содержащий информацию о результатах прямого прохода. Просто на этот раз мы подставляем в код данные об операциях с рис. 2.10:
    def forward_loss(X: ndarray, y: ndarray, weights: Dict[str, ndarray]
    ) -> Tuple[Dict[str, ndarray], float]:
    '''
    Прямой проход через модель нейронной сети и определение величины потерь.
    '''
    M1 = np.dot(X, weights['W1'])
    N1 = M1 + weights['B1']
    Рис. 2.11. Более распространенное (но во многих отношениях менее полезное) визуальное представление нейронной сети

    84
    Глава 2. Основы глубокого обучения
    O1 = sigmoid(N1)
    M2 = np.dot(O1, weights['W2'])
    P = M2 + weights['B2']
    loss = np.mean(np.power(y — P, 2))
    forward_info: Dict[str, ndarray] = {}
    forward_info['X'] = X
    forward_info['M1'] = M1
    forward_info['N1'] = N1
    forward_info['O1'] = O1
    forward_info['M2'] = M2
    forward_info['P'] = P
    forward_info['y'] = y return forward_info, loss
    Несмотря на более сложную схему, последовательность операций не ме- няется. Мы производим запрограммированные вычисления и сохраняем полученные результаты в словарь forward_info
    Обратный проход
    Обратный проход выполняется так же, как и в случае более простой модели линейной регрессии, просто на этот раз он включает большее количество шагов.
    Визуализация
    Напомню, какие шаги нам предстоят:
    1. Вычисление значений всех производных при заданных входных данных.
    2. Умножение полученных результатов.
    Вы снова убедитесь, что благодаря цепному правилу все работает. Частные производные, которые нам предстоит вычислить, показаны на рис. 2.12.
    В результате мы получим градиент потерь по каждому из весов.

    Основы нейронных сетей
    85
    γ
    X
    B
    1
    (X, W
    1
    )
    W
    1
    γ
    α
    δ
    L
    α
    Λ
    B
    2
    Y
    W
    2
    ∂ ν

    W
    1
    (M
    1
    , B
    1
    )
    ∂ α

    M
    1
    (N
    1
    )
    ∂ α

    M
    1
    (M
    1
    , B
    1
    )
    ∂ α

    B
    1
    (O
    1
    , W
    2
    )
    ∂ α

    B
    2
    (M
    2
    , B
    2
    )
    ∂ α

    B
    2
    (O
    1
    , W
    2
    )
    M
    2
    ∂ α

    M
    1
    (P, y)
    ∂ Λ

    P
    (M
    2
    , B
    2
    )
    ∂ α

    M
    2
    Чем меньше, тем лучше
    Рис. 2.12. Во время обратного прохода мы получим произведение всех частных производных, связанных с операциями в нашей нейронной сети
    Математическое представление и код
    Все частные производные, с которыми нам предстоит иметь дело, и со- ответствующие им строки кода представлены в табл. 2.1.
    Таблица 2.1. Список производных для нейронной сети
    Производная
    Код
    dLdP = -(forward_info[y] - forward_info[P])
    np.ones_like(forward_info[M2])
    np.ones_like(weights[B2])
    dM2dW2 = np.transpose(forward_info[O1], (1, 0))
    dM2dO1 = np.transpose(weights[W2], (1, 0))
    dO1dN1 = sigmoid(forward_info[N1] × (1 - sigmoid(forward_info[N1])
    dN1dM1 = np.ones_like(forward_info[M1])
    dN1dB1 = np.ones_like(weights[B1])
    dM1dW1 = np.transpose(forward_info[X], (1, 0))

    86
    Глава 2. Основы глубокого обучения
    Выражения для градиента потерь по элементам смещения dLdB1
    и dLdB2
    нужно суммировать вдоль каждой строки, так как в пакете данных к каждой строке добавляется один и тот же элемент смеще- ния. Подробнее см. раздел «Градиент потерь с учетом смещения» приложения А.
    Полный градиент потерь
    Полный код функции loss_gradients вы найдете в репозитории Jupyter
    Notebook к этой главе (
    https://oreil.ly/2TDV5q9
    ). Эта функция вычисляет все частные производные из табл. 2.1 и перемножает их, давая на выходе градиенты потерь по каждому объекту ndarray с весами:
    y dLdW2
    ;
    y dLdB2
    ;
    y dLdW1
    ;
    y dLdB1
    Остается получить сумму элементов dLdB1
    и dLdB2
    вдоль оси 0, как опи- сано в разделе «Градиент потерь с учетом смещения» в приложении А.
    Наша первая нейронная сеть готова! Посмотрим, превосходит ли она модель линейной регрессии.
    Обучение и оценка нейронной сети
    Прямой и обратный проходы для нейронной сети выполнялись так же, как и для созданной в начале главы модели линейной регрессии. Оди- наковыми будут и схемы обучения и оценка обеих моделей. На каждой итерации в функцию подаются данные, для которых выполняется прямой проход, затем во время обратного прохода вычисляются градиенты по- терь по весам, и на базе этой информации веса обновляются. Фактически внутри обучающего цикла мы можем использовать уже знакомый код:
    forward_info, loss = forward_loss(X_batch, y_batch, weights)
    loss_grads = loss_gradients(forward_info, weights)

    Обучение и оценка нейронной сети
    87
    for key in weights.keys():
    weights[key] -= learning_rate * loss_grads[key]
    Разница состоит в содержимом функций forward_loss и loss_gradients
    , а также в данных словаря weights
    , в котором теперь будет не два, а четы- ре ключа (
    W1
    ,
    B1
    ,
    W2
    и
    B2
    ). Фактически это и есть основная идея книги: даже для сложных архитектур в случае простых моделей используются одни и те же математические принципы и высокоуровневые обучающие процедуры.
    Строка кода для получения предсказаний тоже останется без изменений:
    preds = predict(X_test, weights)
    Просто на этот раз будет применяться другая функция predict
    :
    def predict(X: ndarray, weights: Dict[str, ndarray]) -> ndarray:
    '''
    Генерация предсказаний моделью нейронной сети.
    '''
    M1 = np.dot(X, weights['W1'])
    N1 = M1 + weights['B1']
    O1 = sigmoid(N1)
    M2 = np.dot(O1, weights['W2'])
    P = M2 + weights['B2']
    return P
    Рассчитаем для проверки средний модуль отклонения и корень из среднего квадрата отклонения:
    Mean absolute error: 2.5289
    Root mean squared error: 3.6775
    Оба параметра значительно ниже, чем в предыдущей модели! Рис. 2.13 показывает, как предсказанные значения соотносятся с целевыми. Здесь тоже видны улучшения.

    88
    Глава 2. Основы глубокого обучения
    Визуально точки лежат ближе к прямой с наклоном 45 градусов, чем на рис. 2.6. Попробуйте самостоятельно запустить код из репозитория
    Jupyter Notebook к этой главе (
    https://oreil.ly/2TDV5q9
    )!
    Це ль
    Предсказанное значение
    Рис. 2.13. Предсказанные и целевые значения при решении задачи регрессии нейронной сетью
    Почему все получилось именно так
    Почему эта модель работает лучше предыдущей? Напомню, что в пре- дыдущем случае соотношение между самым важным признаком и целью было нелинейным, в то время как модель умела выявлять только линейные взаимосвязи. И я высказал предположение, что мы сможем увеличить точность модели, добавив в нее нелинейную функцию.
    Рис. 2.14 демонстрирует уже знакомый нам график нормализованных значений самого важного признака вместе с целевыми и прогнозируемы- ми значениями. Последние получены путем передачи в модель средних значений остальных признаков, причем величина наиболее важного признака, как и раньше, варьируется от –3.5 до 1.5.
    Мы видим, что теперь обнаруженная взаимосвязь (а) нелинейна и (б) лучше аппроксимирует соотношение между целью и прогнозами (пред-

    Обучение и оценка нейронной сети
    89
    ставленное точками). Что собственно и требовалось. Так что добавление в нашу модель нелинейной функции позволило путем последовательного обновления весов и обучения модели обнаружить нелинейную связь между входными и выходными данными.
    Це ль/Прогно з
    Самый важный признак (нормализованный)
    Рис. 2.14. Сравнение самого важного признака с целевым значением в модели нейронной сети
    Это первая причина, по которой наша нейронная сеть работает лучше модели линейной регрессии. Кроме того, нейронная сеть может изучать взаимосвязи между комбинациями исходных признаков и цели, а не только между отдельными признаками. Ведь нейронная сеть использует умножение матриц для создания 13 «изученных признаков», каждый из которых представляет собой комбинацию всех исходных, и уже к этим извлеченным признакам применяется еще одна линейная регрессия. Ана- лиз данных, который вы можете найти на сайте книги, показал наиболее важные извлеченные признаки. Это:
    −4.44 × признак
    6
    − 2.77 × признак
    1
    − 2.07 × признак
    7
    + . . .
    и:
    4.43
    × признак
    2
    − 3.39 × признак
    4
    − 2.39 × признак
    1
    + . . .
    Вместе с 11 другими извлеченными признаками они будут включены в последние два слоя нейронной сети.

    90
    Глава 2. Основы глубокого обучения
    Именно эти две вещи — обнаружение нелинейных взаимосвязей между признаками и целью и обнаружение взаимосвязей между комбинациями признаков и целью — обеспечивают б
    ˆ
    ольшую по сравнению с моделью линейной регрессии точность нейронных сетей при решении практиче- ских задач.
    Заключение
    Из этой главы вы узнали, как с помощью принципов, изложенных в гла- ве 1, создать и обучить две стандартные модели машинного обучения.
    Я показал, как представить в виде вычислительного графа простую модель из классической статистики — модель линейной регрессии. Подобное представление позволяет рассчитывать градиенты потерь по различным параметрам модели и обучать модель, подавая ей на вход данные из об- у чающего набора и обновляя параметры в направлении, уменьшающем потери.
    Но, как мы увидели позже, эта модель ограничена, так как обнаруживает только линейные закономерности между признаками и целью. Попыт- ка построить модель, выявляющая нелинейные взаимосвязи, привела к созданию нашей первой нейронной сети. Вы узнали, как создать такую сеть с нуля и как обучить ее с помощью уже знакомой процедуры, с по- мощью которой мы обучали модель линейной регрессии. Вы убедились, что нейронная сеть работает лучше модели линейной регрессии, и теперь знаете, почему так получается.
    Мы неспроста ограничились в этой главе двумя относительно простыми моделями. Ведь их определение выполнялось вручную. Для прямого прохода потребовалось написать код 6 операций, а для обратного — 17.
    Но проницательные читатели могли заметить, что готовый код содержит много повторений. И достаточно корректно выбрать уровень абстракции, как можно будет отказаться от определения моделей с точки зрения от- дельных операций, которым мы занимались в этой главе. Это позволит создавать более сложные модели, в том числе модели глубокого обучения.
    Именно этим мы и займемся в следующей главе. Вперед!

    ГЛАВА 3
    Основы глубокого обучения
    Возможно, вы удивитесь, но мы уже освоили весь необходимый математи- ческий аппарат и основные понятия, чтобы ответить на ключевые вопро- сы о моделях глубокого обучения, которые были заданы в начале книги.
    Теперь вы понимаете, как работают нейронные сети, работа с которыми представляет собой вычисления, связанные с умножением матриц, вы- числением потерь и частных производных по отношению к этим потерям, а также разобрались, почему вся эта магия работает (спасибо цепному правилу). Первые созданные нами нейросети мы представили как множе- ство «строительных блоков», где каждый такой блок представлял собой какую-либо математическую функцию. В этой главе мы превратим эти строительные блоки в абстрактные классы Python, чтобы в дальнейшем использовать их для построения моделей глубокого обучения. Как и обе- щано — все с чистого листа!
    Мы также сопоставим нейросетевые описания с более традиционными описаниями моделей глубокого обучения, которые вы, возможно, уже знаете. Например, мы узнаем, что такое модели с «несколькими скрытыми слоями». Здесь вся суть в том, чтобы сопоставить высокоуровневое опи- сание с тем, как все работает на самом деле. Пока что мы давали только низкоуровневое описание. В первой части этой главы мы сопоставим это описание моделей с общими понятиями более высокого уровня, такими как «слои», которые в конечном итоге позволят нам более легко описывать более сложные модели.
    Определение глубокого обучения: первый проход
    Что такое «модель глубокого обучения»? В предыдущей главе мы писали, что это математическая функция в виде вычислительного графа. Модель должна была сопоставить входные данные из некоторого набора данных признаков (данные, например, могут соответствовать характеристикам

    92
    Глава 3. Основы глубокого обучения домов) с выходными данными, полученными из соответствующего рас- пределения (например, цены этих домов). Оказалось, что если модель будет функцией, в которой для всех входных данных задавался бы свой вес, то функцию можно было бы «подогнать», чтобы получить правиль- ный выход. Для этого нужно:
    1. Пропустить наблюдения через модель, отслеживая величины, вы- численные по пути во время этого «прямого прохода».
    2. Рассчитать потери, показывающие, насколько прогнозы нашей модели отличаются от целевых результатов.
    3. Используя величины, вычисленные на прямом проходе, и цепное правило, описанное в главе 1, вычислить, как сильно каждый из входных параметров влияет на величину ошибки.
    4. Изменить значения параметров, чтобы при повторном проходе ошибка стала меньше.
    В первой модели у нас была линейная комбинация, превращающая признаки в целевые данные (что эквивалентно традиционной модели линейной регрессии). Проблема была ожидаема: даже при оптимальном подборе весов модель отражала просто линейное отношение между при- знаками и целью.
    Затем мы определили структуру функции, которая применяет сначала линейные операции, потом нелинейную операцию (сигмоиду), а затем еще один набор линейных операций. Оказалось, что теперь модель стала лучше понимать взаимоотношение между входом и выходом, а заодно научилась изучать отношения между комбинациями наших входных признаков и целевыми данными.
    При чем же тут модели глубокого обучения? Начнем грубо — это будут последовательности операций, в которых задействованы как минимум
    две непоследовательные нелинейные функции.
    Вскоре я покажу, откуда берется такое определение, но сначала отметим, что поскольку модели глубокого обучения — это последовательность операций, процесс их обучения будет идентичен тому, что мы уже видели ранее. Работоспособность модели обусловлена дифференцируемостью мо- дели по отношению к ее входам, и как упоминалось в главе 1, комбинация дифференцируемых функций тоже является дифференцируемой, и если

    Строительные блоки нейросети: операции
    1   2   3   4   5   6   7   8   9   10   ...   22


    написать администратору сайта