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

  • Визуальное представление результатов

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

  • Обучение с учителем

  • Алгоритмы обучения с учителем

  • Линейная регрессия Линейную регрессию часто представляют следующей формулой:ϵ. 64

  • Визуализация

  • Обучение модели

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


    Скачать 4.97 Mb.
    НазваниеГлубокое обучение
    АнкорКурсовая работа
    Дата26.06.2022
    Размер4.97 Mb.
    Формат файлаpdf
    Имя файлаVeydman_S_Glubokoe_obuchenie_Legkaya_razrabotka_proektov_na_Pyth.pdf
    ТипДокументы
    #615357
    страница5 из 22
    1   2   3   4   5   6   7   8   9   ...   22
    54
    Глава 1. Математическая база а
    . Попробуем найти что-то аналогичное в рассматриваемом случае. Фактически нам нужно определить, что скрывается под знаком
    «?» в выражении:
    Если вспомнить, как происходит умножение матриц, станет понятно, что знак «?» — это W
    T
    , как в более простом примере со скалярным про- изведением векторов! Это легко проверить, напрямую посчитав частные производные функции L по каждому элементу матрицы X. Проделав это
    1
    , мы увидим, что в результате действительно получается выражение:
    ,
    в котором первая операция умножения выполняется поэлементно, а вто- рая — в соответствии с правилами умножения матриц.
    Это означает, что даже когда операции в вычислительном графе включают
    в себя умножение матриц, в результате которого на выходе появляется
    матрица, размером и формой отличающаяся от входных матриц, мы все
    равно можем выполнить обратный проход, используя цепное правило.
    Без этого обучение моделей глубокого обучения было бы намного более сложным делом. Вы убедитесь в этом уже в следующей главе.
    Код
    На базе сделанного выше заключения напишем код, который, я надеюсь, позволит еще лучше понять происходящий процесс:
    def matrix_function_backward_sum_1(X: ndarray,
    W: ndarray, sigma: Array_Function) -> ndarray:
    1
    Полный расчет вы найдете в разделе «Цепное правило» приложения А.

    Самое интересное: обратный проход
    55
    '''
    Вычисление производной функции по первому матричному аргументу.
    '''
    assert X.shape[1] == W.shape[0]
    # умножение матриц
    N = np.dot(X, W)
    # передача результата умножения матриц в функцию сигма
    S = sigma(N)
    # суммирование всех элементов
    L = np.sum(S)
    # примечание: я буду ссылаться на производные по их количеству
    # здесь, в отличие от математического представления, где мы
    # ссылались на их имена функций.
    # dLdS — just 1s dLdS = np.ones_like(S)
    # dSdN
    dSdN = deriv(sigma, N)
    # dLdN
    dLdN = dLdS * dSdN
    # dNdX
    dNdX = np.transpose(W, (1, 0))
    # dLdX
    dLdX = np.dot(dSdN, dNdX)
    return dLdX
    Удостоверимся, что все работает:
    np.random.seed(190204)
    X = np.random.randn(3, 3)
    W = np.random.randn(3, 2)
    print("X:")
    print(X)

    56
    Глава 1. Математическая база print("L:")
    print(round(matrix_function_forward_sum(X, W, sigmoid), 4))
    print()
    print("dLdX:")
    print(matrix_function_backward_sum_1(X, W , sigmoid))
    X:
    [[-1.5775 -0.6664 0.6391]
    [-0.5615 0.7373 -1.4231]
    [-1.4435 -0.3913 0.1539]]
    L:
    2.3755
    dLdX:
    [[ 0.2489 -0.3748 0.0112]
    [ 0.126 -0.2781 -0.1395]
    [ 0.2299 -0.3662 -0.0225]]
    Так как у нас, как и в предыдущем примере, dLdX
    обозначает градиент L по X, то, например, верхний левый элемент будет иметь значение
    Если предположить, что наши расчеты корректны, увеличение элемента
    x
    11
    на 0.001 должно приводить к увеличению L на 0.01
    × 0.2489. И мы легко можем убедиться, что это действительно так:
    X1 = X.copy()
    X1[0, 0] += 0.001
    print(round(
    (matrix_function_forward_sum(X1, W, sigmoid) — \
    matrix_function_forward_sum(X, W, sigmoid)) / 0.001, 4))
    0.2489
    Как видите, мы верно посчитали наш градиент!
    Визуальное представление результатов
    Фактически мы рассмотрели, что происходит с элементом x
    11
    при про- хождении через сигмоиду, а затем сложили результаты. Внутри сигмоиды выполняется много операций, например умножение матриц, в процессе

    Самое интересное: обратный проход
    57
    которого происходит объединение девяти элементов матрицы X с шестью элементами матрицы W. Все эти операции можно изобразить в виде еди- ной функции WNSL, как представлено на рис. 1.23.
    WNSL
    x
    11
    L
    L изменяется на 0.25 α
    Увеличить x
    11
    на α
    Рис. 1.23. Представление вложенных функций как единой функции WNSL
    Это дифференцируемая функция, так как все входящие в нее функции дифференцируемы. Мы рассматриваем одно входное значение x
    11
    , поэто- му для определения градиента нужно всего лишь найти значение
    Для наглядности построим график зависимости L от x
    11
    Еще раз выведем нашу матрицу X и увидим, что x
    11
    =
    -1.5775
    :
    print("X:")
    print(X)
    X:
    [[-1.5775 -0.6664 0.6391]
    [-0.5615 0.7373 -1.4231]
    [-1.4435 -0.3913 0.1539]]
    На рис. 1.24 показаны значения функции L в зависимости от элемента x
    11
    при постоянных значениях всех остальных элементов
    1
    Как видите, при изменении компонента x
    11
    на 2 функция L увеличивается примерно на 0.5 (от 2.1 до 2.6), что и дает только что рассчитанный нами наклон 0.5/2 = 0.25!
    Как видите, сложные математические операции с матрицами не помешали нам правильно вычислять частные производные матрицы L по элементам матрицы X. Аналогично можно посчитать градиент L по элементам W.
    1
    Полную функцию вы найдете на сайте книги (
    https://oreil.ly/deep-learning-github
    ).

    58
    Глава 1. Математическая база
    Рис. 1.24. Зависимость L от элемента x
    11
    Градиент L по W равен X
    T
    . Но так как при вычислении такого гради- ента имеет значение порядок перемножаемых матриц, компонент X
    T
    окажется в выражении первым:
    Соответственно в коде после строки dNdW
    = np.transpose(X,
    (1,
    0))
    будет идти строка dLdW
    = np.dot(dNdW,
    dSdN)
    , а не dLdX
    = np.
    dot(dSdN,
    dNdX)
    , как раньше.
    Заключение
    Материал этой главы научит вас понимать вложенные математические функции и принцип их работы путем представления их в виде соединен- ных линиями последовательных блоков, каждый из которых представляет собой отдельную функцию, входящую в состав сложной. В частности, вам не составит труда написать код для вычисления частных производных таких функций по любому аргументу, даже когда в качестве аргументов выступают двумерные объекты ndarray
    , и проверить правильность сде- ланных расчетов. Все это позволит вам строить и обучать нейронные сети и модели глубокого обучения с нуля в последующих главах. Вперед!

    ГЛАВА 2
    Основы глубокого обучения
    В главе 1 вы познакомились с математическими элементами, составля- ющими базу глубокого обучения: вложенными, непрерывными и диф- ференцируемыми функциями. Вы научились представлять их в виде вычислительных графов, каждый узел которых соответствует одной простой функции. В частности, я показал способ оценки производных вложенных функций: достаточно оценить производные всех состав- ляющих такой функции при заданных аргументах и перемножить полученные результаты. Это возможно благодаря цепному правилу.
    Рассмотренные в предыдущей главе примеры позволили убедиться, что такой подход корректно работает в случае функций, на вход которых подаются объекты ndarray из библиотеки NumPy, и такие же объекты мы видим на выходе.
    Более того, был рассмотрен даже пример функции с несколькими объ- ектами ndarray в качестве аргументов, которая осуществляла умножение
    матриц и давала на выходе матрицу другого размера, то есть фактически меняла форму входных данных. На вход мы подавали матрицу X (массив ndarray размером B
    × N) и матрицу W (массив ndarray размером N
    × M), а на выходе получали массив размером B
    × M. Вы могли убедиться, что когда умножение матриц
    ν(X, W) происходит внутри вложенной функ- ции, для оценки производных по входным данным можно использовать простое выражение. В частности, вместо можно подставить X
    T
    , а вместо
    W
    T
    Пришло время применить эту информацию на практике. В этой главе мы:
    1. Построим на базе этих элементов модель линейной регрессии.
    2. Посмотрим на процесс обучения этой модели.
    3. Расширим эту модель до однослойной нейронной сети.

    60
    Глава 2. Основы глубокого обучения
    В главе 3 все это позволит нам сразу перейти к построению моделей глубокого обучения.
    Но прежде, чем мы начнем, хотел бы напомнить, что представляет собой такой способ машинного обучения, как обучение с учителем.
    Обучение с учителем
    В общем виде машинное обучение можно описать как построение ал- горитмов, выявляющих или «изучающих» присутствующие в данных
    закономерности; обучение с учителем представляет собой подраздел машинного обучения, специализирующийся на поиске взаимосвязей между характеристиками уже подготовленных данных
    1
    В этой главе мы рассмотрим типичную для обучения с учителем задачу: поиск связи между характеристиками дома и его стоимостью. Очевидно, что цена дома зависит от таких характеристик, как количество комнат, их метраж, близость к школам и другой социальной инфраструктуре, а также от того, хотят ли люди приобрести дом в собственность или предпочитают аренду. Все эти данные уже измерены, и цель обучения с учителем состоит в выявлении корреляции между ними.
    Под «измеренными» данными я имею в виду представление каждой ха- рактеристики в виде числа. Это легко сделать, когда речь заходит о таких свойствах, как количество или площадь комнат. Но на цену дома будут влиять и, к примеру, взятые с сайта TripAdvisor отзывы о районе, где дом располагается. Тут уже возникает вопрос, каким образом перевести эти неструктурированные данные, то есть обычную речь, в цифровое пред- ставление. Кроме того, остаются еще и неоднозначные характеристики, например ценность дома. Впрочем, очевидно, что эту конкретную харак- теристику можно выразить через такой параметр, как цена
    2 1
    Другая разновидность машинного обучения — обучение без учителя — ищет взаи- мосвязи в данных без предварительной подготовленной обучающей выборки.
    2
    Хотя при решении такой задачи в реальности с этим параметром возникнут определенные сложности. Например, как определить цену дома, который много десятилетий не выставлялся на продажу? Впрочем, в книге мы будем рассматри- вать примеры, в которых числовое представление данных не вызывает подобных сложностей.

    Обучение с учителем
    61
    После преобразования всех «характеристик» в числа нужно выбрать структуру для их представления. В машинном обучении принята почти универсальная структура, которая, как оказалось, облегчает процесс вычислений. Это представление одного наблюдения, например одного дома, в виде строки данных. Такие строки складываются друг на друга, формируя «пакеты» данных, которые и передаются моделям в виде дву- мерных массивов ndarray
    . Свои прогнозы модели выдают также в виде двумерных объектов ndarray
    , по одному прогнозу на наблюдение.
    При этом длина каждой строки в массиве определяется количеством при- знаков данных. В общем случае одна характеристика может давать целый набор признаков. Тогда мы говорим, что точка данных относится к одной или нескольким категориям. Например, дом может быть облицован крас- ным кирпичом, коричневым кирпичом или плиткой из сланца
    1
    . Процесс извлечения признаков из того, что мы воспринимаем как характеристики наблюдений, называется проектированием признаков. Детальное рассмо- трение этого процесса выходит за рамки этой книги. В данной главе мы решим задачу, в которой для каждого наблюдения будет 13 характери- стик, и каждой из них мы поставим в соответствие один числовой признак.
    Как я уже говорил, обучение с учителем в конечном счете сводится к вы- явлению взаимосвязей между характеристиками данных. На практике мы выбираем одну характеристику и пытаемся предсказать ее поведение.
    Такая характеристика называется целевой. Выбор целевой характери- стики зависит от поставленной задачи. Например, если нужно описать взаимосвязь между ценами домов и количеством комнат в них, в качестве целевого признака можно выбрать как цену, так и количество комнат.
    В обоих случаях обученная модель опишет взаимосвязь между этими двумя характеристиками. Если же наша задача научить модель оценивать
    ранее не выставлявшиеся на продажу дома, целевым признаком должна стать цена, потому что именно ее будет предсказывать обученная модель исходя из остальных признаков.
    Схематично принцип обучения с учителем показан на рис. 2.1. На рисунке представлен как самый высокий уровень поиска взаимосвязей между данными, так и самый низкий уровень классификации этих связей между целевыми и исходными признаками после обучения модели.
    1
    Большинству читателей, скорее всего, известно, что такие признаки называют категориальными.

    62
    Глава 2. Основы глубокого обучения
    Взаимосвязи
    «Входные» характеристики
    (например, площадь дома)
    k признаков
    n строк
    Каждая строка =
    одно наблюдение x
    11
    , x
    12
    , ... x
    1k
    Численное представление признаков
    Численное представление цели
    «Выходные» характеристики
    Модели
    (например, линейная регрессия, нейронная сеть)
    Обобщенное представление
    Взаимосвязи
    Взаимосвязи
    (например, сведения о домах)
    Характеристики наблюдений y
    1
    y i
    y n
    Рис. 2.1. Схема процесса обучения с учителем
    Практически все время мы будем заниматься тем, что показано в нижней части рис. 2.1. При этом зачастую собрать правильный набор данных, корректно определить задачу и выполнить проектирование признаков намного сложнее, чем осуществить моделирование. Но эта книга по- священа именно моделям глубокого обучения и принципам их работы, поэтому сосредоточимся именно на этой теме.
    Алгоритмы обучения с учителем
    Теперь, когда вы получили общее представление о назначении алго- ритмов для обучения с учителем, напомню, что эти алгоритмы пред-

    Линейная регрессия
    63
    ставляют собой просто вложенные функции. С этой точки зрения цель обучения с учителем состоит в поиске функции, которая принимает в качестве входных данных массивы ndarray и их же дает на выходе. Эта функция должна преобразовывать массивы предоставленных ей при- знаков в массив, значения которого как можно точнее аппроксимируют целевые данные.
    Мы будем представлять данные в виде матрицы X, состоящей из n строк, каждая из которых содержит наблюдение с k признаками, причем все эти признаки числовые. Фактически каждое наблюдение представляет собой вектор
    , и совокупно все эти наблюдения со- ставляются в пакет. Вот как будет выглядеть пакет из трех наблюдений:
    Каждому пакету наблюдений будет сопоставлен набор целей. Элемент такого пакета представляет собой номер цели для соответствующего на- блюдения. Его можно представить как вектор-столбец:
    Наша задача в рамках обучения с учителем будет состоять в постро- ении функции, принимающей пакеты наблюдений, представленные в виде структуры X
    batch
    , и продуцирующей векторы p
    i
    (которые мы интерпретируем как «предсказания»), достаточно близкие к целевым значениям y
    i
    По сути, мы уже готовы приступить к построению первой модели на базе реальных данных. Начнем мы с такой распространенной модели, как линейная регрессия.
    Линейная регрессия
    Линейную регрессию часто представляют следующей формулой:
    ϵ.

    64
    Глава 2. Основы глубокого обучения
    Фактически мы предполагаем, что каждую целевую переменную можно представить как линейную комбинацию k признаков и константы
    β
    0
    , которая корректирует «базовое» значение прогноза (в частности, это прогноз при нулевом значении всех признаков).
    Из определения непонятно, каким образом мы будем писать код и обучать эту модель. Поэтому нужно выразить модель в виде функций, с которыми мы работали в главе 1. И проще всего начать со схемы.
    Визуализация
    Как представить линейную регрессию в виде вычислительного графа?
    На уровне отдельных элементов модель выглядит так: мы вычисляем произведение каждой пары x
    i
    и w
    i
    , а затем суммируем полученные ре- зультаты, как показано на рис. 2.2.
    X
    2
    W
    2
    M
    2
    L
    Чем меньше, тем лучше
    A
    M
    X
    1
    W
    1
    M
    1
    M
    X
    n
    W
    n
    M
    n
    M
    Λ
    B
    Рис. 2.2. Алгоритм линейной регрессии, представленный в виде отдельных операций умножения и сложения
    Но в главе 1 мы видели, как представление этой операции через умножение матриц позволяет не только кратко записать функцию, но и корректно рас- считать ее производную, что подходит для последующего обучения модели.
    Но как это сделать? Для начала рассмотрим сценарий, в котором отсут- ствует свободный член (в выражении он обозначен
    β
    0
    ). Результат работы модели линейной регрессии можно представить как скалярное произ- ведение каждого вектора наблюдений и вектора параметров, который мы назовем W:

    Линейная регрессия
    65
    В этом случае предсказание выражается формулой:
    Как видите, в случае модели линейной регрессии «генерацию предсказа- ния» можно представить с помощью всего одной операции: скалярного произведения.
    Для пакета наблюдений будет использоваться другая операция: умноже-
    ние матриц. Например, если есть пакет из трех наблюдений, записанный в виде матрицы:
    ,
    его умножение на вектор W даст набор предсказаний:
    =
    Используем этот факт, а также знакомые вам по предыдущей главе прин- ципы взятия производных, чтобы обучить модель.
    Обучение модели
    Что означает «обучение» модели? Говоря простыми словами, модели
    1
    берут данные, каким-то образом комбинируют их с параметрами и дают предсказания. Например, модель линейной регрессии берет данные в виде матрицы X и набор параметров в виде вектора W и, перемножив их, дает вектор предсказаний:
    1
    По крайней мере, те модели, которые будут рассматриваться в этой книге.

    66
    Глава 2. Основы глубокого обучения
    Однако для обучения модели требуется информация о точности полу- ченных прогнозов. Чтобы ее получить, добавим вектор целевых значений
    y
    batch
    , связанный с подаваемым на вход модели набором наблюдений X
    batch
    , и посчитаем величину отклонения сделанных прогнозов от ожидаемых.
    Такая мера количества ошибок называется функцией потерь. Часто для этой цели используют среднеквадратическую ошибку (mean squared error,
    MSE):
    Обозначим полученное число L. Это крайне важный параметр, ведь теперь мы можем по методике, которую я дал в главе 1, посчитать его градиент по каждому элементу вектора W. Этими данными мы воспользуемся для обновления всех элементов вектора W в направлении, уменьшающем
    значение L. Многократное повторение этой процедуры и называется «об- у чением» модели. Ниже вы убедитесь, что такой подход действительно работает. Чтобы лучше понять, как вычислить нужные градиенты, видо- изменим диаграмму с рис. 2.2.
    1   2   3   4   5   6   7   8   9   ...   22


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