Как создать простой персептрон?


10

Задачи классификации с нелинейными границами не могут быть решены простым персептроном . Следующий код R предназначен для иллюстративных целей и основан на этом примере в Python):

nonlin <- function(x, deriv = F) {
  if (deriv) x*(1-x)
  else 1/(1+exp(-x))
}

X <- matrix(c(-3,1,
              -2,1,
              -1,1,
               0,1,
               1,1,
               2,1,
               3,1), ncol=2, byrow=T)

y <- c(0,0,1,1,1,0,0)

syn0 <- runif(2,-1,1)

for (iter in 1:100000) {
  l1 <- nonlin(X %*% syn0)
  l1_error <- y - l1
  l1_delta <- l1_error * nonlin(l1,T)
  syn0 <- syn0 + t(X) %*% l1_delta
}

print("Output After Training:")
## [1] "Output After Training:"
round(l1,3)
##       [,1]
## [1,] 0.488
## [2,] 0.468
## [3,] 0.449
## [4,] 0.429
## [5,] 0.410
## [6,] 0.391
## [7,] 0.373

Теперь идея ядра и так называемого трюка с ядром состоит в том, чтобы спроецировать входное пространство в пространство более высокого измерения, вот так ( источники рисунков ):

введите описание изображения здесь введите описание изображения здесь

Мой вопрос
Как мне использовать трюк с ядром (например, с простым квадратичным ядром), чтобы я получил персептрон ядра , который способен решить данную проблему классификации? Обратите внимание: это в основном концептуальный вопрос, но если бы вы могли также внести необходимые изменения в код, это было бы здорово

То, что я пробовал до сих пор,
я попробовал следующее, которое работает хорошо, но я думаю, что это не реальная сделка, потому что она становится слишком сложной в вычислительном отношении для более сложных задач («хитрость» за «хитростью ядра» - это не просто идея само ядро, но вам не нужно вычислять проекцию для всех случаев):

X <- matrix(c(-3,9,1,
              -2,4,1,
              -1,1,1,
               0,0,1,
               1,1,1,
               2,4,1,
               3,9,1), ncol=3, byrow=T)

y <- c(0,0,1,1,1,0,0)

syn0 <- runif(3,-1,1)

Полное раскрытие
Я разместил этот вопрос неделю назад на SO, но он не привлек большого внимания. Я подозреваю, что здесь лучше, потому что это скорее концептуальный вопрос, чем вопрос программирования.

Ответы:


2

XX=X,X<,>:Rp×RpRk:Rp×RpR

K(xi,xj)=exp(||xixj||22σ2)

Как упоминалось на странице Википедии о персептроне ядра , мы выбираем подмножество входных данных размера и используем их линейную комбинацию для получения нашего вывода, M

f(x)=iMαiyiK(x,xi)

Если вы видели машину опорных векторов ( SVM ), вы заметите идентичный двойной. Чтобы выбрать подмножество размера для использования, мы оптимизируем over , который представляет, является ли sample опорным / базисным вектором нашего решения. В оптимизации мы включаем веса исходной оптимизации персептрона.Mαiiαiωi

Что касается вашего вопроса о том, что нет необходимости вычислять проекцию, вы правы, матрица входных данных по-прежнему двумерна. При вычислении выходных данных мы заменили скалярное произведение функцией ядра, и именно здесь происходит «неявное» вычисление в пространстве признаков.X



Спасибо. Не могли бы вы сделать свой ответ более конкретным в том смысле, что вы указываете, какие строки в коде сверху должны быть изменены каким-либо образом. Если вы не знаете R, изменения могут быть указаны в псевдокоде. Я бы тогда с радостью принял ваш ответ :-)
vonjd

Пост, на который вы ссылались, на котором вы основали свой код, на мой взгляд, плохое представление о персептронах и обратном распространении, хотя это, конечно, кратко. Знаете ли вы, как работает обратное распространение и общая теория персептрона?
Келлан Флюетт

Ну, до определенного момента, я надеюсь. Что вы получаете в точности? Как бы вы изменили код выше, чтобы использовать трюк ядра с квадратичным ядром?
vonjd

Не существует ли $ \ vec {x} ^ \ intercal \ vec {x) $ в лагранжевом двойственном критерии восприятия? Именно здесь вы заменяете внутренний продукт оценкой функции ядра.
Келлан Флюетт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.