Экскурсия по машинному обучению и глубокому обучению

Введение в алгоритм персептрона

От теории к практике, изучите основные принципы 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), Элементы статистического обучения