В этом руководстве вы подробно узнаете, как реализовать линейную регрессию для прогнозирования с помощью Numpy, а также визуализировать, как алгоритм учится эпоху за эпохой. В дополнение к этому вы изучите двухслойные нейронные сети.
В предыдущем уроке вы получили очень краткий обзор перцептрона.
В этом руководстве вы углубитесь в реализацию линейного персептрона (линейной регрессии), с помощью которого вы сможете предсказать исход проблемы!
Это руководство, очевидно, будет включать немного больше математики, поскольку это неизбежно, но не о чем беспокоиться, так как я объясню их с нуля. Независимо от этого, необходимо понимать, что все алгоритмы машинного обучения в основном представляют собой математические формулировки, которые в конечном итоге реализуются в форме кода.
Прежде чем мы начнем, вспомните, что мы использовали пороговую функцию активации, чтобы имитировать функцию вентилей И и ИЛИ ?!
Здесь мы будем использовать еще одну чрезвычайно простую функцию активации, называемую функцией линейной активации (что эквивалентно отсутствию активации!).
Давайте узнаем, какие чудеса может творить эта функция активации!
Функция линейной активации
Предположим, что перцептрон имеет только один вход и смещение, как показано ниже:
Результирующий линейный выход (т.е. сумма) будет
. Это уравнение прямой линии, как показано на рисунке ниже.
Здесь следует отметить, что, когда функция активации не используется, мы можем сказать, что функция активации является линейной.
Это многомерное (с несколькими переменными) линейное уравнение.
Давайте посмотрим, как это используется для прогнозирования фактического результата y в следующем разделе, т. Е. линейной регрессии. .
Линейная регрессия
Подгонка линейного уравнения к заданному набору данных в n -мерном пространстве называется линейной регрессией. На изображении в формате GIF ниже показан пример линейной регрессии.
Проще говоря, вы пытаетесь найти наилучшие значения m и b, которые лучше всего подходят для набора точек. как показано на рисунке выше. Когда мы получили наилучшее возможное соответствие, мы можем предсказать значения y с учетом x.
Очень популярный пример - задача прогнозирования цен на жилье. В этой задаче вам дается набор значений, таких как площадь дома, количество комнат и т. Д., В качестве характеристик, и вы должны предсказать цену дома с учетом этих значений.
Итак, большой вопрос ... Как работает алгоритм предсказания? Как он научится предсказывать?
Давайте узнаем это на ходу!
Начнем с импорта необходимых пакетов.
Вы будете использовать sklearn
генератор наборов данных для создания набора данных. Вы также будете использовать пакет для разделения данных на обучающие и тестовые данные. Если вы не знакомы с sklearn
, это богатый пакет со множеством алгоритмов машинного обучения. Хотя вы получаете готовые функции для выполнения линейной регрессии, в этом руководстве вы собираетесь создать ее с нуля.
Для создания набора данных вы должны сначала установить список гиперпараметров - в то время как m и b являются параметрами, количество выборок, количество входных функций, количество нейронов, скорость обучения, количество итераций / эпох для обучения и т. д. называются гиперпараметрами. Вы узнаете об этих гиперпараметрах по мере реализации алгоритма.
На данный момент вы должны установить количество обучающих выборок, количество входных функций, скорость обучения и эпохи. Вы поймете скорость обучения и эпохи за короткое время.
Ваша первая задача - импортировать или сгенерировать данные. В этом руководстве вы создадите набор данных с помощью функции sklearn
make_regression
.
В целях обучения мы будем поддерживать минимальное количество функций, чтобы их было легко визуализировать. Следовательно, вы должны выбрать только одну функцию.
Теперь пора визуализировать, что приготовил генератор данных!
Давайте проверим форму векторов на непротиворечивость.
Shape of vector X: (200, 1) Shape of vector y: (200,)
Нам нужно сбросить размер y на (200, 1)
, чтобы мы не получали ошибок при умножении векторов.
(200, 1)
Затем вам нужно будет разделить набор данных на обучающий и тестовый наборы, чтобы вы могли проверить точность регрессионной модели, используя часть набора данных после обучения модели.
Теперь давайте разделим данные на набор поездов и набор тестов.
В нашем случае обучающая выборка составляет 80%, а тестовая - 20%.
Давайте проверим форму созданных наборов данных Train и Test.
(160, 1) (160, 1) (40, 1) (40, 1)
Как видите, 80% данных, то есть 80% из 200 точек данных - это 160, что является правильным.
Итак, чего мы достигли до сих пор?
Мы выполнили первоначальную предварительную обработку данных, а также исследовали данные путем их визуализации. Обычно это первый шаг при моделировании любого алгоритма машинного обучения. Мы также разделили данные для проверки точности модели после ее обучения.
Что мы делаем дальше?
Очевидно, что, как показано на приведенном выше GIF-изображении с линейной регрессией, нам нужно сначала рассмотреть случайную линию, а затем подогнать ее к данным посредством обучения.
Следовательно, следующим шагом является случайное создание линии со случайным наклоном и пересечением (смещением). Цель состоит в том, чтобы добиться наилучшего соответствия леске.
Теперь, учитывая m & b, мы можем построить сгенерированную линию.
Давайте обновим функцию plot_graph
, чтобы она также отображала прогнозируемую линию.
Поскольку линия теперь сформирована, вам нужно спрогнозировать значения, которые она создает для заданного значения x. Все, что нужно сделать, исходя из этого значения, - это вычислить их среднеквадратичную ошибку. Почему?
Как мы могли бы найти разницу между фактическим и прогнозируемым выходом?
Самый простой способ - просто вычесть эти две разницы. У нас есть случайная строка, которая дает результат y_pred
для каждого заданного x, но это точно не фактический результат. К счастью, у нас есть фактический результат всех x! Итак, что мы делаем, так это вместо того, чтобы брать разницу напрямую (которая технически называется абсолютным расстоянием или расстоянием L1), мы возводим ее в квадрат (называемое евклидовым расстоянием или расстоянием L2) и берем среднее значение для всех заданных точек, и это называется Среднеквадратичная ошибка.
Давайте теперь спрогнозируем значения y_pred
из параметров m и b с учетом точек данных X_train
, определив функцию forward_prop
.
Функция затрат / убытков
Как упоминалось ранее, теперь, когда у вас есть как соответствующие значения для X_train
, так и прогнозируемые значения для y_pred
, вы рассчитаете функцию затрат / ошибок / потерь.
Потеря (среднеквадратическая ошибка):
Суммируя все M примеров, мы получаем Loss fn., как показано ниже:
Наша цель - очевидно минимизировать убыток, чтобы линия регрессии предсказывала более точно.
Давайте теперь систематизируем это.
Вы также сохраните каждое значение потерь, которое будет вычислено для графической визуализации его изменений во время тренировки.
4005.265725705774
Давайте изменим указанную выше plot_graph
функцию, определенную выше, чтобы также построить график потерь.
Вы визуализируете линию, созданную из параметров m и b.
Теперь, когда вы подсчитали убыток, давайте минимизируем его.
Градиентный спуск для линейной регрессии
Поскольку Loss является зависимой переменной, а m & b - независимыми переменными, нам нужно будет обновить m и b, чтобы найти минимальную потерю .
Итак, немедленный вопрос будет ...
Как обновить параметры m и b?
Давайте, например, рассмотрим только один параметр p, как показано ниже, и пусть t (target) будет значением это должно быть предсказано. Мы видим, что когда стоимость сходится к минимуму, параметр p достигает определенного значения, называемого оптимальным значением. Допустим, оптимальное значение p - a.
Вы можете сделать несколько наблюдений из этого графика.
Из графика видно, что по мере того, как p приближается к a (минимуму), Стоимость уменьшается, и по мере удаления от него стоимость увеличивается.
Теперь, как мы можем заставить p двигаться в сторону a, независимо от того, находится ли он слева или справа от a, как показано на рисунке?
Давайте рассмотрим p кривой. Из расчетов мы знаем, что наклон кривой в точке задается как d y / d x (здесь это d L / d p, где L → Loss ). На рис., Когда p находится слева от a, наклон , очевидно, ‒ve, и когда он находится справа, наклон будет быть + ve. Но мы видим, что если p находится слева от a, к p. Аналогичным образом необходимо вычесть некоторое значение, когда p находится справа от a.
Это означает, что когда наклон равен ‒ve, подразумевается p = p + (некоторые val.), а когда наклон равен + ve, подразумевает p = p - (некоторые значения), чтобы перейти к a.
∴ Мы вычитаем наклон из p. Таким образом, наклон отменяется и он всегда движется в сторону a. В результате уравнение будет выглядеть так:
Также необходимо учитывать, что если стоимость слишком высока, наклон будет слишком большим. Следовательно, при вычитании крутизны из p, p значение может превышать a. Следовательно, необходимо уменьшить значение крутизны, чтобы p не превышало а. Поэтому мы вводим смягчающий фактор, называемый скоростью обучения (α), для крутизны. Позже вы увидите, что при изменении α скорость уменьшения ошибки меняется.
В итоге мы получим:
Как показано на рисунке, траектория, выбранная p относительно стоимости, является кривой Белла.
Этот метод называется Градиентный спуск.
В нашем случае мы используем два параметра: m и b. Следовательно, кривая Белла будет трехмерной, как показано на рисунке ниже.
Как уже упоминалось, вы вычислите частную производную функции потерь по параметрам m и b. [Примечание. Обычно предполагается, что вы знакомы с основными концепциями частных производных. Однако, если вы этого не сделаете, вы можете сослаться на это замечательное видео Академии Хана]
Обновление параметров
Теперь мы вычитаем наклон параметров m и b из их соответствующих производных вместе с коэффициентом демпфирования α (альфа).
При уменьшении значений m и b они постепенно приближаются к минимумам. Таким образом, обновление параметров таким образом необходимо выполнять в течение многих итераций, которые называются эпохами.
Давайте определим функцию grad_desc
, которая вызывает и gradient
, и update_params
.
Теперь мы определили все, что нам нужно, поэтому давайте скомпилируем все функции в одну и посмотрим, как работает наш алгоритм. Итак, прежде чем вы действительно сможете запустить код, вам нужно будет установить гиперпараметры.
Epoch: 0 Loss = 2934.082243250548
Epoch: 10 Loss = 1246.3617292447889
Epoch: 20
Loss = 546.310951004311
Epoch: 30
Loss = 255.88020867147344
Epoch: 40
Loss = 135.36914932067438
Epoch: 50
Loss = 85.35744394597806
Epoch: 60
Loss = 64.60029693013243
Поскольку вы обучили параметры для 60 эпох, и линия регрессии, похоже, соответствует данным, вы можете перейти к последней фазе, то есть к прогнозированию на наших тестовых данных и проверке точности.
Прогноз
Для проверки точности вы можете взять среднее значение процентной ошибки для всех точек данных теста.
Prediction: Loss = 56.53060443946197 Accuracy = 80.1676%
Hence m = 82.34083095217943 b = 0.46491578390750576
Точность составляет 80%, что является «нормальным» с учетом разброса данных, как видно на приведенных выше графиках.
Я надеялся представить в статье что-то действительно интересное, а в качестве бонуса я также добавил введение в нейронные сети. Но в этом наверняка есть загвоздка!
Двухслойная нейронная сеть с функцией линейной активации
Ниже показана нейронная сеть.
Из изображения мы видим, что есть два входа для двух нейронов в первом слое и выходного нейрона во втором слое.
Мы будем использовать матрицы для представления приведенных выше уравнений. Мы можем представить их в векторной форме (матрица с одним столбцом) как:
При выполнении матричных вычислений нам нужно будет позаботиться о размерах и умножить. Следовательно, мы немного перестраиваем, чтобы получить требуемый результат.
Расширение уравнения не требуется, поэтому мы будем придерживаться
Аналогичным образом значение
Теперь результат слоя 2ⁿᵈ будет:
Из приведенного выше набора уравнений мы видим, что нейронная сеть с линейной функцией активации сводится к линейному уравнению.
Вся цель нейронных сетей состояла в том, чтобы создать очень сложную функцию, которая может соответствовать любому типу данных, и, как ясно видно, нейронная сеть с линейными функциями активации не справляется с этой задачей. Следовательно, следует строго отметить, что линейная функция не может использоваться в качестве функции активации для нейронной сети , хотя ее можно использовать только на последнем уровне для задач регрессии .
Тогда, думаю, вам придется подержать лошадей до следующего урока, чтобы реализовать его!
Вот ссылка для полной реализации в Jupyter Notebook:
Клонируйте его и запускайте ячейки на своем Colab, чтобы увидеть чудеса градиентного спуска !!
Вывод
В этом уроке вы узнали
- Функции линейной активации выполняют задачи регрессии, то есть учатся предсказывать и прогнозировать значения. Этот метод везде называется линейной регрессией.
- MLP (многослойный персептрон) с функцией линейной активации сводится к обычной задаче линейной регрессии. Следовательно, линейные активации не должны использоваться в скрытых слоях сети. Однако его можно использовать на последнем уровне для задач регрессии / прогнозирования.
В следующем руководстве вы узнаете о функции активации сигмовидной формы и выполните логистическую регрессию, которая является наиболее важным ключом для реализации нейронных сетей.
Вы можете прочитать следующую статью о логистической регрессии здесь:
Вы работаете над каким-нибудь крутым проектом глубокого обучения?
Вы можете связаться со мной в Linkedin:
ИЛИ напишите мне в Twitter по любым вопросам: