Одиночный персептрон - нелинейная оценочная функция - PullRequest
7 голосов
/ 07 марта 2012

В случае одного персептрона - литература утверждает, что его нельзя использовать для разделения нелинейных дискриминантных случаев, таких как функция XOR. Это понятно, поскольку размерность VC строки (в 2-D) равна 3, и поэтому одна 2-D строка не может различать выходные данные, такие как XOR.

Однако мой вопрос заключается в том, почему оценивающая функция в одном персептроне должна быть функцией линейного шага? Ясно, что если у нас есть нелинейная функция оценки, такая как сигмоид, этот персептрон может различать 1 и 0 XOR. Итак, я что-то здесь упускаю?

Ответы [ 3 ]

12 голосов
/ 07 марта 2012

если у нас есть нелинейная оценочная функция, такая как сигмоид, этот персептрон может различать 1 и 0 XOR

Это совсем не так. Критерием различения является не форма линии (или гиперплоскости в более высоких измерениях), а скорее то, допускает ли функция линейная отделимость .

Не существует функции single , которая создает гиперплоскость, способную разделять точки функции XOR. Кривая на изображении разделяет точки, но это не функция.

You can't separate the blue and red points into separate hyperplanes using a single function

Чтобы разделить точки XOR, вам нужно будет использовать как минимум две строки (или любые другие фигурные функции). Это потребует двух отдельных персептронов. Затем вы можете использовать третий персептрон для разделения промежуточных результатов на основе знака.

If you use two lines, you can create two discriminants, and then merge the result

3 голосов
/ 07 марта 2012

Я предполагаю, что под сигмоидой вы на самом деле имеете в виду не сигмоид, а нечто с локальным максимумом. В то время как нормальный двоичный классификатор персептрона имеет вид:

f(x) = (1 if w.x+b>0 else 0)

Вы могли бы иметь функцию:

f(x) = (1 if |w.x+b|<0.5 else 0)

Это, безусловно, сработает, но будет довольно искусственным, поскольку вы эффективно подгоняете свою модель к своему набору данных, что плохо.

Вопрос о том, сходится ли обычный алгоритм персептрона, почти наверняка не обсуждается, хотя я могу ошибаться. http://en.wikipedia.org/wiki/Perceptron#Separability_and_convergence Возможно, вам придется придумать совершенно новый способ приспособления к функции, который побеждает цель.

Или вы можете просто использовать машину опорных векторов , которая подобна персептрону, но способна обрабатывать более сложные случаи с помощью трюка с ядром .

0 голосов
/ 11 марта 2014

Старый вопрос, но я хочу оставить свои мысли (кто-нибудь поправит меня, если я ошибаюсь).

Я думаю, что вы смешали понятия linear model и loss или error функции. Перцептрон по определению является линейной моделью, поэтому он определяет линию / плоскость / гиперплоскость, которую вы можете использовать для разделения ваших классов.

Стандартный алгоритм Perceptron извлекает сигнал вашего выхода, давая -1 или 1:

yhat = signal(w * X + w0)

Это нормально и в конечном итоге сойдет, если ваши данные linearly separable.

Чтобы улучшить это, вы можете использовать sigmoid, чтобы сгладить функцию потерь в диапазоне [-1, 1]:

yhat = -1 + 2*sigmoid(w * X + w0)
mean_squared_error = (Y - yhat)^2

Затем используйте числовой оптимизатор, такой как Gradient Descent, чтобы минимизировать ошибку во всем наборе данных. Здесь w0, w1, w2, ..., wn - ваши переменные.

Теперь, если ваши исходные данные не linearly separable, вы можете преобразовать их таким способом, который делает их линейно разделимыми, а затем применить любую линейную модель. Это правда, потому что модель linear on the weights.

Это в основном то, что модели типа SVM делают под капотами для классификации ваших нелинейных данных.

PS: I'm learning this stuff too, so experts don't be mad at me if i said some crap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...