Экскурсия по машинному обучению и глубокому обучению
Введение в алгоритм персептрона
От теории к практике, изучите основные принципы Perceptron и реализуйте алгоритм с помощью стохастического градиентного спуска.
В этом блоге будут освещены следующие вопросы и темы
1. Что такое перцептрон?
2. Стохастический градиентный спуск для персептрона.
3. Реализация на Python
1. Что такое перцептрон?
Perceptron заложил основы для моделей нейронных сетей в 1980-х годах. Алгоритм был разработан Фрэнком Розенблаттом и изложен в статье «Принципы нейродинамики: персептроны и теория мозговых механизмов», опубликованной в 1962 году. В то время работа Розенблатта подверглась критике со стороны Марвина Минкси и Сеймура Паперта, утверждая, что нейронная сети были дефектными и могли решить только проблему линейного разделения. Однако такое ограничение возникает только в однослойной нейронной сети.
Персептрон можно использовать для решения задачи двухклассовой классификации. Обобщенный вид алгоритма можно записать как:
Функция нелинейной активации признака:
В то время как логистическая регрессия нацелена на вероятность того, что события произойдут или нет, поэтому диапазон целевого значения составляет [0, 1]. Персептрон использует более удобные целевые значения t = + 1 для первого класса и t = -1 для второго класса. Следовательно, алгоритм не дает ни вероятностных выходных данных, ни решает проблему классификации K ›2. Другое ограничение возникает из-за того, что алгоритм может обрабатывать только линейные комбинации фиксированной базисной функции.
2. Стохастический градиентный спуск для персептрона
Согласно предыдущим двум формулам, если запись классифицирована правильно, то:
Иначе,
Следовательно, чтобы минимизировать функцию затрат для Perceptron, мы можем написать:
M означает набор неправильно классифицированных записей.
Взяв частную производную, мы можем получить градиент функции стоимости:
В отличие от логистической регрессии, которая может применять пакетный градиентный спуск, мини-пакетный градиентный спуск и стохастический градиентный спуск для расчета параметров, Perceptron может использовать только стохастический градиентный спуск. Нам нужно инициализировать параметры w и b, а затем случайным образом выбрать одну неверно классифицированную запись и использовать стохастический градиентный спуск для итеративно обновляйте параметры w и b, пока все записи не будут правильно классифицированы:
Обратите внимание, что скорость обучения a варьируется от 0 до 1.
Например, у нас есть 3 записи: Y1 = (3, 3), Y2 = (4, 3), Y3 = (1, 1). Y1 и Y2 помечены как +1 и Y3 обозначается как -1. Учитывая, что все исходные параметры равны 0. Следовательно, все точки будут отнесены к классу 1.
Стохастический градиентный спуск циклически перебирает все данные обучения. В первом раунде, применяя первые две формулы, можно правильно классифицировать Y1 и Y2. Однако Y3 будет классифицирован неправильно. Предполагая, что скорость обучения равна 1, применив градиентный спуск, показанный выше, мы можем получить:
Тогда линейный классификатор можно записать как:
Это 1 раунд итерации градиентного спуска.
В таблице выше показана вся процедура стохастического градиентного спуска для персептрона. Если запись классифицирована правильно, весовые векторы w и b остаются неизменными; в противном случае мы добавляем вектор x к текущему вектору веса, когда y = 1 и минус вектор x от текущего вектора веса w, когда y = -1. Обратите внимание, что последние 3 столбца представляют собой прогнозируемые значения, а неправильно классифицированные записи выделяются красным цветом. Если мы выполняем градиентный спуск снова и снова, в 7-м раунде все 3 записи помечаются правильно. Тогда алгоритм остановится. Окончательная формула линейного классификатора:
Обратите внимание, что с этим алгоритмом всегда есть проблема сходимости. Когда данные разделимы, существует множество решений, и то, какое решение будет выбрано, зависит от начальных значений. Когда данные не разделимы, алгоритм не сойдется. Для получения дополнительной информации см. Соответствующий параграф в ссылке ниже.
3. Реализация на Python
from sklearn import datasets import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.lines as mlines np.random.seed(10) # Load data iris=datasets.load_iris() X = iris.data[0:99,:2] y = iris.target[0:99]
Сначала загрузите данные Iris.
# Plot figure plt.plot(X[:50, 0], X[:50, 1], 'bo', color='blue', label='0') plt.plot(X[50:99, 0], X[50:99, 1], 'bo', color='orange', label='1') plt.xlabel('sepal length') plt.ylabel('sepal width') plt.legend()
Затем визуализируйте данные
# Update y into -1 and 1 y=np.array([1 if i==1 else -1 for i in y])
Обновите y = 0 до y = -1
################################# # Gradient Descent ################################# # Initialize parameters w=np.ones((X.shape[1],1)); b=1; learning_rate=0.1; Round=0; All_Correct=False; # Start Gradient Descent while not All_Correct: misclassified_count=0 for i in range(X.shape[0]): XX=X[i,] yy=y[i] if yy * (np.dot(w.T,XX.T)+b)<0: w+=learning_rate * np.dot(XX,yy).reshape(2,1) b+=learning_rate * yy misclassified_count +=1 if misclassified_count==0: All_Correct=True else: All_Correct=False Round += 1 print(Round) print(w) print(b)
После применения стохастического градиентного спуска мы получаем w = (7,9, -10,07) и b = -12,39
x_points = np.linspace(4,7,10) y_ = -(w[0]*x_points + b)/w[1] plt.plot(x_points, y_) plt.plot(X[:50, 0], X[:50, 1], 'bo', color='blue', label='0') plt.plot(X[50:99, 0], X[50:99, 1], 'bo', color='orange', label='1') plt.xlabel('sepal length') plt.ylabel('sepal width') plt.legend()
На рисунке выше показан окончательный результат Perceptron. Мы видим, что линейный классификатор (синяя линия) может правильно классифицировать весь обучающий набор данных. В этом случае набор данных радужной оболочки содержит только 2 измерения, поэтому границей решения является линия. В случае, когда набор данных содержит 3 или более измерений, границей решения будет гиперплоскость.
Заключение
В этом блоге я объясняю теорию и математику Perceptron, сравниваю этот алгоритм с логистической регрессией и, наконец, реализую алгоритм на Python. Надеюсь, после прочтения этого блога вы сможете лучше понять этот алгоритм. Если вас интересуют другие блоги, перейдите по следующей ссылке:
Ссылка
[1] Кристофер М. Бишоп, (2009 г.), Распознавание образов и машинный подход
[2] Тревор Хасти, Роберт Тибширани, Джером Фридман, (2008), Элементы статистического обучения